Enumを使ってゲーム中の状態をわかりやすく管理しよう
今回はプログラミングの話です。
ゲームプログラミングをしてると、ゲーム中の「状態」の管理が必要となる場面が多く登場します。
ここで言う「状態」とは、例えばゲームの進行ステータスや、
(タイトル画面、ゲームスタート前、ステージ進行中、ゲームオーバー、コンティニュー画面など)
プレイヤーのステータスを表す意味でとらえていただけると判りやすいでしょう。
(右を向いている、左を向いている、毒、麻痺、石化、などなど)
このようなゲーム中の状態をプログラムで管理する際には、通常であれば状態管理用の変数を作成するかもしれません。
もちろん、何かの値を管理するために変数を使用することは極めて一般的なことですので、決して間違ってはいません。
しかし場合によっては、変数に代入される値の管理が煩雑になりがちです。
例えば次のコードを見てください。
using UnityEngine;
public class Sample : MonoBehaviour {
int season = 2;
void Start() {
switch (season) {
case 0:
Debug.Log("春");
break;
case 1:
Debug.Log("夏");
break;
case 2:
Debug.Log("秋");
break;
case 3:
Debug.Log("冬");
break;
}
}
}
出力結果は「秋」です。
変数seasonに代入する値で四季の場合分けをしていますが、これには次のような課題があります。
・seasonには0~3以外の値を代入することも可能である。
・下図のように数値と値の対応を管理する必要がある
| 0 | 春 |
| 1 | 夏 |
| 2 | 秋 |
| 3 | 冬 |
範囲外の値が代入できてしまうと予期せぬ動作を招きかねないでしょうし、「0が春」というのもコードを書いた人以外には直感的ではありません。このケースでは値が4つだけなので把握しやすいですが、パターンや変数が増えるほど管理が複雑になることは容易に想像できます。
そこでお勧めしたいのが、Enum(イーナム)という仕組みです。
Enum(列挙型)とは
基本的には月や曜日など、特定の値しかとらないデータを表現する際に使用します。
Enumの宣言にはenumキーワードを使用します。識別子は慣例的にアッパーケースです。
using UnityEngine;
public class Sample : MonoBehaviour {
public enum Season{
Spring,
Summer,
Autumn,
Winter
}
}
宣言したEnumは、変数を宣言する際のデータ型として使用できます。
Season season2;
そして、Enum型の変数への代入は、元となるEnumから呼び出した値の代入に制限されます。(int型などは代入できない)
void Start() {
season2 = Season.Winter;
}
それでは試しに最初のコードをEnumを使用して書き直してみましょう。
using UnityEngine;
public class Sample : MonoBehaviour {
public enum Season {
Spring,
Summer,
Autumn,
Winter
}
Season season2 = Season.Winter;
void Start() {
season2 = Season.Winter;
switch (season2) {
case Season.Spring:
Debug.Log("春");
break;
case Season.Summer:
Debug.Log("夏");
break;
case Season.Autumn:
Debug.Log("秋");
break;
case Season.Winter:
Debug.Log("冬");
break;
}
}
}
このコードでは先ほど問題とされていた2つの課題が両方ともクリアされます。
・seasonには0~3以外の値を代入することも可能である → EnumのSeasonから呼び出せる値しか代入できなくなった
・数値と値の対応を管理する必要がある → Enum宣言時に取り得る値が列挙されているためソースコード上で直感的に認識できる
このように、Enumを使用することでソースコードの可読性や保守性を向上することができます。
機会があればぜひ使ってみてください。
ちなみに、少し突っ込んだ話ですが、Enum型の内部的な値はデフォルトではint型で管理されています。
したがってEnumとは数値だとわかりずらい値に名前を付けることができるイメージが近いかもしれません。
Enumとintの間で型変換をしたりもできますので、気になる方はさらにEnumについて調べてみると良いでしょう。