using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
namespace Unity.AI.Navigation
{
/// Component used by the NavMesh building process to assign a different area type to the region inside the specified volume.
[ExecuteAlways]
[AddComponentMenu("Navigation/NavMesh Modifier Volume", 31)]
[HelpURL(HelpUrls.Manual + "NavMeshModifierVolume.html")]
public class NavMeshModifierVolume : MonoBehaviour
{
#pragma warning disable 0414
// Serialized version is used to upgrade older serialized data to the current format.
// Version 0: Initial version.
[SerializeField, HideInInspector]
byte m_SerializedVersion = 0;
#pragma warning restore 0414
[SerializeField]
Vector3 m_Size = new Vector3(4.0f, 3.0f, 4.0f);
[SerializeField]
Vector3 m_Center = new Vector3(0, 1.0f, 0);
[SerializeField]
int m_Area;
/// Gets or sets the dimensions of the cuboid modifier volume.
/// The dimensions apply in the local space of the GameObject.
public Vector3 size { get { return m_Size; } set { m_Size = value; } }
/// Gets or sets the center position of the modifier volume.
/// The position is relative to the GameObject transform.
public Vector3 center { get { return m_Center; } set { m_Center = value; } }
/// Gets or sets the area type that will be enforced by the volume during the generation of the NavMesh.
/// The range of useful values is from 0 to 31. Higher values always take precedence over lower values in the case when more volumes intersect each other. A value of 1 has the highest priority over all the other types and it means "not walkable". Consequently, a volume with an area of 1 produces a hole in the NavMesh. This property has the same meaning as .
///
public int area { get { return m_Area; } set { m_Area = value; } }
// List of agent types the modifier is applied for.
// Special values: empty == None, m_AffectedAgents[0] =-1 == All.
[SerializeField]
List m_AffectedAgents = new List(new int[] { -1 }); // Default value is All
static readonly List s_NavMeshModifiers = new List();
/// Gets the list of all the components that are currently active in the scene.
public static List activeModifiers
{
get { return s_NavMeshModifiers; }
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void ClearNavMeshModifiers()
{
s_NavMeshModifiers.Clear();
}
void OnEnable()
{
if (!s_NavMeshModifiers.Contains(this))
s_NavMeshModifiers.Add(this);
}
void OnDisable()
{
s_NavMeshModifiers.Remove(this);
}
/// Verifies whether this modifier volume can affect in any way the generation of a NavMesh for a given agent type.
/// The identifier of an agent type that originates from .
/// true if this component can affect the NavMesh built for the given agent type; otherwise false.
public bool AffectsAgentType(int agentTypeID)
{
if (m_AffectedAgents.Count == 0)
return false;
if (m_AffectedAgents[0] == -1)
return true;
return m_AffectedAgents.IndexOf(agentTypeID) != -1;
}
}
}