using UnityEngine;
using UnityEngine.Assertions;
namespace Unity.BossRoom.Navigation
{
///
/// This system exists to coordinate path finding and navigation functionality in a scene.
/// The Unity NavMesh is only used to calculate navigation paths. Moving along those paths is done by this system.
///
public class NavigationSystem : MonoBehaviour
{
public const string NavigationSystemTag = "NavigationSystem";
///
/// Event that gets invoked when the navigation mesh changed. This happens when dynamic obstacles move or get active
///
public event System.Action OnNavigationMeshChanged = delegate { };
///
/// Whether all paths need to be recalculated in the next fixed update.
///
private bool m_NavMeshChanged;
public void OnDynamicObstacleDisabled()
{
m_NavMeshChanged = true;
}
public void OnDynamicObstacleEnabled()
{
m_NavMeshChanged = true;
}
private void FixedUpdate()
{
// This is done in fixed update to make sure that only one expensive global recalculation happens per fixed update.
if (m_NavMeshChanged)
{
OnNavigationMeshChanged.Invoke();
m_NavMeshChanged = false;
}
}
private void OnValidate()
{
Assert.AreEqual(NavigationSystemTag, tag, $"The GameObject of the {nameof(NavigationSystem)} component has to use the {NavigationSystem.NavigationSystemTag} tag!");
}
}
}