ランダムは、ゲームのデザインにおいて敵の行動パターンやアイテム、ダメージ計算、スキル発動確立などの乱数生成に使用されます。
その他にも、ゲーム内のイベントやダイス(サイコロ)を振ることでリザルトに影響を与えるなどランダムはゲーム開発に欠かせません。
ランダムを作る場合は、int型・float型の範囲、配列やリストを並び替えて作ることができます。
本記事では、Unityでランダムな要素を表示する方法を紹介します。
- Unityでランダムを生成したい。
- Randomクラスを使いたい。
- フィッシャーイェーツのシャッフルを使いたい。
指定した範囲でランダム生成
Random.Range()は、指定した範囲内でランダムな数値を生成するために使用されます。
Unityでランダム生成する際に、メジャーなメソッドです。
“Random.Range(min, max)”と記述し、min/maxを含めたint型あるいはfloat型の範囲でランダム生成されます。
Spaceキーを押すと、ランダムな浮動小数点数(float)と整数(int)を生成します。
生成したランダムな数値は、画面上に表示します。
表示には、TextMeshProUGUIを使用しています。
また、数値を画面上に表示するには、int型やfloat型から、
文字列として変換する必要があります。
using UnityEngine;
using TMPro;
public class sample1 : MonoBehaviour
{
public TextMeshProUGUI floatLog;
public TextMeshProUGUI intLog;
void Update()
{
// スペースキーが押されたかどうかを検出
if (Input.GetKeyDown(KeyCode.Space))
{
float randomFloat = Random.Range(0f, 10f); // ランダムな浮動小数点数を生成
int randomInt = Random.Range(1, 50); // ランダムな整数を生成
// TextMeshProのTextプロパティにランダムな値を表示
floatLog.text = randomFloat.ToString("F2");
intLog.text = randomInt.ToString();
Debug.Log("Random Float: " + randomFloat);
Debug.Log("Random Int: " + randomInt);
}
}
}
実装例
ランダムな位置にオブジェクトを生成する
Random.Range()とVectorを組み合わせると、
ランダムな位置からオブジェクトを出力できます。
using UnityEngine;
using TMPro;
public class sample2 : MonoBehaviour
{
public GameObject prefab; // 生成するオブジェクト
public TextMeshProUGUI countString; // spaceキー回数
public Vector2 AreaMin = new Vector3(-10.0f, -5.0f); // 最小値
public Vector2 AreaMax = new Vector3(10.0f, 5.0f); // 最大値
int count; //スペースキーを押した回数
void Update()
{
// スペースキーを押すと新しいオブジェクトを生成
if (Input.GetKeyDown(KeyCode.Space))
{
// ランダムな位置を計算
Vector2 randomPosition = new Vector2(
Random.Range(AreaMin.x, AreaMax.x),
Random.Range(AreaMin.y, AreaMax.y));
//Instantiate関数によるオブジェクトの複製
GameObject newObject = Instantiate(prefab, randomPosition, transform.rotation);
Debug.Log("Position: " + randomPosition);
count++;
countString.text = count.ToString();
}
}
}
オブジェクトの位置は、Vectorを使用します。
Vector3の場合は、座標を(x,y,z)で取得します。
パラメータをRandom.Range()で指定することでランダムな位置を取得します。
実装例
ランダムを使った確率
敵に攻撃をした時、ヒットする確率をRandom.Range()で作成します。
spaceキーで攻撃をします。攻撃力は1から10までのランダムです。
3の倍数の場合は攻撃をヒット(30%)させて、それ以外は外れたことにします。
画面にヒットは赤文字。ミスは青文字で表示します。
using UnityEngine;
using TMPro;
public class application : MonoBehaviour
{
public TextMeshProUGUI attack;
public TextMeshProUGUI enemyHP;
int enemyPoint = 20;
void Update()
{
enemyHP.text =enemyPoint.ToString();
// スペースキーが押されたかどうかを検出
if (Input.GetKeyDown(KeyCode.Space))
{
int attackPoint = Random.Range(1, 10); // ランダムな整数を生成
if (attackPoint % 3 == 0) //3の倍数
{
attack.text = "<color=red>hit</color>";
enemyPoint -= attackPoint; // 敵のHPを攻撃ポイントで減らす
Debug.Log("enemyHP:" + enemyPoint);
}
else
{
attack.text = "<color=blue>miss</color>";
}
Debug.Log("attack:" + attackPoint);
}
}
}
実装例
配列・リストをランダムに並び替える
配列・リストの乱数生成は、トランプのようなカードの山をシャッフルするときに使用します。
{1,3,6,-1}を{-1,6,1,3}のように、配列をランダムで並び替えるには、フィッシャー・イエーツのシャッフルアルゴリズムが効果的です。
このアルゴリズムは、要素を前から後ろへ順番に、その要素を残りの未処理の要素の中からランダムに選んで交換することでシャッフルを実現します。
ソースコード
using UnityEngine;
using System;
public class sample3 : MonoBehaviour
{
void Start()
{
int[] arrayToShuffle = {1,3,6,-1}; // シャッフルする配列
Shuffle(arrayToShuffle); // 配列をシャッフル
Debug.Log("Shuffled Array:");
foreach (int num in arrayToShuffle)
{
Debug.Log(num);
}
}
// フィッシャー・イエーツのシャッフルアルゴリズムを実装
void Shuffle(int[] array)
{
System.Random rand = new System.Random();
int n = array.Length;
for (int i = n - 1; i > 0; i--)
{
int j = rand.Next(i + 1);
// 選択した要素と最後の要素を交換
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
UdemyでUnityを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
Start()メソッドは、シャッフルされる配列を作成し、配列をシャッフルして、シャッフルされた配列の要素をログに出力しています。
Shuffle()メソッドは、フィッシャー・イエーツのシャッフルアルゴリズムを実装しています。このアルゴリズムは、与えられた配列をランダムにシャッフルします。
具体的には、配列の最後の要素から始めて、ランダムに選んだ要素と交換することで配列をシャッフルします。
System.Randomクラスを使用してランダムな整数を生成しています。
実装例
まとめ
ゲームでランダムを使用する場面は数多くあります。
ランダムの生成には、Random.Range()を使用します。
配列やリストの中身をランダムにするには、フィッシャー・イエーツのシャッフルアルゴリズムを使用します。
参考サイト:「重要なクラス – Random – Unity マニュアル」