3-3 设置地图单元Mesh的高度

  在上一章中我们为地图单元添加了高度属性,并完成了简单的UI,来为被点击的地图单元赋值高度信息。但是在构建地图Mesh的时候,并没有将这个高度值应用到被点击的地图单元上。这里我们就来实现这个功能,首先将HexCell 中的elevation字段转换为属性。

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
private int elevation;

public int Elevation
{
get
{
return elevation;
}
set
{
elevation = value;
}
}

  然后在赋值高度的同时,修改地图单元Mesh的垂直坐标。

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int Elevation
{


set
{
elevation = value;

//在获取高度等级的时候,同时为cell的Mesh赋值相应的高度值
Vector3 position = transform.localPosition;
position.y = value * HexMetrics.elevationStep;
transform.localPosition = position;
}
}

  因为将elevation字段转换为了属性,回到HexMapEditor.EditCell里将赋值语句的错误修改掉,

HexGrid.cs
1
2
3
4
5
6
private void EditCell(HexCell cell)
{
cell.color = activeColor;
cell.Elevation = activeElevation;
hexGrid.Refresh();
}

MeshCollider是否能吻合新的高度地图?
旧版本的Unity需要在设置相同的Mesh信息之前先把MeshCollider设为null,它只是假设Mesh的数据不会改改变,所以只有不同的Mesh(或者null)能触发碰撞器的刷新,现在已经没这个必要了。所以我们现在的方法:在三角构建之后重新分配MeshCollider的Mesh信息,这是可行的。

  现在通过UI设置高度之后,点击一个地图单元,我们就可以看到被点击的地图单元升高了对应的高度。但是这里还有两个问题:
  第一:跟随地图单元的坐标并没有随着地图单元的高度高边而改变,当地图单元高度变化的时候,其对应的坐标依然还是在水平高度上。
  第二:地图单元之间的连接错误。颜色混合区域连接着两个相邻的地图单元,当两个地图单元的垂直高度不相同的时候,颜色混合区域应该依然连接着两个地图单元,因为高度不同只是被拉伸了而已。
  在接下来的章节中,我们将会解决这些问题。

Github代码