1-4 正六边形地图单元的排列方式

  上一章中,我们将每个地图单元的坐标显示了出来,这样能更加方便的在Game窗口中查看每个地图单元的坐标信息,方便之后的调试和修改。但是,现在所有的地图单元,是按照正方形地图系统的模式排列的,而整六边形地图系统中,地图单元的排列如下图所示:

  通过观察上图发现,水平方向上,两个正六边形地图单元的距离为2倍的内切圆半径。垂直方向上,两个正六边形地图单元的距离为1.5倍的外接圆半径。根据观察结果修改代码如下:

HexGrid.cs
1
2
3
4
5
6
7
8
9
10
11
private void CreateCell(int x, int z, int i) 
{

//两个正六边形Cell中点的水平间距
position.x = x * (HexMetrics.innerRadius * 2f);
position.y = 0f;
//两个正六边形Cell中点的垂直间距
position.z = z * (HexMetrics.outerRadius * 1.5f);


}

  将正方形地图单元的间距修改为正六边形地图单元的间距后,运行效果如下图:

  通过观察正六边形元素的排列,我们还发现,上下两行的地图元素,并不像正方形元素那样上下紧邻并对齐的,而是会错开一段距离,而且这段距离会随着行数的增加而增加。第0行偏移量为0,第1行偏移量为1倍的内切圆半径,第2行偏移量为2倍的内切圆半径。代码如下:

HexGrid.cs
1
2
3
4
//增加了Offset,每一行偏移量为行数*内切圆半径
//position.x = x * (HexMetrics.innerRadius * 2f) + z * (HexMetrics.innerRadius * 2f) * 0.5f;
//由上一个等式提取公因式得出:
position.x = (x + z * 0.5f) * (HexMetrics.innerRadius * 2f);

  运行结果如下图所示:

  通过观察运行结果可以发现,地图形状为一个菱形,而不是矩形。为了之后调试和使用,这里要将排列方式变为矩形。可以通过去掉偶数行的偏移量来达到目的。也就是每个偶数行的地图单元,都不产生偏移,而每个奇数行的地图单元向右偏移内切圆半径的距离。修改代码如下:

HexGrid.cs
1
2
3
4
5
//上一步中,生成的Cell会排列成菱形
//要排列成正方形,需要在偶数行去掉偏移量
//这里注意,Z/2只是取商,舍掉余数
//所以在偶数行正好抵消了偏移量,而在奇数行,z * 0.5f - z / 2 * (HexMetrics.innerRadius * 2f)正好是一个内切圆半径长度
position.x = (x + z * 0.5f - z / 2) * (HexMetrics.innerRadius * 2f);

  修改后运行结果如下图:

  现在,我们就完成了正六边形单元的排列。接下来的一章中,要修改地图单元的外形,将正方形外观修改成正六边形外观,使其在视觉效果上变为正六边形地图单元的外观。