norablog-techのブログ

このブログは、自分の忘備録的にアウトプットするためのブログとなっております。

【Unity】敵機をPreFab化して大量生成する。

変更:
2022/01/25 変数名を"アッパーキャメル"から、すべて小文字に修正。

 

今回は、UnityのPreFab機能を使って敵機を生成し、大量に落下させます。


www.youtube.com

 

ここでは弾の発射Shot()関数で使った"Instantiate"を使うとともに、"コルーチン"という機能を使います。

Unityマニュアルより:
コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数です。

正直なところ私もよくわかっていませんが、時間指定して繰り返したい処理があるときに
・IEnumerator 
・StartCoroutine 関数
・WaitForSeconds 関数
などを使えばよいようです。

Update関数内に処理を書き込んでも繰り返し処理は出来ますが、毎フレームごとに実行する必要のないものだと困ります。

敵機(Circle)をPreFab化すると"ヒエラルキー"上から消すことになります。
どこかから呼び出さねばなりません。
そのための受け皿として、"ヒエラルキー"上に"空のオブジェクト"を作成し、"GameController"と名前を付けました。
これにスクリプトを追加し、GameObjectとして敵機(Ciecle)を呼び出します。

GameController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour
{
    //追加
    //敵機をGameObjectとして宣言する
    public GameObject circleprefab;  //変更

    // Start is called before the first frame update
    void Start()
    {
        //追加
        //GenerateCircle()を開始する
        StartCoroutine("GenerateCircle");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    //追加
    //敵機(Circle)を生成する
    IEnumerator GenerateCircle()
    {
        while (true)
        {
            Instantiate(
                circleprefab,  //変更
                //X軸方向はランダム、Y軸方向6.0f、Z軸方向0.0fに敵機を生成
                new Vector3(Random.Range(-8.5f, 8.5f), 6.0f, 0.0f),
                transform.rotation
            );
            //1秒ごとに実行する。
            yield return new WaitForSeconds(1.0f);
        }
    }

}

 

また、"CircletPreFab"には"BulletPreFab"を参考に、"Rigidbody 2D"、"Circle Collider 2D"を設定してください。
"Boundary"外に出ると、敵機(Ciecle)を消すようにします。

f:id:NoraBlog:20220122205117p:plain

インスペクターの設定

さらに、CircleController.cs→CirclePreFabController.cs

それに伴い、ファイル内も変更してください。

CirclePreFabController.cs

public class CirclePreFabController : MonoBehaviour

以下略

 

次回は、”衝突判定”を設定して、敵機を弾で撃ち落とす処理を予定しています。

 

では、また。