Uma máquina de estados
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 37 de 64.
O método SetState do Beacon seria igual em todo objeto com estados: uma torre, um inimigo, uma porta. Esse código pode ficar em uma classe própria, uma máquina de estados, que mantém o estado atual e o altera. Cada objeto cria uma máquina e a chama, em vez de repetir o código:
public class StateMachine
{
public IState Current { get; private set; }
public void ChangeState(IState next)
{
Current?.Exit();
Current = next;
Current.Enter();
}
public void Tick()
{
Current?.Tick();
}
}
public class Beacon : MonoBehaviour
{
public Renderer lamp;
private StateMachine machine = new StateMachine();
private IState blink;
private IState steady;
void Start()
{
blink = new BlinkState(lamp);
steady = new SteadyState();
machine.ChangeState(steady);
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame) machine.ChangeState(machine.Current == steady ? blink : steady);
machine.Tick();
}
}A primeira chamada a ChangeState não tem estado para abandonar: Current é null, e ?. ignora a chamada a Exit. A Seção 1 alertou que ?. não detecta o null falso do Unity; isso se aplica a objetos Unity destruídos, e os estados são objetos C# comuns, então ?. é seguro aqui. Current tem um private set, então nenhum script pode trocar o estado sem passar por ChangeState e seus métodos Exit e Enter.
A ordem dentro de ChangeState importa sempre que dois estados mexem na mesma coisa. Exit desfaz o que o estado antigo alterou, depois Enter configura o novo, então o novo estado tem a palavra final. Se o Enter de um DarkState apagasse a lâmpada e fosse executado antes do Exit de BlinkState, esse Exit acenderia a lâmpada de novo no estado escuro. A StateMachine também é uma classe comum: o beacon, uma torre e um inimigo criam cada um a sua com new e chamam seu Tick no Update.
Desafio
MédioExecute os estados do jogador com uma máquina.
- Em
StateMachine.cs, escrevapublic class StateMachinecompublic IState Current { get; private set; }e umTick()que atualiza o estado. ChangeState(IState next)ignora o estado atual; caso contrário, executa Exit, defineCurrente executa Enter.Player: Start criamachine,walkesneake inicia o estado de caminhada; Update inicia o estado de furtividade enquanto Space estiver pressionado; caso contrário, inicia o estado de caminhada e, em seguida, atualiza o estado.
Pressione “Jogar” e mantenha Space pressionada: Sneak: enter. Em seguida, pressione “Verificar”.
Experimente você mesmo
// StateMachine: Current, ChangeState e Tick
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 Loot7Máquinas de estados
Estados como classesO estado de alertaUma máquina de estadosTransiçõesCérebros dos inimigosO cavaleiro atacaRevisão: estados da porta2Interfaces 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