Lucid Randomとは
「Lucid Random」は、UnityのRandomクラスを拡張したLucidRandomクラス、インスタンス可能なRandomGeneratorクラス、最小値・最大値を扱う構造体、重み付きの要素を扱うWeightedListクラスなど、乱数を扱う上で便利な機能を提供します。
基本的には、UnityEngine.Randomクラスと同じように使用できます。
//0.0fから10.0fまでの値をランダムに取得
float value = LucidRandom.Range(0f, 10f);
//ランダムな色を取得
Color color = LucidRandom.ColorHSV();
インスタンス化して使用できるRandomGeneratorクラスも用意されているため、乱数の再現を行いたい場合に便利です。
int seed = 0;
//引数でシード値を指定する
RandomGenerator rand = new RandomGenerator(seed);
//LucidRandomクラスと同じメソッドやプロパティが利用可能
float value1 = rand.value;
float value2 = rand.value;
float value3 = rand.value;
また、重み付きの抽選を行うクラスも用意されています。例えばアイテムの抽選を行いたいとき、全てのアイテムが同じ確率で出現してしまっては面白くありません。当然、アイテムのレア度などに応じた確率を設定する必要があるでしょう。
このような抽選を実装する場合には、WeightedListクラスを利用します。
WeightedList<string> weightedList = new WeightedList<string>();
//重み付きの要素を追加
weightedList.Add("Legendary", 0.5f);
weightedList.Add("Epic", 2.5f);
weightedList.Add("Rare", 12f);
weightedList.Add("Uncommon", 25f);
weightedList.Add("Common", 60f);
//重みを編集
weightedList[4].weight = 50f;
weightedList["Uncommon"] = 35f;
//抽選を行う
string rarity = weightedList.RandomElement();
また、WeightedListはInspector上で編集可能です。
その他にも最大値・最小値を扱う構造体や、配列用の拡張メソッドなどが用意されています。
乱数の実装について
乱数の実装については、内部でUnityEngine.Randomを使用する形になっています。
ただし、UnityのRandomクラスはインスタンス化ができないので、複数の乱数を運用するには向いていません。そこで、Randomクラスをオブジェクトとして扱えるようにし、様々な機能を追加したのがRandomGeneratorクラスです。
Random.State prevState = Random.state;
Random.state = state;
float result = Random.Range(min, max);
state = Random.state;
Random.state = prevState;
こんな感じで直前の状態を保存しておくことで、乱数を独立して運用させています。
乱数の生成ごと自作してもよかったのですが、下手に素人が作るよりもUnity標準のクラスを使った方が確実だなと思ったので、こんな感じの実装になりました。UnityのRandomは結構性能良いらしいし。
なかなか便利なものができたと思っているので、是非使ってみてください!
(一応自分でもチェックはしていますが、もし不具合などがあるようでしたら教えていただけるとありがたいです。すぐに直します。)


コメント
コメントを投稿