Unity 新版输入系统
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/unity-input-system-sh-0uylgu 到我的 AI 助手中。
技能介绍
这个技能解决什么问题
Unity 的旧版 Input.GetAxis / Input.GetKey 走的是 Input Manager 这套老后端,它有几个让人头疼的地方:手柄和键盘是两套独立的绑定逻辑,换设备就得改代码;重新绑定按键要在脚本里手写状态机;项目从键鼠扩展到手柄时,不少处理代码得推倒重来。
Unity Input System(com.unity.inputsystem,1.x)用 基于 Action 的输入模型替代了这套机制,把「哪个设备」和「做什么动作」解耦。这个技能就是围绕这套模型展开的,面向 Unity 6。
技能的核心能力
从 .inputactions 资产读取输入。 在资产里定义 action map(比如 Gameplay),往里添加动作——Move 是 Value/Vector2,Jump 和 Fire 是 Button——然后绑定到具体控制项或 composite binding(比如把 WASD 配成一个 2D Vector 复合绑定)。
两种读取方式,按场景选。
- PlayerInput 组件:拖到玩家物体上,指向
.inputactions资产,选一种 Behavior(Send Messages、Broadcast、Invoke Unity Events 或 Invoke C# Events)。适合单人或本地合作这类简单场景。 - 代码直接读取:用
InputActionReference/InputActionAsset,自己调用.Enable()再读取。适合系统级和工具类代码,控制粒度最细。
核心工作流。
- 先检查 Project Settings → Player 里的 Active Input Handling,确认是
Input System Package (New)或Both。只要还有旧的Input.GetAxis代码,就得设成Both。 - 创建
.inputactions资产,配好 action map、动作和绑定。 - 选定读取方式(PlayerInput 组件或代码直读)。
- 手动引用的 action / map 要自己
.Enable(),PlayerInput 会自动启用它自己的默认 map,销毁时记得 disable。 - 切换 action map 来应对不同上下文(游戏内 ↔ UI/菜单),别在每个 handler 里加 guard。
- 用 Input Debugger(Window → Analysis → Input Debugger)确认设备和 action 触发情况。
常见坑
- 完全没输入:要么 Active Input Handling 还停在 Input Manager (Old),要么忘了对手动引用的 action / map 调用
.Enable()。PlayerInput 会自动启用,裸用的InputAction不会。 - 抛出关于旧输入后端的
InvalidOperationException:说明还有脚本在调Input.GetAxis/Input.GetKey,而 Active Input Handling 已是 New。要么把这些代码迁移过去,要么暂时设成Both。 - 按钮用 ReadValue 读出 0:按钮按下是 edge event,要用 performed 回调或
WasPressedThisFrame(),别在每帧 ReadValue 里判断触发。 - Send Messages handler 不触发:接收脚本必须和 PlayerInput 在同一个 GameObject 上;用 Broadcast 才能触达子物体。
- 订阅泄漏:在
OnDisable里用-=取消订阅,否则OnEnable里反复+=会让 handler 重复叠加。 - 触屏/手柄检测不到:确认启用了对应的 control scheme,在 Input Debugger 里核对设备;Vector2 composite 需要四个绑定都设全。
适用边界
需要跨引擎的可重新绑定输入架构时,这个技能不适用——那种场景走 input-systems,本技能只负责 Unity 这一层的 API。拿到输入向量之后的移动逻辑,归 unity-physics 和 unity-csharp-scripting 处理。
至于交互式重新绑定(PerformInteractiveRebinding)、把绑定存成 JSON,以及用 PlayerInputManager 做本地多人,SKILL.md 只给了入口:翻 references/rebinding.md。
使用场景
- 在 Unity 6 项目里做角色移动、跳跃和开火,需要用 .inputactions 定义动作映射并读取 Vector2/Button。
- 需要让同一套动作同时支持手柄、键盘和触屏,并通过 control scheme 切换设备输入。
- 在玩家物体上挂 PlayerInput,用 Send Messages/Broadcast 把输入事件分发到游戏脚本。
- 排查旧 Input.GetAxis 与新输入后端冲突,或按钮、订阅、手柄检测异常。
适合人员
- Unity 客户端工程师:负责把旧 Input Manager 迁移到 Input System,并统一输入绑定。
- 玩法程序员:实现移动、跳跃、开火和 UI 上下文切换,需要处理 action map 与事件回调。
- 技术美术或工具开发者:制作 .inputactions 模板,处理输入调试和本地多人输入流程。