5-1 地图网格块

  在之前的章节中,我们使用一张彩色噪点图,并采样噪点图中的像素点,对地图中的每个顶点进行位置扰动,让地图整体看起来有一些随机性,视觉效果也更加自然。在接下来的章节中,我们将创建更大的地图区域,并为地图编辑器添加新的功能。
  在Unity3D中单个mesh的顶点容量是65000个,所以我们不能把单个地图尺寸设置的过大。如果想要一张尺寸更大的地图,解决方案是将多个mesh进行拼接,也就是使用若干小块拼接成一个尺寸更大的地图。

  这里我们先定义一个地图块的尺寸为$5*5$,也就是说一个地图块由25个地图单元组成。这个尺寸在HexMetrics.cs中进行定义。代码如下:

HexMetrics.cs
1
2
3
4
5
6
7
8
9
public int HexMetrics
{
//应为Unity mesh最多只能有65000个顶点,想要尺寸更大的地图,就只能将多个chunk拼接起来
//这里定义一个chunk的长宽各有几个cell
public const int chunkSizeX = 5;
public const int chunkSizeZ = 5;


}

地图块的尺寸设置成多大比较合适?
视情况而定,较大的地图块意味着地图块数量少,但是每个地图块的mesh中会有比较多的顶点,这会使draw calls较少。但是较小的地图块会在视锥体裁剪剔除时效率较高,绘制的三角形较少。实际方法就是先设置一个预估的大小,根据不同的需求再进行微调。

  接下来我们定义整个地图中长宽各有多少个地图块。这里定义地图的尺寸为$43$,也就是整个地图由12个地图块拼接组成。根据之前代码地图的尺寸定义,整个地图是由$1225$,也就是300个地图单元组成。这个尺寸对于我们目前测试与查看效果是比较合适的。定义地图块尺寸在HexGrid.cs中的代码如下:

HexGrid.cs
1
2
3
4
5
6
7
8
public class HexGrid : MonoBehaviour
{
//定义整个地图长宽各有多少个chunk
public int chunkCountX = 4;
public int chunkCountZ = 3;


}

  在HexGrid.cs中,我们使用widthheight这两个变量来初始化存储地图单元数组的大小。这里仍然要使用这两个变量,但要将它们变成私有类型。然后重命名为cellCountXcellCountZ。使用IDE的快捷功能可以一次重命名所有出现这些变量的位置。这样在处理地图块或者单元格的个数时就会很清楚。代码如下:

HexGrid.cs
1
2
3
4
5
6
7
8
9
public int HexGrid
{
//这里使用新的变量来初始化cells的尺寸
//这两个变量的值可以通过地图中有几个chunk和每个chunk的尺寸计算出来
private int cellCountX;
private int cellCountZ;


}

  重命名完成后,cellCountXcellCountZ的值就可以通过在Awake方法中地图块尺寸和地图尺寸相乘计算得出。同时,我们再将数组初始化的代码提取出来,封装成一个方法,这样让整个Awake方法就看起来更加整洁。代码如下:

HexGrid.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
27
private void Awake()
{


//计算出整个地图横向和纵向cell的个数,也就是二维数组的长和宽
cellCountX = chunkCountX * HexMetrics.chunkSizeX;
cellCountZ = chunkCountZ * HexMetrics.chunkSizeZ;

CreateCells();
}

/// <summary>
/// 初始化存储cell实例的数组
/// </summary>
private void CreateCells()
{
//通过计算出来的长和宽,对数组进行初始化
cells = new HexCell[cellCountZ * cellCountX];

for (int z = 0, i = 0; z < cellCountZ; z++)
{
for (int x = 0; x < cellCountX; x++)
{
CreateCell(x, z, i++);
}
}
}

  现在,我们就初步完成了地图网格块的设置,规定了一个大地图由多少个地图块构成,每个地图块有多少个地图单元构成,同时还对之前存储所有地图单元的数组,其初始化方式作出了调整。在下一章节中,我们将修改场景中的一些结构及组件,创建地图块Prefab,为之后在场景中生成地图块做准备。

Github代码