Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

À medida que seu gameplay cresce, você eventualmente precisará de objetos que se comportem de forma diferente dependendo do que estão fazendo no momento. Um inimigo pode estar ocioso, patrulhando, perseguindo, atacando, atordoado ou morto. Uma porta pode estar fechada, abrindo, aberta ou trancada. Uma luta contra boss pode passar por várias fases.

É aqui que as Máquinas de Estado se tornam úteis.

image.png

Na imagem acima, você pode ver o inimigo padrão que o Crave cria para o novo projeto, com sua Máquina de Estado aberta ao lado direito. Estamos dentro do estado "wander" que possui estados internos, como o "random selector" (o estado inicial, representado pela cor verde), o "go to random" e o "idle". Você pode ver as transições entre os estados representadas pelas setas, e que cada estado pode ter sua própria lógica, seja em Python, como mostrado na imagem, ou em logic bricks.

Uma máquina de estados ajuda a organizar o comportamento em estados claros ao invés de escrever um grande script cheio de condições não relacionadas.

Nesta lição, você aprenderá:

  • O que é um Estado.
  • O que é uma Transição.
  • Por que máquinas de estado hierárquicas são úteis.
  • Como o Componente de Máquina de Estado do Cave se encaixa em uma entidade.
  • Como funcionam On Enter, On Update e On Exit.
  • Como Python e Logic Bricks podem ser usados dentro de estados e transições.

O objetivo é entender primeiro o modelo mental. Depois que isso fizer sentido, o editor fica muito mais fácil de usar.

O Que É Um Estado?

Um estado descreve o que um objeto está fazendo no momento.

image.png

Por exemplo, um inimigo pode ter estes estados:

  • Idle
  • Patrol
  • Chase
  • Attack
  • Dead

Normalmente, apenas um desses estados deve controlar o inimigo por vez. Se o inimigo estiver em Patrol, ele não deve também executar o comportamento de ataque. Se estiver em Dead, não deve continuar perseguindo o jogador.

Isso facilita raciocinar sobre o gameplay porque cada estado tem uma responsabilidade clara.

Estado O Que Pode Fazer
Idle Ficar parado e esperar.
Patrol Mover-se entre pontos.
Chase Mover-se em direção ao jogador.
Attack Executar uma animação de ataque e causar dano.
Dead Desabilitar movimento e tocar animação de morte.

Ao invés de perguntar "o que o inimigo deve fazer neste frame?" em um script enorme, você pode perguntar "em qual estado o inimigo está atualmente?"

O Que É Uma Transição?

Uma transição é a regra que move a máquina de estados de um estado para outro.

image.png

Por exemplo:

  • De Idle para Patrol quando o inimigo deve começar a se mover, após um temporizador.
  • De Patrol para Chase quando o jogador é detectado.
  • De Chase para Attack quando o inimigo está próximo o suficiente.
  • De Attack para Chase quando o ataque termina.
  • De qualquer estado para Dead quando a vida chega a zero.

A transição não é o comportamento em si. É a decisão que diz "agora devemos mudar de estado."

Essa separação é importante. O estado Attack pode focar em atacar, enquanto a transição decide quando é hora de entrar ou sair desse estado.

Por Que Máquinas de Estado Hierárquicas Ajudam

O Cave usa uma abordagem de máquinas de estado hierárquicas. Isso significa que estados podem estar organizados dentro de outros estados. Isso é útil porque muitos comportamentos compartilham uma ideia pai comum.

Por exemplo, um inimigo pode ser organizado assim:

Alive
    Idle
    Patrol
    Chase
    Attack
Dead

Os estados Idle, Patrol, Chase e Attack pertencem ao estado mais amplo Alive. Isso torna a estrutura mais fácil de entender e pode ajudar a evitar a repetição da mesma lógica em vários lugares.

Para um projeto iniciante, você pode começar com uma máquina de estado simples e plana. Mas conforme o gameplay fica mais complexo, a hierarquia ajuda a manter a lógica limpa.

O Componente de Máquina de Estado

Para usar uma máquina de estados em uma cena, uma entidade precisa de um Componente de Máquina de Estado.

O componente conecta a entidade a um asset de Máquina de Estado. O asset define os estados, transições e lógica, enquanto o componente executa essa lógica na entidade durante o gameplay.

Isso é semelhante a outros sistemas do Cave:

Asset Componente
Python Script Componente Python o executa.
Animation Componente de Animação a reproduz.
State Machine Componente de Máquina de Estado a executa.

Na prática, isso significa que sua entidade inimiga pode ter um Componente de Máquina de Estado, e esse componente pode executar uma máquina de estado de IA inimiga.

