おっさんプログラマのUnity奮闘記

元WEB系プログラマのUnity奮闘記

おっさんのUnity入門 2Dオブジェクトで敵を量産する(プレファブの使い方)

敵オブジェクトを量産する仕組みを実装していきます。

【追加するオブジェクト】

  • GameController
  • EnemyGenerater.cs


【RED_ENEMYのプレファブ化】
Prefabricating RED_ENEMY

RED_ENEMYを任意の場所(この場合Prefabs)へドロップします。

【GameControllerの追加】
ゲーム全体をコントロールするためのオブジェクトを追加します。
Add GameController

GameControllerに敵を自動的に生成するためのスクリプトEnemyGenerator.csを追加します。


【EnemyGenerator.cs】

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

public class EnemyGenerator : MonoBehaviour {

	// 敵オブジェクト(プレファブ)の入れ物
	// 敵オブジェクトはInspectorで指定する
	[SerializeField]
	private GameObject enemyObj;

	// プレイヤーオブジェクトの入れ物
	private GameObject playerObj;

	void Start () {
		// プレイヤーオブジェクトを取得
		playerObj = GameObject.Find ("PLAYER_GREEN");

		// プレイヤーからx軸方向に5、y軸方向に2移動した位置に
		// 敵を出現させる
		Instantiate (enemyObj, 
			playerObj.transform.position
			+ new Vector3 (5, 2, 0), transform.rotation);
	}

}


【量産に使用するプレファブを指定】
先ほどプレファブ化したRED_ENEMYを指定します。
Designate prefab for mass production


Automatically generated image
Sceneに配置していない敵オブジェクトが登場しました。

【不要となった敵オブジェクトをSceneから削除する】
Delete unnecessary enemy objects from Scene

Delete enemy object


【動作確認】
Operation check

プレファブから生成された敵オブジェクトのみが出現するようになりました。

今度は一定時間毎に敵が生成されるように修正します。

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

public class EnemyGenerator : MonoBehaviour {

	// 敵オブジェクト(プレファブ)の入れ物
	// 敵オブジェクトはInspectorで指定する
	[SerializeField]
	private GameObject enemyObj;

	// プレイヤーオブジェクトの入れ物
	private GameObject playerObj;

	// 敵を生成するまでの時間
	float timer;
	// 敵を生成するまでの閾値
	float instantiateInterval;
	// 敵の最大生成数
	int maxInstanceValue;


	void Start () {

		timer = 3;
		instantiateInterval = 3;
		maxInstanceValue = 10;

		// プレイヤーオブジェクトを取得
		playerObj = GameObject.Find ("PLAYER_GREEN");

	}


	void Update () {
		// 敵オブジェクトの生成関数を呼び出す
		GenerateEnemy ();
	}


	// 敵オブジェクトの生成関数
	void GenerateEnemy () {
		// カウンタ
		timer -= Time.deltaTime;

		if (timer < 0) {
			if (maxInstanceValue > 0) {
				// プレイヤーからx軸方向に10、y軸方向に1移動した位置に
				// 敵を出現させる
				Instantiate (enemyObj, 
					playerObj.transform.position
					+ new Vector3 (10, 1, 0), transform.rotation);
				// 最大出現数を減らす
				maxInstanceValue--;
				// タイマーのリセット
				timer = 3;
			}
		}
	}
}


【動作確認】
Operation check

一定間隔かつ一定距離で敵が量産されるようになりました。