
学习Unity的新输入系统(Input System),确实是提升开发效率、应对多平台输入的好选择。这套系统比老旧的Input Manager更灵活,尤其适合需要同时支持键盘鼠标、手柄、甚至触屏的现代游戏项目。
下面为你整理一份从安装到实战的入门教程,希望能帮你快速上手。
-
切换输入模式:安装完成后,Unity会提示你重启编辑器。重启后,你需要告诉Unity使用哪套输入系统。进入
Edit->Project Settings->Player-> Active Input Handling。-
如果你是新建项目,建议选择 Input System Package (New),完全拥抱新系统。
-
如果你是现有项目,担心旧代码报错,可以暂时选择 Both,让新旧系统同时工作,平稳过渡。
-
⌨️ 第二步:两种基础用法
新输入系统提供了两种主要的使用方式,你可以根据项目需求选择。
方法一:快速直接地监听设备(适合原型或简单游戏)
这种方式最接近旧系统的习惯,直接在代码里查询设备状态,适合快速测试。
using UnityEngine;
using UnityEngine.InputSystem; // 别忘了引用命名空间
public class QuickInputExample : MonoBehaviour
{
void Update()
{
// 检查键盘空格键是否在这一帧被按下
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
Debug.Log("跳跃!");
}
// 获取鼠标的屏幕位置
Vector2 mousePos = Mouse.current.position.ReadValue();
// 检查手柄A键是否被按住
if (Gamepad.current != null && Gamepad.current.aButton.isPressed)
{
Debug.Log("手柄A键按住中");
}
}
}
代码示例参考自Unity开发者社区教程
方法二:基于“输入动作”的正式用法(推荐,适合复杂项目)
这是新输入系统的核心玩法,需要创建配置文件。
-
创建配置文件:在Project窗口右键 ->
Create->Input Actions,命名为PlayerControls。 -
可视化编辑:双击打开
PlayerControls,你会看到一个强大的编辑器。-
Action Maps:可以理解为动作集合。比如创建一个叫“Gameplay”的Map,专门放游戏中的操作。
-
Actions:你的抽象动作。在“Gameplay”Map下创建 Move(类型设为
Value,Control Type设为Vector2)和 Jump(类型设为Button)两个动作。 -
Bindings:为动作绑定物理按键。选中 Move,点击右下角“Add Binding”的小加号,选择“Add 2D Vector Composite”。然后就可以在展开的选项里,为Up、Down、Left、Right分别绑定W、S、A、D键。然后再添加一个Binding,路径选择
Gamepad/leftStick。这样一来,你的Move动作就同时支持键盘和手柄了。 -
别忘了点击右上角的 Save Asset。
-
-
生成C#代码:这是一个非常方便的功能。在
PlayerControls资产的Inspector面板中,勾选 Generate C# Class,然后点击 Apply。Unity会自动生成一个强类型的C#类,让你的代码写起来更顺手。 -
编写逻辑代码:
-
using UnityEngine; using UnityEngine.InputSystem; // 基础命名空间 public class PlayerMovement : MonoBehaviour { // 由Unity生成的类的实例 private PlayerControls controls; private Vector2 moveInput; private bool isJumping; void OnEnable() { controls = new PlayerControls(); // 创建实例 // 为Move动作的“执行”状态注册回调,当方向改变时触发 controls.Gameplay.Move.performed += ctx => moveInput = ctx.ReadValue<Vector2>(); // 为Move动作的“取消”状态注册回调,当松开按键时触发 controls.Gameplay.Move.canceled += ctx => moveInput = Vector2.zero; // 为Jump动作的“开始”状态注册回调,按下瞬间触发 controls.Gameplay.Jump.started += OnJump; controls.Enable(); // 启用输入 } void OnDisable() { // 一定要记得取消注册并禁用,防止内存泄漏和奇怪的bug controls.Gameplay.Move.performed -= ctx => moveInput = ctx.ReadValue<Vector2>(); controls.Gameplay.Move.canceled -= ctx => moveInput = Vector2.zero; controls.Gameplay.Jump.started -= OnJump; controls.Disable(); } void OnJump(InputAction.CallbackContext context) { Debug.Log("执行跳跃!"); // 在这里添加你的跳跃逻辑 } void Update() { // 在Update中使用从回调中读取到的值 if (moveInput != Vector2.zero) { Debug.Log($"移动输入方向: {moveInput}"); // 在这里应用移动逻辑 transform.Translate(moveInput * Time.deltaTime * speed); } } } -
这段代码综合了搜索结果中的回调注册方式
-
🚀 第三步:进阶技巧与实用建议
-
当你熟悉了基础用法后,可以探索这些更强大的功能:
-
交互(Interactions):你可以直接在Input Action的编辑器中为动作添加交互行为,比如 Hold(长按)、Tap(点击)、MultiTap(双击或多击),而无需自己写计时器代码。
-
例如,给“开枪”动作添加一个Hold交互,并设置Hold Time为0.5秒,就能轻松实现“蓄力射击”效果。
-
-
处理器(Processors):对输入值进行实时处理,比如反转轴、将输入值乘以一个系数、对摇杆输入进行曲线平滑等。
-
控制方案(Control Schemes):在同一个配置文件中定义不同的控制方案(如“键盘+鼠标”、“手柄”),并在运行时动态切换,完美适配PC和主机。
-
调试工具:新输入系统自带了一个强大的调试窗口(
Window->Analysis->Input Debugger),可以实时查看所有接入的设备、当前的输入值以及触发的动作,是排查问题的利器。
✅ 总结
Unity的新输入系统虽然上手门槛比旧系统稍高,但其带来的灵活性、可维护性和跨平台能力,对于追求高品质体验的项目来说是值得投入的。从一个简单的Input Actions文件开始,逐步探索它的各种功能,相信你会体会到它的强大之处。
使用教程&spm=1001.2101.3001.5002&articleId=159084868&d=1&t=3&u=dd3a4bfc61a74e038d848b757263236d)

被折叠的 条评论
为什么被折叠?



