3-9 阶梯化Slope类型连接区域

  在上一章中,我们为不同高度的连接区域划分了类型,并创建了一个方法来判断两个相邻地图单元之间的连接区域是哪种类型。这一章中,我们来实现只阶梯化Slope类型的连接区域,其他的连接区域依然是由两个三角面片构成的矩形。
  首先回到HexMesh.TriangulateConnection方法中,在这个方法中进行了阶梯化连接区域的操作,我们在阶梯化之前加入一个判断,当连接类型为Slope的时候才执行阶梯化操作。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
private void TriangulateConnection(HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2)
{


//在这里新加入判断,当两个相邻cell的连接类型为Slope的时候,才会创建阶梯化连接
if (cell.GetEdgeType(direction) == HexEdgeType.Slope)
{
TriangulateEdgeTerraces(v1, v2, cell, v3, v4, neighbor);
}


}

  接着,我们需要启用之前的代码,也就是判断如果连接类型不为Slope,那么连接区域就是矩形的。

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


//在这里新加入判断,当两个相邻cell的连接类型为Slope的时候,才会创建阶梯化连接
if (cell.GetEdgeType(direction) == HexEdgeType.Slope)
{
TriangulateEdgeTerraces(v1, v2, cell, v3, v4, neighbor);
}
else
{
//当连接类型不为Slope的时候,连接区域是矩形的
AddQuad(v1, v2, v3, v4);
AddQuadColor(cell.color, neighbor.color);
}


}

  这样,我们就完成了相邻地图单元连接区域的分类,并且会按照不同的分类,自动进行判断这个连接区域是否要进行阶梯化处理。在节省面数的同时,也让整个地图的层侧干更加的明显了。
  不过当我们在Unity中运行时发现,如果连接类型为Slope的时候,矩形连接区域是正常的,但是三角形连接区域却没有完全贴合阶梯的边缘,导致有“破面”的情况发生。造成这个问题的原因是,我们只对矩形连接区域进行了阶梯化,而忽略了三角形连接区域。在接下来的章节中,我们将修复这个问题。

Github代码