+//$ Copyright 2016, Code Respawn Technologies Pvt Ltd - All Rights Reserved $//
+//$ Modification 2017, West Winds Creative, Developed for Labyrintheer $//
+using System.Collections.Generic;
+using NavMeshBuilder = UnityEngine.AI.NavMeshBuilder;
+namespace Labyrintheer.DungeonBuilder.Navigation
+ public enum DungeonNavMeshSourceType
+ public class DungeonRuntimeNavigation : MonoBehaviour
+ /// Should dynamic navigation be created during runtime (For NPC AI)
+ public bool enableRuntimeNavigation = false;
+ public int[] navMeshAgentIDs;
+ public Vector3 boundsPadding = Vector3.zero;
+ public bool landscapeBaking = true;
+ DungeonNavMeshSourceType meshSourceType = DungeonNavMeshSourceType.MeshData;
+ // The size of the build bounds
+ NavMeshData[] m_NavMesh;
+ AsyncOperation m_Operation;
+ NavMeshDataInstance[] m_Instance;
+ List<NavMeshBuildSource>[] meshSources;
+ public void BuildNavMesh()
+ meshSources = new List<NavMeshBuildSource>[navMeshAgentIDs.Length];
+ m_NavMesh = new NavMeshData[navMeshAgentIDs.Length];
+ m_Instance = new NavMeshDataInstance[navMeshAgentIDs.Length];
+ if (enableRuntimeNavigation && Application.isPlaying)
+ Dungeon dungeon = GetComponent<Dungeon>();
+ Debug.LogError("DungeonRuntimeNavigation should be attached to a Dungeon prefab. Missing Dungeon Script in the game object");
+ for (int count = 0; count < navMeshAgentIDs.Length; count++)
+ m_NavMesh[count] = new NavMeshData();
+ m_Instance[count] = NavMesh.AddNavMeshData(m_NavMesh[count]);
+ meshSources[count] = new List<NavMeshBuildSource>();
+ dungeonBounds = DungeonUtils.GetDungeonBounds(dungeon);
+ dungeonBounds.size = dungeonBounds.size + boundsPadding;
+ private void DestroyNavMesh()
+ // Unload navmesh and clear handle
+ if (m_Instance != null)
+ for (int count = 0; count < navMeshAgentIDs.Length; count++)
+ m_Instance[count].Remove();
+ m_NavMesh[count] = null;
+ meshSources[count].Clear();
+ dungeonBounds = new Bounds();
+ void CollectMeshSources() {
+ Dungeon dungeon = GetComponent<Dungeon>();
+ Debug.LogError("DungeonRuntimeNavigation should be attached to a Dungeon prefab. Missing Dungeon Script in the game object");
+ for (int count = 0; count < navMeshAgentIDs.Length; count++)
+ //if (meshSources[count] != null)
+ meshSources[count].Clear();
+ DungeonNavMeshSourceCollector.CollectSources(dungeon, meshSourceType, ref meshSources[count]);
+ void UpdateNavMesh(bool asyncUpdate = false)
+ for (int count = 0; count < navMeshAgentIDs.Length; count++)
+ //NavMeshSourceTag.Collect(ref m_Sources);
+ var defaultBuildSettings = NavMesh.GetSettingsByID(navMeshAgentIDs[count]);
+ m_Operation = NavMeshBuilder.UpdateNavMeshDataAsync(m_NavMesh[count], defaultBuildSettings, meshSources[count], dungeonBounds);
+ NavMeshBuilder.UpdateNavMeshData(m_NavMesh[count], defaultBuildSettings, meshSources[count], dungeonBounds);
+ void OnDrawGizmosSelected()
+ if (!enableRuntimeNavigation) return;
+ Gizmos.color = Color.green;
+ Gizmos.DrawWireCube(m_NavMesh[0].sourceBounds.center, m_NavMesh[0].sourceBounds.size);
+ Gizmos.color = Color.green;
+ var center = dungeonBounds.center;
+ var size = dungeonBounds.size;
+ Gizmos.DrawWireCube(center, size);