質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

501閲覧

[Unity]CustomEditorを用いているクラスを付けたGameObjectをPrefabに登録しているとき、enumの値を増やすと、増やした値が反映されない

hara64

総合スコア18

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/06/26 06:33

見よう見まねで作っているのでおかしなところがあったら指摘して頂きたいのですが、
以下のような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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

なるほど、では下記のようにデシリアライズ時にdbFlagsのサイズを調整するのはどうでしょうか?
おそらくこれなら現在のE_FLAGの要素数とシリアライズされた配列のサイズの不整合が起こらないんじゃないかと思います。

lang

1using System; 2using UnityEngine; 3 4public class DebugFlagManager : MonoBehaviour, ISerializationCallbackReceiver 5{ 6 public enum E_FLAG 7 { 8 eFLAG1, 9 eFLAG2, 10 eFLAG3, 11 eFLAG4, 12 eFLAG5, 13 eNUM 14 }; 15 16 [SerializeField][HideInInspector] private bool[] dbFlags = new bool[(int)E_FLAG.eNUM]; 17 18 public void OnBeforeSerialize() 19 { 20 } 21 22 public void OnAfterDeserialize() 23 { 24 Array.Resize(ref this.dbFlags, (int)E_FLAG.eNUM); 25 } 26}

投稿2021/06/28 11:37

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問