Menu
CoddyTech

Доберитесь до базы

Урок 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, который не отписался от события.

challenge icon

Задание

Легко

Враги, добравшиеся до базы, отнимают жизни.

  1. В EnemyData добавь public int damage;.
  2. В Enemy добавь public static event Action<Enemy> ReachedBase; (using System;). На последней точке маршрута вызови это событие и уничтожь врага.
  3. В 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