ウェーブカウンター
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 24/25。
HUD にはウェーブ番号が表示されます。スポーナーはその番号を把握しており、GameManager が表示するため、スポーナーはウェーブ番号とウェーブの総数を伴う C# イベント WaveStarted を発生させます。敵の静的イベントとは異なり、このイベントはそのスポーナーに属し、GameManager は spawner フィールドを通じて購読します。
void OnEnable()
{
spawner.WaveStarted += ShowWave;
}Action<int, int> は 2 つの int を渡すため、ShowWave は 2 つの引数を受け取ります。void ShowWave(int wave, int total)。
チャレンジ
中級現在のウェーブを表示します。
WaveSpawnerで、public event Action<int, int> WaveStarted;(using System;)を追加し、ウェーブが始まるときにi + 1とwaves.Countを渡してイベントを発生させます。GameManagerで、シリアライズされたspawner(WaveSpawner)とwaveText(TMP_Text)を追加します。OnEnableで登録し、OnDisableで登録解除して、Wave 1/8を表示します。
「プレイ」を押します。最初のウェーブが始まると、右上にWave 1/8が表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 150;
[SerializeField] private int startLives = 20;
[SerializeField] private TMP_Text moneyText;
[SerializeField] private TMP_Text livesText;
private int money;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
Enemy.Killed += OnKilled;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
Enemy.Killed -= OnKilled;
}
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;
}
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド