diff --git a/Assets/Examples/Scripts/NavMeshSourceTag.cs b/Assets/Examples/Scripts/NavMeshSourceTag.cs index 375ff635..bfcdc90b 100644 --- a/Assets/Examples/Scripts/NavMeshSourceTag.cs +++ b/Assets/Examples/Scripts/NavMeshSourceTag.cs @@ -1,79 +1,94 @@ +using System; +using System.Collections; +using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; -using System.Collections.Generic; -// Tagging component for use with the LocalNavMeshBuilder -// Supports mesh-filter and terrain - can be extended to physics and/or primitives -[DefaultExecutionOrder(-200)] public class NavMeshSourceTag : MonoBehaviour { - // Global containers for all active mesh/terrain tags - public static List m_Meshes = new List(); - public static List m_Terrains = new List(); + public static List> m_Meshes = + new List>(); + public static List> m_Terrains = + new List>(); + + [SerializeField] + public int areaNum = -1; //Set to zero for default - void OnEnable() - { - var m = GetComponent(); - if (m != null) - { - m_Meshes.Add(m); - } + void OnEnable() + { + if(areaNum == -1) {return;} + addToList(); + } + + //This is not the best way to do this, as you can easily call this multiple times are mess things up + //TODO refractor this to avoid multiple adds + public void addToList() + { + var m = GetComponent(); + if (m != null) + { + m_Meshes.Add(new Tuple(m, areaNum)); + } - var t = GetComponent(); - if (t != null) - { - m_Terrains.Add(t); - } - } + var t = GetComponent(); + if (t != null) + { + m_Terrains.Add( + new Tuple(t, areaNum)); + } + } - void OnDisable() - { - var m = GetComponent(); - if (m != null) - { - m_Meshes.Remove(m); - } + void OnDisable() + { + var m = GetComponent(); + if (m != null) + { + m_Meshes.Remove(new Tuple( + m, areaNum)); + } - var t = GetComponent(); - if (t != null) - { - m_Terrains.Remove(t); - } - } + var t = GetComponent(); + if (t != null) + { + m_Terrains.Remove( + new Tuple(t, areaNum)); + } + } - // Collect all the navmesh build sources for enabled objects tagged by this component - public static void Collect(ref List sources) - { - sources.Clear(); + public static void Collect(ref List sources) + { + sources.Clear(); - for (var i = 0; i < m_Meshes.Count; ++i) - { - var mf = m_Meshes[i]; - if (mf == null) continue; + for (var i = 0; i < m_Meshes.Count; ++i) + { + var mf = m_Meshes[i]; + if (mf.Item1 == null) continue; - var m = mf.sharedMesh; - if (m == null) continue; + var m = mf.Item1.sharedMesh; + if (m == null) continue; - var s = new NavMeshBuildSource(); - s.shape = NavMeshBuildSourceShape.Mesh; - s.sourceObject = m; - s.transform = mf.transform.localToWorldMatrix; - s.area = 0; - sources.Add(s); - } + var s = new NavMeshBuildSource(); + s.shape = NavMeshBuildSourceShape.Mesh; + s.sourceObject = m; + s.transform = mf.Item1.transform.localToWorldMatrix; + s.area = mf.Item2; + sources.Add(s); + } - for (var i = 0; i < m_Terrains.Count; ++i) - { - var t = m_Terrains[i]; - if (t == null) continue; + for (var i = 0; i < m_Terrains.Count; ++i) + { + var t = m_Terrains[i]; + if (t.Item1 == null) continue; - var s = new NavMeshBuildSource(); - s.shape = NavMeshBuildSourceShape.Terrain; - s.sourceObject = t.terrainData; - // Terrain system only supports translation - so we pass translation only to back-end - s.transform = Matrix4x4.TRS(t.transform.position, Quaternion.identity, Vector3.one); - s.area = 0; - sources.Add(s); - } - } + var s = new NavMeshBuildSource(); + s.shape = NavMeshBuildSourceShape.Terrain; + s.sourceObject = t.Item1.terrainData; + // Terrain system only supports translation - so we pass translation + // only to back-end + s.transform = Matrix4x4.TRS( + t.Item1.transform.position, Quaternion.identity, Vector3.one); + s.area = t.Item2; + sources.Add(s); + } + } }