なにこれ?
こんなコードを書いて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
よりは十分に早いです。
(が、高速化は専門じゃないのでもっと良い方法あれば教えてください。)