自分流にアレンジ
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)はコードにある値を使います。宣言されている箇所で変更し、「プレイ」を押してください。道の曲がり角に複数の防衛設備を配置し、資金が入るたびにアップグレードすれば、初期設定のゲームに勝てます。
チャレンジ
難しいゲームを終了させてから、コードを調整しましょう。
WaveSpawner:public event Action AllWavesCleared;を追加し、最後のウェーブの後、Enemy.All.Count == 0になったら発生させます(WaitUntil)。GameManager:ライフを0以上に保ちます。End(message)はシリアライズされたendPanelとendTextを表示し、Time.timeScale = 0を設定します。ライフが0ならGame Over、すべてのウェーブをクリアしたらYou Win!を表示します。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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド