敵機を作ったのですが、あらかじめシーン上に敵機を配置していくのは、数機ならいいのですが、何百機ともなると骨が折れます。そこで、敵機をプログラムで生成していくことにします。
敵機をランダムな位置に次々と生成する
空のゲームオブジェクトを配置する
スクリプトで敵機を生成するのですが、このスクリプトはどのゲームオブジェクトに付ければいいのか、よく考える必要があります。敵機のスクリプトに敵機を生成する機能を付けると、敵機が一機もいなくなったときに、敵機が生成されなくなります。自機につけると、自機がやられたときにやはり困ります。そもそも自機が敵機を生み出すのは、不自然です。ですので、敵機を生成する機能は、敵機でも自機でもないゲームオブジェクトに付ける必要があります。
敵機を生成する機能を付けるゲームオブジェクトは画面に表示する必要はありませんが、スクリプトを付けるためにシーン上に配置する必要があります。このようなゲームオブジェクトを「空のゲームオブジェクト」と呼びます。今回は空のゲームオブジェクト(位置はどこでもいいです)をシーン上に配置し、スクリプトを取り付けることにします。
まず、メニューから
→ を選びます。
できたGameObjectをStageManagerに名前を変えます。名前は何でもいいのですが、ステージを管理するという意味でこういう名前にしました。
スクリプトを作成する
StageManager.csというスクリプトを作成します。 フォルダを開いて右クリックして、 → で出来たファイルをStageManagerにリネーム(名前を変更)します。
フォルダの中に、
StageManager.csを開いて、スクリプトを変更します。
using UnityEngine;
public class StageManager : MonoBehaviour
{
public GameObject Enemy;
int timer = 0;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
timer++; //インクリメント
if (timer == 300)
{
Instantiate(Enemy, new Vector3(Random.Range(-10f,10f), 6, 0), Quaternion.Euler(0,0,180));
timer = 0;
}
}
}
まず最初に、GameObject Enemyで、GameObject型のEnemyという変数を宣言しています。その前にPublicをつけることで、他のスクリプトからこの変数にアクセスできるようにしているのですが、その他に、Unityの場合はUnityエディタ上で、この変数を操作できるという仕組みがあります。
次にint timer = 0でint型のtimerという変数を宣言して、さらに0に初期化します。
Update関数は、1フレームに1回呼ばれます。その中でtimerを1ずつ増加(インクリメント)し、timerが300になったら(300フレームごとに)、Instantiateを実行するという内容です。
Instantiateとは
Instantiateは、オブジェクトを生成する働きがあります。主にゲームオブジェクトの生成に使われます。
Instantiate (Object original) ;
で、指定したオブジェクトを生成します。ですが、よく使われるのは、
Instantiate (Object original, Vector3 position, Quaternion rotation);
の形だと思います。位置を表すのはVector3型にしなければいけないので、new Vector3(x, y, z)のように指定します。もちろんVector3型の変数でもいいです。Quaternionは、回転を表すものです。通常はQuaternion.identityのように指定します。生成するときに回転をさせたい場合には、Quaternion.Euler(0,0,180)のように、角度を指定してあげます。
publicの変数をエディタで操作する
StageManager.csをStageManagerのゲームオブジェクトに取り付けます。

するとEnemyという欄が現れました。これは、スクリプトの中で、public GameObject Enemyと書いていたからです。今は、Enemyの欄は空欄です。ここに自動生成したいゲームオブジェクトを指定してあげます。

フォルダを開いて、ヒエラルキーで を選んで、 フォルダの をドラッグ&ドロップしてあげます。すると の欄に のプレハブが入りました。
念のため、画面に手動で配置していたEnemyは削除しておきます。この状態で実行してみると、

おお、敵機が無限に沸いてきますね。ついでに、自機も生成するようにします。
using UnityEngine;
public class StageManager : MonoBehaviour
{
public GameObject Player;
public GameObject Enemy;
int timer = 0;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Instantiate(Player, new Vector3(0, -4.5f, 0), Quaternion.identity);
}
// Update is called once per frame
void Update()
{
timer++;
if (timer == 300)
{
Instantiate(Enemy, new Vector3(Random.Range(-10f,10f), 6, 0), Quaternion.Euler(0,0,180));
timer = 0;
}
}
}
publicのGameObject型のPlayerを宣言しておきます。自機は最初に一度生成すればいいので、Start関数の中でInstantiateします。さらに、ヒエラルキー上のPlayerは削除しておきます。Enemyの時と同じように、StageManagerコンポーネントの「プレイヤー」欄に、Playerのプレハブを指定します。※なぜ、「プレイヤー」と日本語表記になっているのかは謎ですが・・・。

敵機も自機も自動生成されました!
今回はここまでです。お疲れ様でした。
コメント