Enumを簡単にStringとしてシリアライズできるパッケージ作りました

github.com

なにこれ?

こんなコードを書いてEnumをシリアライズすると、
.unityや.prefabを見ればわかるように、内部的には0, 1, 2というintの値として保存されます。

つまり、Enumの途中に値を追加/削除すると意図しない指定の変更が起きてしまいます。

↓ "One" を指定していたはずなのに!

正攻法としては、ちゃんと手動で数値を振るということになるのですが、
Unityのシリアライザーのためにこの作業が必要になるのが気に食わない。(個人の主観です。)

ということで、Stringとしてシリアライズしてくれるパッケージを作りました。

使い方

  • UnityPackageManagerで https://github.com/kyubuns/StringSerializableEnum.git?path=Unity/Assets/StringSerializableEnum をインストール。
  • StringとしてシリアライズしたいEnumに [StringSerializable] をつける。
  • StringSerializable{Enum名} という型が自動生成されるので、それをシリアライズしてお使いください。

見た目は変わらず。でもズレない!

差分も見やすくて嬉しい。

Q&A

じゃあ名前を変更すると?

Inspectorではエラー表示になり、このまま実行するとランタイムで例外を吐きます。

Enumの名前が変わるのと数値が変わるの、同じぐらいのリスクじゃない?

ぶっちゃけ同じだと思ってます。ただの思想の問題。
やろうと思えば静的にチェックもできるので少しだけ嬉しいかも?

StringとEnumの変換遅くない?

以下のようにswitchに展開してるので Enum.TryParse よりは十分に早いです。
(が、高速化は専門じゃないのでもっと良い方法あれば教えてください。)