Agent Skills
返回列表
💻

Unity 新输入系统

开发编程 更新于 2026.08.29

将以下提示词粘贴到你的 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 管理多个设备和各自的输入绑定