Доберитесь до базы
Урок 3 из 25 курса Игра на Unity: Tower Defense на Coddy.
Враг на последней контрольной точке достиг базы: он уходит, а база теряет жизни. Жизни принадлежат 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: Tower Defense
Потренируйтесь самостоятельно: Песочница Unity