6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

実はあったSerializedDictionary

Last updated at Posted at 2023-06-30

SerializeできるDictionaryが欲しい、、、

Unityで開発している際に「DictionaryをSerializeしたいな」とか「DictionaryをJson化したいな」と思うことありますよね。(私はありました)
ただ、SerializeするにはGoogleで調べた限りPairをListで作ってSerializeDictionaryというようなクラスを自作で用意する必要がありそうでした。

実はあったSerializedDictionary(注意点有)

たまたま見つけたのですが、UnityEngine.RenderingSerializedDictonaryクラスがありました。(英語でも検索に出てこなかったのであまり使われないのでしょうか、、、?)

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

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?