【Unity】enumとは?定数に名前を付けたものを集めたデータ型

enum型とは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「enumってなに?」

「enumはどうやって使うの?」

というお悩みの方に向けた内容となっています。

Unityのプログラミング言語であるC#では、データ型の一つにenumというものがあります。

このenumとは、列挙型と呼ばれる名前の付いている定数を集めたデータ型になっています。

そして、enumを使うことで、例えば、ゲーム内で決まっているアイテムやプレイヤーのアクションなどをスクリプトの中で、名前で管理することができるようになります。

そこでこのページでは、Unityで使われるC#のenumというデータ型について、どういうものなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

enumとは?

まずは、enumがどういうデータ型なのかを紹介していきます。

列挙型と呼ばれる名前付きの定数の集合体

enumは、名前が付いている定数を集めたデータ型のことで、列挙型と呼ばれています。

そもそも名前が付いている定数というのは、変動することの無い決まっている値(定数)に対して、名前を付けて分かりやすくしているもののことです。

例えば、円周率(3.1415…)は変わることの無い値であり、数学などの計算で使う際はこれをπ(パイ)という記号や名称で書くことで、円周率であるということが分かりやすくなります。

このπ(パイ)のように、分かりやすく名前を付けた定数を複数で管理しているものが、enumというデータ型です。

例として、1月から12月のそれぞれの値に対して、名前を付けてenum型を定義しておくことで、次からは名前を書くだけでその月の値を取得したり表示したりすることができるようになります。

このように、enum複数の定数を管理している集合体のようなデータ型になっています。

スクリプト内で名前を使って管理できる

Unityでは、このenumを使うことで、値ではなく名前を使ってスクリプト内を分かりやすく管理することができます。

例えば、ゲーム内でのプレイヤーの行動として、「攻撃する」「防御する」「アイテムを使う」「逃げる」といった4つのアクションがあったとします。

この時に、プレイヤーが選択するint型の変数を作り、「0」「1」「2」「3」の値とそれぞれのアクションを紐づけておくことで、以下のようにゲーム内の処理を作ることができます。

ただし、これだとスクリプト内では数字だけの条件分岐となってしまうため、「0」がどのアクションなのかなどを覚えておかなければなりません。

そこで、enumを使ってそれぞれの値を定数として名前を付けてあげることで、ゲーム内の処理を作る際にこの名前を使って管理することができるようになります。

他にも、ゲームで使われる武器やアイテムなど変わることのないものに対して、enumを使って管理することで、スクリプトが分かりやすくなっていきます。

enumの基本的な使い方

ここからは、enumの基本的な使い方についてまとめていきます。

enum型を定義する

まず、enum型を定義する際は、以下のように型の名前を書いた後に、それぞれの定数に付けたい名前を「,」で区切りながら入力していきます。

enum 型の名前
{
定数の名前1,
定数の名前2,
定数の名前3
}

例えば、ここでは「EnumName」というenum型を作り、それぞれの定数の名前を以下のように付けていきます。

enum EnumName
{
Name0,
Name1,
Name2
}

enum型は、デフォルトではint型の定数が振られるようになっていて、特に指定されていない場合は、上から順番に「0」から始まる整数が自動的に入っていきます。

つまり、上記で言うと「0」「Name0」「1」「Name1」「2」「Name2」という名前で管理されていきます。

この定数の値を変えたい場合は、以下のようにそれぞれの名前に値を代入していくことで変えることができます。

enum EnumName
{
Name0 = 10,
Name1 = 99,
Name2 = 42
}

上記では、「10」「Name0」「99」「Name1」「42」「Name2」という名前になります。

enum型で定義した名前を使って値を取得する

enum型で定義した名前は、スクリプト内で「型の名前.定数の名前」と記述することで、値を取得することができます。

実際に、以下のようなスクリプトを作ってコンソールウィンドウに表示させてみます。

using UnityEngine;

public class Sample : MonoBehaviour
{
    // enum型を定義
    enum EnumName
    {
        Name0 = 10,
        Name1 = 99,
        Name2 = 42
    }

    void Start()
    {
        EnumName test = EnumName.Name0; // enum型の変数を宣言して初期化
        Debug.Log(test);
    }
}

6行目でenum型を定義していて、そして15行目でenum型の変数を宣言して、右辺で「EnumName.Name0」と記述して初期化しています。

プログラムを実行してみると、

上記のように定義した名前である「Name0」が表示されているのが分かります。

また、名前ではなく数値を表示させたい場合は、頭に(int)を付けて以下の16行目のようにint型に変換することで、定数の値を表示できます。

using UnityEngine;

public class Sample : MonoBehaviour
{
    // enum型を定義
    enum EnumName
    {
        Name0 = 10,
        Name1 = 99,
        Name2 = 42
    }

    void Start()
    {
        EnumName test = EnumName.Name0; // enum型の変数を宣言して初期化
        Debug.Log((int)test);   // enumで定義されているint型の定数に変換される
    }
}

switch文を使って処理を作る

enum型で定義する際に、一緒に使うことが多いのがswitch文if文などの条件分岐です。

実際にswitch文を使って、プレイヤーの行動アクションとして「攻撃する」「防御する」「アイテムを使う」「逃げる」という4つの選択処理を作ってみます。

以下のスクリプトを作成していきます。

using UnityEngine;

public class Sample : MonoBehaviour
{
    // enum型を定義
    enum Action
    {
        Attack,
        Defense,
        Item,
        Escape
    }

    Action action;  //  enum型の変数を宣言する
    bool isPushing = false; // キーを押したかどうかを判定する変数

    void Update()
    {
        KeyControl();
        PlayerAction();
    }

    // キー操作による変数への代入処理
    void KeyControl()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            action = Action.Attack; // action変数に代入処理
            isPushing = true;
        }
        else if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            action = Action.Defense; // action変数に代入処理
            isPushing = true;
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            action = Action.Item; // action変数に代入処理
            isPushing = true;
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            action = Action.Escape; // action変数に代入処理
            isPushing = true;
        }
    }

    // プレイヤーの処理
    void PlayerAction()
    {
        if (isPushing)
        {
            // switch文でそれぞれの値毎で処理を分けている
            switch (action)
            {
                case Action.Attack:
                    Debug.Log("攻撃する");
                    break;
                case Action.Defense:
                    Debug.Log("防御する");
                    break;
                case Action.Item:
                    Debug.Log("アイテムを使う");
                    break;
                case Action.Escape:
                    Debug.Log("逃げる");
                    break;
            }
            isPushing = false;
        }
    }
}

6行目で「Action」というenum型を定義して、その中で「Attack」「Defense」「Item」「Escape」という4つの名前を記述しておきます。

そして、14行目で定義したenum型の変数を宣言しておきます。

次に、PlayerActionというメソッドの中の54行目以降で、switch文を使って変数の値毎でそれぞれの処理を分けて記述しています。

あとは、行動アクションの選択方法として、ここではKeyControlというメソッドの26行目以降でキー操作によって、変数の値が変わるように処理を行っています。

実際にゲームを実行してみると、

それぞれのキーを押すことで、異なる処理を行うことができています。

まとめ

このページでは、UnityのC#で使えるenumというデータ型について、どういうものなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

enumとは、名前が付いている定数を集めたグループのようなもので、列挙型と呼ばれています。

このenumを使うことで、条件分岐などの際に値を使わずに指定した名前を使って分岐させることができるので、スクリプトを記述する際に分かりやすくなります。

enumは必ず使わなければならないものではないですが、直感的にスクリプトを記述することができるのでおすすめです。

最後までお読みいただきまして、ありがとうございました!

コメント