5-1 地图网格块
在之前的章节中,我们使用一张彩色噪点图,并采样噪点图中的像素点,对地图中的每个顶点进行位置扰动,让地图整体看起来有一些随机性,视觉效果也更加自然。在接下来的章节中,我们将创建更大的地图区域,并为地图编辑器添加新的功能。
在Unity3D中单个mesh的顶点容量是65000个,所以我们不能把单个地图尺寸设置的过大。如果想要一张尺寸更大的地图,解决方案是将多个mesh进行拼接,也就是使用若干小块拼接成一个尺寸更大的地图。
这里我们先定义一个地图块的尺寸为$5*5$,也就是说一个地图块由25个地图单元组成。这个尺寸在HexMetrics.cs
中进行定义。代码如下:
1 | public int HexMetrics |
地图块的尺寸设置成多大比较合适?
视情况而定,较大的地图块意味着地图块数量少,但是每个地图块的mesh中会有比较多的顶点,这会使draw calls较少。但是较小的地图块会在视锥体裁剪剔除时效率较高,绘制的三角形较少。实际方法就是先设置一个预估的大小,根据不同的需求再进行微调。
接下来我们定义整个地图中长宽各有多少个地图块。这里定义地图的尺寸为$43$,也就是整个地图由12个地图块拼接组成。根据之前代码地图的尺寸定义,整个地图是由$1225$,也就是300个地图单元组成。这个尺寸对于我们目前测试与查看效果是比较合适的。定义地图块尺寸在HexGrid.cs
中的代码如下:
1 | public class HexGrid : MonoBehaviour |
在HexGrid.cs
中,我们使用width
和height
这两个变量来初始化存储地图单元数组的大小。这里仍然要使用这两个变量,但要将它们变成私有类型。然后重命名为cellCountX
和cellCountZ
。使用IDE的快捷功能可以一次重命名所有出现这些变量的位置。这样在处理地图块或者单元格的个数时就会很清楚。代码如下:
1 | public int HexGrid |
重命名完成后,cellCountX
和cellCountZ
的值就可以通过在Awake
方法中地图块尺寸和地图尺寸相乘计算得出。同时,我们再将数组初始化的代码提取出来,封装成一个方法,这样让整个Awake
方法就看起来更加整洁。代码如下:
1 | private void Awake() |
现在,我们就初步完成了地图网格块的设置,规定了一个大地图由多少个地图块构成,每个地图块有多少个地图单元构成,同时还对之前存储所有地图单元的数组,其初始化方式作出了调整。在下一章节中,我们将修改场景中的一些结构及组件,创建地图块Prefab,为之后在场景中生成地图块做准备。