Unity 新输入系统
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/unity-input-system-2qj7。
技能介绍
要解决的问题
Unity 旧版 Input Manager 用 Input.GetAxis 和 Input.GetKey 读取输入,这种方式把键盘、手柄、触屏的按键直接硬编码到游戏逻辑里。当玩家想重绑键位,或者同一组动作需要同时支持手柄和触屏时,代码中到处是设备判断分支。Unity 6 引入的新 Input System 包通过 action、control scheme 和 binding 将输入与行为解耦,但手动配置这些资产很容易踩坑:Active Input Handling 未切换、action 忘记 Enable()、按钮用 ReadValue 每帧轮询导致状态丢失。
技能如何工作
这个技能封装了新 Input System 包的完整工作流,让你从项目配置直接走到读取输入。
核心步骤如下:
- 检查 Active Input Handling:在 Project Settings → Player 中确认输入模式为
Input System Package (New)或Both,后者用于兼容仍在调用旧Input.GetAxis的代码。 - 创建
.inputactions资产:定义 action map(如Gameplay),再添加具体 action——Move绑定到Vector2值,Jump和Fire绑定到按钮。WASD 这类四个方向的组合绑定使用 2D Vector composite。 - 选择读取方式:
PlayerInput组件适合设计师驱动的单机或本地合作场景,支持 Send Messages、Broadcast、Unity Events 和 C# Events 四种 Behavior;直接在代码中引用InputActionReference则更适合系统和工具,提供最大控制权。 - 启用与切换 action map:
PlayerInput自动启用默认 map,但你自己引用的 action 必须手动Enable(),销毁时Disable()。场景切换时用 map switching 切换上下文,而不是给每个处理器加守卫条件。 - 验证:通过 Window → Analysis → Input Debugger 确认设备已连接、action 正确触发。
适用边界与注意点
按钮不要用 ReadValue 每帧轮询。按钮按下是边缘事件,正确做法是订阅 performed 回调,或调用 WasPressedThisFrame()。
Send Messages 处理器不触发时,先确认接收脚本与 PlayerInput 在同一个 GameObject 上。Broadcast 才会传递给子对象。
订阅泄漏是常见隐患。在 OnEnable 中 += 订阅后,必须在 OnDisable 中 -= 取消订阅,否则重新启用时回调会叠加。
跨引擎的输入架构不要用这个技能。如果需要引擎无关的重绑定系统、输入缓冲或多设备抽象,应使用 input-systems 技能。拿到输入向量后的角色移动逻辑交给 unity-physics 和 unity-csharp-scripting 处理。
关于交互式重绑定(PerformInteractiveRebinding)、绑定的 JSON 存取以及 PlayerInputManager 本地多人模式,技能的 references/rebinding.md 有详细说明。
使用场景
- 在搭建玩家控制器时,用 .inputactions 资产定义 Move/Jump/Fire 等 action,并绑定 WASD 和手柄按键
- 需要让同一组输入动作同时支持键盘、手柄和触屏,通过 control scheme 和 composite binding 分别配置
- 为游戏场景和 UI 菜单分别定义 action map,用 Switch 切换上下文,而不是给每个输入处理器加守卫条件
- 手柄连接后完全没有输入,用 Input Debugger 检查设备状态和 action 触发情况,定位忘记 Enable 的 action
适合人员
- Unity 游戏开发工程师,需要在新项目或迁移项目中搭建基于 action 和 control scheme 的输入系统
- 玩法程序员,正在把旧的 Input.GetAxis/Input.GetKey 代码改造成新 Input System 包的调用方式
- 技术策划或关卡设计师,想通过 PlayerInput 组件和 Send Messages 快速配置输入事件,而不必写大量脚本
- 实现本地多人游戏的开发者,需要用 PlayerInputManager 管理多个设备和各自的输入绑定