#9 敵機を生成する

このブログは、趣味でプログラミングを勉強中の筆者が、実験を繰り返しながら、WordPressの使い方の練習も兼ねて、備忘録のように記事を残していくものです。Unityのバージョンは6000.0.32f1です。

敵機を作ったのですが、あらかじめシーン上に敵機を配置していくのは、数機ならいいのですが、何百機ともなると骨が折れます。そこで、敵機をプログラムで生成していくことにします。

今回のゴール

敵機をランダムな位置に次々と生成する

空のゲームオブジェクトを配置する

スクリプトで敵機を生成するのですが、このスクリプトはどのゲームオブジェクトに付ければいいのか、よく考える必要があります。敵機のスクリプトに敵機を生成する機能を付けると、敵機が一機もいなくなったときに、敵機が生成されなくなります。自機につけると、自機がやられたときにやはり困ります。そもそも自機が敵機を生み出すのは、不自然です。ですので、敵機を生成する機能は、敵機でも自機でもないゲームオブジェクトに付ける必要があります。

敵機を生成する機能を付けるゲームオブジェクトは画面に表示する必要はありませんが、スクリプトを付けるためにシーン上に配置する必要があります。このようなゲームオブジェクトを「空のゲームオブジェクト」と呼びます。今回は空のゲームオブジェクト(位置はどこでもいいです)をシーン上に配置し、スクリプトを取り付けることにします。

まず、メニューからゲームオブジェクト空のオブジェクトを作成を選びます。

できたGameObjectStageManagerに名前を変えます。名前は何でもいいのですが、ステージを管理するという意味でこういう名前にしました。

スクリプトを作成する

Scriptsフォルダの中に、StageManager.csというスクリプトを作成します。Scriptsフォルダを開いて右クリックして、作成MonoBehaviourスクリプトで出来たファイルをStageManagerにリネーム(名前を変更)します。

StageManager.csを開いて、スクリプトを変更します。

StageManager.cs

まず最初に、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 originalVector3 positionQuaternion 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の欄は空欄です。ここに自動生成したいゲームオブジェクトを指定してあげます。

Prefabフォルダを開いて、ヒエラルキーでStageManagerを選んで、PrefabフォルダのEnemyをドラッグ&ドロップしてあげます。するとEnemyの欄にEnemyのプレハブが入りました。

念のため、画面に手動で配置していたEnemyは削除しておきます。この状態で実行してみると、

おお、敵機が無限に沸いてきますね。ついでに、自機も生成するようにします。

StageManager.cs

publicGameObject型Playerを宣言しておきます。自機は最初に一度生成すればいいので、Start関数の中でInstantiateします。さらに、ヒエラルキー上のPlayerは削除しておきます。Enemyの時と同じように、StageManagerコンポーネントの「プレイヤー」欄に、Playerのプレハブを指定します。※なぜ、「プレイヤー」と日本語表記になっているのかは謎ですが・・・。

敵機も自機も自動生成されました!

今回はここまでです。お疲れ様でした。

コメント

タイトルとURLをコピーしました