123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- using System.Collections.Generic;
- namespace UnityEngine.AI
- {
- [ExecuteInEditMode]
- [DefaultExecutionOrder(-101)]
- [AddComponentMenu("Navigation/NavMeshLink", 33)]
- [HelpURL("https://github.com/Unity-Technologies/NavMeshComponents#documentation-draft")]
- public class NavMeshLink : MonoBehaviour
- {
- [SerializeField]
- int m_AgentTypeID;
- public int agentTypeID { get { return m_AgentTypeID; } set { m_AgentTypeID = value; UpdateLink(); } }
- [SerializeField]
- Vector3 m_StartPoint = new Vector3(0.0f, 0.0f, -2.5f);
- public Vector3 startPoint { get { return m_StartPoint; } set { m_StartPoint = value; UpdateLink(); } }
- [SerializeField]
- Vector3 m_EndPoint = new Vector3(0.0f, 0.0f, 2.5f);
- public Vector3 endPoint { get { return m_EndPoint; } set { m_EndPoint = value; UpdateLink(); } }
- [SerializeField]
- float m_Width;
- public float width { get { return m_Width; } set { m_Width = value; UpdateLink(); } }
- [SerializeField]
- int m_CostModifier = -1;
- public int costModifier { get { return m_CostModifier; } set { m_CostModifier = value; UpdateLink(); } }
- [SerializeField]
- bool m_Bidirectional = true;
- public bool bidirectional { get { return m_Bidirectional; } set { m_Bidirectional = value; UpdateLink(); } }
- [SerializeField]
- bool m_AutoUpdatePosition;
- public bool autoUpdate { get { return m_AutoUpdatePosition; } set { SetAutoUpdate(value); } }
- [SerializeField]
- int m_Area;
- public int area { get { return m_Area; } set { m_Area = value; UpdateLink(); } }
- NavMeshLinkInstance m_LinkInstance = new NavMeshLinkInstance();
- Vector3 m_LastPosition = Vector3.zero;
- Quaternion m_LastRotation = Quaternion.identity;
- static readonly List<NavMeshLink> s_Tracked = new List<NavMeshLink>();
- void OnEnable()
- {
- AddLink();
- if (m_AutoUpdatePosition && m_LinkInstance.valid)
- AddTracking(this);
- }
- void OnDisable()
- {
- RemoveTracking(this);
- m_LinkInstance.Remove();
- }
- public void UpdateLink()
- {
- m_LinkInstance.Remove();
- AddLink();
- }
- static void AddTracking(NavMeshLink link)
- {
- #if UNITY_EDITOR
- if (s_Tracked.Contains(link))
- {
- Debug.LogError("Link is already tracked: " + link);
- return;
- }
- #endif
- if (s_Tracked.Count == 0)
- NavMesh.onPreUpdate += UpdateTrackedInstances;
- s_Tracked.Add(link);
- }
- static void RemoveTracking(NavMeshLink link)
- {
- s_Tracked.Remove(link);
- if (s_Tracked.Count == 0)
- NavMesh.onPreUpdate -= UpdateTrackedInstances;
- }
- void SetAutoUpdate(bool value)
- {
- if (m_AutoUpdatePosition == value)
- return;
- m_AutoUpdatePosition = value;
- if (value)
- AddTracking(this);
- else
- RemoveTracking(this);
- }
- void AddLink()
- {
- #if UNITY_EDITOR
- if (m_LinkInstance.valid)
- {
- Debug.LogError("Link is already added: " + this);
- return;
- }
- #endif
- var link = new NavMeshLinkData();
- link.startPosition = m_StartPoint;
- link.endPosition = m_EndPoint;
- link.width = m_Width;
- link.costModifier = m_CostModifier;
- link.bidirectional = m_Bidirectional;
- link.area = m_Area;
- link.agentTypeID = m_AgentTypeID;
- m_LinkInstance = NavMesh.AddLink(link, transform.position, transform.rotation);
- if (m_LinkInstance.valid)
- m_LinkInstance.owner = this;
- m_LastPosition = transform.position;
- m_LastRotation = transform.rotation;
- }
- bool HasTransformChanged()
- {
- if (m_LastPosition != transform.position) return true;
- if (m_LastRotation != transform.rotation) return true;
- return false;
- }
- void OnDidApplyAnimationProperties()
- {
- UpdateLink();
- }
- static void UpdateTrackedInstances()
- {
- foreach (var instance in s_Tracked)
- {
- if (instance.HasTransformChanged())
- instance.UpdateLink();
- }
- }
- #if UNITY_EDITOR
- void OnValidate()
- {
- m_Width = Mathf.Max(0.0f, m_Width);
- if (!m_LinkInstance.valid)
- return;
- UpdateLink();
- if (!m_AutoUpdatePosition)
- {
- RemoveTracking(this);
- }
- else if (!s_Tracked.Contains(this))
- {
- AddTracking(this);
- }
- }
- #endif
- }
- }
|