public static SerializedNavmesh Serialize(AgentProperties properties) { NavmeshLayserSerializer serializer = new NavmeshLayserSerializer(_chunkData, _chunkRange, properties); SerializedNavmesh result = serializer.Serialize(); result.pathFinderVersion = VERSION; return(result); }
public static void Deserialize(SerializedNavmesh target, AgentProperties properties) { //remove all data if it exist lock (_chunkData) { List <XZPosInt> removeList = new List <XZPosInt>(); foreach (var graph in _chunkData.Values) { if (graph.properties == properties) { removeList.Add(graph.gridPosition); } } foreach (var pos in removeList) { _chunkData.Remove(new GeneralXZData(pos, properties)); } NavmeshLayerDeserializer deserializer = new NavmeshLayerDeserializer(target, properties); var deserializedStuff = deserializer.Deserialize(); //create chunk if needed and clamp size if it outside foreach (var deserialized in deserializedStuff) { XZPosInt pos = deserialized.chunkPosition; YRangeInt curRange; if (_chunkRange.TryGetValue(pos, out curRange)) { _chunkRange[pos] = new YRangeInt( Mathf.Min(curRange.min, deserialized.chunkMinY), Mathf.Max(curRange.max, deserialized.chunkMaxY)); } else { _chunkRange.Add(pos, new YRangeInt(deserialized.chunkMinY, deserialized.chunkMaxY)); } } List <Graph> graphs = new List <Graph>(); //put graphs inside chunks foreach (var deserialized in deserializedStuff) { //Chunk chunk = _chunkData[deserialized.chunkPosition]; XZPosInt pos = deserialized.chunkPosition; YRangeInt ran = _chunkRange[pos]; Graph graph = deserialized.graph; graph.SetChunkAndProperties(new ChunkData(pos, ran), properties); _chunkData[new GeneralXZData(pos, properties)] = graph; graph.SetAsCanBeUsed(); graphs.Add(graph); } //connect chunks foreach (var graph in graphs) { for (int i = 0; i < 4; i++) { Graph neighbour; if (TryGetGraphFrom(graph.gridPosition, (Directions)i, properties, out neighbour)) { graph.SetNeighbour((Directions)i, neighbour); } } #if UNITY_EDITOR if (Debuger_K.doDebug) { graph.DebugGraph(); } #endif } } }