3-2 简单的地图单元高度编辑器

  我们已经为地图单元增加了高度属性,并且规定了一个高度单位是多少个Unity3D中的单位。与之前为地图单元赋值颜色类似,现在我们需要先完成一个简单的UI,利用Slider来控制地图单元的高度。在鼠标点击地图单元的时候,为被点击的地图单元同时赋值已选中的颜色和高度。
  我们先从HexGrid.ColorCell方法入手,将方法名改为GetCell,返回值为被点击地图单元的实例,并且在这个方法里不再重新构建整所有的地图单元。

HexGrid.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
/// <summary>
/// 获取背点击cell的实例
/// </summary>
/// <param name="_position">鼠标点击hexmap的位置</param>
public HexCell GetCell(Vector3 position)
{
position = transform.InverseTransformPoint(position);
HexCoordinates coordinates = HexCoordinates.FromPosition(position);
int index = coordinates.X + coordinates.Z * width + coordinates.Z / 2;

//返回被点击cell的实例
return cells[index];
}

  因为GetCell已经不再重新构建整个地图了,所以我们将这部分单独创建一个方法,也方便今后进行调用。

HexGrid.cs
1
2
3
4
5
6
7
/// <summary>
/// 重新构建整个地图
/// </summary>
public void Refresh()
{
hexMesh.Triangulate(cells);
}

  接着我们回到HexMapEditor.cs中,在这里我们创建EditCell方法,这个方法中为被点击的地图单元赋值颜色和高度,并刷新整个地图,而在HandleInput方法中,只要调用它就可以了。

HexMapEditor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void HandleInput()
{



if (Physics.Raycast(_inputRay, out _hit))
{
EditCell(hexGrid.GetCell(_hit.point));
}
}

/// <summary>
/// 为被点击cell赋值颜色和高度,并刷新整个地图
/// </summary>
/// <param name="cell">被点击cell的实例</param>
private void EditCell(HexCell cell)
{
cell.color = activeColor;
hexGrid.Refresh();
}

  现在的EditCell方法中只有赋值颜色的部分,这里需要添加赋值高度的部分。和赋值颜色的思路一样,我们首先添加一个变量用于获取当前UI选中的高度,然后再将这个高度赋值给被点击地图单元的实例。

HexMapEditor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class HexMapEditor : MonoBehaviour
{
//已选中的高度
private int activeElevation;



private void EditCell(HexCell cell)
{
cell.color = activeColor;
cell.elevation = activeElevation;
hexGrid.Refresh();
}
}

  和UI选取颜色一样,需要有一个方法被UI调用,来设置选中的高度。这里使用Slider组件来实现这个功能,由于Slider组件所产生的是float类型的数据,所以我们需要接收float类型的值,并将这个值转换成int类型。

HexMapEditor.cs
1
2
3
4
5
6
7
8
/// <summary>
/// 获取UI选定的高度
/// </summary>
/// <param name="elevation">从UI的Slider接收的值</param>
public void SetElevation(float elevation)
{
activeElevation = (int)elevation;
}

  我们回到Unity3D编辑器中,选中Hex Map Editor,添加一个Slider组件(GameObject / Create / Slider)。并调整其大小、位置和方向如下图所示。

  接着将Slider组件的取值范围设置为取整数值(Whole Numbers),并设置其取值范围为0-6。最后将OnValueChanged事件与HexMapEditor.SetElevation方法相关连。

  这样,我们就初步完成了一个通过UI来为被点击的地图单元赋值高度的功能了。不过现在只是将高度值赋值到了被点击的地图单元实例中,并没有在构建三角面片的时候对地图单元的mesh作出改变。在接下来的一章中,我们来实现这个功能。

Github代码