見出し画像

障害物(フェンス)をランダムに生成

今日もUdemyの教材
Complete C# Unity 3D Game Development in Unity 6
を進めていきます。

ランナー系ゲームで転がってくる障害物を以前作成しましたが、今回は進む道にフェンスを作成してプレイヤーを邪魔する障害物を生成します。

Unity 地面から出ているフェンスの生成
  • 道の左・真ん中・右、どこかにフェンスを出したい

  • 出る位置をランダムにしたい

そんなときには、ランダム配置(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の子オブジェクトとして配置する

今回もたくさんの学びがありましたが、まだまだやるべきことが多いですね。

それでは!


いいなと思ったら応援しよう!