障害物(フェンス)をランダムに生成
今日もUdemyの教材
「Complete C# Unity 3D Game Development in Unity 6」
を進めていきます。
ランナー系ゲームで転がってくる障害物を以前作成しましたが、今回は進む道にフェンスを作成してプレイヤーを邪魔する障害物を生成します。

道の左・真ん中・右、どこかにフェンスを出したい
出る位置をランダムにしたい
そんなときには、ランダム配置(Random Placement) 使っていきます。
using UnityEngine;
public class Chunk : MonoBehaviour
{
[SerializeField] GameObject fencePrefab;
[SerializeField] float[] lanes = { -2.5f, 0f, 2.5f };
void Start()
{
SpawnFence();
}
void SpawnFence()
{
int randomLaneIndex = Random.Range(0, lanes.Length);
Vector3 spawnPosition = new Vector3(lanes[randomLaneIndex], transform.position.y, transform.position.z);
Instantiate(fencePrefab, spawnPosition, Quaternion.identity, this.transform);
}
}
今回のコードはこんな感じ。
このスクリプトの目的はとてもシンプルです。
ステージの上にある「3本のレーン(左・真ん中・右)」のどこかに、
ランダムでフェンスを1つ出す
ということです。
つまり、毎回ゲームを起動するたびに、
左にフェンスが出たり
真ん中に出たり
右に出たり
と、ランダムな位置にフェンスが出てくる仕組みを構築していきます。
1.public class Chunk : MonoBehaviour
Chunk というクラス(=スクリプトの設計図)を作っています。
MonoBehaviour を継承することで、Unity上のオブジェクトにアタッチできるようになります。
今回このスクリプトは、ステージの一部分(床)**に付けて使います。
※Chunk Prefabが床になります。この床に「Chunk」のスクリプトをアタッチします。

2.[SerializeField] GameObject fencePrefab;
ここでは、**出したいオブジェクト(フェンス)**をUnityのInspector上で設定できるようにしています。
たとえば、fencePrefab には「Fence」というPrefab(事前に作っておいたフェンスのオブジェクト)をドラッグ&ドロップで登録します。

3.[SerializeField] float[] lanes = { -2.5f, 0f, 2.5f };
ここが今回のポイントです!
これは「フェンスを置ける3つの位置」を数字で表しています。
レーン:左
値:-2.5
配置場所:左の位置
レーン:真ん中
値:0
配置場所:中央の位置
レーン:右
値:2.5
配置場所:右の位置

つまり、フェンスはX軸方向に「左・真ん中・右」のいずれかの位置に出せる、ということです。
float[] は「浮動小数点数の配列(Array)」という意味。
3つの数字をまとめて1つの変数にしているんですね。
【補足#1】
でもどうやって位置関係をX軸方向に限定できるのでしょう?
このVector3のコード部分にその答えがあります。
Vector3 spawnPosition = new Vector3(lanes[randomLaneIndex], transform.position.y, transform.position.z);ここで、
lanes[randomLaneIndex] → X軸の値(-2.5 / 0 / 2.5 のどれか)
transform.position.y → 高さ(Y)
transform.position.z → 奥行き(Z)
と、それぞれの軸の値を組み合わせて「3D空間での位置」を決めています。
だから X軸だけをランダムに動かして、他の軸はそのまま ということになります。
4.Ramdom.Range(0, lanes.Length);
int randomLaneIndex = Random.Range(0, lanes.Length);これは「0から2までの数字をランダムで選ぶ」という命令です。
Random.Range(0, lanes.Length)
→ 配列 lanes の要素数(3)を使って、0〜2 の範囲でランダムな数を出します。
たとえば結果はこんな感じ
0 → 左のレーン
1 → 真ん中のレーン
2 → 右のレーン
つまり、「どのレーンにフェンスを出すか」をランダムで決めているわけですね。
5.Instantiate(fencePrefab, spawnPosition, Quaternion.identity, this.transform);
これで実際にフェンスが生成されます!
fencePrefab → どんなオブジェクトを出すか
spawnPosition → どこに出すか
Quaternion.identity → 回転なし(真っすぐ)
this.transform → このChunkの子オブジェクトとして配置
「子オブジェクトにする」ことで、Chunkごとにフェンスをまとめて管理できます。
たとえば、Chunkを削除したら中のフェンスも一緒に消えるようになります。
【補足#2】
この「this.transform」を、もう少し補足します。
「this.transform」 は「親」を指定しているいう事です。
this は「このスクリプトが付いているオブジェクト自身」を意味します。
このスクリプト Chunk.cs が「Chunk Prefab」というGameObjectに付いているので、「Chunk PrefabのTransform(位置・回転・スケール情報)」ということになります。
👉 this.transform を指定することで、生成したフェンスは Chunk Prefabの子オブジェクトとして生成 されます。
まとめ
float[ ] lanes:フェンスを出す位置をまとめた配列(左・中・右)
Random.Range(0, lanes.Length):ランダムにレーンを選ぶ
Vector3 spawnPosition:実際に出す座標を作る
Instantiate()Prefab:(フェンス)を生成する
this.transform:Chunkの子オブジェクトとして配置する
今回もたくさんの学びがありましたが、まだまだやるべきことが多いですね。
それでは!
