Search Unity

AI keeps getting stuck in place

Discussion in 'Navigation' started by HenryCats, Apr 8, 2022.

  1. HenryCats

    HenryCats

    Joined:
    Dec 8, 2020
    Posts:
    4
    i use a simple enemy AI and it keeps getting stuck in place its really annoying can some please help

    here is my script:

    Code (CSharp):
    1.  
    2. using UnityEngine;
    3. using UnityEngine.AI;
    4.  
    5. public class EnemyAi : MonoBehaviour
    6. {
    7.     public bool hasHealth = false;
    8.  
    9.     public bool attackMode = false;
    10.  
    11.     public NavMeshAgent agent;
    12.  
    13.     public Transform player;
    14.  
    15.     public LayerMask whatIsGround, whatIsPlayer;
    16.  
    17.     public float health;
    18.  
    19.     //Patroling
    20.     public Vector3 walkPoint;
    21.     bool walkPointSet;
    22.     public float walkPointRange;
    23.  
    24.     //Attacking
    25.     public float timeBetweenAttacks;
    26.     bool alreadyAttacked;
    27.  
    28.     //States
    29.     public float sightRange, attackRange;
    30.     public bool playerInSightRange, playerInAttackRange;
    31.  
    32.     private void Awake()
    33.     {
    34.         player = GameObject.Find("First Person Player").transform;
    35.         agent = GetComponent<NavMeshAgent>();
    36.     }
    37.  
    38.     private void Update()
    39.     {
    40.         //Check for sight and attack range
    41.         playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
    42.         playerInAttackRange = Physics.CheckSphere(transform.position, attackRange, whatIsPlayer);
    43.  
    44.         if (!playerInSightRange && !playerInAttackRange) Patroling();
    45.         if (playerInSightRange && !playerInAttackRange) ChasePlayer();
    46.         if (playerInAttackRange && playerInSightRange) AttackPlayer();
    47.     }
    48.  
    49.     private void Patroling()
    50.     {
    51.         if (!walkPointSet) SearchWalkPoint();
    52.  
    53.         if (walkPointSet)
    54.             agent.SetDestination(walkPoint);
    55.  
    56.         Vector3 distanceToWalkPoint = transform.position - walkPoint;
    57.  
    58.         //Walkpoint reached
    59.         if (distanceToWalkPoint.magnitude < 1f)
    60.             walkPointSet = false;
    61.     }
    62.     private void SearchWalkPoint()
    63.     {
    64.         //Calculate random point in range
    65.         float randomZ = Random.Range(-walkPointRange, walkPointRange);
    66.         float randomX = Random.Range(-walkPointRange, walkPointRange);
    67.  
    68.         walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
    69.  
    70.         if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
    71.             walkPointSet = true;
    72.     }
    73.  
    74.     private void ChasePlayer()
    75.     {
    76.         agent.SetDestination(player.position);
    77.     }
    78.  
    79.     private void AttackPlayer()
    80.     {
    81.         if (attackMode)
    82.         {
    83.             //Make sure enemy doesn't move
    84.             agent.SetDestination(transform.position);
    85.  
    86.             transform.LookAt(player);
    87.  
    88.             if (!alreadyAttacked)
    89.             {
    90.                 alreadyAttacked = true;
    91.                 Invoke(nameof(ResetAttack), timeBetweenAttacks);
    92.             }
    93.         }
    94.     }
    95.     private void ResetAttack()
    96.     {
    97.         alreadyAttacked = false;
    98.     }
    99.  
    100.     public void TakeDamage(int damage)
    101.     {
    102.         if (hasHealth)
    103.         {
    104.             health -= damage;
    105.  
    106.             if (health <= 0) Invoke(nameof(DestroyEnemy), 0.5f);
    107.         }
    108.     }
    109.     private void DestroyEnemy()
    110.     {
    111.         Destroy(gameObject);
    112.     }
    113.  
    114.     private void OnDrawGizmosSelected()
    115.     {
    116.         Gizmos.color = Color.yellow;
    117.         Gizmos.DrawWireSphere(transform.position, sightRange);
    118.         if (attackMode)
    119.         {
    120.             Gizmos.color = Color.red;
    121.             Gizmos.DrawWireSphere(transform.position, attackRange);
    122.         }
    123.     }
    124. }
     
    Last edited: Apr 8, 2022