跨平台的 输入动作系统 允许您连接 动作 并安排 绑定,以便在编辑时处理各种硬件输入。结合 上下文,您可以轻松配置和编辑一个模块化的输入系统,使其在任何设备的任何游戏阶段都能工作。用例包括:
- 一个第一人称射击系统,根据玩家是否处于战斗模式或观众模式,动态切换动作。
- 一个全面的驾驶系统,配备加速/减速、汽车助推器和加油站。
- 在格斗游戏中为能力系统设置热键,以无缝切换动作,而不会让玩家错过攻击。
输入上下文
InputContext 是一组动作的集合,包含相关的 输入动作,例如 PlayContext 用于游戏内角色控制,NavContext 用于导航 UI 菜单的控制。您可以通过其 Enabled 属性 启用/禁用上下文(及其对应的动作),例如在打开库存菜单时启用 NavContext,然后在玩家关闭菜单并返回主要游戏时切换到 PlayContext。
即使游戏最初可能不使用多个输入上下文,建议在任何输入系统的顶层创建一个主要上下文,例如在游戏过程中发生输入的 PlayContext 实例。
在文件夹中插入一个新的 InputContext,并将其重命名为 PlayContext。

输入动作
InputAction 定义了游戏玩法动作机制,例如“跳跃”、“冲刺”或“射击”。这些动作随后通过 输入绑定 映射到硬件输入。
InputAction 可以根据其 Type 属性(Enum.InputActionType)有几种变体。默认值是 Bool,旨在接收来自输入的按下/释放的 true/false 值,例如 ButtonA、E 或 MouseLeftButton。
| 输入 动作 类型 | 示例用法 |
|---|---|
| Bool | 触发的动作,例如跳跃、射击、冲刺等,支持模拟输入的按下/释放阈值。 |
| Direction1D | 可变的零到满的动作,例如汽车的加速踏板或视野范围的缩放级别。 |
| Direction2D | 2D 方向移动,例如相机旋转或标准的 Roblox 角色移动。 |
| Direction3D | 3D 方向移动,例如可以上下漂浮、加速/减速并左右漂移的空中车辆。 |
| ViewportPosition | 2D 视口坐标,例如鼠标输入,用于自定义光标或射线投射以选择世界对象。 |
要测试简单角色冲刺的 InputAction:
在 ReplicatedStorage 的 PlayContext 上下文中创建一个新的 InputAction。将其重命名为 CharacterSprint 以指示其专用动作。

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

Roblox提供了默认的输入绑定,用于移动、相机控制和基本的环境交互 — Roblox玩家熟悉这些控制,因此你应该仅在特定情况下覆盖它们。还要注意,保留的输入无法被覆盖,并且将始终以其预期的方式进行操作。
| 动作 | 鼠标/键盘 | 游戏手柄 | 触控 |
|---|---|---|---|
| 打开Roblox菜单 | Esc | Start 按钮 (ButtonStart) | 不适用 |
| 开发者控制台 | F9 | 不适用 | 不适用 |
| 全屏模式 (Windows) 显示桌面 (Mac) | F11 | 不适用 | 不适用 |
| 录制视频 (Windows) | F12 | 不适用 | 不适用 |
| 截图 | PrintScreen | 不适用 | 不适用 |
分配给父 InputAction 的 Type 直接影响哪些通用输入类型(键/按钮/点击、模拟触发器、摇杆等)对子 InputBinding 实例有效。反过来,发送到父动作的连接事件的值取决于绑定选择的输入类型。有关动作类型、绑定和返回值之间关系的详细信息,请参见 输入事件。
要为简单角色冲刺连接绑定:
在 CharacterSprint 动作中插入一个新的 InputBinding,并将其重命名为 KeyboardBinding。然后将绑定的 KeyCode 属性设置为 LeftShift。


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


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


输入事件
InputAction 实例有三个内置 事件 来处理来自 InputBindings 的玩家输入。
- StateChanged — 此事件在所有输入动作类型的状态发生变化时触发,除非状态尝试过渡到相同状态。
根据输入动作的 Type(Bool、Direction1D、Direction2D、Direction3D 或 ViewportPosition)和来自子 InputBinding 的通用输入类型(键/按钮/点击、模拟触发器、摇杆等),不同的值会返回给 Pressed、Released 和 StateChanged 事件处理程序。请查看以下表格以更好地理解它们之间的关系。
Bool 类型最适合触发的动作,例如跳跃、射击、冲刺等,支持模拟输入的按下/释放阈值。
| 在 InputBindings 上的有效输入类型 | 返回给 InputAction 事件 |
|---|---|
| 来自键盘按键或基本鼠标/游戏手柄按钮的布尔输入,通过绑定的 KeyCode 属性,或通过绑定的 UIButton 属性的 GuiButton 按下/释放。 |
|
| 来自模拟输入的可变输入量,例如游戏手柄触发器(ButtonL2/ButtonR2),通过绑定的 KeyCode 属性。 |
|
要连接简单角色冲刺的事件:
在 CharacterSprint 树中插入一个新的 Script,与各种输入绑定并排放置。然后将其 RunContext 设置为 Client,并将其重命名为 OnActivate。

将以下代码粘贴到 OnActivate 脚本中。请注意第 13 到 15 行的 Pressed 事件连接,当冲刺输入绑定被按下时,它会将角色的行走速度加倍,而第 16 到 18 行的相应 Released 事件连接会在冲刺输入绑定被释放时将行走速度重置为默认值。
OnActivate (客户端脚本)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)
上下文变化
一旦您拥有一个 输入上下文,例如 PlayContext,您可以通过脚本在游戏过程中启用/禁用它,改变其 Priority 以确定哪些动作优先于其他动作,并通过 Sink 阻止输入在优先级较低的上下文中被处理。
为了更方便地从其他脚本切换上下文,在 ReplicatedStorage 中的输入文件夹中插入一个新的 BindableEvent,并将其重命名为 ContextEvent。

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

在 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 thencontext.Enabled = enabledprint(context.Name .. ": " .. tostring(context.Enabled))elsewarn("未找到 InputContext!")endend)有了 UpdateContext 脚本,您现在可以通过触发可绑定事件来更新命名的 InputContext,例如从驱动 GuiButton 的 LocalScript 中。
按钮脚本local ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")local button = script.Parentbutton.Activated:Connect(function()-- 触发可绑定事件,带有目标输入上下文和启用状态contextEvent:Fire("PlayContext", true)end)
输入动作管理器
输入动作管理器 工具是一个统一的矩阵式界面,用于设计、审核和扩展您的输入架构。
要访问它,请导航到 Studio 中的 窗口 菜单并选择 输入 ⟩ 输入 动作 管理器。如果您的游戏已经使用输入 上下文、动作 或 绑定,管理器将自动扫描 DataModel 并将这些现有实例提取到编辑器网格中。任何新的与输入相关的实例将自动填充到 ReplicatedStorage 中的 Inputs 文件夹中。

要配置 角色冲刺 的输入设置,如上面各节所述:
在 StarterGui 中的 ScreenGui 容器内,创建一个 屏幕按钮,将其重命名为 SprintButton,并根据需要 定位/调整大小。

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


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


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

将以下代码粘贴到 OnActivate 脚本中。请注意第 13 到 15 行的 Pressed 事件连接,当冲刺输入绑定被按下时,它会将角色的行走速度加倍,而第 16 到 18 行的相应 Released 事件连接会在冲刺输入绑定被释放时将行走速度重置为默认值。
OnActivate (客户端脚本)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)



