using System; using Unity.AI.Navigation; using UnityEngine; using UnityEngine.AI; [DefaultExecutionOrder(-115)] // Before input system public class DynamicNavMeshUpdater : MonoBehaviour { [Header("Agent Tracking")] [SerializeField, Tooltip("The agent whose position will be used to update the NavMesh")] NavMeshAgent trackedAgent; [SerializeField, Range(0.01f, 1f), Tooltip("Quantization factor for position updates (lower = more frequent updates)")] float quantizationFactor = 0.1f; NavMeshSurface surface; Vector3 volumeSize; void Awake() { surface = GetComponent(); } void OnEnable() { volumeSize = surface.size; surface.center = GetQuantizedCenter(); surface.BuildNavMesh(); } void Update() { var updatedCenter = GetQuantizedCenter(); var updateNavMesh = false; if (surface.center != updatedCenter) { surface.center = updatedCenter; updateNavMesh = true; } if (surface.size != volumeSize) { volumeSize = surface.size; updateNavMesh = true; } if (updateNavMesh) { surface.UpdateNavMesh(surface.navMeshData); } } Vector3 GetQuantizedCenter() { return trackedAgent.transform.position.Quantize(quantizationFactor * surface.size); } void OnDrawGizmosSelected() { if (surface == null) surface = GetComponent(); Gizmos.color = new Color(0f, 1f, 0f, 0.25f); Gizmos.DrawCube(transform.position + surface.center, surface.size); Gizmos.color = new Color(0f, 1f, 0f, 0.5f); Gizmos.DrawWireCube(transform.position + surface.center, surface.size); } } public static class Vector3Extensions { public static Vector3 Quantize(this Vector3 position, Vector3 quantization) { return Vector3.Scale( quantization, new Vector3( Mathf.Floor(position.x / quantization.x), Mathf.Floor(position.y / quantization.y), Mathf.Floor(position.z / quantization.z) )); } }