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
                }
            }
        }