Steamworks 文献库
操作集层
操作集层为可选的操作绑定集,可覆盖于现有的控制集上。 与操作集不同的是,操作集层从所从属的操作集里抽取操作,且在应用时不会成批替换已在使用中的操作,但会有小的修改, 包括设置变更以及添加或从基础操作集移除绑定。 一次可应用多个操作集层,且会连续应用。

技术上来说,一次可使用的集层数量没有限制,但在实际操作中,配置器中过多的集层会使玩家很迷惑。

请注意:
  • 激活已经在使用中的操作集对其集层没有影响。
  • 激活新的操作集将清除旧集中所有使用中的集层。
  • 激活已经在使用中的操作集层没有影响。
  • 激活已经在使用中的操作集层不会改变其在堆栈中的顺序。
  • 停用操作集层,然后再次激活,会使该集层位于堆栈顶部。
  • 调用 ActivateActionSetLayer 开销很小,可以安全地重复调用(但请见以下标注)。

    请小心使用多个集层!

    虽然您可以每帧重复应用操作集层,但这不意味着您应该如此,特别是如果您使用的集层不止一个时。 最后应用的集层会替代此前应用但有冲突的所有信息,因此请特别小心按顺序应用。 您的代码很容易带有竞争条件或其他细微的计时错误,导致顺序调换。

    操作集层只适用于有限的使用案例,好的做法是只在特定游戏状态变更的情况下应用和移除集层。

    对于带有原生 Steam 输入支持的游戏,开发者可以定义由游戏代码激活的特定操作集层。 此外,在传统模式下,玩家可以定义自己的操作集层及其触发输入,就像他们能定义自己的玩家触发操作集一样。

    实用示例


    想象一个多兵种、带交通工具的射击游戏。 该游戏具有原生 Steam 输入支持,并使用操作集层。 对于基本游戏玩法,始终有一个基础操作集处于使用状态,覆盖四处奔跑、拾起物品、跳跃等等。

    action_set_layers_basic_1.png

    玩家选择兵种后,会添加对应的层,例如“狙击手”

    action_set_layers_sniper_2.png

    其代码大致如下:

    void changeClass(EClassID myClass) { if(myClass == SNIPER) { SteamInput()->ActivateActionSetLayer( controllerHandle1, sniperLayerHandle ); } //其他兵种逻辑 }

    如果玩家进入或离开交通工具,状态变更中对交通工具层的控制会激活或停用,对交通工具特定函数添加或移除新的控制。

    action_set_layers_vehicle_1.png

    void changeVehicle(EVehicleID myVehicle, bool entering) { InputActionSetHandle_t layerHandle; if(myVehicle == AUTOMATIC) { layerHandle = automaticHandle; //自动变速—驾驶、加油、刹车 } else if(myVehicle == STICK_SHIFT) { layerHandle = stickShiftHandle; //手动变速—驾驶、加油、刹车、踩离合、挂挡,等等 } if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, layerHandle ); //进入交通工具时,应用交通工具的操作集层 } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, layerHandle ); //离开交通工具时,移除交通工具的操作集层 } }

    在游戏中,玩家即使搭乘交通工具时也可以使用武器。 因此狙击手使用狙击步枪上的瞄准器时,会激活第三个操作集层,无论玩家是徒步还是搭乘交通工具。

    action_set_layers_scope.png

    void useScope(bool entering) { if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, scopeHandle ); //瞄准时应用瞄准层 } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, scopeHandle ); //放下瞄准器时移除瞄准层 } }

    所有层按以下方式组合。

    action_set_layers_result_2.png

    注意,层不仅能在基础层之上添加新的操作,也可以替代此前的绑定——在这种情况下,针对交通工具的“刹车”和“加油”操作会替代基础层的“跳跃”和“互动”操作,“驾驶”会替代基础层中绑定至触控板和摇杆的“移动”操作,而“驾驶”反过来又会被瞄准操作集层里的“瞄准”操作替代。 一旦三个操作集层堆叠在顶部,唯一剩下来自基础集的操作就是“射击”。

    传统模式


    您几乎可以像创建常规操作集一样创建操作集层。 只需简单地点击配置器上的“添加操作层”键:

    add_action_layer.png

    您可以在此指定操作集层的名称及绑定。 因为这是传统操作集层,游戏并没有相关设置,玩家需要自行激活。 决定哪些输入会激活操作集层,然后打开绑定菜单,点击操作集激活图标,即最左侧特殊图标:

    bind_action_set.png

    由此调出操作集激活菜单:

    change_action_set.png

    这个示例要应用一个层,而非激活操作集。 我们从下拉菜单里选择“应用操作层”:

    apply_action_set_layer.png

    最后,选择要应用的层:

    select_action_set_layer.png

    用同样的流程来指定单独的绑定以移除层。
  翻译: