Unity新输入系统(Input System)教学篇

前言

很多小伙伴看见新输入系统就头疼,被它界面上的各种参数搞晕,别怕!本文将使用详细的步骤,让你一步步深入了解新输入系统,爱上新输入系统!

本篇幅较长,如果可以认真看完,尤其是对于新手,将会有很大帮助!

一、为什么使用新输入系统?

1. 用起来方便

  • 覆盖全场景硬件:支持键盘、鼠标、手柄、触屏等,无需第三方插件;​
  • 跨平台:同一套输入配置(Input Action Asset),可直接用于多个平台,无需为不同平台单独写输入逻辑

2. 逻辑和输入解耦

旧系统会将 "输入绑定与代码强耦合"(如硬编码Input.GetKey(KeyCode.W)),也就是说,玩家需要做某件事(例如空格键跳跃),竟然还需要关心按哪个键,这明显会和输入系统强耦合。

  • 动作与硬件分离:用 "动作(Action)" 定义功能,通过可视化配置完成,后续换按键无需改代码,仅需调整配置
  • 模块化管理:通过 "动作映射(Action Map)" 分组输入,切换场景 / 状态时只需启用 / 禁用对应映射(如进入 UI 界面时禁用玩家控制映射,避免误操作)

3. 可以精准控制输入

旧系统在输入精度上存在明显局限(如无法区分 "按键按下" 和 "按键持续按住"),而新系统支持细粒度的输入状态控制:​

  • 支持 "按下(started)""持续(performed)""松开(canceled)" 三个阶段​
  • 例如:"started" 阶段触发开枪动画,"performed" 阶段持续发射(长按),"canceled" 阶段停止发射
  • 蓄力技能:"performed" 阶段累计蓄力值,"canceled" 阶段释放技能​​

4. 性能更高

旧系统依赖 "每帧轮询"(如在Update中反复调用Input.GetKey),即使没有输入也会执行检测,存在冗余性能消耗

  • 按需触发:例如 "Move" 动作仅在按下 / 松开 / 持续按住时触发performed/canceled回调,无输入时不执行任何代码​
  • 回调逻辑更清晰:复杂输入(如 "Shift+W 冲刺""Ctrl + 鼠标右键瞄准")可通过 "组合绑定"+"事件回调" 实现,无需在Update中写多层if判断​

二、新输入系统的安装和必要配置

1. 打开 Package Manager​

在 Unity 编辑器顶部菜单栏,依次点击 Window > Package Manager,打开包管理窗口,将 "Packages" 下拉菜单切换为 Unity Registry

2. 搜索并安装 Input System​

搜索框输入 "Input System"。找到对应包后,点击右侧的 "Install" 按钮,我这里已经安装。

3.更改 PlayerSettings 设置

在 Unity 编辑器顶部菜单栏,依次点击 Edit > Project Settings,打开项目设置窗口。在左侧导航栏中选择 Player 选项,展开"Other Settings",找到 "Active Input Handling" 设置项

  • Input System Package (New):仅启用新输入系统,完全禁用旧系统 API,新项目使用,能最大化发挥新系统性能
  • Input Manager (Old):仅启用旧系统,新系统功能失效
  • Both:同时启用新旧系统,会增加内存占用,且可能出现输入冲突

这里我们选择 Input System Package (New),此时出现一个弹窗,因为编辑器要重启才能应用,我们点击 " Apply "

三、新建输入配置文件​

新输入系统的所有输入逻辑都围绕 "Input Action Asset"(输入动作资源)展开,这是存储输入映射、设备绑定的核心文件,创建步骤如下:​

1. 创建 Input Action Asset​

在 Project 窗口空白处右键,依次选择 Create > Input Action ,生成一个默认名为 "New Input Action Asset" 的文件

如果你是使用的编辑器是unity6.0及其之后的版本,工程会自动创建一个Input Action Asset​,如图:

四、核心结构讲解​

在这里我们先理解核心结构,然后我们在[实战篇]进行手动实操,其实实战篇还没写,嘿嘿嘿~

我们使用的编辑器版本是unity6,以他自动创建的为例讲解。双击进入输入动作编辑窗口,核心结构分为 3 层:​

++最高层 Action Maps(动作映射) --- 输入动作( Actions**)的容器**++

  • 主要作用:用于分组管理、方便在不同游戏状态下统一 "启用 / 禁用"、避免输入冲突。

  • 每一个Action Maps 下都可以创建多个 Actions(动作)

  • 这里工程为我们自动创建了 Player 和 UI 两个 Action Maps.

右键 Action Maps面板可以创建新的 Action Map,此时发现 Actions 面板自动为我们创建了一个新动作

