NavMeshSurfaceVolumeUpdater.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.AI;
  4. namespace Unity.AI.Navigation.Samples
  5. {
  6. /// <summary>
  7. /// Update a NavMeshSurface with Volume object collection
  8. /// </summary>
  9. [DefaultExecutionOrder(-102)]
  10. public class NavMeshSurfaceVolumeUpdater : MonoBehaviour
  11. {
  12. [SerializeField]
  13. NavMeshAgent trackedAgent;
  14. NavMeshSurface m_Surface;
  15. Vector3 m_VolumeSize;
  16. void Awake()
  17. {
  18. m_Surface = GetComponent<NavMeshSurface>();
  19. }
  20. void OnEnable()
  21. {
  22. m_VolumeSize = m_Surface.size;
  23. m_Surface.center = QuantizedCenter();
  24. m_Surface.BuildNavMesh();
  25. }
  26. void Update()
  27. {
  28. UpdateNavMeshOnCenterOrSizeChange();
  29. }
  30. void UpdateNavMeshOnCenterOrSizeChange()
  31. {
  32. var updatedCenter = QuantizedCenter();
  33. var updateNavMesh = false;
  34. if (m_Surface.center != updatedCenter)
  35. {
  36. m_Surface.center = updatedCenter;
  37. updateNavMesh = true;
  38. }
  39. if (m_Surface.size != m_VolumeSize)
  40. {
  41. m_VolumeSize = m_Surface.size;
  42. updateNavMesh = true;
  43. }
  44. if (updateNavMesh)
  45. m_Surface.UpdateNavMesh(m_Surface.navMeshData);
  46. }
  47. static Vector3 Quantize(Vector3 v, Vector3 quant)
  48. {
  49. float x = quant.x * Mathf.Floor(v.x / quant.x);
  50. float y = quant.y * Mathf.Floor(v.y / quant.y);
  51. float z = quant.z * Mathf.Floor(v.z / quant.z);
  52. return new Vector3(x, y, z);
  53. }
  54. Vector3 QuantizedCenter()
  55. {
  56. // Quantize the center position to update only when there's a 10% change in position relative to size
  57. var center = trackedAgent.transform.position;
  58. return Quantize(center, 0.1f * m_Surface.size);
  59. }
  60. }
  61. }