第十一章 地图动作与地图事件(Map Action and Map Event)
我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。
我们这一章来完成地图上的操作,地图的操作将全部由MapAction
控制。
文章目录
三 地图输入(Map Input)
我们的MapAction
是游戏地图进行操作的,它包含很多东西。
这一节主要是玩家的输入操作。
不过在操作之前,应该先了解玩家在整个游戏的操作流程。
1 输入条件(Input Condition)
玩家输入的条件应满足如下条件:
-
状态
ActionStatus
必须是等待输入状态WaitInput
; -
必须是玩家回合
AttitudeTowards.Player
; -
地图状态不能是播放动画
MapStatus.Animation
; -
地图状态不在事件状态
MapStatus.Event
; -
地图状态是菜单
MapStatus.Menu
与子菜单MapStatus.SubMenu
状态时,确定按键(左键)不可操作,而取消按键(右键)可以操作。
这些很好理解,剧情时不能操作(当然,你可以选择在剧情时按某个按键是跳过剧情);而不是玩家时,我们同样不能操作;播放动画时(例如移动动画,攻击动画等)不能操作;触发事件时不能操作;而在菜单状态,我们的“确定操作”由UnityEngine.UI
控制,而取消操作需要我们来控制。
基于以上,创建方法:
/// <summary>
/// 是否可以输入。
/// cancelButton = true: 菜单时可输入
/// </summary>
/// <param name="cancelButton"></param>
/// <returns></returns>
public virtual bool CanInput(bool cancelButton)
{
if (status != ActionStatus.WaitInput || turn != AttitudeTowards.Player)
{
return false;
}
if (mapStatus == MapStatus.Animation || mapStatus == MapStatus.Event)
{
return false;
}
if (!cancelButton)
{
if (mapStatus == MapStatus.Menu || mapStatus == MapStatus.SubMenu)
{
return false;
}
}
return true;
}
2 鼠标移动(Mouse Move)
在地图中,我们的光标是要随着鼠标移动的,这就需要每帧都刷新它的位置。
鼠标坐标转换成地图坐标:
/// <summary>
/// 鼠标转Cell
/// </summary>
/// <param name="mousePosition"></param>
/// <returns></returns>
protected Vector3Int MouseToCellPosition(Vector3 mousePosition)
{
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(mousePosition);
Vector3Int cellPosition = map.grid.WorldToCell(worldPosition);
return cellPosition;
}
每帧刷新光标坐标:
/// <summary>
/// 鼠标移动时的输入
/// </summary>
/// <param name="mousePosition"></param>
public override void OnMouseMove(Vector3 mousePosition)
{
if (status == ActionStatus.WaitScenarioDone)
{
scenarioAction.OnMouseMove(mousePosition);
return;
}
if (!CanInput(false))
{
return;
}
Vector3Int cellPosition = MouseToCellPosition(mousePosition);
map