- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.AI;
- [CreateAssetMenu(menuName = "Finite State Machine/Action/Patrol/WalkAction")]
- public class PatrolWalkAction : Action
- {
- [SerializeField] private float waitTime = 2f;
- [SerializeField] private float distOffSet = 0.1f;
- [SerializeField] private bool isWaiting = false;
- public override void Execute(FSM fsm)
- {
-
- NavMeshAgent agent = fsm.Controller.Agent;
- Waypoints waypoints = fsm.Controller.Waypoints;
- Animator animator = fsm.Controller.Animator;
- if (agent == null || waypoints == null)
- {
- return;
- }
- if (!isWaiting)
- {
- animator.SetBool("IsMoving", true);
- fsm.Controller.Agent.isStopped = false;
-
- if (!agent.pathPending && agent.remainingDistance <= distOffSet)
- {
-
- int randomIndex = Random.Range(0, waypoints.WaypointsList.Length);
-
- Vector3 randomPos = waypoints.WaypointsList[randomIndex].transform.position;
- agent.SetDestination(randomPos);
- Debug.Log($"Moving to waypoint: {randomPos}");
-
- fsm.StartCoroutine(WaitInWaypoint(fsm));
- }
- }
- }
- private IEnumerator WaitInWaypoint(FSM fsm)
- {
-
- isWaiting = true;
- fsm.Controller.Agent.isStopped = true;
- fsm.Controller.Animator.SetBool("IsMoving", false);
- Debug.Log("Waiting at waypoint");
-
- yield return new WaitForSeconds(waitTime);
-
- isWaiting = false;
- }
- }