【Unity連載】ランダムな要素の作成には乱数を使おう


ランダムな要素の作成には乱数を使おう


ゲームではしばしばランダムな要素が登場します。
サイコロの結果、敵からドロップするアイテムの種類、攻撃の回避判定など、例を挙げるときりがありません。そして、このゲーム中に発生する様々な運要素の実装には必ずと言って良いほど「乱数」が使われています。

ほとんどのプログラミング言語には乱数を生成する方法が用意されており、C#も例外ではありません。
ですが、さらにUnityでは「ゲーム作りのために特化した乱数生成の仕組み」が用意されています。

今回はこのUnityで用意されている乱数を生成する方法について紹介していきます。

Randomクラス


Unityで使用するプログラムのライブラリにはRandomというクラスが用意されており、今回はその中から指定した数値の範囲からランダムに値を取得する方法を紹介します。
クラスという単語にピンと来ない方はとりあえず、乱数に関する機能が最初からたくさん用意されているんだなぁ程度に思っておけば大丈夫です。

ランダムな値の取得には、Randomクラスに用意されているRangeメソッドを使用します。
Rangeメソッドには整数の値をランダムで取得する方法と、小数点数の値をランダムで取得する方法の2種類の使い方があります。


■決まった範囲の整数からランダムで値を取得したい

こちらが使用するメソッドの定義です。
 public static int Range (int min, int max); 

Rangeメソッドの引数にて乱数を生成する範囲を整数(minに最小値、maxに最大値+1)で指定します。←注意

using UnityEngine;

public class Sample : MonoBehaviour {

	void Start() {
		int rnd = Random.Range(1, 10); // ※ 1~9の範囲でランダムな整数値が返る
	}

}

このコードの注意点は、第2引数に指定した値は乱数の生成範囲から除外される点です。
もし1~10の範囲でランダムな値を取得したければ、第2引数は11にする必要があります。


■決まった範囲の小数点数からランダムで値を取得したい

こちらが使用するメソッドの定義です。
 public static float Range (float min, float max); 

Rangeメソッドの引数にて乱数を生成する範囲を小数点数(minに最小値、maxに最大値)で指定します。

using UnityEngine;

public class Sample : MonoBehaviour {

	void Start() {
		float rnd = Random.Range(0.1f, 9.9f); // ※ 0.1~9.9の範囲でランダムな小数点数値が返る
	}

}

Rangeメソッドを小数点数で使用する場合は整数の時と違って、第2引数で指定した最大値が含まれます

Rangeメソッドを使う際には、整数と小数点数どちらで使うのかによる違いに十分注意してください。
乱数値を取得出来たら、対応する番号のアイテムを手に入れるとか、ダメージに倍率を掛ける等、その用途は発想次第でいくらでも広がりますし、さらにRandomクラスには今回紹介したRangeメソッド以外のメソッドや変数も用意されています。Rangeメソッドの使い方に慣れてきたら調べてみると面白いと思います。
乱数を使うという発想を是非、自身のゲーム製作に活用してみてください!


少し突っ込んだ話

C#には、Unityとは関係なしにもともと用意されているSystemという名前空間が存在し、そこにはもSystem.Randomというクラスが存在します。
UnityではSystemの名前空間はめったに使用しないですし、そもそもプログラムファイル作成時にはデフォルトでUnityEngineの名前空間を使用するよう宣言されています。さらには基本的な乱数生成の機能しか持たないSystem.Randomクラスは、無数の乱数値を生成した場合に周期性が出やすいなどの性質があり、UnityEngine.Randomよりも機能数で劣ります。Unityで乱数を使うときはゲーム用に最適化されているUnityEngine.Randomクラスを使うようにしましょう。
(System.Randomの使用はインスタンス化が必要なため、よくわからないまま間違えて使うことは無いと思います)

  • このエントリーをはてなブックマークに追加

PAGE TOP