/// <summary> /// Used to initialize the navigation mesh so it will allow building tiles /// This will store the build settings and create the amount of layers corresponding to the number of NavigationAgentSettings /// </summary> /// <param name="buildSettings"></param> /// <param name="agentSettings">Agent setting to use</param> public void Initialize(NavigationMeshBuildSettings buildSettings, NavigationAgentSettings[] agentSettings) { BuildSettings = buildSettings; // Remove layers that are no longer needed if (LayersInternal.Count > agentSettings.Length) { LayersInternal.RemoveRange(agentSettings.Length, LayersInternal.Count - agentSettings.Length); } // Initialize layers for (int i = 0; i < agentSettings.Length; i++) { NavigationMeshLayer layer; if (LayersInternal.Count <= i) { layer = new NavigationMeshLayer(); LayersInternal.Add(layer); } else { layer = LayersInternal[i]; } layer.AgentSettings = agentSettings[i]; layer.BuildSettings = buildSettings; } }
/// <summary> /// Build a single tile for all layers /// Initialize should have been called before calling this /// </summary> /// <param name="inputVertices">Input vertex data for the input mesh</param> /// <param name="inputIndices">Input index data for the input mesh</param> /// <param name="boundingBox">Bounding box of the tile</param> /// <param name="tileCoordinate">Tile coordinate to of the tile to build</param> /// <returns>A list of built tiles</returns> public List <NavigationMeshTile> BuildAllLayers(Vector3[] inputVertices, int[] inputIndices, BoundingBox boundingBox, Point tileCoordinate) { List <NavigationMeshTile> builtTiles = new List <NavigationMeshTile>(); for (int i = 0; i < LayersInternal.Count; i++) { NavigationMeshLayer layer = Layers[i]; layer.BuildTile(inputVertices, inputIndices, boundingBox, tileCoordinate); } // Update tile hash UpdateTileHash(); return(builtTiles); }
public override void Serialize(ref NavigationMesh obj, ArchiveMode mode, SerializationStream stream) { // Serialize tile size because it is needed stream.Serialize(ref obj.BuildSettings.TileSize); stream.Serialize(ref obj.BuildSettings.CellSize); boundingBoxSerializer.Serialize(ref obj.BoundingBox, mode, stream); int numLayers = obj.Layers.Count; stream.Serialize(ref numLayers); if (mode == ArchiveMode.Deserialize) { obj.LayersInternal.Clear(); } for (int l = 0; l < numLayers; l++) { NavigationMeshLayer layer; if (mode == ArchiveMode.Deserialize) { // Create a new layer layer = new NavigationMeshLayer(); obj.LayersInternal.Add(layer); } else { layer = obj.LayersInternal[l]; } tilesSerializer.Serialize(ref layer.TilesInternal, mode, stream); } if (mode == ArchiveMode.Deserialize) { obj.UpdateTileHash(); } }