こんにちは、Unityエンジニアのオオバです。
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メソッドを使います。
SampleEnum[] result
= (SampleEnum[])Enum.GetValues(typeof(SampleEnum));
foreach(var value in result) Console.WriteLine(value);
// 出力 : Ne, Ushi, Tora
たった1行でEnumの全要素を配列に変換できます。
typeofで対象のEnum型を指定し、戻り値を目的の型にキャストするのがポイントです。
やってしまいがちなEnum加工の無駄な書き方
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);
}
一見動きそうですが、以下の無駄なコストが発生しています。
- Listの生成: 新しいリストを毎回newしている
- Enum.Parse処理: 文字列からEnumへの変換は内部で文字列比較が走る
- foreachループ: GetValuesなら不要な処理
GetValuesを使えばこの3つのコストがすべて不要になります。
パフォーマンスの観点でも、コードの可読性の観点でもGetValues一択です。
GetValuesとGetNamesの使い分け
EnumにはGetValuesとGetNamesという似た名前のメソッドがあります。
混同しやすいので違いを整理しておきましょう。
| メソッド | 戻り値 | 用途 |
|---|---|---|
Enum.GetValues(typeof(T)) | Enum型の配列(Array) | 値そのものを使いたいとき |
Enum.GetNames(typeof(T)) | string型の配列 | 名前の文字列を使いたいとき |
値として処理するならGetValues、文字列として表示するならGetNames と覚えておけばOKです。
たとえばUI上にEnum名をテキストとして並べたい場合はGetNamesが適しています。
一方、ゲームロジックでEnumの値をループ処理する場合はGetValuesを使います。
受け取る型で挙動が変わる点に注意
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, Allの5つが返ります。
Allは複合値ですが、Enumの定義として存在するため配列に含まれます。
ビットフラグとして個別の値だけを取り出したい場合は、0と複合値を除外するフィルタリングが必要です。
var flags = ((Permission[])Enum.GetValues(typeof(Permission)))
.Where(p => p != Permission.None && IsPowerOfTwo((int)p))
.ToArray();
ビットフラグ型Enumを扱う場合は、この点を意識しておきましょう。
まとめ
Enumの値を配列で取得するにはEnum.GetValuesを使いましょう。
GetNamesとGetValuesの違い、受け取る型による挙動の変化を理解しておけば、Enumの操作で困ることはなくなります。
- 値として使うなら
GetValues - 文字列として使うなら
GetNames - 受け取る型(var / int)で挙動が変わる点に注意
Enumはシンプルな型ですが、正しく使いこなすことでコードの品質とメンテナンス性が向上します。
C#の基本をしっかり押さえたい方はこちらの記事も参考にしてみてください。
👉 【Unity】LINQとfor文の負荷検証どっちを使うべき?

筆者のXをフォローしよう
Unityオブジェクトの描画順の制御って難しいですよね。
この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。
Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
→ Unity描画順の教科書
最後まで読んでいただきありがとうございました!
すばらしいC#ライフをお過ごしください。









