読者です 読者をやめる 読者になる 読者になる

いんでぃーづ

個人でゲーム開発してる上で吸収したモノたち紹介。UnityからGIMPまでなんでも。デザインとかゲーム論まで語っちゃうよ的なアレ。

MENU
{スポンサーリンク}

Unity : Enum型をシリアライズ保存するときのコツ

C# Tips

Enum型使ってますか? 変数の状態を直感的に記述できていいですよね。

//// 武器
public enum Weapon {
    Sword,    // 剣
    Spear,    // ヤリ
    Axe        // オノ
}

しかもインスペクターから設定できちゃう便利なヤツです。

public class EnumTest : MonoBehaviour {

    public Weapon MyWeapon;

    void Start () {

    }

    void Update () {

    }
}

f:id:sugar_affordance:20160627222348p:plain:w400

が、この状態であることをすると、大変なことになります。

Enumの定義内容を変えてみる

武器に「素手」を追加したくなりました。 素手はやっぱリストの最初にだろ、ということで、Enumの定義を以下のように変えてみます。

//// 武器
public enum Weapon {
    Sude,    // 素手 !!!
    Sword,    // 剣
    Spear,    // ヤリ
    Axe        // オノ
}

この状態で、再びインスペクターを見てみます。

f:id:sugar_affordance:20160627222353p:plain:w400

なんと、勝手に素手になってしまいました!

これは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の順に並んでいます。

ちょっと嫌ですな。解決方法が待たれるところである(他人事)。

Amazon.co.jpアソシエイト