大家好,我是 Mark 。Unity 新版输入系统一直没时间学,最近闲下来了抽空研究了一下和旧版相比在可配置性、多设备支持、性能等方面都有明显的优势。我也是参考官方的教程边学边记录的有啥问题可以在评论区留言,后期我也会抽空继续补充更加进阶的教程。如果该教程对你有帮助请点赞+收藏。
官方教程:
https://docs.unity.cn/Packages/com.unity.inputsystem@1.1/manual/QuickStartGuide.html安装
** 打开 Package Manager**
导航栏 -> Window -> Package Manager
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图1](/uploads/projects/mingzhixing@code/873ef00e9cf9cbc85a1411e0501d8f06.png)
** 安装 Input System**
选择 Unity Registry 在列表中找到 Input System 点击 Install 安装。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图2](/uploads/projects/mingzhixing@code/649e9d4454438def8984a78cecee5041.png)
点击 Yes 启用新版 Input System 等待 Unity 重新启动。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图3](/uploads/projects/mingzhixing@code/d03679655ab23f6af57ecb1668bb04f9.png)
Unity 默认会同时启用旧版和新版输入系统,你可以在 Player settings 中(Edit -> Project Settings -> Player ->Active Input Handling) 找到相应的设置。可以随时修改这里的设置,这样做依然会重启编辑器。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图4](/uploads/projects/mingzhixing@code/a89b6164edcca23b1a26958b1767902c.png)
入门指南
** 快速监听某个按键按下抬起操作**
void Update(){// 检查空格键是否在这个帧被按下if (Keyboard.current.spaceKey.wasPressedThisFrame){Debug.Log("Space key was pressed");}// 检查空格键是否在这个帧被释放if (Keyboard.current.spaceKey.wasReleasedThisFrame){Debug.Log("Space key was released");}// 检查左鼠标键是否在这个帧被按下if (Mouse.current.leftButton.wasPressedThisFrame){Debug.Log("Left mouse button was pressed");}// 检查左鼠标键是否在这个帧被释放if (Mouse.current.leftButton.wasReleasedThisFrame){Debug.Log("Left mouse button was released");}}
** 使用可视化编辑器来建立映射**
Project -> Create -> Input Actions
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图5](/uploads/projects/mingzhixing@code/8183f044f282b47d0be8fc6284690459.png)
新建 Input Actions 给其命名(名称无所谓),笔者命名为 Test Input Controls 完成后,选中该文件勾选 Generate C# Class 点击 Apply 后 Unity 会为我们生成一个 Action 的包装类,方便后续在代码中引用。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图6](/uploads/projects/mingzhixing@code/2c98cd52596372ca37b983cf11a3731e.png)
Action Map
可以理解为一个组织和管理输入动作的一种方式。通过将相关的输入动作放在同一个Action Map中,可以更好地管理输入逻辑。例如,可以将所有与玩家移动相关的输入动作放在一个叫做”Movement”的Action Map中。
Action
一个具体的输入动作,比如按键按下、摇杆移动等。
生成结束点击 Edit asset 创建第一个 Action Map 并将其命名为 Player 并将 Actions 列表生成的 Action 重命名为 Fire 。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图7](/uploads/projects/mingzhixing@code/c14fb732b5d2f4f8a0b0e722d92a7821.png)
选中 < No Binding > 给 Fire Action 映射对应的按键(按键可以自定义,笔者映射的按键为键盘的 K 键)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图8](/uploads/projects/mingzhixing@code/fd828c95e09cd57f359b744a6fd55a1b.png)
也可以绑定多个按键对应不同的操作设备,笔者映射的第二个按键为鼠标左键
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图9](/uploads/projects/mingzhixing@code/9c8f7150359c73b2c8756a3c1b8dbc27.png)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图10](/uploads/projects/mingzhixing@code/0cc93d1317f5a2e4aec5a45ab8ccdc12.png)
完成上述操作后点击 Save Asset 保存当前映射表,这样做可以绑定多个物理输入得到的输入值也只会影响同引用的 Action 对象。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图11](/uploads/projects/mingzhixing@code/ea451ad8bcab87ab968dcdc26ad68ba3.png)
** 通过**代码监听映射表中的按键
创建测试脚本 TestInputSystem (命名可随意),我们需要使用之前的 TestInputControls ,通过监听 started 和 canceled 实现按键按下抬起操作。具体可参考下述代码
// 输入控制类的实例private TestInputControls InputControls;void OnEnable(){InputControls = new TestInputControls(); // 创建输入控制实例InputControls.Player.Fire.started += OnFireDown; // 注册开火开始动作的回调InputControls.Player.Fire.canceled += OnFireUp; // 注册开火结束动作的回调InputControls.Enable(); // 启用输入控制}//当开火动作被触发时调用此方法。private void OnFireDown(InputAction.CallbackContext Obj){Debug.Log($"Fire Down | KeyName:{Obj.control.name}"); // 输出"Fire Down"到控制台}//当开火动作释放时调用此方法。private void OnFireUp(InputAction.CallbackContext Obj){Debug.Log($"Fire Up | KeyName:{Obj.control.name}"); // 输出"Fire Up"到控制台}//主要用于移除输入动作的回调函数,并禁用输入控制。private void OnDisable(){InputControls.Player.Fire.started -= OnFireDown; // 移除开火开始事件的监听InputControls.Player.Fire.canceled -= OnFireUp; // 移除开火结束事件的监听InputControls.Disable(); // 禁用输入控制}
测试效果
可以看到,我们使用一套代码就可以同时监听键盘和鼠标的输入
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图12](/uploads/projects/mingzhixing@code/83814c1ad68ad0a1df4c3d294d9df004.png)
按下抬起有了,要想实现长按也很简单。选中 TestInputControls 点击 Edit asset 在 Action Properties 一栏点击 Interactions 后方的 + 号添加 Hold
Hold:按下并按住至少设定的持续时间(默认为defaultHoldTime),则执行动作。(长按执行操作) MultiTap:需要多次轻击(在tapTime内按下并释放),每次轻击之间的间隔不超过tapDelay秒(双击或多击)
Press:根据按钮的按下和释放顺序来触发特定的操作(例如:在按下按钮后执行某个动作或在释放按钮时执行某个操作)
SlowTap:按下并按住控件一段时间后释放时执行操作(长按释放后执行操作) Tap:按下并按住小段时间内释放执行操作(点击)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图13](/uploads/projects/mingzhixing@code/0a89d5e1f49907f5253136ace47e07df.png)
添加完 Hold 后,看一下它的两个变量。如果默认值不能满足你的需求,取消勾选 Default 可自定义变量值。修改 Hold Time 变量一般即可满足需求
Press Point:按下按键这个阈值才能被认为是按下(笔者理解的是按压力度)
Hold Time:按下并按住按键保持的时间(以秒为单位)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图14](/uploads/projects/mingzhixing@code/98fa85b252d44703776e9043cf6f887f.png)
还是之前的代码在此基础上增加了长按监听的代码,具体参考下述代码
// 输入控制类的实例private TestInputControls InputControls;void OnEnable(){InputControls = new TestInputControls(); // 创建输入控制实例InputControls.Player.Fire.started += OnFireDown; // 注册开火开始动作的回调InputControls.Player.Fire.performed += OnLongPress; // 注册长按动作的回调InputControls.Player.Fire.canceled += OnFireUp; // 注册开火结束动作的回调InputControls.Enable(); // 启用输入控制}//当开火动作被触发时调用此方法。private void OnFireDown(InputAction.CallbackContext Obj){Debug.Log($"Fire Down | KeyName:{Obj.control.name}"); // 输出"Fire Down"到控制台}//当开火动作持续时调用的方法。private void OnLongPress(InputAction.CallbackContext Obj){Debug.Log($"Fire Long Press | KeyName:{Obj.control.name},持续时间{Obj.duration}"); // 输出动作持续时间}//当开火动作释放时调用此方法。private void OnFireUp(InputAction.CallbackContext Obj){Debug.Log($"Fire Up | KeyName:{Obj.control.name}"); // 输出"Fire Up"到控制台}//主要用于移除输入动作的回调函数,并禁用输入控制。private void OnDisable(){InputControls.Player.Fire.started -= OnFireDown; // 移除开火开始事件的监听InputControls.Player.Fire.performed -= OnLongPress; // 移除长按事件的监听InputControls.Player.Fire.canceled -= OnFireUp; // 移除开火结束事件的监听InputControls.Disable(); // 禁用输入控制}
经过上述步骤,我们学习到了新版 InputSystem 中的三个最基本的按键触发(按下、抬起、长按)。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图15](/uploads/projects/mingzhixing@code/b8618e5fa2a5503835659da80c5b3899.webp)
想要学习更多干货,Unite 全球开发者大会等你来!
7月23日-25日,Unite 将于上海隆重开启。1 场 Keynote 和多个专场,涵盖团结引擎、游戏生态、数字孪生、智能座舱等多重赛道,我们还准备了小而美的工作坊,覆盖小游戏、开源鸿蒙、Vision Pro 三大主题。
走过路过别错过。
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图16](/uploads/projects/mingzhixing@code/2b2915ae1b79829864e89b52afb7163a.webp)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图17](/uploads/projects/mingzhixing@code/3319399b51531a21760631361f1fef9a.png)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图18](/uploads/projects/mingzhixing@code/dcc33c51efc6969392639caf7137a92f.png)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图19](/uploads/projects/mingzhixing@code/6733fb8bb5e99f589e21e639763959ea.png)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图20](/uploads/projects/mingzhixing@code/9d978e87a9110637d6e5624428bc701f.png)
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图21](/uploads/projects/mingzhixing@code/781f974e20bf6e45d29aaab75f81dc6d.png)
长按关注
Unity 官方微信
第一时间了解Unity引擎动向,学习进阶开发技能
![[收藏]玩转Unity新版输入系统(Input System) ,之按键触发 - 图22](/uploads/projects/mingzhixing@code/26c4479f4091f578c49d2e531743e2c9.gif)
