SerializeできるDictionaryが欲しい、、、
Unityで開発している際に「DictionaryをSerializeしたいな」とか「DictionaryをJson化したいな」と思うことありますよね。(私はありました)
ただ、SerializeするにはGoogleで調べた限りPairをListで作ってSerializeDictionaryというようなクラスを自作で用意する必要がありそうでした。
実はあったSerializedDictionary(注意点有)
たまたま見つけたのですが、UnityEngine.RenderingにSerializedDictonaryクラスがありました。(英語でも検索に出てこなかったのであまり使われないのでしょうか、、、?)
Unity can't serialize Dictionary so here's a custom wrapper that does. Note that you have to extend it before it can be serialized as Unity won't serialized generic-based types either.
SerializeできるようにWrapしてあると書いてあります。
ただしSerializeFieldを付けただけだとInspectorには表示されますが編集ができません、、、
内部に2つのリストを持っていてInspectorに2つ表示されますが、片方を編集したタイミングでOnBeforeSerializeが呼ばれてしまうので、もう片方のリストがnullだよと怒られます。
PropertyDrawer使えば対応できると思います(多分
使い方
// シリアライズ化
//note: Inspectorには表示されるが編集ができない為、Editor拡張を作る必要有
[SerializeField]
SerializedDictionary<ulong, string> serializedDictionary;
// Json化は渡すだけでOK
var json = JsonUtility.ToJson(serializedDictionary);
serializedDictionary = JsonUtility.FromJson(json);
SerializeFieldを付けてInspectorに表示できますしJsonにもできます。
また既存のDictionaryを変更したい場合も、内部でDictionaryを継承しているのでSerializedDictionaryに変更するだけでOKです。
おわりに
2023/07/01 誤字を修正
速度については検証しきれてません。ただサクッと少量のDictionaryをSerializeするには何も導入する必要がないので有用なのではないでしょうか。
Unity/C#といえばこの方の記事にもSerializableDictonaryがあります。