基地に到達する
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 3/25。
最後のウェイポイントにいる敵が基地に到達すると、その敵は消え、基地のライフが減ります。ライフはGameManagerが管理します。まもなく敵はプレハブから作られるようになりますが、プレハブからシーン内のGameManagerを参照することはできないため、敵は静的イベントで通知します。これはEnemyクラスに属するので、GameManagerは一度だけ購読すれば、後から作られた敵も含め、すべての敵からの通知を受け取れます。敵はReachedBase?.Invoke(this);でイベントを発生させます。?は誰もリッスンしていない場合に呼び出しをスキップし、thisはどの種類の敵が到達したかをリスナーに伝えます。
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
}静的イベントはゲームが続く限り存続するため、各+=には対応する-=が必要です。登録を解除しなければ、破棄されたGameManagerも呼び出され続けてしまいます。
チャレンジ
簡単基地に到達した敵はライフを減らします。
EnemyDataにpublic int damage;を追加します。Enemyにpublic static event Action<Enemy> ReachedBase;を追加します(using System;)。最後のウェイポイントでイベントを発生させ、敵を破棄します。GameManagerに[SerializeField] private int startLives = 20;とprivate int lives;を追加し、Startで設定します。上記のようにイベントを購読します。OnReachedBaseでは、ライフからenemy.data.damageを差し引きます。
「プレイ」を押します。両方の敵が基地で消えます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
// 後で追加するもの:残機、お金、HUD、勝利と敗北。
public class GameManager : MonoBehaviour
{
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド