在上一章中,我们在两种创建连接区域的河道方案中选择了较为合适的一种,就是在连接区域内增加一个四边形,通过调整连接区域中间位置的顶点高度,来形成一条两侧倾斜的河道。
要把连接处的3个四边形变为4个,就需要在地图单元的每条边上增加额外的顶点。首先我们回到EdgeVertices.cs脚本中,在这里我们来修改顶点的数量。首先使用IDE的重命名功能,将v4重命名为v5,接着将v3重命名为v4。注意,这里一定要使用IDE工具的重命名功能,不然只能手动的搜索整个项目中的脚本来重命名变量了,很可能导致不可预知的错误发生。代码如下:
EdgeVertices.cs1 2 3 4 5 6 7
| public struct EdgeVertices {
public Vector3 v1, v2, v4, v5;
… }
|
重命名完成后,再添加一个新的变量v3。代码如下:
EdgeVertices.cs1 2 3 4 5 6 7
| public struct EdgeVertices {
public Vector3 v1, v2, v3, v4, v5;
… }
|
因为增加了新的顶点,我们就要修改构造函数。添加新增的这个顶点。v3是在连接区域的中央,也就是0.5的位置上,而与其左右相邻的两个顶点,就分别到了0.25和0.75的位置上。代码如下:
EdgeVertices.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public struct EdgeVertices {
…
public EdgeVertices(Vector3 corner1, Vector3 corner2) { v1 = corner1; v2 = Vector3.Lerp(corner1, corner2, 0.25f); v3 = Vector3.Lerp(corner1, corner2, 0.5f); v4 = Vector3.Lerp(corner1, corner2, 0.75f); v5 = corner2; }
… }
|
同样的,我们在TerraceLerp方法中,也要将新的v3顶点添加进去。代码如下:
EdgeVertices.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public struct EdgeVertices {
…
public static EdgeVertices TerraceLerp(EdgeVertices a, EdgeVertices b, int step) { EdgeVertices result; result.v1 = HexMetrics.TerraceLerp(a.v1, b.v1, step); result.v2 = HexMetrics.TerraceLerp(a.v2, b.v2, step); result.v3 = HexMetrics.TerraceLerp(a.v3, b.v3, step); result.v4 = HexMetrics.TerraceLerp(a.v4, b.v4, step); result.v5 = HexMetrics.TerraceLerp(a.v5, b.v5, step); return result; } }
|
接着,我们回到HexMesh.cs中,这里对EdgeVertices.cs中的方法进行了调用构建mesh,所以也要做出一些修改。首先是TriangulateEdgeFan方法。代码如下:
HexMesh.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class HexMesh : MonoBehaviour {
…
private void TriangulateEdgeFan(Vector3 center, EdgeVertices edge, Color color) { AddTriangle(center, edge.v1, edge.v2); AddTriangleColor(color); AddTriangle(center, edge.v2, edge.v3); AddTriangleColor(color); AddTriangle(center, edge.v3, edge.v4); AddTriangleColor(color);
AddTriangle(center, edge.v4, edge.v5); AddTriangleColor(color); } }
|
然后要修改TriangulateEdgeStrip方法。代码如下:
HexMesh.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class HexMesh : MonoBehaviour {
…
private void TriangulateEdgeStrip(EdgeVertices e1, Color c1, EdgeVertices e2, Color c2) { AddQuad(e1.v1, e1.v2, e2.v1, e2.v2); AddQuadColor(c1, c2); AddQuad(e1.v2, e1.v3, e2.v2, e2.v3); AddQuadColor(c1, c2); AddQuad(e1.v3, e1.v4, e2.v3, e2.v4); AddQuadColor(c1, c2);
AddQuad(e1.v4, e1.v5, e2.v4, e2.v5); AddQuadColor(c1, c2); } }
|
这样,我们就完成了添加顶点数量的相关代码。下图是添加顶点前后地图mesh的变化对比。在下一章中,我们将设置河道的高度,这样可以将地面与河道使用不同高度区分开来。


Github代码