ぐーるらいふ

底辺。

【Unity】いい感じにデータクラスをList表示したい【Inspector】

なんか連投です。
きっとこの後間が空きます!
時間とやる気があるときにやっとけ!って事ですね。

リスト表示したい

なんか簡単なマスタデータ的なデータ持ちたくて
でもcsvにするほどでも無くて、でも折角Unity使ってるんだからオシャレにリスト表示したい。

f:id:ghoul_life:20181029235212p:plain

こんな感じに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

上記のコードだけで画像のようなリスト表示が出来るようになる。便利~。