Unity:输入系统(Input System)与持续检测键盘按键(Input.GetKey)
目录
Unity 的两套输入系统:
🔍 Input.GetKey 详解
🎯 对比:常用的输入检测方法
技术底层原理(简化版)
示例:角色移动
为什么会被“新输入系统”替代?
Unity 的两套输入系统:
系统 | 名称 | 使用方式 | 是否需要安装 |
---|---|---|---|
旧输入系统 | UnityEngine.Input | Input.GetKey() 、Input.GetAxis() 等 | ❌ 不需要 |
新输入系统 | UnityEngine.InputSystem | Keyboard.current.spaceKey.wasPressedThisFrame 等 | ✅ 需要安装 Input System 包 |
Input.GetKey()
是 Unity 的旧输入系统(Old Input System)中用来检测键盘按键是否“持续按下”的方法。
Input.GetKey()
属于 Unity 的 旧版输入系统(Legacy Input System),也叫做:
✅ UnityEngine.Input
它来自 Unity 的核心命名空间:
using UnityEngine;
而不是新的 Input System 包(那个要安装)。
🔍 Input.GetKey 详解
用法:
if (Input.GetKey(KeyCode.Space)) {// 玩家按住了空格键,执行跳跃蓄力
}
参数:
KeyCode
是 Unity 定义的一个枚举,包含了键盘上所有按键的标识:
KeyCode.A // 字母 A 键
KeyCode.Space // 空格键
KeyCode.LeftArrow // 左方向键
KeyCode.Return // 回车键
🎯 对比:常用的输入检测方法
方法 | 中文解释 | 检测什么? | 类比 |
---|---|---|---|
Input.GetKey(KeyCode.X) | 是否“持续”按下按键 X | 按着的时候每帧都为 true | 持续踩油门 |
Input.GetKeyDown(KeyCode.X) | 是否“在这一帧刚刚按下”按键 X | 只在按下的那一帧为 true | 点一下油门 |
Input.GetKeyUp(KeyCode.X) | 是否“在这一帧刚刚松开”按键 X | 只在松开的那一帧为 true | 抬脚松油门 |
技术底层原理(简化版)
在 Unity 的旧输入系统中:
-
Unity 会每帧读取当前操作系统的键盘状态
-
Input.GetKey()
就是访问这个“键盘状态快照”的一个函数 -
它只在 MonoBehaviour 的
Update()
或FixedUpdate()
中有效
❗ 注意:你不能在 Awake()
或 Start()
里用 GetKey()
,因为那时候 Unity 还没开始检测输入帧。
示例:角色移动
void Update() {if (Input.GetKey(KeyCode.RightArrow)) {transform.Translate(Vector2.right * speed * Time.deltaTime);}
}
这个例子做了什么?
-
每帧检测玩家是否按住右方向键
-
如果按住,就让角色持续向右移动
为什么会被“新输入系统”替代?
Unity 推出新的 Input System
原因:
旧输入系统的问题 | 新系统的优势 |
---|---|
不能支持多个输入设备(键盘 + 手柄 + 触屏) | 可以一次支持多个设备,统一映射 |
不支持自定义按键重映射 | 可以创建用户配置的输入动作 |
不支持输入事件/异步 | 支持事件驱动,响应更快 |
不支持多人本地输入 | 支持多人同时使用不同设备 |
不过很多 2D 游戏和初学项目,用旧系统就很够用,而且更简单。