Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Estado de Ataque | Comportamento do Inimigo
Jogo de Luta no Unity

bookEstado de Ataque

public class AttackState : State
{
    string attackStateName; 
    bool isAttacking;
    Animator animator;
    Transform transform;
    float range;
    int damage;
    LayerMask playerLayer;

    public AttackState(Transform t, Animator animator, LayerMask playerLayer, string attackStateName, int damage, float range = 2.1f)
    {
        this.animator = animator;
        this.attackStateName = attackStateName;
        this.range = range;
        transform = t;
        this.damage = damage;
        this.playerLayer = playerLayer;
    }

    public override void StartState()
    {
        isStateFinished = false;
        animator.SetBool(attackStateName, true);
        isAttacking = false;
    }

    public override void EndState()
    {
        animator.SetBool(attackStateName, false);
    }

    public override void UpdateState(float deltaTime)
    {
        Attack();
    }

    public override void StartAction()
    {
        isAttacking = true;
    }

    public override void FinishMovement()
    {
        isAttacking = false;
    }

    void Attack()
    {
        if (!isAttacking) return;
        RaycastHit2D rayCastHit = Physics2D.Raycast(transform.position, Vector2.right * transform.localScale.x, range, playerLayer);
        if (rayCastHit)
        {
            if (rayCastHit.transform.TryGetComponent(out IGetAttacked getAttacked))
            {
                getAttacked.GetAttacked(damage);
                isAttacking = false;
            }
        }
    }
}

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:

closeTransition = new Transition(() =>
{
    return (ThresholdDistance >= Mathf.Abs(transform.position.x - player.position.x));
}, new StatePourcentage(attack2, 50f), new StatePourcentage(attack1, 50f));

stateManager.AddStateTransition(idle, closeTransition);
stateManager.AddStateTransition(idle, FarAwayTransition);
stateManager.AddStateTransition(dashState, toIdleTransition);
stateManager.AddStateTransition(dashState, finishRunning);
stateManager.AddStateTransition(runState, finishRunning);
stateManager.AddStateTransition(attack2, toIdleTransition);
stateManager.AddStateTransition(attack1, toIdleTransition);

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:
 ```csharp
 closeTransition = new Transition(() =>
 {
     return (ThresholdDistance >= Mathf.Abs(transform.position.x - player.position.x));
 }, new StatePourcentage(attack2, 50f), new StatePourcentage(attack1, 50f));
 ```

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.

question mark

Qual método é responsável por detectar e aplicar dano ao jogador dentro do alcance na classe AttackState?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 7

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 3.33

bookEstado de Ataque

Deslize para mostrar o menu

public class AttackState : State
{
    string attackStateName; 
    bool isAttacking;
    Animator animator;
    Transform transform;
    float range;
    int damage;
    LayerMask playerLayer;

    public AttackState(Transform t, Animator animator, LayerMask playerLayer, string attackStateName, int damage, float range = 2.1f)
    {
        this.animator = animator;
        this.attackStateName = attackStateName;
        this.range = range;
        transform = t;
        this.damage = damage;
        this.playerLayer = playerLayer;
    }

    public override void StartState()
    {
        isStateFinished = false;
        animator.SetBool(attackStateName, true);
        isAttacking = false;
    }

    public override void EndState()
    {
        animator.SetBool(attackStateName, false);
    }

    public override void UpdateState(float deltaTime)
    {
        Attack();
    }

    public override void StartAction()
    {
        isAttacking = true;
    }

    public override void FinishMovement()
    {
        isAttacking = false;
    }

    void Attack()
    {
        if (!isAttacking) return;
        RaycastHit2D rayCastHit = Physics2D.Raycast(transform.position, Vector2.right * transform.localScale.x, range, playerLayer);
        if (rayCastHit)
        {
            if (rayCastHit.transform.TryGetComponent(out IGetAttacked getAttacked))
            {
                getAttacked.GetAttacked(damage);
                isAttacking = false;
            }
        }
    }
}

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:

closeTransition = new Transition(() =>
{
    return (ThresholdDistance >= Mathf.Abs(transform.position.x - player.position.x));
}, new StatePourcentage(attack2, 50f), new StatePourcentage(attack1, 50f));

stateManager.AddStateTransition(idle, closeTransition);
stateManager.AddStateTransition(idle, FarAwayTransition);
stateManager.AddStateTransition(dashState, toIdleTransition);
stateManager.AddStateTransition(dashState, finishRunning);
stateManager.AddStateTransition(runState, finishRunning);
stateManager.AddStateTransition(attack2, toIdleTransition);
stateManager.AddStateTransition(attack1, toIdleTransition);

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:
 ```csharp
 closeTransition = new Transition(() =>
 {
     return (ThresholdDistance >= Mathf.Abs(transform.position.x - player.position.x));
 }, new StatePourcentage(attack2, 50f), new StatePourcentage(attack1, 50f));
 ```

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.

question mark

Qual método é responsável por detectar e aplicar dano ao jogador dentro do alcance na classe AttackState?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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