Очистите арену
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 55 из 64.
Событие с пометкой static принадлежит классу, а не отдельному объекту. Для всех врагов, которые когда-либо появятся, существует одно событие Enemy.Died, поэтому спавнер может подписаться на него с помощью Enemy.Died += OnEnemyDied; ещё до появления любого врага, а каждый враг вызывает это событие, передавая себя в качестве аргумента. Та же идея на обычном C#:
public class Coin
{
public static event Action<Coin> Picked;
public void Pick()
{
Picked?.Invoke(this);
}
}
public class Purse
{
private int coins;
public Purse()
{
Coin.Picked += OnPicked; // Пока объект Coin не нужен
}
void OnPicked(Coin coin)
{
coins++;
}
}К событию экземпляра обращаются через объект, например hero.Died; к статическому — через имя класса, например Coin.Picked. Статическое событие переживает все объекты, поэтому отпишись от него в OnDisable, иначе уничтоженный спавнер останется в его списке.
Задание
СреднеПусть каждая волна ждёт, пока арена не опустеет.
- В
Enemyдобавьpublic static event Action<Enemy> Died;и вызовиDied?.Invoke(this);непосредственно передDestroy(gameObject);. - В
WaveSpawnerведи подсчётalive: увеличивай на 1 при каждом появлении, уменьшай на 1 в методе, которыйOnEnableподписывает наEnemy.Died, аOnDisableотписывает. - После появления волны жди, пока
alive > 0.
Нажми «Играть» и победи волну 1: волна 2 появится через 2 секунды. Затем нажми «Проверить».
Попробуйте сами
using System.Collections;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private WaveSet waveSet;
[SerializeField] private Transform[] spawnPoints;
public int Wave { get; private set; }
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
while (true)
{
foreach (Wave wave in waveSet.waves)
{
Wave++;
Debug.Log("Wave " + Wave);
for (int i = 0; i < wave.count; i++)
{
Transform point = spawnPoints[i % spawnPoints.Length];
Instantiate(wave.enemy, point.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
}
}
}
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу7Машины состояний
Состояния как классыСостояние тревогиМашина состоянийПереходыЛогика враговРыцарь атакуетПовторение: состояния двери10Проект: Арена выживания
ГеройВиды врагов2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity