P12-M01

【UNITY】タワーディフェンス1(NavMesh応用)

根強いファンも多い、タワーディフェンスゲームを作っていこう!勉強した「NavMesh」を応用して作っていきます。タワーディフェンスは、決められたコースを攻めて来る敵をタワー(敵を倒すもの)をおいて陣地などを守るゲームです。

—【今回の流れ】—

1.まずタワーは自動ではなく自分でコントロールするかたちにします。

2.NavMeshを作成します。

3.敵(Agent)を作成します。

4.NavMeshAgentに目的地を設定します。

1

タワーの作成する

タワーを作っていきます。タワーは3つの部品でできてます。

1.Stand: 「タワーの土台」

2.Barrel:「砲(弾をだすところ)」

3.Muzzle「実際に弾が出現して出ていくところ」ただのGameObjectです。

図のように「Tower」としてまとめよう。

1. 砲(Barrel)とMuzzleは必ずz座標正の方向(青い矢印方向)に作ろう!!

2.Muzzleの位置から弾をだすようにするので、BarrelやStandにかぶらないようにしよう。弾がBarreleやStandにあたってまっすぐ飛ばなくなってしまうよ。

タワーをキーボードで操作しよう

タワーを左右に回転させるためのプログラムをかこう

ファイル名「TowerCont」のC#ファイルを新規作成しよう

1.右矢印を押したときタワーがY軸方向に右回転する

2.左矢印を押したときタワーがY軸方向に左回転する

 

タワーから弾を発射させよう

まずCreate > Sphereでタワーの弾をつくります。これをタワーから発射できるようにしていこう。

名前は「Bullet」とします。

次に作ったGameObject「Bullet」をAsset内に移しPrefabにします。

弾のようにいくつも複製(コピー)をする必要のあるものや、プログラムから出現させたり消したりする必要があるものはPrefab化する必要があるぞ。

「弾」にTag名「bullet01」をつけます。タグ名は複数のGameObjectにつけれるので複製される物に使うと便利です。

Tagのプルダウンメニューをクリックすると図のようなメニューが表示されます。一番したの「Add Tag」をクリックして新しいTag名を追加してください。

その後新しいTag名を「弾」に設定します。

タワーから弾を出すプログラムを書こう

ファイル名「Shooting」のC#ファイルを新規作成しよう 

1.変数定義

  「弾」、「弾の発射位置」、「弾の速度」をpublicで定義します。

2.スペースキーが押されたら

3.「弾」(Prefab)を複製(ゲーム内に出現させる)する

4.複製した「弾」に力を与え前方に発射する

作ったプログラムファイル「Shooting」を「Tower」にアタッチします。その後、public変数をそれぞれ図のように定義します。

2

NavMeshフィールドを作ろう

自分で考えて好きなNavMeshフィールドを作ろう。

3

敵をNavMeshAgentを使って作ろう

まずCubeなどをつかって敵を作ってみよう

「敵」にNav Mesh Agentをアタッチする

「敵」が目的地まで移動するようにする

ファイル名「EnemyCont」のC#ファイルを新規作成しよう 

1.OnCollisionEnterを使ってをつかって「弾」がなにかあたったとき、「弾」消える処理を記述

作ったプログラムファイルをそれぞれ「Enemy」にアタッチします。

作った「Enemy」をAssetに入れてプレファブ化します。ヒエラルキーにある元の「Enemy」は削除します。

「敵」出現するようにする

先程つくった「TowerCont」を編集して、「敵」を複製して出すようにします。

1.必要な定義を追加

2.「敵」がしていした数だけ出現するようにする

3.決められたポイントから現れるようにする。

編集したプログラムファイル「TowerCont」をpublic変数をそれぞれ図のように定義します。

4

「弾」にプログラムを追加して

爆発のパーティクルを追加

「弾」があたったときのパーティクル(爆発)を加えます。

「弾」自体にもプログラムを追加して、弾があたったときの爆発と、弾があたった「敵を消す」処理を加えます。

1.パーティクルをpublicで定義

2.OnTriggerEnterで弾が他のObjectにあたったかを検知

3.「敵」(Tag名:Enemy)にあたった場合あたった「敵を削除」

「敵」にTag名「enemy」をつけます。タグ名は複数のGameObjectにつけれるので複製される物に使うと便利です。