示例#1
0
            /// <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);
            }
示例#2
0
        /// <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,
            });
        }
示例#3
0
        /// <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,
            });
        }
示例#4
0
            /// <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);
            }