Menu
CoddyTech

Волны как данные

Часть раздела Архитектура игр в 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 с более сложными волнами, а скрипт остаётся тем же.

challenge icon

Задание

Средне

Дождь из блоков: блоки падают с неба в ритм, а ты уворачиваешься от них с помощью стрелок. 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 (ресурс)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Архитектура игр в Unity