Menu
CoddyTech

自分流にアレンジ

Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 25/25。

ゲームにはエンディングが必要です。ライフが0になると敗北し、すべてのウェーブが送り出され、敵が残っていなければ勝利です。スポナーはWaitUntilを使ってボードが空になるのを待ちます。これは毎フレームラムダを確認し、その後イベントを発生させます。

yield return new WaitUntil(() => switchesOn == switches.Length);

どちらのエンディングでもEndPanelを表示し、Time.timeScale = 0でゲームを停止します。残りライフが1のときにTankが2のダメージを受けると、ちょうど0かどうかのチェックをすり抜けてしまうため、Mathf.Maxでライフを0以上に保ちます。Time.timeScaleの値はシーンを読み込んでも維持されるため、「もう一度プレイ」では最初に1に戻します。

次に、ゲームを自分好みにしましょう。ここでは、プレイヤーのInspectorが読み取り専用なので、startMoney(150)、startLives(20)、timeBetweenWaves(8)はコードにある値を使います。宣言されている箇所で変更し、「プレイ」を押してください。道の曲がり角に複数の防衛設備を配置し、資金が入るたびにアップグレードすれば、初期設定のゲームに勝てます。

challenge icon

チャレンジ

難しい

ゲームを終了させてから、コードを調整しましょう。

  1. WaveSpawner:public event Action AllWavesCleared;を追加し、最後のウェーブの後、Enemy.All.Count == 0になったら発生させます(WaitUntil)。
  2. GameManager:ライフを0以上に保ちます。End(message)はシリアライズされたendPanelとendTextを表示し、Time.timeScale = 0を設定します。ライフが0ならGame Over、すべてのウェーブをクリアしたらYou Win!を表示します。
  3. public void PlayAgain():Time.timeScale = 1を設定してから、シーンを再読み込みします。

「プレイ」を押し、8つすべてのウェーブを通して基地を守りましょう。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    [SerializeField] private int startMoney = 150;
    [SerializeField] private int startLives = 20;
    [SerializeField] private WaveSpawner spawner;
    [SerializeField] private TMP_Text moneyText;
    [SerializeField] private TMP_Text livesText;
    [SerializeField] private TMP_Text waveText;

    private int money;
    private int lives;

    void OnEnable()
    {
        Enemy.ReachedBase += OnReachedBase;
        Enemy.Killed += OnKilled;
        spawner.WaveStarted += ShowWave;
    }

    void OnDisable()
    {
        Enemy.ReachedBase -= OnReachedBase;
        Enemy.Killed -= OnKilled;
        spawner.WaveStarted -= ShowWave;
    }

    void Start()
    {
        money = startMoney;
        lives = startLives;
        ShowMoney();
        ShowLives();
    }

    public bool TrySpend(int amount)
    {
        if (amount > money)
        {
            return false;
        }

        money -= amount;
        ShowMoney();
        return true;
    }

    public void Earn(int amount)
    {
        money += amount;
        ShowMoney();
    }

    void OnKilled(Enemy enemy)
    {
        Earn(enemy.data.reward);
    }

    void OnReachedBase(Enemy enemy)
    {
        lives -= enemy.data.damage;
        ShowLives();
    }

    void ShowMoney()
    {
        moneyText.text = "Money: " + money;
    }

    void ShowLives()
    {
        livesText.text = "Lives: " + lives;
    }

    void ShowWave(int wave, int total)
    {
        waveText.text = "Wave " + wave + "/" + total;
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:タワーディフェンスのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド