1-2 构建地图单元容器

  在1-1中,我们用代码创建了一个正六边形地图单元的基本结构,接下来,为了构建正六边形地图系统,首先需要构建一个正六边形地图单元实例。首先创建HexCell组件。这里不在此脚本中填写任何代码。

HexCell.cs
1
2
3
4
5
6
using UnityEngine;

public class HexCell : MonoBehaviour
{

}

  接下来在场景中创建一个Plane,重命名为Hex Cell,挂载HexCell组件,并且把这个Plane创建为Prefab。如下图:

  然后创建一个空物体,命名为Hex Grid,用来容纳地图单元。创建HexGrid脚本,并声明三个变量,分别表示在该容器中,地图单元的行数、列数和地图单元预置,代码如下:

HexGrid.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;

public class HexGrid : MonoBehaviour
{
//表示每一行有多少个地图单元
public int width = 6;

//表示每一列有多少个地图单元
public int height = 6;

//存放地图单元格的预置
public HexCell cellPrefab;
}

  地图单元的容器创建完成后,将Width和Height的值都设置为6,将之前创建好的HexCell预置拖入Hex Cell框内。

  现在,需要完成创建地图单元的代码,这里使用一个嵌套的for循环来创建地图单元,Width为每一行中有多少个地图单元,Height为行数。最后,将创建好的地图单元实例,存储在一个二维数组中,便于后期的查找和修改。HexGrid脚本添加代码如下:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//存放实例化的地图单元
HexCell[] cells;

private void Awake()
{
//根据长度和宽度,初始化数组大小
cells = new HexCell[height * width];

//从左下角开始,依次往右,每一行为 width 个单元后,上移一行
for (int z = 0, i = 0; z < height; z++)
{
for (int x = 0; x < width; x++)
{
CreateCell(x, z, i++);
}
}
}

/// <summary>
/// 创建一个地图单元
/// </summary>
/// <param name="x">地图单元是 横行中的第几个</param>
/// <param name="z">地图单元是 粽列中的第几个</param>
/// <param name="i">地图单元在</param>
private void CreateCell(int x, int z, int i)
{
//声明一个Vector3,用来
Vector3 position;
position.x = x * 10f;
position.y = 0f;
position.z = z * 10f;

//在数组cells的i位置实例化地图单元
//cell用来给这个被实例化的单元设置父级和位置
HexCell cell;
cells[i] = Instantiate<HexCell>(cellPrefab);
cell = cells[i];

//设置被实例化地图单元的父级和位置
cell.transform.SetParent(transform, false);
cell.transform.localPosition = position;
}

  这里要注意一点,在Unity中,一个默认Panel为10x10单位。所以在CreateCell方法中,position.x = x * 10fposition.z = z * 10f中的10f便是Panel的边长,要每次移动Panel边长的距离,让各个地图元素相邻。生成效果如下:

  至此,已经成功的生成了由正方形单元组成的地图网格。但是由于每个地图单元是紧紧相邻的,在Game窗口中很难快速定位每一个地图单元的位置,如果是正六边形的地图单元,这种情况还可能更加混乱。下一步,为了方便以后的调试和更加直观的查看,我们将为每一个地图单元加上自身的坐标。