zaboombafoo
zaboombafoo

Reputation: 13

AI wandering state doesn't seem to work right

I've been trying to make an AI system that would follow specific waypoints and once the player character walks into the trigger zone, the AI would start chasing the character and vice versa.

It seems that this does kind of work, but the AI only moves to one waypoint and then stops until the player walks into the trigger zone; after which if the player walks out, it again only goes to one waypoint then stops again.

I have multiple waypoints and I just want it to keep cycling through them, but it just goes to one of them and stops.


using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;
using UnityEngine.AI;
using UnityEngineInternal;

public class AILocomotion : MonoBehaviour
{
    public Transform playerTransform;
    NavMeshAgent agent;
    Animator animator;
    public float maxTime = 1.0f;
    public float maxDistance = 1.0f;
    float timer = 0.0f;
    bool moveTowards = false;
    bool followWaypoint = false;
    float deaccel= 0.5f;
    float calVelocity = 0.0f;
    public Transform[] points;
    private int destPoint = 0;
    public string animState;

    void Start()
    {

        agent = GetComponent<NavMeshAgent>();
        animator = GetComponent<Animator>();
        moveTowards = false;
        followWaypoint = true;  
        
    }

    // Update is called once per frame
    void Update()
    {
        if (moveTowards == true)
        {
            timer -= Time.deltaTime;
            if (timer < 0.0f)
            {
                float sqDistance = (playerTransform.position - agent.destination).sqrMagnitude;
                if (sqDistance > maxDistance * maxDistance)
                {
                    agent.destination = playerTransform.position;
                }
            }
            animator.SetFloat("Speed", agent.velocity.magnitude);
        }
        else if (!moveTowards && agent.velocity.magnitude>0.0f)
        {
            calVelocity = agent.velocity.magnitude;
            calVelocity -= Time.deltaTime * deaccel;
            animator.SetFloat("Speed", calVelocity);
        }

        
        //CHECKS IF BOTH CONDITIONS HAVE MET AND RUNS THE WAYPOINT FOLLOWING CODE
        if (followWaypoint == true && (!agent.pathPending && agent.remainingDistance < 1.0f))
        {
            GotoNextPoint();
        }

        Debug.LogError("Bool" + followWaypoint);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            moveTowards = true;
            //DISABLES THE WAYPOINT FOLLOWING CODE TO RUN THE CHASE CODE INSTEAD
            followWaypoint = false;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            moveTowards = false; 
            //RE-ENABLES THE WAYPOINT FOLLOWING CODE ONCE THE PLAYER LEAVES THE TRIGGER AREA
            followWaypoint = true;
        }
    }

    //THIS IS THE WAYPOINT FOLLOWING CODE
    void GotoNextPoint()
    {
        animator.SetFloat("Speed", agent.velocity.magnitude);
        // Returns if no points have been set up
        if (points.Length == 0)
            return;

        // Set the agent to go to the currently selected destination.
        agent.destination = points[destPoint].position;

        Debug.LogError("DestPoint = " + destPoint);
        // Choose the next point in the array as the destination.
        // cycling to the start if necessary.
        destPoint = Random.Range(0, points.Length);
    }
}

Upvotes: 0

Views: 28

Answers (1)

Anas Essouli
Anas Essouli

Reputation: 99

Use OnTriggerStay instead of OntriggerEnter and Try

Upvotes: 1

Related Questions