++第二层 Actions(动作)--- 定义交互逻辑++

  • 代表具体的输入行为,如 "Move" 控制移动,"Jump" 控制跳跃,"Attack" 控制攻击

  • 是包含在 Action Maps 下的具体的输入

右键 Action 面板可以创建新的 Action,此时发现 Actions 面板自动为我们创建了一个新动作

++第三层 Action Properties(动作属性面板)--- 输入动作(Actions)的精细化配置++

当选择 Action 面板的某一个 Action,可以看到此面板

仔细观察这个面板,发现有三个部分:

第一部分:Action**(动作类型)**

这里又分为Action TypeControl Type,很多小伙伴读到这里可能已经感到厌倦了,莫急!虽然这里的面板看起来很复杂,但是用起来是有套路的.

Action Type ,动作是哪种类型

  • Value值类型,用于需要 "持续读取数值" 的输入,例如玩家的移动

  • Button:**按钮类型,**用于 "离散事件触发",例如攻击跳跃按下时触发一次

  • Pass Through:**直通类型,**非常少用,知道有这个东西即可

  • 我们想一想就能明白,游戏中的输入无非就 Value和Button 这两者

Control Type(控制类型)

  • 只有我们选择 Action Type 为 value(值类型)的时候才会出现,因为如果选择 Button(按钮类型),控制类型就是 Button 嘛

  • 别看这里的控制类型种类非常多,但是在实际开发中,用的最多的就只有几个,这里拿 Axis 和 Vector 2 举例

  • Axis : 模拟单轴的输入,如手柄摇杆的 X/Y 轴、鼠标滚轮,返回 -1 ~ 1区间的 float 值

  • Vector 2:二维向量输入,可以把他想象成一个二维坐标系,

    • 当按下键盘的 w 键时返回(0,1)

    • 当按下键盘的 s 键时返回(0,-1)

    • 当按下键盘的 a 键时返回(-1,0)

    • 当按下键盘的 d键时返回(1,0)

    • 当同时按下wd 时返回(1,1),以此类推

第二部分:Interactions(交互)

Hold(按住 / 蓄力)

一般是为 Button类型(按钮)添加

想象游戏中的交互场景,例如长按 E 0.5s拾取某个物体,长按鼠标左键0.5s蓄力重击,就需要添加这个

  • Press Point(按压阈值),表示输入需要 "按压到多大程度",才会开始判定,一般用于手柄

  • Hold Time(按住时长),表示需要持续按住至少多少秒,"Hold" 交互才会真正触发,例如,蓄力至少0.5s才能释放重击

Press(按下)

包含三个阶段:

  • Started:按下瞬间触发;

  • Performed:按下持续过程中持续触发;

  • Canceled:松开瞬间触发。

例如瞄准(按下右键时开始瞄准,按住时保持瞄准,松开时退出瞄准)

第三部分:Processors(处理器)

作用:在输入值传递给游戏逻辑前,对其进行 "预处理"

  • Axis Deadzone(轴死区)

    过滤手柄摇杆、方向盘等 "模拟设备" 的微小漂移。比如摇杆没动,但设备有轻微信号波动时,把这类 "小到可以忽略" 的输入直接当成 0,防止角色 "自动乱飘"。

  • Clamp(范围限制)

    把输入值 "夹" 在最小 - 最大范围里。比如希望角色移动速度最多到 10、最少到 0,用它就能把输入值限制在这个区间,避免数值失控。

  • Invert(反转)

    把输入值的正负反过来。比如原本按 W 键是 "向前"(输入正方向),用它后按 W 键就变成 "向后"(输入负方向),适合 "反向控制" 的场景。

  • Normalize(归一化)

    把输入的向量长度统一为 1。比如手柄斜着推摇杆时,原本 x/y 值的组合会让移动速度比 "正推" 更快,用它后不管怎么推,移动速度都一致。

  • Scale(缩放)

    给输入值乘以一个系数,调整 "灵敏度"。比如手柄太灵敏,就乘以 0.5 降低效果;太迟钝,就乘以 2 放大效果。

第四层 Binding Properties (用于绑定按键和添加后处理)

当在 Action 面板新建一个 Action时,展开后可以发现自动新建了一个空绑定,即该动作目前没有绑定任何按键

步骤1:确定 Action 的类别

上文提到过,Action 无非就两种类别,Value 和 Button

这里 MyMove 代表玩家移动,明显应该选择 Value 类型,我们将要绑定 wasd 和上下左右箭头

例如 Attack 这种表示玩家攻击,明显应该选择Button 类型

Control Type 选择 Vector2是因为对于3D玩家,一般只在xz平面移动,所以只需要二维向量即可表示出玩家的移动方向

