こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Enumの全要素を配列で取得したい
  • GetValuesとGetNamesどっちを使うべき?
  • Enumをループで回す方法がわからない
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Enumの操作はGetValuesとGetNamesを理解すれば困らない

    Enumはゲーム開発で頻繁に使う型です。
    アイテム種別やステータス、UIの状態管理など、あらゆる場面で登場します。

    この記事ではEnumの値を配列として取得する方法から、やりがちな無駄な書き方、そしてUnityでの実践的な活用パターンまで解説します。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    GetValuesでEnumの値を配列で取得する

    Enumに定義した全ての値を配列で取得したいケースはよくあります。
    たとえば次のようなEnumがあるとしましょう。

    enum SampleEnum  
    {
        Ne = 0, Ushi = 1, Tora = 2  
    }
    

    このNe, Ushi, Toraを配列で取得するには、Enum.GetValuesメソッドを使います。

    【C#】Enumの値を配列で取得する方法と実践的な使い方まとめ_0

    SampleEnum[] result  
        = (SampleEnum[])Enum.GetValues(typeof(SampleEnum));  
    
    foreach(var value in result) Console.WriteLine(value);  
    // 出力 :  Ne, Ushi, Tora  
    

    たった1行でEnumの全要素を配列に変換できます。
    typeofで対象のEnum型を指定し、戻り値を目的の型にキャストするのがポイントです。

    やってしまいがちなEnum加工の無駄な書き方

    【C#】Enumの値を配列で取得する方法と実践的な使い方まとめ_1

    GetValuesを知らないと、つい以下のような書き方をしてしまいます。

    // 1.GetNamesで文字列の配列を取得  
    var enumNames = Enum.GetNames(typeof(SampleEnum));  
    var result = new List<SampleEnum>();  
    foreach (var enumName in enumNames)  
    {
        // 2.ParseしてEnumとして取り出しリスト追加  
        var value = (SampleEnum)Enum.Parse(typeof(SampleEnum), enumName);  
        result.Add(value);  
    }
    

    一見動きそうですが、以下の無駄なコストが発生しています。

    GetValuesを使えばこの3つのコストがすべて不要になります。
    パフォーマンスの観点でも、コードの可読性の観点でもGetValues一択です。

    GetValuesとGetNamesの使い分け

    EnumにはGetValuesGetNamesという似た名前のメソッドがあります。
    混同しやすいので違いを整理しておきましょう。

    GetValuesとGetNamesの比較
    メソッド戻り値用途
    Enum.GetValues(typeof(T))Enum型の配列(Array)値そのものを使いたいとき
    Enum.GetNames(typeof(T))string型の配列名前の文字列を使いたいとき

    値として処理するならGetValues、文字列として表示するならGetNames と覚えておけばOKです。

    たとえばUI上にEnum名をテキストとして並べたい場合はGetNamesが適しています。
    一方、ゲームロジックでEnumの値をループ処理する場合はGetValuesを使います。

    受け取る型で挙動が変わる点に注意

    【C#】Enumの値を配列で取得する方法と実践的な使い方まとめ_2

    GetValuesで取得した配列をforeachで回す際、受け取る変数の型によって挙動が変わります。
    これを知らないと意図しない結果になるため注意が必要です。

    varで受け取るとEnum型

    foreachの型をvarで宣言すると、格納される値はEnum型(この場合SampleEnum型)になります。

    ※文字列ではない
    var values = Enum.GetValues(typeof(SampleEnum));  
    // 「var」で受け取るとEnum型で取得  
    foreach (var v in values) Debug.Log(v);  
    // Ne, Ushi, Toraと出力される  
    

    int型で受け取るとint値

    int型で受け取ると暗黙的にキャストされてint型で取得できます。

    var values = Enum.GetValues(typeof(SampleEnum));  
    // 「int型」で受け取るとint型で取得  
    foreach (int v in values) Debug.Log(v);  
    // 0, 1, 2と出力される  
    

    この挙動を活かせば、Enum値とint値を1つのループで同時に扱えます。
    明示的なキャストなしで型が変わる仕組みなので、コードレビュー時に見落とさないよう注意しましょう。

    UnityでのEnum活用パターン

    Enumの配列取得はUnity開発で多くの場面で役立ちます。実践的な活用パターンをいくつか紹介します。

    エディタ拡張でのドロップダウン生成

    エディタ拡張でEnum選択のドロップダウンを動的に生成する場合、GetNamesが便利です。

    string[] names = Enum.GetNames(typeof(ItemType));  
    int selected = EditorGUILayout.Popup("アイテム種別", currentIndex, names);  
    

    Enumに新しい値を追加しても、ドロップダウンの選択肢が自動で増えます。ハードコーディングの文字列配列を手動で管理する必要がなくなるため、メンテナンスコストが大幅に下がります。

    全Enum値に対する初期化処理

    ゲーム開始時にEnumの全要素に対して初期値を設定したいケースです。

    var statTypes = (StatType[])Enum.GetValues(typeof(StatType));  
    foreach (var stat in statTypes)  
    {
        _statDict[stat] = 0;  
    }
    

    Dictionaryの初期化やデータテーブルの構築で頻繁に使うパターンです。
    Enumに値を追加するだけで初期化対象も自動的に増えるため、追加忘れによるバグを防げます。

    👉 【Unity】Dictionaryの使い方!ゲーム開発に便利!

    Enumの要素数を取得する

    Enumの要素数が必要な場面では、配列のLengthを使います。

    int count = Enum.GetValues(typeof(SampleEnum)).Length;  
    // count = 3  
    

    配列サイズの指定やループ回数の制御に使えます。

    Flags属性付きEnumでの注意点

    [Flags]属性を付けたビットフラグ型のEnumでは、GetValuesの挙動に注意が必要です。

    [Flags]  
    enum Permission  
    {
        None = 0,  
        Read = 1,  
        Write = 2,  
        Execute = 4,  
        All = Read | Write | Execute // 7  
    }
    

    GetValuesを呼ぶとNone, Read, Write, Execute, All5つが返ります。
    Allは複合値ですが、Enumの定義として存在するため配列に含まれます。

    ビットフラグとして個別の値だけを取り出したい場合は、0と複合値を除外するフィルタリングが必要です。

    var flags = ((Permission[])Enum.GetValues(typeof(Permission)))  
        .Where(p => p != Permission.None && IsPowerOfTwo((int)p))  
        .ToArray();  
    

    ビットフラグ型Enumを扱う場合は、この点を意識しておきましょう。

    まとめ

    Enumの値を配列で取得するにはEnum.GetValuesを使いましょう。
    GetNamesGetValuesの違い、受け取る型による挙動の変化を理解しておけば、Enumの操作で困ることはなくなります。

    Enumはシンプルな型ですが、正しく使いこなすことでコードの品質とメンテナンス性が向上します。

    C#の基本をしっかり押さえたい方はこちらの記事も参考にしてみてください。

    👉 【Unity】LINQとfor文の負荷検証どっちを使うべき?

    Unityオブジェクトの描画順の制御って難しいですよね。
    この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。

    Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
    Unity描画順の教科書

    最後まで読んでいただきありがとうございました!
    すばらしいC#ライフをお過ごしください。

    オススメ記事