【Unity】いい感じにデータクラスをList表示したい【Inspector】
なんか連投です。
きっとこの後間が空きます!
時間とやる気があるときにやっとけ!って事ですね。
リスト表示したい
なんか簡単なマスタデータ的なデータ持ちたくて
でもcsvにするほどでも無くて、でも折角Unity使ってるんだからオシャレにリスト表示したい。
こんな感じにInspectorを活用したい。
調べればすぐ出てくるかもしれないけど、自分でもメモっておく。
PropertyDrawerとReordableList
ソースから。Dataクラスをリスト表示する最小限な構成を紹介
using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] // <- これが大事。忘れずに public class Data { public int _id; public string _name; public DataList.DataActionType _actionType; }
using UnityEngine; // GameObjectに付けるのはこれ。 public class DataList : MonoBehaviour { public enum DataActionType { NONE, TYPE1, TYPE2, TYPE3 } [SerializeField] Data[] _dataList; }
以下はEditor拡張だ。
// Project/Editorの下に配置でもOK #if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(Data))] // DataクラスのInspector表示をカスタム public class DataPropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 表示幅 float[] widthes = { position.width * 0.2f, position.width * 0.5f, position.width * 0.3f }; if (property != null) { position.width = widthes[0]; EditorGUI.PropertyField(position, property.FindPropertyRelative("_id"), GUIContent.none); // フィールド名を指定 position.x += position.width; position.width = widthes[1]; EditorGUI.PropertyField(position, property.FindPropertyRelative("_name"), GUIContent.none); position.x += position.width; position.width = widthes[2]; EditorGUI.PropertyField(position, property.FindPropertyRelative("_actionType"), GUIContent.none); } } } #endif
// Project/Editorの下に配置でもOK #if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditorInternal; [CustomEditor(typeof(DataList))] public class DataListEditor : Editor { private ReorderableList _reorderableList; // ReorderableListを利用して、並び替えや+-ボタンを使えるようにする void OnEnable() { _reorderableList = new ReorderableList(serializedObject, serializedObject.FindProperty("_dataList")); _reorderableList.drawElementCallback += (Rect rect, int index, bool selected, bool focused) => { SerializedProperty property = _reorderableList.serializedProperty.GetArrayElementAtIndex(index); // PropertyFieldを使ってよしなにプロパティの描画を行う(PropertyDrawerを使っているのでそちらに移譲されます) EditorGUI.PropertyField(rect, property, GUIContent.none); }; _reorderableList.drawHeaderCallback += rect => { EditorGUI.LabelField(rect, "id | name | action type"); }; } public override void OnInspectorGUI() { _reorderableList.DoLayoutList(); serializedObject.ApplyModifiedProperties(); } } #endif
これだけでOK
上記のコードだけで画像のようなリスト表示が出来るようになる。便利~。