こんにちは!エンジニアのオータケです!
今回はUnityで「乱数」をテーマに解説していきます!
例えばRPGなどで宝箱を開けた時に入っているお金の金額が毎回バラバラなんてことがあるかと思います。
これは乱数を発生させているから実現できている仕組みでもあります。
今回の記事を読んでいただくことでゲーム開発に必須の機能である乱数について学び実際の開発に活かすことができるようになります!
この記事では
・乱数について
・数値を取得する方法
・範囲で指定した数値を取得する方法
といった基本的な内容だけでなく
・プレイヤーの名前をランダムに決めたい場合
などの実践的・応用的な解説もしていきます!
これから一緒にマスターしていきましょう!
乱数(Random)とは?
乱数はわかりやすく一言で表せば「何が出るのかわからない数値」のことを表します。
例えば、サイコロを振って出た目だったり、トランプをシャッフルして1枚引いたときの数字だったりそういったものをイメージしていただくとわかりやすいかと思います。
そんな乱数をUnity上でも扱うことができ、ゲーム開発では必須の機能となります。
初期化の方法
まず乱数を使う際にUnityではInitStateというメソッドを使って初期化します。
Unityの乱数は完全にランダムな数値ではなくシード値を元に決められた数値を作り出す仕組みとなっています。
このシード値というものを設定するのがInitStateメソッドになります。
Random.InitState(58);
上記のコードの場合、58がシード値になります。
この数値を固定にすることで毎回同じ乱数の値を作り出すことが可能となります。
逆に、毎回同じ乱数にしたくない場合は可変のものをシード値とすると良いでしょう。
例えばアプリ(ゲーム)を起動した際の日時といったものがそれにあたります。
ランダムな数値を取得したい(Random.value)
乱数についての説明や初期化について説明してきましたがまず、基本的な使い方を紹介したいと思います。
int money = (int)(Random.value * 1000.0f);
今回は冒頭で触れたRPGの宝箱を開けた際にお金が入っていたというシチュエーションを想定しています。
int型変数moneyには宝箱を開けた際の金額がそのまま代入されます。
Randomクラスのvalueプロパティを呼び出すだけで乱数を取得することができます。
このプロパティを呼び出すたびに別の数値を取得します。
valueプロパティでは0.0f~1.0fの数値を取得するためそのままでは使えないことが多く、今回の場合は「宝箱の中のお金」をイメージしているので1000をかけてそれらしい金額にしています。
そして計算後int型にキャストしています。(valueプロパティはfloat型であるため)
範囲を指定して数値を取得したい(Random.Range)
先程のvalueプロパティを使った例で乱数について知ることができたと思いますが、先程の方法では場合によっては問題が出てくることもあります。
先程のvalueプロパティは0.0f~1.0fの範囲の数値を得るというものでした。
例えば、宝箱の中を開けたらお金が0ゴールド入っていたなんて場合がでてきます。
これが、ゲーム制作者の意図通りであれば問題ありませんが宝箱を開けた際に1ゴールド以上絶対に出てほしいという仕様の場合はゲームの不具合ということになってしまいます。
そんな時、取得したい数値の範囲を決め乱数を発生させるRangeメソッドというものがあるので早速使ってみましょう。
int money = (int)Random.Range(1.0f, 151.0f);
Rangeメソッドでは第一引数に発生する「最小の数値」を、第二引数には発生する「最大の数値+1」を指定します。
つまり、今回の場合は実際に乱数を発生させると1~150の範囲で乱数を発生させることができるようになります。
このようにすることで先程のような0ゴールドの宝箱といった状況はなくなります。
プレイヤーの名前をランダムで決めたい
では最後に乱数の実践編としてゲームでよくあるプレイヤーの名前をランダムで決めるという仕組みを作ってみたいと思います。
といってもそんなに難しくありません。
まずはコードを見てみましょう。
List<string> playerName = new List<string>(); playerName.Add("ジョン"); playerName.Add("カーン"); playerName.Add("ウォーレン"); int index = (int)Random.Range(0.0f, playerName.Count + 1); string yourName = playerName[index];
今回のサンプルではListを用いてあらかじめ名前をいくつか登録しておきます。
Listについては次の記事を見ていただくことで知ることができます!
6行目で早速Rangeメソッドを使っていますが、ここの最大値はListの要素数を指定しています。
こうしておかないと正しくListに登録済みのデータを引っ張ってこれない可能性がでてきます。
そして取得した値を変数indexに代入し、7行目でその値をplayerNameの要素番号の指定に使っています。
こうすることで登録済みの名前データから無作為に名前が選び出されるという仕組みが構築できました!
まとめ
いかがでしょうか!?
今回は乱数というゲーム開発で必須の知識について解説しました。
また、ゲームでよくある名前のランダム決定方法についてもソースコードを交えて解説しました。
乱数はゲーム開発でよく使うため使い方を忘れないようにしたいですね!