より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

UnityのSerializableFieldで連想配列(Dictinary)を扱いたい

結論から言うとDictionaryに対してSerializableFieldAttributeを宣言してもInspectorでは設定できません。

そのままではできないので

  1. Key,Valueの形のクラスを宣言しておく
  2. これをリスト形式で保持して、Inspectorから設定できるようにする
  3. 取得時に連想配列に変換

みたいな形で扱うと良さそうです。

    [Serializable]
    public class SerializableKeyPair<TKey, TValue>
    {
        [SerializeField] private TKey key;
        [SerializeField] private TValue value;

        public TKey Key => key;
        public TValue Value => value;
    }

ジェネリックって複数の型に対しても扱えるんですね。

        [SerializeField] private SerializableKeyPair<bool,Sprite>[] _menuSprites = default;
        private Dictionary<bool,Sprite> _menuSpritesDictionary;
        private Dictionary<bool,Sprite> MenuSpritesDictionary => _menuSpritesDictionary ??= _menuSprites.ToDictionary(p => p.Key, p => p.Value);