unityチュートリアルSpaceShooterその5「ゲーム化」

標準

その4で作成できた小惑星に、弾を動かすのに作ったMoverというスクリプトを適用し、スピードに-5を入力する。これで小惑星が落ちてくる。

出来上がった小惑星は、プレファブ化し、シーン上から削除する。

6.ゲームコントローラーの追加

1)空のGameObjectを追加し、GameControllerと名前変更する。タグとしてプリメイドのGameControllerをつける。リセットは必ずしも必要ないが、一応場所、回転、拡縮をリセットする。

2)新規スクリプト GameControllerを追加

3)GameControllerで行いたいことは、まず、小惑星(障害物~hazard)を枠外からランダムポジションで落としてくること。

これをSpawnWavesという関数で実現することにする。
public GameObject hazard;

void SpawnWaves(){

}

Start関数で、この関数を呼び出す
void Start(){

SpwanWaves();

}

4)SpawnWaves関数で何をしたいかというと、障害物を実体化すること。

Instantiate(hazard, spawnPosition,spawnRotation);

ひとまず、関数の中で上記を正しく表現するために、

void SpawnWaves()
{
Vector3 spawnPosition = new Vector3();
Quaternion spawnRotation = new Quaternion();

Instantiate(hazard, spawnPosition, spawnRotation);
}

としておく。

このhazardは、publicで設定できるが、spawnPositionとspawnRotationはどうすればいいか。

5)positionは、Vector3変数であるので、
public Vector3 =new spawnValues;

を宣言しておいて、xは-6から6までの乱数。yは0。zは、範囲外に出ている16とする。

SpawnWaves関数のほうで、spawnPositionの設定を行う。

Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x,spawnValues.x),spawnValues.y,spawnValues.z);

6)回転のほうは、どうするかというと、クォータニオンは扱いがやっかいであるが、ここでは、初期値(回転なし)でいいので、ちょうど Quaternion.identityというのがあるので、それで定義しなおす。

Quaternion spawnRotation = Quaternion.identity;

7.小惑星が次々に現れる設定を作る

たくさん小惑星を落としたいからといって、単純にコピペを繰り返しても、同時に落ちてくるだけなので、うまくいかない。

とはいえ、繰り返しのために、for文を記述しておく。

public int hazardCount;

for (int i=0;i<hazardCount;i++){

繰り返したい内容;

}

コピペよりはプログラムはすっきりしたが、このままでは小惑星は同時にあらわれて、最初の段階でお互いに衝突して爆発してしまう。

小惑星が落ちてくる「間隔」が必要になる。

そこで、public float spawnWait;

を追加し、実体化のコマンドの下の行に、

WaitForSeconds(spawnWait);

を記述する。論理的には、これで合っているのだが、C#ではこれは動作しない。

時間を止めて、別の関数を走らせるためには、コルーチンをしかけなければならない。

コルーチンの場合、関数は、voidではなくなる。必ず、IEnumerator にする。

IEnumeratore spawnWaves(){ ~~~ }

そして、WaitForSeconds( ); の前に必ず、yield return new を追加する必要がある。

yield return new WaitForSeconds(spawnWait);

呼び出しも、単に関数名では呼び出せないので、Start関数の中は、呼び出す関数名をStartCoroutine関数で指定する。

StartCoroutine(soawnWaves());

すぐにスタートするのではなく、少しの間だけゲームスタートを待つほうが親切であるので、public float startWait;

を作っておくといい。これをspawnWaves()関数の最初で 少し待つというコマンドで実現する。

yield new WaitForSeconds(startWait);

また、小惑星の次の集団(hazardCountによる)が落下するまでの間を少し空けるために、

public float waveWait;

を作成する。これは、while(true)を使って、無限にループするようにする。

全体のプログラムは次のようになっている。


using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
public GameObject hazard;
public Vector3 spawnValues;
public int hazardCount;
public float spawnWait;
public float startWait;
public float waveWait;

void Start ()
{
StartCoroutine (SpawnWaves ());
}

IEnumerator SpawnWaves ()
{
yield return new WaitForSeconds (startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate (hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds (spawnWait);
}
yield return new WaitForSeconds (waveWait);
}
}
}


8.爆発の残りを消去する

ゲームをスタートすると、VFXのexplosionが画面にいつまでも残っている。

そこで、DestroyByTimeというスクリプトを書く

public float lifeTime;

void Start(){

Destroy(gameObject,lifeTime);

}

このスクリプトを、VFXフォルダ内プレファブの、explositon(3タイプとも)にコンポーネントとして追加しておく。

広告

コメントは受け付けていません。