4-8 修复连接区域

  在上一章中,我们完成了对每个地图单元整体进行海拔高度的扰动,但是我们在改变地图单元高度的时候,发现其相邻的连接区域并没有与地图单元相连接,产生了大量的破面。这是因为在构建连接区域的时候,并没有使用地图单元扰动后的高度。在HexCell.cs中我们添加一个属性,这样就可以在任何地方得到地图单元扰动后的坐标了。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
public class HexCell : MonoBehaviour
{
//获取cell在扰动后的实际坐标位置
public Vector3 Position
{
get
{
return transform.localPosition;
}
}


}

  这样,我们就能在HexMesh.Triangulate方法中使用这个属性,来获得地图单元扰动后的位置了。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
private void Triangulate(HexDirection direction, HexCell cell)
{
//这里是获cell扰动后的位置
Vector3 center = cell.Position;


}

  接着,在TriangulateConnection方法中,获取相邻地图单元位置时,也使用扰动后的坐标。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void TriangulateConnection(HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2)
{


Vector3 v3 = v1 + bridge;
Vector3 v4 = v2 + bridge;

//这里在获取相邻cell的位置时,也是使用了扰动后的坐标位置
v3.y = v4.y = neighbor.Position.y;



if (direction <= HexDirection.E && nextNeighbor != null)
{
Vector3 v5 = v2 + HexMetrics.GetBridge(direction.Next());

//这里在获取相邻cell的位置时,也是使用了扰动后的坐标位置
v5.y = nextNeighbor.Position.y;


}
}

  至此我们修复了地图单元相邻的连接区域高度不同,产生破面的问题。但是我们观察发现,在Cliff高度差类型的连接中,三角形连接区域会与矩形连接区域之间产生破面。这是因为插值计算斜边上一点的时候,使用的是扰动之前的坐标点。这个问题我们将随着细分地图单元及其周边连接区域,提升市局效果和细节的同事进行解决。

Github代码