using System;
using UnityEngine;
using UnityEngine.AI;
namespace Unity.AI.Navigation.Samples
{
///
/// Update a NavMeshSurface with Volume object collection
///
[DefaultExecutionOrder(-102)]
public class NavMeshSurfaceVolumeUpdater : MonoBehaviour
{
[SerializeField]
NavMeshAgent trackedAgent;
NavMeshSurface m_Surface;
Vector3 m_VolumeSize;
void Awake()
{
m_Surface = GetComponent();
}
void OnEnable()
{
m_VolumeSize = m_Surface.size;
m_Surface.center = QuantizedCenter();
m_Surface.BuildNavMesh();
}
void Update()
{
UpdateNavMeshOnCenterOrSizeChange();
}
void UpdateNavMeshOnCenterOrSizeChange()
{
var updatedCenter = QuantizedCenter();
var updateNavMesh = false;
if (m_Surface.center != updatedCenter)
{
m_Surface.center = updatedCenter;
updateNavMesh = true;
}
if (m_Surface.size != m_VolumeSize)
{
m_VolumeSize = m_Surface.size;
updateNavMesh = true;
}
if (updateNavMesh)
m_Surface.UpdateNavMesh(m_Surface.navMeshData);
}
static Vector3 Quantize(Vector3 v, Vector3 quant)
{
float x = quant.x * Mathf.Floor(v.x / quant.x);
float y = quant.y * Mathf.Floor(v.y / quant.y);
float z = quant.z * Mathf.Floor(v.z / quant.z);
return new Vector3(x, y, z);
}
Vector3 QuantizedCenter()
{
// Quantize the center position to update only when there's a 10% change in position relative to size
var center = trackedAgent.transform.position;
return Quantize(center, 0.1f * m_Surface.size);
}
}
}