タワーディフェンス入門
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 48/50。
クリープは道に沿って基地へ進み、1基のタワーが基地を守っています。射程内にクリープがいる間、タワーは最も近いクリープにボルトを撃ち、倒したクリープごとにゴールドを獲得します。スペースキーでゴールドを使ってタワーを次のレベルに上げます。レベルが上がるごとに、射程が伸びたり、発射速度が上がったり、攻撃力が上がったりします。基地に到達したクリープはそのまま通過します。レベルのデータは、コードに触れることなく、デザイナーがアセットで調整します。また、タワーは大量のボルトを撃つため、毎回生成して破棄する代わりに、プールから再利用します。
2つのスクリプトを作成します。アセットの型であるTowerDataと、Towerです。Creep、Bolt、CreepSpawnerは用意されています。
チャレンジ
難しいInspector では Tower に data(Arrow アセット)、boltPrefab、infoText を設定します。Input System の Keyboard.current を通じて Space キーを読み取ります。
TowerData.cs:Inspector に表示できるクラスTowerLevelを作成し、public float range、public float fireEvery、public int damage、public int cost(そのレベルに到達するための価格)を持たせます。また、Create メニュー項目を持つ ScriptableObject のTowerDataと、public List<TowerLevel> levelsを作成します。Arrow アセットには次の3つのレベルを設定します。range 4、間隔 1 s、damage 1、cost 0;range 5、間隔 0.6 s、damage 1、cost 6;range 6、間隔 0.4 s、damage 2、cost 12。- タワーは最初のレベル、所持ゴールド 0 で開始し、どちらかが変わるたびに
infoTextにLevel 1, 0 goldのように両方を表示します。 - 前回の射撃からそのレベルの
fireEvery秒が経過し、射程内にクリープがいる場合(クリープのコライダーがタワーからrange内にあり、Physics.OverlapSphereで検出される場合)、タワーは最も近いクリープを撃ちます。ObjectPool<Bolt>からボルトを取得してタワーの位置に置き、bolt.Launch(creep, damage, pool.Release)を呼び出します。ボルトは処理が終わると最後の引数を呼び出し、プールに戻ります。ボルトはプール内で待機している間は無効化され、取得されると有効化されます。 - 死亡したクリープはそれぞれ、
bountyのゴールドを支払います。静的イベントCreep.Killedを監視します。 - 次のレベルがあり、ゴールドがその
costを満たしている場合、Space キーで次のレベルを購入します。ゴールドからコストを差し引き、タワーのレベルを上げて、Tower level 2のようにログを出力します。それ以外の場合、Space キーを押しても何も起こりません。
Play を押し、道路上で待ってからアップグレードし、次に Check を押します。
自分で試してみよう
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;
public class Tower : MonoBehaviour
{
[SerializeField] private TowerData data;
[SerializeField] private Bolt boltPrefab;
[SerializeField] private TMP_Text infoText;
private int level;
private int gold;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。