6-8 编辑地图单元上的河流信息

  在上一章中,我们完成了对鼠标左键按下时拖拽的检测,并创建了相关逻辑处理的代码。在这一章中我们将完善这些逻辑,使我们可以在Inspector面板的Debug模式下,可以看到地图单元上是否有河流与河流的信息。
  目前我们已经可以检测鼠标左键按下后的拖拽事件了。接下来,我们就可以对每个地图单元上添加或移除河流信息了。这里要注意,移除河流是不需要检测鼠标左键按下时的拖拽事件的。代码如下:

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


if (cell)
{



if (riverMode == OptionalToggle.No)
{
cell.RemoveRiver();
}
else if (isDrag && riverMode == OptionalToggle.Yes)
{
//设置之前的cell中 河流的流出方位
previousCell.SetOutgoingRiver(dragDirection);
}
}
}

  这样,我们就就可以通过数百左键按下拖拽,在两个相邻的地图单元上创建流入和流出的河流了。但这样只是针对单个地图单元进行操作,我们忽略了笔刷的因素,感觉上没有什么不妥。既然有笔刷这个属性,那么我们在创建河流的时候,就应该创建出所有在笔刷范围内地图单元的河流。既然是在笔刷覆盖单位内创建河流信息,那就要确保笔刷覆盖范围内,都有地图单元的实例。代码如下:

HexMapEditor.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
private void EditCell(HexCell cell)
{


if (cell)
{



if (riverMode == OptionalToggle.No)
{
cell.RemoveRiver();
}
else if (isDrag && riverMode == OptionalToggle.Yes)
{
//检测当前cell的拖拽方位上,是否有相邻cell 的实例
//如果有实例,就创建相应的河流信息
HexCell otherCell = cell.GetNeighbor(dragDirection.Opposite());
if (otherCell)
{
otherCell.SetOutgoingRiver(dragDirection);
}
}
}
}

  运行Unity,通过鼠标左键按下后拖拽,我们就可以创建地图单元上的河流信息了,虽然现在我们没办法在Game窗口中直接看到河流的创建和删除,但是我们可以通过Inspector面板的Debug模式来查看每个地图单元上的河流信息是否正确。如下图:

  这里要注意,我们之前使用了鼠标抬起事件Input.GetMouseButtonUp(0)来检测是否点击到了地图上,而现在因为添加了拖拽功能,所以只检测鼠标左键事件即可Input.GetMouseButton(0)。代码如下:

HexMapEditor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class HexMapEditor : MonoBehaviour
{


private void Update()
{
if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject())
{

}
else
{

}
}
}

  至此,我们就完成了鼠标左键按下拖拽进行河流的创建或移除的功能了。在接下来的章节中,我们将分析河流的三角剖分形状,逐步作出在地图系统中可见的河流。

Github代码