Волны как данные
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 22 из 50.
Волны уровня — это список: три пехотинца, затем два громилы, затем босс. Если записать их в коде спавнера, для каждого уровня понадобится собственный код. Если же представить их как данные, список помещается в ресурс: по одному ресурсу на уровень, а один скрипт спавнера считывает переданный ему ресурс. Каждая запись — это класс [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 секунды. Спавнер Level 2 получает ресурс Level2 с более сложными волнами, а скрипт остаётся тем же.
Задание
СреднеДождь из блоков: блоки падают с неба в ритм, а ты уворачиваешься от них с помощью стрелок. Dropper роняет блок в каждую дорожку своего массива lanes, всегда с интервалом в 1 секунду. Преврати ритм в данные, чтобы каждая песня могла быть ресурсом:
- В
DropPattern.csнапиши классDropс атрибутом[System.Serializable]и общедоступными полямиlane(int: -1 — слева, 0 — посередине, 1 — справа) иdelay(float: сколько секунд ждать перед этим падением). Ниже напишиDropPattern— ScriptableObject с атрибутом[CreateAssetMenu]и общедоступными полямиblockPrefab(GameObject),laneWidth(float) иdrops(List<Drop>). - В
Dropperзамени оба поля одним общедоступным полемpatternтипа DropPattern. Для каждого падения по порядку подождиdelay, затем урони блок из шаблона в позицииDropper, смещённой по x наlane, умноженное наlaneWidth. После последнего падения выведи в журналPattern done.
В проекте есть ресурс Song1: ширина дорожки — 2, всего четыре падения, а в Inspector он помещён в поле pattern объекта Dropper. Нажми Play и уворачивайся, затем нажми Check.
Попробуйте сами
using System.Collections.Generic;
using UnityEngine;
// Здесь находятся Drop (один блок: его дорожка и пауза перед ним) и DropPattern (ресурс)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов