Problemas com NavMeshAgent

Estou tendo um problema irritante de mais com o Uso do Nav Mesh Agent, meu Objetivo é fazer um mísero Inimigo Esqueleto se mover até o Personagem parar Atacar, Perseguir o Personagem pelo cenário e QUANDO MORTO (MORRER) o que acontece é que faz tudo isso que eu mencionei porém quando MORRE ele fica no chão deitado conforme eu animei ele pra fazer, más… Fica me seguindo :frowning:

Como eu resolvo o problema de um Nav Mesh Agent morto parar de me seguir

Desativa o NavMeshAgent - agent.enabled = false;

Também dá pra usar isStoped = true. Eu já tive esse problema, eu tentei usar o isStoped e não funcionou, também tentei desativar o script e por algum motivo ele continuava perseguindo o player mesmo morto, eu não sei se foi algum erro de lógica, até porque meu código estava muito extenso e eu só fiz pra testar.

1 curtida

Pois então tentei diversos metodos, tanto controlando a parte de Enable para False quando chamado Trigger (Die) e outros, nenhum deles está funcionando, o NavMeshAgent parece estar com algum bug interno que não aceita ser desativado de jeito nenhum, não sei como resolvo :skull_and_crossbones:

Tem como mandar o script?

1 curtida

Consigo Sim vou enviar.

using UnityEngine;
using UnityEngine.AI;

public class InimigosControle : MonoBehaviour
{
public NavMeshAgent agent;
public Transform player;
public Animator animator;

public float attackRange = 1.5f;
public float health = 100f;
public float attackCooldown = 1.5f;
public float rotationSpeed = 5f;

private bool isDead = false;
private float nextAttackTime = 0f;

void Update()
{
    if (isDead) return;

    float distance = Vector3.Distance(transform.position, player.position);

    if (distance > attackRange)
    {
        MoveToPlayer();
    }
    else
    {
        AttackPlayer();
    }
}

void MoveToPlayer()
{
    if (agent.isStopped) agent.isStopped = false;
    agent.SetDestination(player.position);

    animator.SetBool("Move", true);
    animator.SetBool("Attack", false);
}

void AttackPlayer()
{
    agent.isStopped = true;
    animator.SetBool("Move", false);

    // Rotação suave para o player ao atacar
    Vector3 direction = (player.position - transform.position).normalized;
    Quaternion lookRotation = Quaternion.LookRotation(new Vector3(direction.x, 0, direction.z));
    transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);

    if (Time.time >= nextAttackTime)
    {
        animator.SetBool("Attack", true);
        Debug.Log("Inimigo atacou o Player!");
        nextAttackTime = Time.time + attackCooldown;
    }
}

public void TakeDamage(float damage)
{
    if (isDead) return;

    health -= damage;
    if (health <= 0)
    {
        Die();
    }
}

void Die()
{
    isDead = true;
    agent.isStopped = true;
    animator.SetTrigger("Die");
    Debug.Log("Inimigo morreu!");
    Destroy(gameObject, 3f);
}

}

Enviei acima, tentei igualmente com o da Aula e nao funcionou, tentei solucoes na Web e este foi o que menos (Bugou) mas o que esta acontecendo neste codigo é que o Inimigo simplesmente fica seguindo dps de morto e quando chega perto volta a “Vida” e ataca o player.

Eu pensei em remover completamente o NavMeshAgent, usando Destroy(agent):
void Die()
{
isDead = true;
agent.isStopped = true;
animator.SetTrigger(“Die”);
Destroy(agent);
Debug.Log(“Inimigo morreu!”);
Destroy(gameObject, 3f);
}

1 curtida

Durante a produção das aulas eu tive esse mesmo problema. Desativar o componente de Agent e zerar sua velocidade deveria resolver:

navMeshAgent.velocity = Vector3.zero;
navMeshAgent.enabled = false; 
1 curtida