タワーディフェンス入門
CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 61/64。
クリープたちは道に沿ってあなたの基地へ進み、1基のタワーが基地を守っています。タワーは射程内にいる間、最も近いクリープにボルトを撃ち込み、倒したクリープはそれぞれゴールドを落とします。スペースキーを押すと、そのゴールドを使ってタワーを次のレベルに強化できます。レベルが上がるごとに射程が伸びたり、発射速度が上がったり、威力が増したりします。基地にたどり着いたクリープは、そのまま通り抜けます。レベルは、コードに触れることなくデザイナーがアセットで調整するゲームデータです。また、タワーは大量のボルトを発射するため、射撃のたびにボルトを生成して破棄するのではなく、プールから再利用します。
2つのスクリプトを作成します。アセットの型である TowerData と、Tower です。Creep、Bolt、CreepSpawner は準備済みで、タワーの Nearest と Show も用意されています。
チャレンジ
難しいタワーを完成させましょう。Nearest(range)とShow()は準備できています。
TowerLevel:シリアライズ可能で、range、fireEvery、damage、costはpublicです。TowerDataはpublic List<TowerLevel> levelsを保持します。fireEvery秒ごとに、Nearest(range)がクリープを見つけたら、タワーの位置にObjectPool<Bolt>からボルトを配置します:bolt.Launch(creep, damage, pool.Release)。Creep.Killedの発生後に報奨金bountyが支払われたときと、スペースキーを押して次のレベルをそのcostで購入したときにShow()を実行し、Tower level 2をログに記録します。
「プレイ」を押してアップグレードしましょう。その後、「確認」を押します。
自分で試してみよう
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;
// 準備済み: 範囲内でタワーに最も近いクリープ。いなければ null。
Creep Nearest(float range)
{
Creep nearest = null;
float best = Mathf.Infinity;
foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
{
if (hit.TryGetComponent(out Creep creep))
{
float distance = Vector3.Distance(transform.position, creep.transform.position);
if (distance < best)
{
best = distance;
nearest = creep;
}
}
}
return nearest;
}
// 準備済み: レベルと所持ゴールドを Level 1, 0 gold の形式で表示する。
void Show()
{
infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
}
}
Unityのゲームアーキテクチャのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド