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.
Desafio
MédioTransforme o ritmo do Dropper em um recurso de música.
- Em
DropPattern.cs, escreva uma classe[System.Serializable]Dropcomint lanepúblico efloat delay. - Abaixo dela, escreva
DropPattern : ScriptableObjectcom[CreateAssetMenu]eGameObject blockPrefab,float laneWidth,List<Drop> dropspúblicos. - Em
Dropper, usepublic DropPattern pattern;: para cada queda, aguardedrop.delaye, em seguida, solte o bloco deslocadodrop.lane * pattern.laneWidthao 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity