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があります。