Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Estado de Execução | Comportamento do Inimigo
Jogo de Luta no Unity
course content

Conteúdo do Curso

Jogo de Luta no Unity

Jogo de Luta no Unity

1. Sistema de Animação do Unity
2. Comportamento do Jogador
3. Comportamento do Inimigo
4. Melhore o Jogo
5. Melhore o Jogo Flappy Bird

bookEstado de Execução

Alterações e Adições

Variável isStateFinished:

Esta é uma variável booleana que indica se o estado terminou sua execução.

Método FinishState:

Este é um novo método virtual que define isStateFinished como true. Ser virtual significa que classes derivadas podem sobrescrever este método se precisarem realizar ações adicionais quando um estado termina.

Por Que Essas Alterações Foram Feitas

As alterações introduzem a variável isStateFinished para rastrear a conclusão do estado e o método FinishState para padronizar o sinal de conclusão do estado, permitindo que classes derivadas adicionem lógica personalizada ao concluir o estado.

Estado de Corrida

Vamos olhar para a classe RunState, que herda da classe State. Esta classe é responsável por lidar com o comportamento de corrida do nosso inimigo. Vamos nos concentrar nas adições e alterações feitas nesta classe.

Construtor:

public RunState(Rigidbody2D rb, Animator animator, Transform p, float speed);

Este construtor inicializa o RunState com os componentes necessários: um Rigidbody2D para movimento, um Animator para animações, um Transform para rastrear o jogador e uma speed para determinar a velocidade com que o inimigo corre;

Método StartState:

public override void StartState(); Este método define isStateFinished como false e aciona a animação de corrida ao definir o parâmetro booleano "run" no animator como true.

Método UpdateState:

public override void UpdateState(float DeltaTime); Este método atualiza a posição e orientação do inimigo com base na posição do jogador; Ajusta a escala do inimigo para encarar o jogador, calcula a velocidade com base na velocidade, e aplica essa velocidade ao Rigidbody2D.

Método EndState:

public override void EndState() Este método para a animação de corrida ao definir o parâmetro booleano "run" no animator como false.

Como Funciona para Nosso Inimigo

  • Movimento e Animação:

Usando Rigidbody2D e Animator, o RunState garante que o inimigo possa se mover suavemente e ter animações correspondentes. Isso torna o comportamento visual e fisicamente realista;

  • Rastreamento da Posição do Jogador:

O player transform permite que o inimigo sempre se mova em direção ao jogador, o que é essencial para comportamentos de perseguição ou fuga;

  • Manipulação de Direção:

Ajustar o scale.x com base na posição do jogador garante que o inimigo encare o jogador corretamente enquanto corre, adicionando realismo;

  • Atualizações Dinâmicas de Estado:

O método UpdateState é chamado a cada quadro para ajustar continuamente o movimento e a direção do inimigo com base na posição do jogador, tornando o inimigo responsivo e dinâmico.

Inicialização do Inimigo

Explicação

Inicialização de Estado:

As variáveis idle e runState são inicializadas com seus respectivos estados. A variável idle é uma instância de IdleState com o animator passado, enquanto runState é uma instância de RunState que inclui um Rigidbody2D, Animator, Transform para o jogador e um valor de velocidade.

Inicialização do StateManager:

stateManager = new StateManager(idle); O StateManager é inicializado com o estado idle como estado inicial.

Definições de Transição:

  • FarAwayTransition:

FarAwayTransition = new Transition(() => { return (ThresholdDistance < Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(runState, 50f), new StatePourcentage(dashState, 50f));;

Esta transição verifica se o jogador está mais distante que ThresholdDistance;

  • toIdleTransition: toIdleTransition = new Transition(() => { return stateManager.GetCurrentState().isStateFinished; }, new StatePourcentage(idle, 100)); Esta transição verifica se o estado atual está concluído. Se verdadeiro, transita para o estado idle com 100% de probabilidade.
  • finishRunning: finishRunning = new Transition(() => { return (ThresholdDistance >= Vector2.Distance(transform.position, player.position)); }, new StatePourcentage(idle, 100)); Esta transição verifica se o jogador está mais próximo que ThresholdDistance. Se verdadeiro, transita para o estado idle com 100% de probabilidade.

Adicionando Transições ao StateManager:

Essas linhas adicionam as transições definidas ao stateManager.

Por Que Fizemos Assim

Mudanças Dinâmicas de Estado:

As transições permitem que o inimigo mude dinamicamente seu comportamento com base na posição do jogador e no status de conclusão do estado atual, tornando o inimigo mais responsivo e interativo dentro do ambiente do jogo.

Transições Condicionais:

O uso de condições (como verificar distância ou conclusão de estado) garante que as transições de estado ocorram de forma lógica e apropriada, melhorando o realismo do jogo.

Transições Baseadas em Probabilidade:

Usar StatePourcentage permite transições baseadas em probabilidade, adicionando um elemento de imprevisibilidade e variedade ao comportamento do inimigo.

O que acontece com o `animator` quando o método `StartState` é chamado na classe `RunState`?

O que acontece com o animator quando o método StartState é chamado na classe RunState?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5
some-alt