步骤2:确定要绑定按键的类型

1.我们删除自动创建的空绑定,因为他不符合我们的要求

2.点击 MyMove右边的 + 号,选择第二个选项,这里解释一下四个绑定类型的作用

  • Add Binding(添加基础绑定)

    • 作用:给动作绑定单个硬件输入(如键盘按键、鼠标按钮、手柄摇杆等)。

    • 场景:简单的 "单键触发" 场景,比如 "跳跃" 动作绑定 "空格键"、"攻击" 动作绑定 "鼠标左键"。

  • Add Up\Down\Left\Right Composite(添加上下左右组合绑定)

    • 作用:一次性创建四个方向(上、下、左、右)的子绑定,最终输出一个**Vector2**类型的 "方向向量"。

    • 场景:需要 "二维方向输入" 的场景(如角色移动)。例如:

      • 给 "移动" 动作添加该组合绑定后,可分别为 "Up" 绑定W键、"Down" 绑定S键、"Left" 绑定A键、"Right" 绑定D键;

      • 最终动作会输出Vector2值(比如按W时输出(0,1),按A时输出(-1,0)),直接用于控制角色方向。

  • Add Binding With One Modifier(添加带 1 个修饰键的绑定)

    • 作用:需要 修饰键 + 主按键组合 才触发的输入。"修饰键" 通常是ShiftCtrlAlt

    • 场景:比如 "冲刺移动" 需要 "按住Shift + 方向键" 才生效。此时,Shift是 "修饰键",方向键是 "主键",只有两者同时满足,动作才会触发

  • Add Binding With Two Modifiers(添加带 2 个修饰键的绑定)

    • 类似上者三者同时满足才会触发动作

3.这里我们选择第二个,绑定展开后可以看到 2D Vector 下有四个空绑定

步骤3:绑定按键

1.我们将 2D Vector 改名为 WASD (键盘F2改名),然后选择 "Up"这个空绑定,点击右侧 Binding Properties 面板的 Path 按钮

2.点击 Listen 按钮,可以监听我们当前设备的输入

3.此时按下键盘的 W,可以看到出现了 W[Keyboard],代表监听成功

4.选择后发现 W 已经绑定到当前动作下

5.我们依次把键盘的 S、 A、D分别绑定到 Down、Left、Right下

太棒了!!!学到这里,你已经学会了最基础的按键绑定,这是实现wasd移动的基础

有时候我们还需要键盘的上下左右箭头控制移动,功能和wsad一样,只是绑定的按键不一样,我们把它实现

6.我们还是选择第二个选项,改名为 Arrow key

7.我们依次把键盘的 ↑、 ↓、←、→分别绑定到 Up、Down、Left、Right 绑定下,完成!

为 Button 类型的 Action 添加绑定

步骤1中我们确定了 Action 类别为 Value,如果我想为玩家添加一个交互动作,比如按 E ,该怎么做呢?

1.创建一个 Action,改名为 MyInteract, Action Type 改为 Button

2.为其绑定按键为 E

3.如果还想添加另一个按键绑定,例如按 F,怎么做呢?

我们选择第一个选项,然后重复以上步骤

整体概况:

保存InputAction资产

点击右上角 Save Asset,也可以点击 Auto - Save 自动保存

恭喜你!成功看完了这一篇文章,怎么样?新输入系统是不是没有想象中的那么复杂呢?相信你已经对新输入系统的使用有个基本的了解,接下来我会写一篇【新输入系统】实战篇,教大家在代码中使用咱们设置好的这些动作,拜拜~(◍・ᴗ・◍)✧*。

相关推荐
相信神话20216 小时前
第四章:创建《酒魂》项目与场景结构
游戏·游戏引擎·godot·2d游戏开发
mxwin6 小时前
Unity Shader URP 使用模板测试 · 深度测试实现秘境空间效果
unity·游戏引擎·shader
Kurisu5758 小时前
博德之门3 2026最新免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)
游戏·游戏程序·动画·游戏美术·友善·爱国
真鬼1231 天前
【Unity 6】Unity6快捷下载,快速下载
unity·游戏引擎
会潜水的小火龙1 天前
unity打包apk报错Failure to initialize问题解决方法
unity·游戏引擎
平行云1 天前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送
Sator11 天前
unity仅用粒子系统实现拖尾
unity·游戏引擎
游乐码1 天前
Unity基础(五)四元数相关
unity·游戏引擎
想做后端的前端1 天前
Unity热更新 - HybridCLR & YooAsset
unity·游戏引擎
鹿野素材屋1 天前
Unity预加载:减少游戏中首次加载资源时的卡顿
windows·游戏·unity