もんりぃ is undefined.

育児ネタとか、技術ネタとか。

Unity Case-Study / シリアライズ可能でインスペクタから操作可能な Dictionary を扱いたい

What

  • 以下の要件を満たした Dictionary 的なフィールドを宣言したい!
    • シリアライズ可能
    • インスペクタで操作可能
    • キーと値の型を定義可能

Why

  • Unity の仕様上、 List<T> は OK ですが Dictionary<TKey, TValue> は NG です。
    • リアライザの仕組み上仕方ないらしいのですが、詳しいことは他の方の記事に譲りますw
  • そこで、別の切り口から代替案を考えてみました。

How

  • SerializablestructList を作ります!

f:id:monry84:20170817030220p:plain

  • そうすると、上記の画像のように、要件を満たした Dictionary もどきが実現できます!
    • Fuga List の方が Dictionary もどきになります。
  • ポイントは struct[Serializable] 属性をつける所です。
    • これがないとシリアライズできませんし、インスペクタから操作もできません。
  • struct 内部のフィールドに属性をつけてあげれば通常のインスペクタ拡張と同じ機能が利用できます。
    • この例だと [Range(1, 10)] が該当します。
  • 都度 struct を宣言する必要があるので、ちょっとシンドイですが。
  • 勿論、 ISerializationCallbackReceiver を実装するという素直な手もありますが、それはそれでインスペクタの拡張などが結構大変かなぁ…と。
  • なお、 structシリアライズ出来るようになった Unity は割と最近のバージョンなのでご注意ください。
    • 私は Unity 2017.1.0f3 で動作確認を行っております。