見出し画像

5-4 enum(列挙型)の基礎知識

enum(列挙型)は、あらかじめ決められた複数の状態や、特定の値の集合を管理する際に便利な型です。
例えばゲーム中のモードや、プレイヤーの状態の判別をわかりやすく整理できます。
他にもバフやデバフの定義、難易度の定義といったまとまりを定義する様々な場面で利用できます。


enumの宣言

このように定義することで、ゲームの各モードを状態として管理できます。
以下の例では、ボードゲームの状態を定義しています。

// ゲーム中のモードを定義
enum GameMode
{
    Init, // ゲーム開始前に1度だけ呼ばれる初期化
    SelectUnit, // ユニットを選択中
    Menu, // メニューを開いている時
    Result // 勝敗表示
}

GameMode

enumの変数名です、自由に命名できます。
本講座では、単語の先頭を大文字にする(アッパーキャメル)という書き方を推奨しています。

Init SelectUnit Menu Result

列挙型のキーの一覧です。
こちらも「,」カンマ区切りで自由に命名できます。
各キーには整数が割り当てられていて、キーはそれに名前をつけているようなイメージです(定数と同様のイメージ)
通常は、先頭のキーから0,1,2,3…と自動的に割り当てられます。

宣言と代入

enum(GameMode)型は以下のように宣言します。

using UnityEngine;

public class EnumController : MonoBehaviour
{
    // ゲーム中のモード
    enum GameMode
    {
        Init,   // ゲーム初期化
        SelectUnit, // ユニットを選択
        Menu,   // メニューを開いている
        Result  // 勝敗表示
    }
    
    // ゲームモード型の変数
    GameMode mode;
    
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {

    }

enumは以下のように代入します。

    void Start()
    {
        // 最初のモード
        mode = GameMode.Init;
    }

enumで定義した名前が型になります
変数mode
には、enumで定義した値しか代入することができません。

enumの利用例

例えば、プレイヤーがゲーム中に異なるモードを移行する際
enumを使うと分かりやすく管理できます。

    void Start()
    {
        // 最初のモード
        mode = GameMode.Init;
    }

    // Update is called once per frame
    void Update()
    {
        // モードによって処理を分ける
        if (mode == GameMode.Init)
        {
            Debug.Log("初期化");
        }
        else if (mode == GameMode.Menu)
        {
            Debug.Log("メニュー表示");
            mode = GameMode.SelectUnit;
        }
        else if (mode == GameMode.Result)
        {
            Debug.Log("勝敗表示");
        }
    }

以下のenumを使わない例と比べると、コードを読みやすく、分かりやすくすることができました。

    void Start()
    {
        // 最初のモード
        mode = 0;
    }

    // Update is called once per frame
    void Update()
    {
        // モードによって処理を分ける
        if (mode == 0)
        {
            Debug.Log("初期化");
        }
        else if (mode == 2)
        {
            Debug.Log("メニュー表示");
            mode = 1;
        }
        else if (mode == 3)
        {
            Debug.Log("勝敗表示");
        }
    }

拡張性

途中に足したり引いたりできるので拡張性に優れています。
SelectUnitとMenuの間にPauseを追加しました。
この場合Menu以下のキーの番号が自動的に振り直されます。

    // ゲーム中のモード
    enum GameMode
    {
        Init,   // ゲーム初期化
        SelectUnit, // ユニットを選択
        Pause, // ポーズ中
        Menu,   // メニューを開いている
        Result  // 勝敗表示
    }

数値の指定

明示的に数値を指定することも可能です。
本講座では使いませんのでそんな機能があるんだな〜程度におぼえておいてもらえれば大丈夫です。

public enum GameMode
{
    Init = 100,
    SelectUnit, // 101になる
    Pause = 1000,
    Menu, // 1001になる
    Result // 1002になる
}

まとめ

enumを使うことで、ゲームの状態管理が整理され、コードが読みやすくなります。
メニューやゲームモードの遷移など、複数の固定された状態を扱う場面で特に有効です。
それでは次のセクションにすすみましょう!

この記事が気に入ったらサポートをしてみませんか?