Um asset de máquina de estado pode ter propriedades, como você pode ver indo na aba de propriedades, e essas propriedades podem ser alteradas localmente no componente da máquina de estado, permitindo criar máquinas de estado modulares que têm configurações diferentes para vários tipos de entidades.

Eventos de Estado

Cada estado pode reagir a três momentos importantes:

Evento Quando Executa Uso Comum
On Enter Quando o estado começa. Resetar temporizadores, inicializar variáveis, tocar animação, escolher um alvo.
On Update Enquanto o estado está ativo. Mover, verificar distâncias, atualizar temporizadores.
On Exit Ao sair do estado. Parar efeitos, limpar valores temporários.

Por exemplo, um estado Attack pode funcionar assim:

  • On Enter: tocar animação de ataque.
  • On Update: esperar o momento do golpe ou callback da animação.
  • On Exit: limpar a flag de ataque.

Isso faz com que cada estado pareça um pequeno comportamento auto-contido.

Python Dentro dos Estados

Máquinas de estado podem usar Python para lógica.

Dentro do código Python de cada Estado, o Cave fornece variáveis úteis como entity e scene, para que o estado possa controlar a entidade que possui o Componente da Máquina de Estado.

Por exemplo, um estado poderia tocar um som quando iniciado:

cave.playSound("Enemy Alert", volume=0.8)

Ou ele poderia ler uma propriedade da entidade:

health = entity.properties.get("health", 100)

Isso mantém a lógica do estado próxima do comportamento a que pertence.

Python Dentro das Transições

Transições também podem usar Python. Para a lógica em Python nas transições, o Cave usa uma variável chamada result. Se result se tornar True, a transição pode ocorrer. Por exemplo, uma transição para o estado Dead pode checar a vida assim:

health = entity.properties.get("health", 100)
result = health <= 0

Uma transição de Chase para Attack poderia checar distância se seu script ou propriedades do inimigo fornecem esse valor:

player = scene.get("Player")
playerPos = player.getTransform().getWorldPosition()
entityPos = entity.getTransform().getWorldPosition()

distanceToPlayer = (playerPos - entityPos).length()
result = distanceToPlayer < 2.0

Os dados exatos dependem do seu jogo, mas a ideia é sempre a mesma: a transição decide se é hora de mudar de um estado para outro.

DICA: Durante uma transição, todas as variáveis locais definidas no estado de onde a transição está vindo estão disponíveis para você. Então, no exemplo anterior, onde calculamos a distância entre a entidade e o jogador, poderíamos armazenar o transform do jogador e o transform da entidade em duas variáveis no evento on-enter do estado de onde essa transição vem, para economizar alguns recursos, já que esses dados ficariam em cache e não precisaríamos recuperá-los a cada frame.

Logic Bricks Dentro das Máquinas de Estado

Máquinas de estado também podem usar Logic Bricks.

Isso é útil quando você deseja construir comportamento visualmente ao invés de escrever código Python. Para muitas tarefas de gameplay, os Logic Bricks são uma forma bem acessível de conectar eventos, condições e ações.

Eles funcionam exatamente da mesma forma explicada acima para o código Python dentro do estado ou para uma transição. Os Logic Bricks do Estado e os Logic Bricks da Transição já estão inicializados com os bricks que você precisa para começar.

Você pode misturar Python e Logic Bricks dependendo do que parecer mais claro para o comportamento que está construindo. Se um Estado ou Transição tiver ambos, então ambos serão executados e a transição ocorrerá se um OU o outro acontecer.

Quando Usar uma Máquina de Estado

Use uma máquina de estado quando um objeto tiver modos claros de comportamento.

Bons exemplos incluem:

  • IA inimiga.
  • Fases de boss.
  • Portas e objetos interativos.
  • Fluxo de missão ou quest.
  • Progressão de cutscenes.
  • Estados de habilidades de personagem.

Você pode não precisar de uma máquina de estado para objetos muito simples de uma ação só. Se um item pego apenas toca um som e desaparece, um pequeno script Python ou configuração de Logic Bricks pode ser suficiente.

O Que Você Deve Lembrar

Uma máquina de estado organiza o gameplay em estados e transições.

Estados descrevem o que está acontecendo no momento. Transições decidem quando trocar para outro estado. On Enter, On Update e On Exit ajudam a manter cada estado focado e legível.

Para comportamentos simples, um script pode ser suficiente. Para comportamentos com múltiplos modos, uma máquina de estado normalmente torna a lógica mais fácil de entender e expandir.