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.
Desafio
MédioChuva 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]Dropcom os campos públicoslane(um int: -1 esquerda, 0 meio, 1 direita) edelay(um float: os segundos a esperar antes desta queda). Abaixo dela, escrevaDropPattern, um ScriptableObject com[CreateAssetMenu]e os campos públicosblockPrefab(um GameObject),laneWidth(um float) edrops(umaList<Drop>). - Em
Dropper, substitua os dois campos por um campo públicopatterndo tipo DropPattern. Para cada queda, na ordem, espere o tempo definido pordelaye, em seguida, solte o bloco do padrão na posição do Dropper, deslocada porlanevezeslaneWidthao longo de x. Após a última queda, registrePattern 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
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens