using UnityEngine; using UnityEngine.AI; [RequireComponent(typeof(NavMeshAgent))] public sealed class NavPathProbe : MonoBehaviour { [SerializeField] private Transform destination; private NavMeshAgent agent; private bool submitted; private string lastState; private int requestFrame; private void Awake() { agent = GetComponent(); } private void Start() { RequestPath(); } [ContextMenu("Request Path (Play Mode)")] public void RequestPath() { if (!Application.isPlaying || !isActiveAndEnabled || agent == null) return; submitted = false; if (destination == null || !agent.enabled || !agent.isOnNavMesh) { Publish("assign destination and place enabled agent on a compatible NavMesh"); return; } submitted = agent.SetDestination(destination.position); requestFrame = Time.frameCount; Publish(submitted ? "requested" : "request rejected"); } private void Update() { if (!submitted || Time.frameCount <= requestFrame) return; if (!agent.enabled || !agent.isOnNavMesh) { Publish("not on NavMesh"); return; } if (agent.pathPending) { Publish("pending"); return; } if (agent.pathStatus != NavMeshPathStatus.PathComplete) { Publish(agent.pathStatus.ToString()); return; } if (!agent.hasPath) { Publish("no active path"); return; } float distance = agent.remainingDistance; if (float.IsInfinity(distance) || float.IsNaN(distance)) { Publish("unknown distance"); return; } if (distance > agent.stoppingDistance) { Publish("travelling"); return; } Publish(agent.velocity.sqrMagnitude > 0.01f ? "braking" : "arrived"); } private void Publish(string state) { if (state == lastState) return; lastState = state; Debug.Log("Navigation: " + state, this); } }