Menu
CoddyTech

Ondas como Dados

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 27 de 64.

As ondas de uma fase são uma lista: três soldados rasos, depois dois brutamontes e, por fim, um chefe. Escrita no código de um gerador, cada fase precisa do seu próprio código. Escrita como dados, a lista fica em um recurso, um recurso por fase, e um único script de gerador lê o recurso que receber. Cada entrada é uma classe [System.Serializable], então o Inspector do recurso exibe a lista:

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;
}

Tudo isso fica em um único arquivo, WaveSet.cs: o ScriptableObject precisa estar em um arquivo com o mesmo nome, e a classe simples Wave pode ficar ao lado dele. Selecione um recurso WaveSet e o Inspector exibirá Waves com seu Size e as linhas Element 0, Element 1, cada uma com Enemy, Count e Spacing; o botão + adiciona uma onda. O gerador percorre a lista em uma coroutine:

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");
    }
}

Com Level1 contendo 3 soldados rasos com 0.5 segundos de intervalo e, depois, 2 brutamontes, os soldados rasos aparecem em 0, 0.5 e 1 segundo; o intervalo após o último soldado raso e a pausa de 3 segundos vêm em seguida, e o primeiro brutamontes aparece em 4.5 segundos. O gerador de Level 2 recebe um recurso Level2 com ondas mais difíceis, e o script continua o mesmo.

challenge icon

Desafio

Médio

Transforme o ritmo do Dropper em um recurso de música.

  1. Em DropPattern.cs, escreva uma classe [System.Serializable] Drop com int lane público e float delay.
  2. Abaixo dela, escreva DropPattern : ScriptableObject com [CreateAssetMenu] e GameObject blockPrefab, float laneWidth, List<Drop> drops públicos.
  3. Em Dropper, use public DropPattern pattern;: para cada queda, aguarde drop.delay e, em seguida, solte o bloco deslocado drop.lane * pattern.laneWidth ao longo do eixo x.

Pressione “Jogar”: quatro blocos caem. Depois, pressione “Verificar”.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;

// Drop (um bloco: sua faixa e a espera antes dele) e DropPattern (o asset) ficam aqui

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity