输入动作系统

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

跨平台的 输入动作系统 允许您连接 动作 并安排 绑定,以便在编辑时处理各种硬件输入。结合 上下文,您可以轻松配置和编辑一个模块化的输入系统,使其在任何设备的任何游戏阶段都能工作。用例包括:

  • 一个第一人称射击系统,根据玩家是否处于战斗模式或观众模式,动态切换动作。
  • 一个全面的驾驶系统,配备加速/减速、汽车助推器和加油站。
  • 在格斗游戏中为能力系统设置热键,以无缝切换动作,而不会让玩家错过攻击。

输入上下文

InputContext 是一组动作的集合,包含相关的 输入动作,例如 PlayContext 用于游戏内角色控制,NavContext 用于导航 UI 菜单的控制。您可以通过其 Enabled 属性 启用/禁用上下文(及其对应的动作),例如在打开库存菜单时启用 NavContext,然后在玩家关闭菜单并返回主要游戏时切换到 PlayContext

即使游戏最初可能不使用多个输入上下文,建议在任何输入系统的顶层创建一个主要上下文,例如在游戏过程中发生输入的 PlayContext 实例。

  1. 推荐
    ReplicatedStorage 中创建一个名为 InputsFolder,以保存各种输入上下文。

    在 ReplicatedStorage 中的新文件夹,重命名为 Inputs
  2. 在文件夹中插入一个新的 InputContext,并将其重命名为 PlayContext

    在 ReplicatedStorage 中的新 InputContext 实例,重命名为 PlayContext
  3. 可选
    属性 窗口中,将 Priority 设置为 2000,并启用 Sink。启用 Sink 的上下文会在其优先级级别上消耗其绑定的 KeyCodes 的输入事件,阻止这些输入到达优先级较低的上下文。这在打开时应抑制特定游戏输入的用例中非常实用,例如库存屏幕。在此示例中,PlayContext 被赋予足够高的 Priority,以便在默认的 PlayerScripts 上下文处理之前沉没其绑定的输入。

    InputContext 的优先级设置为 2000 且启用 Sink

输入动作

InputAction 定义了游戏玩法动作机制,例如“跳跃”、“冲刺”或“射击”。这些动作随后通过 输入绑定 映射到硬件输入。

InputAction 可以根据其 Type 属性(Enum.InputActionType)有几种变体。默认值是 Bool,旨在接收来自输入的按下/释放的 true/false 值,例如 ButtonAEMouseLeftButton

输入 动作 类型示例用法
Bool触发的动作,例如跳跃、射击、冲刺等,支持模拟输入的按下/释放阈值。
Direction1D可变的零到满的动作,例如汽车的加速踏板或视野范围的缩放级别。
Direction2D2D 方向移动,例如相机旋转或标准的 Roblox 角色移动。
Direction3D3D 方向移动,例如可以上下漂浮、加速/减速并左右漂移的空中车辆。
ViewportPosition2D 视口坐标,例如鼠标输入,用于自定义光标或射线投射以选择世界对象。

要测试简单角色冲刺的 InputAction

  1. 推荐
    资源管理器 中选择顶层的 Workspace 对象,然后在 属性 窗口中,将 PlayerScriptsUseInputActionSystem 属性设置为 Enabled

  2. ReplicatedStoragePlayContext 上下文中创建一个新的 InputAction。将其重命名为 CharacterSprint 以指示其专用动作。

    在 InputContext 中的新 InputAction 实例,重命名为 CharacterSprint
  3. 属性 窗口中,注意动作的 TypeBool(默认)。这是简单角色冲刺的逻辑类型,作为布尔 true/false 动作(角色要么在冲刺,要么不在冲刺)。

    InputAction 的类型属性设置为 Bool

输入绑定

InputBinding 定义了哪个硬件绑定应触发父 InputAction,例如按键、游戏手柄按钮或触摸启用设备上的点击。为了实现 跨平台 兼容性,每个 InputAction 应该有一个 游戏手柄键盘/鼠标触摸InputBinding,如下所示。

Roblox提供了默认的输入绑定,用于移动、相机控制和基本的环境交互 — Roblox玩家熟悉这些控制,因此你应该仅在特定情况下覆盖它们。还要注意,保留的输入无法被覆盖,并且将始终以其预期的方式进行操作。

动作鼠标/键盘游戏手柄触控
打开Roblox菜单EscStart 按钮 (ButtonStart)不适用
开发者控制台F9不适用不适用
全屏模式 (Windows)
显示桌面 (Mac)
F11不适用不适用
录制视频 (Windows)F12不适用不适用
截图PrintScreen不适用不适用

分配给父 InputActionType 直接影响哪些通用输入类型(键/按钮/点击、模拟触发器、摇杆等)对子 InputBinding 实例有效。反过来,发送到父动作的连接事件的值取决于绑定选择的输入类型。有关动作类型、绑定和返回值之间关系的详细信息,请参见 输入事件

要为简单角色冲刺连接绑定:

  1. CharacterSprint 动作中插入一个新的 InputBinding,并将其重命名为 KeyboardBinding。然后将绑定的 KeyCode 属性设置为 LeftShift

  2. CharacterSprint 动作中插入第二个 InputBinding,并将其重命名为 GamepadBinding。然后将绑定的 KeyCode 属性设置为 ButtonY

  3. StarterGui 中的 ScreenGui 容器内,创建一个 屏幕按钮,将其重命名为 SprintButton,并根据需要 定位/调整大小

  4. CharacterSprint 动作中插入第三个 InputBinding,并将其重命名为 TouchBinding。然后,在 属性 窗口中,将绑定的 UIButton 属性链接到您之前在 StarterGui 中创建的 SprintButton 按钮。

输入事件

InputAction 实例有三个内置 事件 来处理来自 InputBindings 的玩家输入。

  • Pressed — 仅当输入动作的 Type 设置为 Bool 时,此事件才会触发,并且仅在状态从 false 变为 true 时触发。
  • Released — 仅当输入动作的 Type 设置为 Bool 时,此事件才会触发,并且仅在状态从 true 变为 false 时触发。
  • StateChanged — 此事件在所有输入动作类型的状态发生变化时触发,除非状态尝试过渡到相同状态。

根据输入动作的 TypeBoolDirection1DDirection2DDirection3DViewportPosition)和来自子 InputBinding 的通用输入类型(键/按钮/点击、模拟触发器、摇杆等),不同的值会返回给 PressedReleasedStateChanged 事件处理程序。请查看以下表格以更好地理解它们之间的关系。

Bool 类型最适合触发的动作,例如跳跃、射击、冲刺等,支持模拟输入的按下/释放阈值。

InputBindings 上的有效输入类型返回给 InputAction 事件
来自键盘按键或基本鼠标/游戏手柄按钮的布尔输入,通过绑定的 KeyCode 属性,或通过绑定的 UIButton 属性的 GuiButton 按下/释放。
来自模拟输入的可变输入量,例如游戏手柄触发器(ButtonL2/ButtonR2),通过绑定的 KeyCode 属性。

要连接简单角色冲刺的事件:

  1. CharacterSprint 树中插入一个新的 Script,与各种输入绑定并排放置。然后将其 RunContext 设置为 Client,并将其重命名为 OnActivate

  2. 将以下代码粘贴到 OnActivate 脚本中。请注意第 1315 行的 Pressed 事件连接,当冲刺输入绑定被按下时,它会将角色的行走速度加倍,而第 1618 行的相应 Released 事件连接会在冲刺输入绑定被释放时将行走速度重置为默认值。

    OnActivate (客户端脚本)
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local humanoid = character:WaitForChild("Humanoid")
    local defaultWalkSpeed = humanoid.WalkSpeed
    local inputAction = script.Parent
    inputAction.Pressed:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed * 2
    end)
    inputAction.Released:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed
    end)
  3. 测试您的游戏,并使用您之前选择的 绑定 测试角色冲刺动作:键盘的 LeftShift、游戏手柄的 ButtonY,以及触摸启用设备的屏幕 SprintButton。请记住,您可以使用 控制器模拟器 在 Roblox Studio 中直接测试游戏手柄输入。

上下文变化

一旦您拥有一个 输入上下文,例如 PlayContext,您可以通过脚本在游戏过程中启用/禁用它,改变其 Priority 以确定哪些动作优先于其他动作,并通过 Sink 阻止输入在优先级较低的上下文中被处理。

  1. 为了更方便地从其他脚本切换上下文,在 ReplicatedStorage 中的输入文件夹中插入一个新的 BindableEvent,并将其重命名为 ContextEvent

  2. 在同一层级创建一个新的 Script,将其 RunContext 设置为 Client,并将其重命名为 UpdateContext

  3. UpdateContext 脚本中粘贴以下代码:

    UpdateContext (客户端脚本)
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")
    local contextEvent = inputsFolder:WaitForChild("ContextEvent")
    -- 连接可绑定事件
    contextEvent.Event:Connect(function(targetContext, enabled)
    local context = inputsFolder:FindFirstChild(targetContext)
    if context then
    context.Enabled = enabled
    print(context.Name .. ": " .. tostring(context.Enabled))
    else
    warn("未找到 InputContext!")
    end
    end)
  4. 有了 UpdateContext 脚本,您现在可以通过触发可绑定事件来更新命名的 InputContext,例如从驱动 GuiButtonLocalScript 中。

    按钮脚本
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")
    local contextEvent = inputsFolder:WaitForChild("ContextEvent")
    local button = script.Parent
    button.Activated:Connect(function()
    -- 触发可绑定事件,带有目标输入上下文和启用状态
    contextEvent:Fire("PlayContext", true)
    end)

输入动作管理器

输入动作管理器 工具是一个统一的矩阵式界面,用于设计、审核和扩展您的输入架构。

要访问它,请导航到 Studio 中的 窗口 菜单并选择 输入 ⟩ 输入 动作 管理器。如果您的游戏已经使用输入 上下文动作绑定,管理器将自动扫描 DataModel 并将这些现有实例提取到编辑器网格中。任何新的与输入相关的实例将自动填充到 ReplicatedStorage 中的 Inputs 文件夹中。

在 ReplicatedStorage 中名为 Inputs 的文件夹

要配置 角色冲刺 的输入设置,如上面各节所述:

  1. 推荐
    资源管理器 中选择顶层的 Workspace 对象,然后在 属性 窗口中,将 PlayerScriptsUseInputActionSystem 属性设置为 Enabled

  2. StarterGui 中的 ScreenGui 容器内,创建一个 屏幕按钮,将其重命名为 SprintButton,并根据需要 定位/调整大小

  3. 输入动作管理器 中,将鼠标悬停在 上下文 列标题上,然后单击 按钮。输入新上下文的适当名称,例如 PlayContext,然后按 Enter。一个匹配名称的 InputContext 出现在 ReplicatedStorage 中。

    在 ReplicatedStorage 中名为 PlayContext 的新 InputContext 实例
  4. 将鼠标悬停在新上下文上并单击 按钮。在弹出菜单中,选择 Bool,输入 CharacterSprint 作为动作的名称,然后按 Enter。一个匹配名称的 InputAction 出现在上下文下方。

    在 InputContext 中名为 CharacterSprint 的新 InputAction 实例
  5. 在新的 CharacterSprint 行中,为每种输入类型分配绑定:

    1. 键盘和鼠标 — 单击箭头按钮,从选择菜单中选择 LeftShift
    2. 触摸 — 单击单元格,然后在 资源管理器 层次结构中单击您之前插入的 ScreenGui 中的 SprintButton 对象。
    3. 游戏手柄 — 单击箭头按钮,从选择菜单中选择 ButtonY
  6. CharacterSprint 树中插入一个新的 Script,与各种输入绑定并排放置。然后将其 RunContext 设置为 Client,并将其重命名为 OnActivate

  7. 将以下代码粘贴到 OnActivate 脚本中。请注意第 1315 行的 Pressed 事件连接,当冲刺输入绑定被按下时,它会将角色的行走速度加倍,而第 1618 行的相应 Released 事件连接会在冲刺输入绑定被释放时将行走速度重置为默认值。

    OnActivate (客户端脚本)
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local character = player.Character
    if not character or character.Parent == nil then
    character = player.CharacterAdded:Wait()
    end
    local humanoid = character:WaitForChild("Humanoid")
    local defaultWalkSpeed = humanoid.WalkSpeed
    local inputAction = script.Parent
    inputAction.Pressed:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed * 2
    end)
    inputAction.Released:Connect(function()
    humanoid.WalkSpeed = defaultWalkSpeed
    end)
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。