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

在 属性 窗口中,将 Priority 设置为 2000 并启用 Sink。启用 Sink 的上下文在其优先级层次下消耗其绑定的 KeyCodes 输入事件,阻止那些输入到达较低优先级的上下文。对于像库存界面这样在打开时应该抑制特定游戏输入的使用场景,这是实用的。在本例中,PlayContext 被给予高于默认 PlayerScripts 上下文的 Priority 以在默认的 PlayerScripts 上下文处理之前消耗其绑定输入。
输入动作
InputAction 定义了一个游戏玩法动作机制,例如 "跳跃"、"冲刺" 或 "射击"。这些动作随后通过 输入绑定 映射到硬件输入。
InputAction 可以根据其 Type 属性(Enum.InputActionType)有多种变体。默认值是 Bool,设计用于接收来自按下/释放输入(例如 ButtonA、E 或 MouseLeftButton)的 true/false 值。
| 输入 动作 类型 | 示例用法 |
|---|---|
| Bool | 触发动作,如跳跃、射击、冲刺等,支持模拟输入的按下/释放阈值。 |
| Direction1D | 变量的零到满的动作,例如汽车的油门踏板或视野范围的缩放级别。 |
| Direction2D | 二维方向移动,例如相机旋转,或标准的 Roblox 角色移动。 |
| Direction3D | 三维方向移动,如可以升降、加速/减速、左右漂移的空中车辆。 |
| ViewportPosition | 二维视口坐标,如鼠标输入,用于自定义光标或射线选取世界对象。 |
要测试简单角色冲刺的 InputAction:
在 ReplicatedStorage 的 PlayContext 上下文中创建一个新的 InputAction。将其重命名为 CharacterSprint,以指示它的专用动作。

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

分配给父 InputAction 的 Type 直接影响对子 InputBinding 实例的有效输入类型(键/按钮/点击、模拟触发器、摇杆等)。反过来,发送到父动作连接事件的值依赖于绑定的选择输入类型。有关动作类型、绑定和返回值之间相关性的详细信息,请参阅 输入事件。
要连接简单角色冲刺的绑定:
在 CharacterSprint 动作中插入一个新的 InputBinding 并将其重命名为 KeyboardBinding。然后将该绑定的 KeyCode 属性设置为 LeftShift。


为确保鼠标 Shift 锁定不会干扰按键绑定,在 资源管理器 中选择 StarterPlayer 并在 属性 窗口中禁用其 EnableMouseLockOption。


在 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("未找到输入上下文!")endend)一旦 UpdateContext 脚本到位,您现在可以通过触发可绑定事件来更新命名的 InputContext,例如从一个 LocalScript 中,该脚本驱动 GuiButton 在一个 ScreenGui 容器内。
按钮脚本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)
默认绑定
Roblox提供了默认的输入绑定,用于移动、相机控制和基本的环境交互 — Roblox玩家熟悉这些控制,因此你应该仅在特定情况下覆盖它们。还要注意,保留的输入无法被覆盖,并且将始终以其预期的方式进行操作。
| 动作 | 鼠标/键盘 | 游戏手柄 | 触控 |
|---|---|---|---|
| 打开Roblox菜单 | Esc | Start 按钮 (ButtonStart) | 不适用 |
| 开发者控制台 | F9 | 不适用 | 不适用 |
| 全屏模式 (Windows) 显示桌面 (Mac) | F11 | 不适用 | 不适用 |
| 录制视频 (Windows) | F12 | 不适用 | 不适用 |
| 截图 | PrintScreen | 不适用 | 不适用 |



