Menu
CoddyTech

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

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

challenge icon

Задание

Средне

Превратите ритм Dropper в ресурс песни.

  1. В DropPattern.cs напишите класс Drop с атрибутом [System.Serializable], содержащий публичные поля int lane и float delay.
  2. Ниже напишите DropPattern : ScriptableObject с атрибутом [CreateAssetMenu] и публичными полями GameObject blockPrefab, float laneWidth, List<Drop> drops.
  3. В Dropper используйте public DropPattern pattern;: для каждого блока дождитесь drop.delay, затем сбросьте блок, переместив его вдоль оси x на drop.lane * pattern.laneWidth.

Нажмите «Играть»: упадут четыре блока. Затем нажмите «Проверить».

Попробуйте сами

using System.Collections.Generic;
using UnityEngine;

// Здесь находятся Drop (один блок: его дорожка и пауза перед ним) и DropPattern (ресурс)

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

Потренируйтесь самостоятельно: Песочница Unity