2-3 重构部分现有方法

  在上一章中,我们创建了地图单元之间的互相链接关系。现在,我们需要利用已经创建好的链接关系,重构一些我们之前需要复杂计算的方法。
  首先回到HexMetrics.cs脚本中,添加两个新的静态方法,用来获取地图单元的顶点位置信息。这样我们就可以将原本的Vector3[] corners枚举设置为私有了。

HexMetrics.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private static Vector3[] corners =
{

};

/// <summary>
/// 获取cell的direction位置的顶点
/// </summary>
/// <param name="direction">顶点方位</param>
/// <returns></returns>
public static Vector3 GetFirstCorner(HexDirection direction)
{
return corners[(int)direction];
}

/// <summary>
/// 获取cell的direction+1位置的顶点
/// </summary>
/// <param name="direction">顶点方位</param>
/// <returns></returns>
public static Vector3 GetSecondtCorner(HexDirection direction)
{
return corners[(int)direction + 1];
}

  接下来回到HexMesh.cs脚本中,在private void Triangulate(HexCell cell)方法中,我们可以替换掉之前使用corners枚举获取顶点的代码。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//private void Triangulate(HexCell cell)
private void Triangulate(HexDirection direction, HexCell cell)
{
//获取单个cell的中点位置
Vector3 center = cell.transform.localPosition;

//根据中点位置计算出其余两个顶点的信息
AddTriangle(
center,
center + HexMetrics.GetFirstCorner(direction),
center + HexMetrics.GetSecondCorner(direction)
);

//因为有了HexDirection,这里不再直接使用corners枚举来获取cell的顶点位置信息,而使用HexDirection方位来获取
//根据中点位置计算出其余的顶点位置信息,并按照顺序构建三角面片
//for (int i = 0; i < 6; i++)
//{
// //构建三角面片
// AddTriangle(
// center,
// center + HexMetrics.corners[i],
// center + HexMetrics.corners[i + 1]
// );


}

  最后,我们新建一个Triangulate(HexCell cell)方法,使用HexDirection方位来循环添加单个地图单元的6个点点位置信息。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
/// <summary>
/// 使用HexDirection方位,为单个cell循环添加其6个顶点信息
/// 此方法之后会进行优化合并
/// </summary>
/// <param name="cell">单个cell的实例</param>
private void Triangulate(HexCell cell)
{
for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++)
{
Triangulate(d, cell);
}
}

  这样,前置的一些准备工作就完成了,我们将之前直接使用corners枚举的代码,替换为了使用HexDirection方位的代码,避免了一些复杂的计算,也保证了corners的安全性。
  接下来的章节中,我们将开始实现两个地图单元之间颜色混合的功能了。

Github代码