読者です 読者をやめる 読者になる 読者になる

Unity5(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity9】UNETでゾンビ発生地点を増やす【UNET17】

Unity UNET チュートリアル

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

Unity5.1.1p3 Personal(2015年7月)


前回の続きです〜


今のところゾンビ発生地点が1箇所しか無いので、4つに増やしていきます〜

また、時間差で少しずつ出現するようにしていきます〜



UNET Part 17 - Better Spawning - YouTube


【目標】ゾンビ発生地点を増やす

①ゾンビ発生地点を4つに増やす
まずはゾンビを発生地点を増やしていきます〜
Mainシーンにて空のGameObjectを作成して、名前を「Zombie_SpawnGroup」にして下さい〜


f:id:hiyotama:20150717165433p:plain


続いて既存のZombieSpawnオブジェクトを4つにコピーして、Zombie_SpawnGroupオブジェクトの子オブジェクトにして下さい〜


f:id:hiyotama:20150717165941p:plain
コピーして子オブジェクトにする


各ZombieSpawnオブジェクトに「ZombieSpawn」というタグを付けます〜
また、場所も少しずつバラけさせましょう〜


f:id:hiyotama:20150717182521p:plain
ZombieSpawn

f:id:hiyotama:20150717182527p:plain
ZombieSpawn(1)

f:id:hiyotama:20150717182533p:plain
ZombieSpawn(2)

f:id:hiyotama:20150717182541p:plain
ZombieSpawn(3)

②GameManager_ZombieSpawnerスクリプトの修正

続いて以前作成したGameManager_ZombieSpawnerスクリプトを修正していきます〜以下ソースです〜

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class GameManager_ZombieSpawner : NetworkBehaviour {

	[SerializeField] GameObject zombiePrefab;
//********** 開始 **********//
	//配列に修正
	//[SerializeField] GameObject zombieSpawn;
	private GameObject[] zombieSpawns;
//********** 終了 **********//
	
	private int counter;
	private int numberOfZombies = 20;
//********** 開始 **********//
	private int maxNumberOfZombies = 80; //ゾンビの最大数
	private float waveRate =10; //ゾンビが出現する間隔(秒)
	//出現フラグ 今回はずっとtrueのまま
	private bool isSpawnActivated = true;
//********** 終了 **********//
	
	
	public override void OnStartServer ()
	{
//********** 開始 **********//
//		for (int i = 0; i < numberOfZombies; i++) {
//			SpawnZombies ();
//		}
		//ゾンビ発生地点を取得
		zombieSpawns = GameObject.FindGameObjectsWithTag("ZombieSpawn");
		//コルーチン
		StartCoroutine(ZombieSpawner());
//********** 終了 **********//
	}
	
//********** 開始 **********//
	IEnumerator ZombieSpawner ()
	{
		//無限ループ
		for (;;) {
			//10秒待機
			yield return new WaitForSeconds (waveRate);
			//ゲーム上の全ゾンビ取得
			GameObject[] zimbies = GameObject.FindGameObjectsWithTag ("Zombie");
			//ゾンビの数が最大値より少なかったらメソッド実行
			if (zimbies.Length < maxNumberOfZombies) {
				CommenceSpawn();
			}
		}
	}
	
	void CommenceSpawn ()
	{
		if (isSpawnActivated) {
			//20回ループ
			for (int i = 0; i < numberOfZombies; i++) {
				//0〜3からランダムで選んだゾンビ発生地点の位置情報を引数にメソッド実行
				int randomIndex = Random.Range(0, zombieSpawns.Length);
				SpawnZombies(zombieSpawns[randomIndex].transform.position);
			}
		}
	}
//********** 終了 **********//
	
//********** 開始 **********//
	//void SpawnZombies ()
	void SpawnZombies (Vector3 spawnPos)
//********** 終了 **********//
	{
		counter++;
//********** 開始 **********//
		//GameObject go = GameObject.Instantiate(zombiePrefab, zombieSpawn.transform.position, Quaternion.identity) as GameObject;
		//引数の位置にゾンビ生成
		GameObject go = GameObject.Instantiate(zombiePrefab, spawnPos, Quaternion.identity) as GameObject;
//********** 終了 **********//
		NetworkServer.Spawn(go);
		go.GetComponent<Zombie_ID>().zombieID = "Zombie " + counter;
	}
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

GameManager_ZombieSpawner.cs


まずはZombieプレハブに「Zombie」タグを付けます〜


f:id:hiyotama:20150717182725p:plain
Zombieタグ


OnStartServerメソッドにてゾンビ発生地点4箇所を取得し、コルーチンを実行します〜


コルーチン内では10秒ごとに、場のゾンビ数がmaxNumberOfZombies(デフォルトだと80引き)より少なければCommenceSpawnメソッドを実行します〜


CommenceSpawnメソッド内ではランダムで選んだゾンビ発生箇所の位置情報を引数に、SpawnZombiesメソッドを実行します〜というのを20回繰り返します〜


SpawnZombiesメソッド内の修正は、生成するゾンビの位置情報が引数に変わるという修正のみです〜

③結果

それではゲームを実行してみましょう〜


f:id:hiyotama:20150717191715p:plain
ゾンビ発生


ゲーム開始後10秒で、20匹のゾンビがランダムな位置から発生しました〜

その10秒後にも同じく20匹のゾンビが発生します〜成功です〜


今回はここまでです〜

ありがとうございました〜


【Unity9】UNETでマルチプレイヤーなオンラインゲーム開発【UNET1】
【Unity9】UNETでプレイヤーの動きを補間し、なめらかな動きを実現する【UNET1-2】
【Unity9】UNETでネットワーク越しに傾き(Rotation)を同期させる【UNET2】
【Unity9】UNETでオンライン開始時のプレイヤー生成位置を変更する【UNET2-2】
【Unity9】UNETのネットワークトラフィックを軽減し、効率化する【UNET3】
【Unity9】UNETのlatency(遅延時間)を改善する【UNET4】
【Unity9】UNETのlatency(遅延時間)を表示して、ちょっとだけ改善する【UNET4-2】
【Unity9】UNETのSyncVarのhookの使用例と、前時代の同期方法【UNET5】
【Unity9】UNETを使ってRotationを同期させる【UNET6】
【Unity9】UNETで各プレイヤーにPlayerIDを設定する【UNET7】
【Unity9】UNETで敵プレイヤーにダメージを与える!【UNET8】
【Unity9】UNETでHPを画面に表示し、Playerへダメージを与える【UNET9】
【Unity9】UNETでHPが0以下になった時、Playerを破壊する!【UNET10】
【Unity9】UNETで死んだPlayerを生き返らせる!【UNET11】
【Unity9】UNETでゾンビAIを出現させる!【UNET12】
【Unity9】UNETでゾンビ生成時にユニークなIDを付ける!【UNET13】
【Unity9】UNETでゾンビを撃つ!【UNET14】
【Unity9】UNETでゾンビに攻撃させる!【UNET15】
【Unity9】UNETでゾンビの動きをスムーズにシンクロさせる!【UNET16】
【Unity9】UNETでゾンビ発生地点を増やす【UNET17】
【Unity9】UNETで発生したバグを取り除く【UNET18】
【Unity9】Unity MultiPlayerを使ってネットワーク越しにマッチメイキング!【UNET19】
【Unity9】GUIを改善して、Network Managerを見やすくする!【UNET20】
【Unity9】表示したGUI(Network Manager)を機能させる!【UNET20-2】
【Unity9】UNETでAnimationを同期させる!【UNET21】