Волны как данные
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 27 из 64.
Волны уровня — это список: три рядовых противника, затем два громилы, затем босс. Если записать это в коде спавнера, для каждого уровня понадобится собственный код. Если записать в виде данных, список помещается в ресурс: один ресурс на уровень, а один скрипт спавнера считывает переданный ему ресурс. Каждая запись — это класс [System.Serializable], поэтому в Inspector ресурса отображается список:
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Wave
{
public GameObject enemy;
public int count = 1;
public float spacing = 1f;
}
[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
public List<Wave> waves;
public float restBetweenWaves = 3f;
}Всё это находится в одном файле, WaveSet.cs: ScriptableObject нужен файл с таким же именем, а обычный класс Wave может располагаться рядом. Выберите ресурс WaveSet, и в Inspector отобразится список Waves с полем Size и элементами Element 0, Element 1; у каждого будут поля Enemy, Count и Spacing. Кнопка + добавляет волну. Спавнер проходит по списку в корутине:
public class WaveSpawner : MonoBehaviour
{
public WaveSet waveSet;
void Start()
{
StartCoroutine(SendWaves());
}
IEnumerator SendWaves()
{
foreach (Wave wave in waveSet.waves)
{
for (int i = 0; i < wave.count; i++)
{
Instantiate(wave.enemy, transform.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
Debug.Log("Last wave sent");
}
}Если в Level1 указаны 3 рядовых противника с интервалом 0,5 секунды, а затем 2 громилы, рядовые противники появятся в моменты 0, 0,5 и 1 секунда, затем пройдут интервал после последнего рядового противника и пауза в 3 секунды, а первый громила появится через 4,5 секунды. Спавнер уровня Level2 получает ресурс Level2 с более сложными волнами, а скрипт остаётся тем же.
Задание
СреднеПревратите ритм Dropper в ресурс песни.
- В
DropPattern.csнапишите классDropс атрибутом[System.Serializable], содержащий публичные поляint laneиfloat delay. - Ниже напишите
DropPattern : ScriptableObjectс атрибутом[CreateAssetMenu]и публичными полямиGameObject blockPrefab,float laneWidth,List<Drop> drops. - В
Dropperиспользуйтеpublic DropPattern pattern;: для каждого блока дождитесьdrop.delay, затем сбросьте блок, переместив его вдоль оси x наdrop.lane * pattern.laneWidth.
Нажмите «Играть»: упадут четыре блока. Затем нажмите «Проверить».
Попробуйте сами
using System.Collections.Generic;
using UnityEngine;
// Здесь находятся Drop (один блок: его дорожка и пауза перед ним) и DropPattern (ресурс)
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity