private void CalculateWalkableTiles() { var player = PlayerActor.Instance; var distance = player.stats.currentStats.speed; // var pos = GridUtil.GridToWorld(player.GridPosition); // var VBuffer = new List<Vector3>(); var walkableTiles = Astar.Area(player.GridPosition, distance); var vol = GenerationLib.makeVolume( new float[3][] { new float[] { -distance - 1, distance + 1, 1f }, new float[] { 0, 1, 1f }, new float[] { -distance - 1, distance + 1, 1f } }, (x, y, z) => { if ((int)y < 0.5f) { return(0); } return(walkableTiles.Contains(new NVector2((int)x + player.GridPosition.x, (int)z + player.GridPosition.y)) ? 1 : 0); }); List <int> iBuffer; List <Vector2> uvs; List <Vector3> vBuffer; SurfaceNets.GenerateSurfaceMesh(vol, 0.5f, out vBuffer, out iBuffer, out uvs); var delta = ((distance + 1) - (-distance - 1)) / 2.0f + 0.5f; vBuffer = vBuffer.Select(v => new Vector3(v.x - delta, 0.0f, v.z - delta)).ToList(); this.walkableTiles = new HashSet <NVector2>(walkableTiles); mesh.Clear(); mesh.SetVertices(vBuffer); mesh.SetIndices(iBuffer.ToArray(), MeshTopology.Quads, 0); mesh.uv = uvs.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); }