いんでぃーづ

ゲームいろいろ、いろいろ自由

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

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

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


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。