Menu
CoddyTech

Ondas como dados

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 22 de 50.

As ondas de um nível são uma lista: três soldados rasos, depois dois brutamontes e, em seguida, um chefe. Escritas no código de um gerador, cada nível precisa do próprio código. Escrita como dados, a lista vai para um recurso, um recurso por nível, e um único script de gerador lê o recurso que recebe. 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 fica em um único arquivo, WaveSet.cs: o ScriptableObject precisa de um arquivo com o próprio 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 segundo 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 brutamonte aparece em 4.5 segundos. O gerador de Level 2 recebe um recurso Level2 com ondas mais difíceis, e o script permanece igual.

challenge icon

Desafio

Médio

Chuva de Blocos: blocos caem do céu seguindo um ritmo, e você desvia deles usando as setas. O Dropper solta um bloco em cada faixa do seu array lanes, sempre com 1 segundo de intervalo. Transforme o ritmo em dados, para que cada música possa ser um asset:

  • Em DropPattern.cs, escreva uma classe [System.Serializable] Drop com os campos públicos lane (um int: -1 esquerda, 0 meio, 1 direita) e delay (um float: os segundos a esperar antes desta queda). Abaixo dela, escreva DropPattern, um ScriptableObject com [CreateAssetMenu] e os campos públicos blockPrefab (um GameObject), laneWidth (um float) e drops (uma List<Drop>).
  • Em Dropper, substitua os dois campos por um campo público pattern do tipo DropPattern. Para cada queda, na ordem, espere o tempo definido por delay e, em seguida, solte o bloco do padrão na posição do Dropper, deslocada por lane vezes laneWidth ao longo de x. Após a última queda, registre Pattern done.

O projeto tem um asset Song1: largura da faixa 2 e quatro quedas, e o Inspector o coloca no campo pattern do Dropper. Pressione Play e desvie, depois Check.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;

// Drop (um bloco: sua faixa e o tempo de espera antes dele) e DropPattern (o asset) ficam aqui
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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