/// <summary> /// Creates a navigation mesh file from a navigation mesh /// </summary> /// <param name="navmesh">Navigation mesh</param> /// <returns>Returns the navigation mesh file</returns> public static NavMeshFile FromNavmesh(NavMesh navmesh) { NavMeshFile file = new NavMeshFile { NavMeshParams = navmesh.GetParams(), NavMeshData = new List <MeshData>(), HasTileCache = navmesh.TileCache != null, TileCacheParams = navmesh.TileCache != null?navmesh.TileCache.GetParams() : new TileCacheParams(), TileCacheData = new List <TileCacheData>() }; // Store navmesh tiles. for (int i = 0; i < navmesh.MaxTiles; ++i) { var tile = navmesh.Tiles[i]; if (tile != null) { file.NavMeshData.Add(tile.Data); } } if (navmesh.TileCache != null) { // Store cache tiles. var tileCount = navmesh.TileCache.GetTileCount(); for (int i = 0; i < tileCount; ++i) { var tile = navmesh.TileCache.GetTile(i); if (tile != null) { file.TileCacheData.Add(new TileCacheData { Header = tile.Header, Data = tile.Data }); } } } return(file); }
/// <summary> /// Creates a graph file from a graph /// </summary> /// <param name="graph">Graph</param> /// <returns>Returns the graph file</returns> public static GraphFile FromGraph(Graph graph) { var meshFileDict = new Dictionary <Agent, NavMeshFile>(); foreach (var key in graph.MeshQueryDictionary.Keys) { var nm = graph.MeshQueryDictionary[key].GetAttachedNavMesh(); var rcFile = NavMeshFile.FromNavmesh(nm); meshFileDict.Add(key, rcFile); } return(new GraphFile() { Settings = graph.Settings, Dictionary = meshFileDict, }); }
/// <summary> /// Creates a graph from a graph file /// </summary> /// <param name="file">Graph file</param> /// <returns>Returns the graph</returns> public static Graph FromGraphFile(GraphFile file) { var meshQueryDict = new Dictionary <Agent, NavMeshQuery>(); foreach (var key in file.Dictionary.Keys) { var rcFile = file.Dictionary[key]; var nm = NavMeshFile.FromNavmeshFile(rcFile); var mmQuery = new NavMeshQuery(); mmQuery.Init(nm, file.Settings.MaxNodes); meshQueryDict.Add(key, mmQuery); } return(new Graph { Settings = file.Settings, MeshQueryDictionary = meshQueryDict, }); }
/// <summary> /// Creates a navigation mesh from a navigation mesh file /// </summary> /// <param name="file">Navigation mesh file</param> /// <returns>Returns the navigation mesh</returns> public static NavMesh FromNavmeshFile(NavMeshFile file) { NavMesh navmesh = new NavMesh(); navmesh.Init(file.NavMeshParams); for (int i = 0; i < file.NavMeshData.Count; i++) { var tile = file.NavMeshData[i]; if (tile == null || tile.Header.Magic != Detour.DT_NAVMESH_MAGIC) { continue; } navmesh.AddTile(tile, TileFlagTypes.DT_TILE_FREE_DATA, 0, out int res); } if (file.HasTileCache) { var tmproc = new TileCacheMeshProcess(null); navmesh.TileCache = new TileCache(); navmesh.TileCache.Init(file.TileCacheParams, tmproc); for (int i = 0; i < file.TileCacheData.Count; i++) { var tile = file.TileCacheData[i]; if (tile.Header.Magic != DetourTileCache.DT_TILECACHE_MAGIC) { continue; } navmesh.TileCache.AddTile(tile, CompressedTileFlagTypes.DT_COMPRESSEDTILE_FREE_DATA); } } return(navmesh); }