Enum型使ってますか? 変数の状態を直感的に記述できていいですよね。
//// 武器 public enum Weapon { Sword, // 剣 Spear, // ヤリ Axe // オノ }
しかもインスペクターから設定できちゃう便利なヤツです。
public class EnumTest : MonoBehaviour { public Weapon MyWeapon; void Start () { } void Update () { } }
が、この状態であることをすると、大変なことになります。
Enumの定義内容を変えてみる
武器に「素手」を追加したくなりました。 素手はやっぱリストの最初にだろ、ということで、Enumの定義を以下のように変えてみます。
//// 武器 public enum Weapon { Sude, // 素手 !!! Sword, // 剣 Spear, // ヤリ Axe // オノ }
この状態で、再びインスペクターを見てみます。
なんと、勝手に素手になってしまいました!
これはEnumが内部的に整数値でデータを管理しているためです。 ”0”だったSwordが、Sudeを追加したせいでスライドして”1”になってしまったんですね。代わりに”0”のSudeが選択状態になってしまいました。
これは非常にやっかいで、プロジェクトのいたるところでEnumをシリアライズしている場合、ちょこっと定義を変えただけで、しっちゃかめっちゃかになってしまいます。
でもSudeは一番上に定義したい! というわがままな型は、定義に一工夫しましょう。
Enum規定値をオーバーライドする
Enumは値ごとに整数値を設定できます。 以下のように定義を変えてみましょう。
//// 武器 public enum Weapon { Sude = 3, // 素手 Sword = 0, // 剣 Spear = 1, // ヤリ Axe = 2 // オノ }
これだとSwordが0のままなので、シリアライズもそのままです。
イヤ俺はSudeを0にしたい! って方は、がんばってシリアライズされたデータを直してってくださいな。
気をつけること
Enum.GetValues.aspx)メソッドで取得した配列は、整数値の順番に並んでいます。
var values = System.Enum.GetValues (typeof(Weapon));
とすると、valuesの中身は Sword, Spear, Axe, Sudeの順に並んでいます。
ちょっと嫌ですな。解決方法が待たれるところである(他人事)。