动作映射本质上就是一组有名称的键位绑定。
它们的主要目的是定义其包含的绑定的优先级,并且能够轻松地批量启用或禁用这些绑定。
以回放功能为例:
所有与回放相关的绑定都被分组到同一个名为
“ReplayPlaybackActionMap”的动作映射中。
当您打开回放时,此动作映射会被激活。
它还可以被赋予比常规驾驶控制更高的优先级,这样右方向键就不会尝试控制车辆转向,而是会将回放向前快进 10 秒。
当生成一个事件 时,BeamNG.drive 会从第一个动作映射开始,检查其中是否包含要执行的相关绑定:
(* 除非已经设置了截获标志 )
动作映射可以处于激活或未激活状态,并且各自有一个列表。您可以在 GE-Lua 控制台中运行以下命令,随时查看这两个列表:
dump(ActionMap:getList())
这些是游戏启动后立即激活的默认动作映射,及其顺序:
列表顶部的动作映射具有更高的优先级:它们有机会在底部的动作映射之前处理绑定。
第二个列表列出了所有未激活的动作映射。
未激活的映射永远不会被考虑,最终用户无法使用其中的任何绑定,因此它们的顺序无关紧要。
在撰写本文时,未激活的列表通常包含:
模组可以通过在 .json 动作文件格式
中选择一个新的 actionMap 字段名来添加额外的动作映射。
该名称加上后缀 “ActionMap” 将用作其在场景树中的标识符。例如,使用 ‘actionMap’:‘FunStuff’ 将创建一个可通过 scenetree.findObject(‘FunStuffActionMap’) 访问的动作映射。
所有额外的动作映射默认情况下都是未激活的 。
为了使新的动作映射可用,必须先激活 它们(并在使用完毕后根据需要停用)。
激活一个动作映射意味着将其从未激活列表移动到激活列表。
换句话说,动作映射被 推入 或 弹出 激活列表。
可以随时通过运行以下 GE-Lua 代码来激活动作映射:
local actionMapName = "MyActionMap"
scenetree.findObject(actionMapName):push()
为了稍后停用它,请使用以下代码:
local actionMapName = "MyActionMap"
scenetree.findObject(actionMapName):pop()
这将把动作映射移回未激活列表。
动作映射被激活(推入)的位置大致在 GuiActionMap 下方(参见激活动作映射列表
)。
因此,它们的优先级低于 GUI/菜单/全局 动作映射,但高于先前激活的动作映射。
实际上,这意味着模组永远无法覆盖例如退出游戏的 ALT+F4 绑定。这是设计使然。
这在显示#层级结构
时,会显示为 enabled = true 或 enabled = false。
这是一个很少使用的功能,但为了完整性在此记录。它允许在不丢失其在激活的动作映射列表 中的位置(优先级)的情况下禁用某个动作映射(无需将动作映射从激活列表移到未激活列表)。
其主要目的是允许在菜单关闭时禁用所有 Menu 动作映射的绑定(如果最终用户开始导航菜单,则重新启用它们),同时保持其绑定的适当优先级。
这个布尔标志可以为每个动作映射设置。其默认值为 true。
在显示#层级结构
时,会显示为 trapHandledEvents = true 或 trapHandledEvents = false。
这是另一个很少使用的功能,同样为完整性在此记录。
如果此标志为 false,则动作映射执行顺序
的行为会发生变化:即使在当前动作映射中找到了绑定,系统仍会继续检查优先级较低的动作映射。
例如,如果动作映射栈的前半部分将此标志设置为 false,而后半部分设置为 true,那么前半部分中的所有绑定都将被处理。之后,第一个找到匹配绑定的动作映射将被处理,其余的动作映射则没有机会(因为事件刚刚被最后一个匹配的动作映射捕获了)。
这篇文章对你有用吗?