はじめに
列挙型の要素をランダムに取得したくなったのでメモ
コード
以下を実行することで、ランダムに列挙型の要素を取得できます。
using System; using UnityEngine; public class TestScript : MonoBehaviour { //列挙型の宣言 public enum TEST_TYPE { UP, DOWN, RIGHT, LEFT } //列挙型TEST_TYPEの変数testTypeを宣言 private TEST_TYPE testType; private void Start() { //1000回繰り返して確認 for (int i = 0; i < 1000; i++) { RandomTest(); Debug.Log(testType); } } private void RandomTest() { //enum型の要素数を取得 int maxCount = Enum.GetNames(typeof(TEST_TYPE)).Length; //ランダムな整数を取得 int number = UnityEngine.Random.Range(0, maxCount); //int型からenum型へ変換 testType = (TEST_TYPE)Enum.ToObject(typeof(TEST_TYPE), number); } }
実行結果
ランダムに要素が取得できていることがわかります。

ざっくり解説
ランダムに取得する肝の部分は、以下のコードになります。
内容はコメントのとおりです。
private void RandomTest() { //enum型の要素数を取得 int maxCount = Enum.GetNames(typeof(TEST_TYPE)).Length; //ランダムな整数を取得 int number = UnityEngine.Random.Range(0, maxCount); //int型からenum型へ変換 testType = (TEST_TYPE)Enum.ToObject(typeof(TEST_TYPE), number); }
列挙型の要素は特に指定しない場合、
設定した文字列に対しては、数字が0から順に割り当てられます。
//列挙型の宣言 public enum TEST_TYPE { UP = 0, DOWN = 1, RIGHT = 2, LEFT = 3 }
今回、これを利用してランダムな要素を取得しています。
1.列挙型の要素数を数える(今回は4)
2.列挙型の要素数の値を最大値としてランダムな数を取得
(最大値は4で設定されるため、0,1,2,3のいずれかの数字が生成される)
※ランダム関数 整数を返す場合は最大値が含まれない
3.取得した数字と対応する列挙型を取得
(2が生成された場合、2と対となる要素 RIGHTを取得)
おわりに
最初、列挙型が0から始まるのを忘れていて
ランダム関数の最大値を+1でコードを書いていました。
これをすると列挙型の範囲を超えるパターンがあるのですが、
エラーは発生しないのでバグを埋め込んだことに気付きにくいです。
気をつけてください〜。
//ランダムな整数を取得 int number = UnityEngine.Random.Range(0, maxCount+1);