Conteúdo do Curso
Jogo de Luta no Unity
Jogo de Luta no Unity
Estado de Ataque
csharp
Explicação da Classe AttackState
A classe AttackState
é um estado específico que gerencia o comportamento de ataque do inimigo. Esta classe herda da classe State
e inclui métodos para iniciar, atualizar e finalizar o estado de ataque, além de lidar com a ação de atacar.
Definição da Classe e Variáveis Membro
Definição da Classe:
public class AttackState : State
;
Esta classe herda da classe State
, o que significa que deve implementar os métodos abstratos definidos em State
.
Variáveis Membro:
string attackStateName;
Nome do estado de ataque utilizado no animator.
bool isAttacking;
Indicador para verificar se o inimigo está atacando no momento.
Animator animator;
Controla as animações.
Transform transform;
Transform do inimigo, utilizado para posicionamento e raycasting.
float range;
Alcance do ataque.
int damage;
Dano causado pelo ataque.
LayerMask playerLayer;
Máscara de camada utilizada para identificar o jogador.
Construtor
O construtor inicializa o AttackState
com os componentes necessários: um Transform
para posicionamento, um Animator
para animações, uma layer mask para identificar o jogador, o nome do estado de ataque, o valor de dano e o alcance do ataque. Esses valores são atribuídos às variáveis membro correspondentes.
Método StartState
Este método define isStateFinished
como false
, aciona a animação de ataque ao definir o parâmetro booleano apropriado no animator como true
e reinicia a flag isAttacking
para false
.
Método EndState
Este método interrompe a animação de ataque ao definir o parâmetro booleano apropriado no animator como false
.
Método UpdateState
Este método é chamado a cada frame e aciona o método Attack
para executar a ação de ataque.
Método StartAction
Este método define isAttacking
como true
, indicando que a ação de ataque foi iniciada.
Método FinishMovement
Este método define isAttacking
como false
, indicando que a ação de ataque foi finalizada.
Método de Ataque
Este método executa a ação de ataque. Se isAttacking
for true
, ele lança um raio na direção em que o inimigo está voltado. Se o raio atingir um objeto na playerLayer
, ele chama o método GetAttacked
no objeto atingido, causando dano e encerrando a ação de ataque.
Por Que Fizemos Desta Forma
Controle Sobre o Comportamento de Ataque: A flag
isAttacking
permite controle preciso sobre quando o ataque deve ocorrer, tornando o comportamento mais responsivo aos eventos do jogo;Execução Dinâmica do Ataque: Ao atualizar continuamente o estado de ataque do inimigo, o
AttackState
garante que o inimigo possa atacar o jogador de forma precisa e dinâmica;Integração com Animação: O uso de parâmetros do animador garante que as animações do inimigo estejam corretamente sincronizadas com seus ataques, proporcionando uma experiência fluida e realista.
Funcionamento no Contexto
Entrada no Estado de Ataque: Quando o inimigo entra no AttackState
, o método StartState
é chamado, acionando a animação de ataque e reiniciando a flag isAttacking
.
Durante o Ataque: O método UpdateState
é chamado a cada frame. Ele aciona o método Attack
para verificar se um ataque deve ocorrer.
Início do Ataque: O método StartAction
define isAttacking
como true
, permitindo que o método Attack
execute a ação de ataque.
Execução do Ataque: O método Attack
lança um raio para detectar o jogador e causa dano se o jogador for atingido.
Finalização do Ataque: O método FinishMovement
define isAttacking
como false
, interrompendo a ação de ataque.
Saída do Estado de Ataque: Quando o inimigo sai do AttackState
, o método EndState
é chamado, interrompendo a animação de ataque.
Estruturando o AttackState
desta forma, garantimos que o inimigo possa realizar ataques responsivos e dinâmicos ao jogador, com transições suaves entre animações e estados.
Transição de Proximidade:
csharp
closeTransition:
Esta transição verifica se o jogador está dentro de uma determinada distância horizontal (ThresholdDistance
) do inimigo.
Se a condição for atendida, a transição ocorre aleatoriamente para attack1
ou attack2
com probabilidade igual (50% cada);
Exemplo de Código:
Adicionando closeTransition ao Estado Idle:
stateManager.AddStateTransition(idle, closeTransition);
Esta linha adiciona o closeTransition
ao estado idle
, permitindo que a máquina de estados verifique esta condição quando o inimigo estiver no estado idle.
Por que Fizemos Desta Forma
O sistema de transição permite que o inimigo mude para o estado de ataque com base na proximidade do jogador, aumentando o envolvimento. A abordagem probabilística para escolher entre diferentes ataques adiciona imprevisibilidade, elevando o desafio e o interesse do jogo.
Como Funciona no Contexto
Estado Ocioso:
Enquanto o inimigo está no estado idle
, ele verifica constantemente se o jogador está dentro do ThresholdDistance
usando o closeTransition
.
Se o jogador estiver suficientemente próximo, o closeTransition
é acionado e o inimigo transita para attack1
ou attack2
.
Estados de Ataque:
Uma vez em attack1
ou attack2
, o inimigo executa o ataque.
Após finalizar o ataque, o toIdleTransition
existente faz o inimigo retornar ao estado idle
, pronto para verificar novamente a condição do closeTransition
.
Ao adicionar este closeTransition
, garantimos que o inimigo possa engajar o jogador de forma mais dinâmica e imprevisível quando o jogador estiver em curta distância. Isso aprimora a jogabilidade ao tornar o comportamento do inimigo mais responsivo e envolvente.
Obrigado pelo seu feedback!