Unity enum(列挙型)の基本的な使い方と注意点について

C#

はじめに

enum(列挙型)は、複数の定数をひとまとめの集合として定義するための機能です。
enumを使用することで定数をわかりやすく管理できますが、使っている中で注意点があることにも気づきました。ネット上の記事だとあまり注意点が記載されていないため、そのあたりも個人用としてまとめておきます。

本記事ではenumの基本的な使い方、サンプルコード、enum使用時の注意点についてまとめます。

enumの特徴

・複数の定数を一つの型にして管理できる
・定義した型に共通の処理を定義できる

簡単にいうと定数をひとまとめにして管理できる!ということです。

enumの定義方法

enumを使用する場合は以下の方法で定義します。

定義方法1

public enum Type
{
    Chair,
    Key,
}

上記のように定義すると、Chairには0、Keyには1が自動的に割り当てられます。
コードにカーソルを合わせるとどのような状態で設定されているか確認可能です。

定義方法2

また以下のようにも定義でき、自分で番号を割り振ることも可能です。
私は個人的にこちらの定義方法しか使わないようにしています。
後述の「enumの注意点」で理由は記載します。

public enum Type
{
    Chair = 10,
    Key = 20,
}

enumの使用方法

以下のように使用することができます。

コード例

アイテム管理クラス

using System;
using UnityEngine;

//アイテムを管理するクラス
public class Item
{
    //種類
    public enum Type
    {
        Chair,
        Key,
    }
}

アイテムチェッククラス

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemCheck : MonoBehaviour
{
    //アイテムタイプ用の変数を宣言
    [SerializeField] Item.Type SelectItem;

    void Start()
    {
        IsSelectKey();
    }

    //Keyを選択中か判定する
    public void IsSelectKey()
    {
        if(SelectItem == Item.Type.Key)
        {
            Debug.Log("いまはキーがセットされています。");
        }
    }
}

アイテムチェッククラスを任意のGameObjectにアタッチし、
SelectItemをKeyに設定した状態で実行すると以下のような実行結果が得られます。

Unity側の設定

実行結果

いまはキーがセットされています。

enumの注意点

前述の定義方法で記載したとおり、
enumは定義した要素に0,1,2,・・・と自動で数値を割り振ってくれるので便利です。
しかし、たとえば要素と要素の間に別の要素を追加した場合どうなるでしょうか?

要素追加前の状態

using System;
using UnityEngine;

public class Item
{
    //種類
    public enum Type
    {
        Chair,
        Key,
    }
}

要素追加後の状態

using System;
using UnityEngine;

public class Item
{
    //種類
    public enum Type
    {
        Chair,
        Apple,  //←ChairとKeyの間に要素を追加
        Key,
    }
}

SelectedItemがKeyで設定していた箇所がAppleに変わってしまいました。
Chairが0、Keyが1で設定されていたところにAppleが追加されたことによって、
Chairが0、Appleが1、Keyが2となってしまい、
要素追加前のKeyは1でしたが、要素追加後の1はAppleになってしまったことによるものです。

要素が少ない場合は対応できるかもしれませんが、
例えば要素が100個あったらどうでしょうか?対応がとても大変ですよね?

解決方法

割り振られる番号がずれてしまうのが問題なので、
前述の「定義方法2」で要素を定義するだけで解決できます。
この定義方法では自分で番号を割り振れるのでずれることがありません。

コード例

using System;
using UnityEngine;

public class Item
{
    //種類
    public enum Type
    {
        Chair = 10,
        Apple = 20,  //←それぞれの要素に自分で番号を割り振る
        Key   = 30,
    }
}

上記のように自分で番号を割り振っていれば問題は発生しません。
enumの定番の罠ですので注意しましょう。
※私も上記の罠を食らい、20個ぐらい1つずつ修正することになったことがあります(´;ω;`)

まとめ

注意点に記載した罠にさえ引っかからなければenumはとても便利な機能です。
ゲーム開発ではかなりの数の定数が出てくることが多いですので、
未来でメンテする自分のためにも積極的に使用し、わかりやすいコードとなるよう心がけましょう。

参考記事

enumについて - Qiita
##enumとは列挙型。列挙クラス。内部的には、java.lang.Enumクラスを継承したクラス。^1なお、enumについては書籍『Effective Java』の第6章が詳しい。著者のJ…
タイトルとURLをコピーしました