見よう見まねで作っているのでおかしなところがあったら指摘して頂きたいのですが、
以下のような2つのクラスを作成し、デバッグ用途でチェックボックスをクリックして値をON/OFFする機能を作っています。
ここで、新しいDebugFlagを追加するためにE_FLAGに値を追加(例えば、eFLAG6を追加)した場合
期待する動作としては、dbFlagsの要素数が6になっていて欲しいのですが、
DebugFlagManagerをくっつけたGameObjectをPrefabに登録している場合に、dbFlagsの要素数が5のままになってしまい
DebugFlagManagerEditorの側が範囲外アクセスを起こしてしまうようです。
こちら、一度当該クラスのGameObjectへの紐づけを解除し、改めてGameObjectに紐づけをしてクラスをInspectorで開いてみると
問題なく要素が増え、dbFlagsがInspector上で表示されています。
これは、Prefabの挙動としてこのようなものになっているのでしょうか。
あるいは、CustomEditorの挙動としてこのようになっているのでしょうか。
E_FLAGに値を増やした際には毎回GameObjectへの紐づけを解除する必要があるのか
あるいは、何らかの方法でE_FLAGの値が増えたことを検知する方法が有るのか、ご教授頂けませんでしょうか。
C#
1public class DebugFlagManager : MonoBehaviour 2{ 3 // 項目を増やす場合、GrobalComponentのprefabに登録されていると、項目が増えない。その場合、一度removeして、再度applyする必要がある? 4 public enum E_FLAG 5 { 6 eFLAG1, 7 eFLAG2, 8 eFLAG3, 9 eFLAG4, 10 eFLAG5, 11 eNUM 12 }; 13 14 [SerializeField][HideInInspector] private bool[] dbFlags = new bool[(int)E_FLAG.eNUM]; 15}
C#
1#if UNITY_EDITOR 2[CustomEditor(typeof(DebugFlagManager))] 3public class DebugFlagManagerEditor : Editor 4{ 5 DebugFlagManager thisComponentClass = null; 6 private SerializedProperty dbFlagsProperty; 7 private readonly string[] flagNames = Enum.GetNames(typeof(DebugFlagManager.E_FLAG)); 8 private GUIStyle boldStyle; 9 10 public override void OnInspectorGUI() 11 { 12 base.OnInspectorGUI(); 13 14 GUILayout.Label("DebugFlags", this.boldStyle); 15 using (new EditorGUI.IndentLevelScope()) 16 { 17 int enumCount = (int)DebugFlagManager.E_FLAG.eNUM; // eNUMという値が、有効な値の個数を示している. 18 for (int i = 0; i < enumCount; i++) 19 { 20 var dbFlagProperty = this.dbFlagsProperty.GetArrayElementAtIndex(i); // シリアライズされた値を配列として扱って、各要素を取得. 21 EditorGUILayout.PropertyField(dbFlagProperty, new GUIContent(this.flagNames[i])); 22 } 23 } 24 25 this.serializedObject.ApplyModifiedProperties(); 26 } 27 28 29 private void OnEnable() 30 { 31 thisComponentClass = target as DebugFlagManager; 32 33 this.dbFlagsProperty = this.serializedObject.FindProperty("dbFlags"); 34 this.boldStyle = new GUIStyle {fontStyle = FontStyle.Bold}; 35 } 36} 37#endif
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。