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

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

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

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

3796閲覧

Unityにて、Inspector上の配列の要素数を、Enumの個数から、ゲーム起動前に決定したい

hara64

総合スコア18

デバッグ

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/26 10:00

Unityで、デバッグ機能を作ろうとしています。

Enumにデバッグフラグを列挙して、
フラグの個数の大きさのbool型配列を作って、
配列がtrueだったら、該当のデバッグ機能が有効になる、という作りにしています。

このbool型配列を、ゲーム起動前にInspectorから操作して(チェックボックスにチェックを入れて)
フラグ切り替えを行いたいのですが

起動前の時点で、Enumの個数を取得してきて、配列の要素数を定義する方法がないでしょうか。

C#

1 public enum E_FLAG 2 { 3 eIS_SKIP_START_SCENARIO, 4 eDRAW_FADESTATE, 5 eDRAW_UICTRL, 6 eNUM, 7 eINVALID = eNUM 8 };

C#

1 dbFlags = new bool[(int)E_FLAG.eNUM]; // <- ここを起動前に設定したい.

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

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

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

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

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

guest

回答1

0

ベストアンサー

Enum.GetNamesで列挙名の一覧を取ってきて、それと同数にする...とかでしょうかね?

たとえば下記のような作りになっている場合、

C#

1using System; 2using System.Linq; 3using UnityEngine; 4#if UNITY_EDITOR 5using UnityEditor; 6#endif 7 8public class SomethingBehaviour : MonoBehaviour 9{ 10 [SerializeField] private Vector3 foo; 11 [SerializeField] private string bar; 12 [SerializeField] private float baz; 13 [SerializeField][HideInInspector] private bool[] dbFlags = new bool[Enum.GetNames(typeof(E_FLAG)).Length]; 14 15 private void Start() 16 { 17 foreach (var (flagValue, flagName) in this.dbFlags.Zip( 18 Enum.GetNames(typeof(E_FLAG)), 19 (flagValue, flagName) => (flagValue, flagName))) 20 { 21 Debug.Log($"{flagName}:{flagValue}"); 22 } 23 } 24} 25 26public enum E_FLAG 27{ 28 eIS_SKIP_START_SCENARIO, 29 eDRAW_FADESTATE, 30 eDRAW_UICTRL, 31 eNUM, 32 eINVALID = eNUM 33} 34 35#if UNITY_EDITOR 36[CustomEditor(typeof(SomethingBehaviour))] 37public class SomethingBehaviourEditor : Editor 38{ 39 private SerializedProperty dbFlagsProperty; 40 private readonly string[] flagNames = Enum.GetNames(typeof(E_FLAG)); 41 private GUIStyle boldStyle; 42 43 public override void OnInspectorGUI() 44 { 45 base.OnInspectorGUI(); 46 EditorGUILayout.Space(); 47 GUILayout.Label("Debug", this.boldStyle); 48 using (new EditorGUI.IndentLevelScope()) 49 { 50 var enumCount = this.flagNames.Length; 51 for (var i = 0; i < enumCount; i++) 52 { 53 var dbFlagProperty = this.dbFlagsProperty.GetArrayElementAtIndex(i); 54 EditorGUILayout.PropertyField(dbFlagProperty, new GUIContent(this.flagNames[i])); 55 } 56 } 57 58 this.serializedObject.ApplyModifiedProperties(); 59 } 60 61 private void OnEnable() 62 { 63 this.dbFlagsProperty = this.serializedObject.FindProperty("dbFlags"); 64 this.boldStyle = new GUIStyle {fontStyle = FontStyle.Bold}; 65 } 66} 67#endif

インスペクターの見た目は下図のようになり、

図1

実行すると下図のようにフラグの状態が表示されました。

図2

あるいは、列挙体をビットフィールド方式で定義するのも一案かもしれません。
下記のような作りの場合...

C#

1using System; 2using UnityEngine; 3 4public class SomethingBehaviour2 : MonoBehaviour 5{ 6 [SerializeField] private Vector3 foo; 7 [SerializeField] private string bar; 8 [SerializeField] private float baz; 9 [SerializeField] private E_FLAG2 dbFlags; 10 11 private void Start() 12 { 13 foreach (var flagName in Enum.GetNames(typeof(E_FLAG2))) 14 { 15 Debug.Log($"{flagName}:{this.dbFlags.HasFlag((E_FLAG2)Enum.Parse(typeof(E_FLAG2), flagName))}"); 16 } 17 } 18} 19 20[Flags] 21public enum E_FLAG2 22{ 23 eIS_SKIP_START_SCENARIO = 1 << 0, 24 eDRAW_FADESTATE = 1 << 1, 25 eDRAW_UICTRL = 1 << 2, 26 eNUM = 1 << 3, 27 eINVALID = 1 << 4 28}

インスペクター上には複数の項目を選択できるポップアップメニューが現れるかと思います。

図3

投稿2020/04/26 14:14

Bongo

総合スコア10807

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

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

hara64

2020/04/30 03:22

ありがとうございます。Editorの改変というものが存在しているとは認識していましたが このような日常的な変更を解決する手段として使えるものとは思っていませんでした。 教えていただいた方法を試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問