Unityのインスペクター上で列挙型リストを動的に表示する


Dictionaryに追加されたKeyや要素をインスペクター上に"列挙型"として表示するためのスクリプトです。DictionaryはSeiralizeできないので、インスペクター上で内容を確認することはできません。

ただ内容を表示するだけならDebug.logで構わないのですが、要素にdelegate型等を指定して「keyに応じたなにかしらの動作のチェックを行いたい」場合、インスペクターにGUILayout.Buttonで全てのkeyを書くのは非常に大変です。
そこでDictionaryの内容を列挙型で取得できたら非常に便利なんじゃないかと組んでみました。

InspectorEnumPopup.cs

using System.Collections;
using System.Collections.Generic;
using System.Linq;

using UnityEngine;
using UnityEditor;

public class InspectorEnumPopup : MonoBehaviour
{
    public Dictionary<string, string> Dic = new Dictionary<string, string>();

    void Start()
    {
        Dic.Add("Hello", "こんにちわ");
        Dic.Add("Bye", "さようなら");
    }
}
#if UNITY_EDITOR
//CustomEditor
[CustomEditor(typeof(InspectorEnumPopup))]
public class InspectorEnumPopupCustom : Editor
{
    private string[] EnumList = new string[] { "None" };
    private int Idx = 0;

    private InspectorEnumPopup Content;

    public void EnumUpdate()
    {
        EnumList = Content.Dic.Keys.ToArray();
    }
    public override void OnInspectorGUI()
    {
        Content = target as InspectorEnumPopup;
        base.OnInspectorGUI();

        Idx = EditorGUILayout.Popup("List", Idx, EnumList);
        if (GUILayout.Button("Enum.Update"))
        {
            if (Application.isPlaying)
            {
                EnumUpdate();
            }
        }
        if (GUILayout.Button("Check Dictionary"))
        {
            if (Application.isPlaying)
            {
                Debug.Log("Key:" + EnumList[Idx] + " Element:" + Content.Dic[EnumList[Idx]]);
            }
        }
    }
}

#endif

ここではDictionaryの内容を表示しているだけですが、本来の目的はエディターでの動作確認を簡単にする為のスクリプトです。