Menu
CoddyTech

タワーディフェンス入門

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 61/64。

クリープたちは道に沿ってあなたの基地へ進み、1基のタワーが基地を守っています。タワーは射程内にいる間、最も近いクリープにボルトを撃ち込み、倒したクリープはそれぞれゴールドを落とします。スペースキーを押すと、そのゴールドを使ってタワーを次のレベルに強化できます。レベルが上がるごとに射程が伸びたり、発射速度が上がったり、威力が増したりします。基地にたどり着いたクリープは、そのまま通り抜けます。レベルは、コードに触れることなくデザイナーがアセットで調整するゲームデータです。また、タワーは大量のボルトを発射するため、射撃のたびにボルトを生成して破棄するのではなく、プールから再利用します。

2つのスクリプトを作成します。アセットの型である TowerData と、Tower です。Creep、Bolt、CreepSpawner は準備済みで、タワーの Nearest と Show も用意されています。

challenge icon

チャレンジ

難しい

タワーを完成させましょう。Nearest(range)とShow()は準備できています。

  1. TowerLevel:シリアライズ可能で、range、fireEvery、damage、costはpublicです。TowerDataはpublic List<TowerLevel> levelsを保持します。
  2. fireEvery秒ごとに、Nearest(range)がクリープを見つけたら、タワーの位置にObjectPool<Bolt>からボルトを配置します:bolt.Launch(creep, damage, pool.Release)。
  3. 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プレイグラウンド