注意:本笔记内容适用于 Unity 旧版输入系统,允许转载,无需注明出处。
参考书籍:Unity5.X 从入门到精通
开发平台:Unity 2018版本
编程语言:CSharp
编程平台:Visual Studio 2018 or Visual Code
2022/12/06 笔记完善中…
一、前言
尽管 Unity 在 2021 版本后推荐使用 New Input System 作为开发首选,但依然不能阻止开发者在针对特定项目或Demo上使用 Old Input System 作为开发首选。本文重点围绕旧输入系统作出记录。
二、旧版输入管理器
位于 Project Setting 面板下的 Input 栏目。主要提供可快速创建与编辑的输入管理选项。初始工程环境,提供至多18个有效使用的常规输入轴配置。例如 :
- Horizontal & Vertical :被用于 WASD 按键移动
- MouseX & MouseY:被用于平面鼠标的上下水平移动
- Fire1 & Jump:鼠标左键 与 空格键交互。
注意:输入类轴配置的增多与减少依赖于手动配置 Size 大小。原则上递增值即可,在确认需要减少 Size 值需慎重,避免将已配置项完全删除。同时应注意轴配置名称,重复的命名配置下,将优先应用第一个匹配的轴名称配置。
2.1 旧版输入轴配置说明
- Name:输入轴名称,使用
GetAxis(string axisName)
获取轴配置。- 注意:当存在多个同名轴名称,以与之匹配的 第一个轴 信息作为配置基础。
- Descriptive (Negative) Name:描述字段。用于阐述 正/负 双向按键行为的具体内容。
- 任何按键行为都具备双向性,用于否定对立按键的行为。
- 举个例子
- 攻击行为:短按松手 = 平A 长按松手 = 蓄力A
- 移动行为:按下汽车引擎逐渐启动,速度由低至高。松手汽车不会立刻停下,而是速度由高至低衰减至停下。
- (Negative/Positive) Button:负/正 向的物理按键绑定。通常情况下关联键盘现有按键。
- Alt (Negative/Positive) Button:同上,但作为备选按键存在。
- 例如 WASD 以外可以使用 ↑↓←→ 作为替代按键使用。
- Gravity:联系 Input Manager 下 Axis,输入系统依赖于 Vector2 系列的轴值作为判断依据。
- 例如前进为 0-1 的过渡,让角色移动由一个由慢至快前进的过程。或是设定值为1,直接切换,无需 0-1 过渡过程。
- Dead:小于该值的任何输入值(不论正负值)都会视为0。
- 例如在遥杆控制器上的运用较为常见。
- Sensitivity:输入设备的操作灵敏度。
- 对于键盘输入,该值越大则响应时间越快,该值越小越平滑。
- 对于鼠标输入,设置该值会对鼠标的实际移动距离按比例缩放
- Snap:如果该值为true,当轴收到负按键的输入信号时,轴的数值会立即置为0。
- 仅用于键/鼠标输入|
- Invert:转置轴输入。
- 如果该值为true,正按键会发送负值,负按键会发送正值
- 例如 小圈子游戏 —— IdentyV 中 “宿伞之魂” 的摇铃 DeBuff 效果。
- Type:输入轴的类型。
- 按键对应Key/Mouse类型。
- 鼠标移动和滚轮滑动对应Mouse Movement类型
- 摇杆设置为Joystick Axis
- 窗口移动消息设置为WIndow Movement|
- Axis:要映射的设备输入轴(摇杆、鼠标、手柄等)
- Joy Num:设置使用哪个摇杆作为消息输入。
- 默认接受所有摇杆的输入,仅用于输入轴和非按键输入
0.1 Input类 成员变量
成员变量 | 描述 | |
---|---|---|
acceleration | 获取设备当前在三维空间中的线性加速度 | 只读 |
accelerationEventCount | 得到上一帧的加速度参数数据长度 | |
accelerationEvents | 得到上一帧的加速度数据列表(分配临时变量) | 只读 |
anyKey | 是否有按键按下 | 只读 |
anyKeyDown | 当有任意按键按下的第一帧返回true | 只读 |
compass | 罗盘属性(仅支持手持设备) | 只读 |
compensateSensors | 是否根据屏幕方向补偿感应器 | |
compositionCursorPos | 当前IME组合字符串的光标位置 | |
compositionString | 用户通过IME输入端组合字符串 | |
deviceOrientation | 操作系统提供的设备方向(只读) | |
gyro | 返回默认的陀螺仪 | |
imeCompositionMode | 设置IME组合模式 | |
imelsSelected | 当前是否启用了IME输入键盘 | |
inputString | 得到当前帧的键盘输入字符串 | 只读 |
location | 设备当前的位置属性(仅支持手持设备) | 只读 |
mousePosition | 鼠标位置的像素坐标 | 只读 |
multiTouchEnabled | 系统是否支持多点触摸 | |
simulateMouseWithTouches | 屏幕触控模拟鼠标点击 | |
touchCount | 当前所有触摸状态列表长度 | 只读 |
touches | 当前所有触摸状态列表(分配临时变量) | 只读 |
touchSupported | 返回应用程序正在运行的设备是否支持触摸输入 |
0.2 Input类 成员函数
成员函数 | 描述 |
---|---|
GetAccelerationEvent() | 返回指定的上一帧加速度测量数据(不分配临时变量) |
GetAxis() | 根据名称得到虚拟输入轴的值 |
GetAxisRaw() | 根据名称得到虚拟坐标轴的未使用平滑过滤的值 |
GetButton() | 如果指定名称的虚拟按键被按下,返回true |
GetButtonDown() | 指定名称的虚拟按键被按下的那一帧,返回true |
GetButtonUp() | 指定名称的虚拟按键被松开的那一帧,返回true |
GetJoystickNames() | 返回当前连接的所有摇杆的名称数组 |
GetKey() | 当指定按键被按下时返回true |
GetKeyDown() | 当指定按键被按下的那一帧返回true |
GetKeyUp() | 当指定按键被松开的那一帧返回true |
GetMouseButton() | 指定的鼠标按键是否按下 |
GetMouseButtonDown() | 指定的鼠标按键按下的那一帧返回true |
GetMouseButtonUp() | 指定的鼠标按键松开的那一帧返回true |
GetTouch() | 返回指定的触摸数据对象(不分配临时变量) |
IsJoystickPreconfigured | 配置默认的摇杆输出(只限Linux) |
ResetInputAxes | 重置所有输入,调用该方法后所有方向轴 |
- Key:与物理按键对应。可通过按键名称或按钮编码
KeyCode
获取输入状态。 - Button:输入管理器(Input Manager)中定义的虚拟按键。
- Axis:模拟平滑变化的输入,例如摇杆、方向盘。
一、鼠标输入
1.1 鼠标输入 成员变量
成员变量 | 描述 | |
---|---|---|
mousePosition | 得到当前鼠标位置 | Vector3 |
1.2 鼠标输入 成员方法
成员函数 | 描述 |
---|---|
GetMouseButtonDown() | 鼠标按键按下的第一帧返回true |
GetMouseButtonUp() | 鼠标按键松开的第一帧返回true |
GetMouseButton() | 鼠标按键按下期间一直返回true |
GetAxis("Mouse X") | 得到一帧内鼠标在水平方向的移动距离 |
GetAxis("Mouse Y") | 得到一帧内鼠标在垂直方向的移动距离 |
Unity中,鼠标位置用屏幕像素坐标表示,屏幕左下角为坐标原点(0, 0),右上角为(Screen.width, Screen.height)
- Screen.width:屏幕分辨率的宽度
- Screen.height:屏幕分辨率的高度
mousePosition
:Vector3类型 (x, y, z)
- x:水平坐标
- y:垂直坐标
- z:始终为0
二、键盘操作
2.1 键盘输入 成员方法
成员方法 | 描述 |
---|---|
GetKey() | 按键按下期间返回true |
GetKeyDown() | 按键按下的第一帧返回true |
GetKeyUp() | 按键松开的第一帧返回true |
GetAxis("Horizontal") 和GetAxis("Vertical") | 用方向键或W、A、S、D键来模拟-1到1的平滑输入 |
2.2 常用按键名与KeyCode编码
键盘按键 | Name | KeyCode |
---|---|---|
字母键A、B、C…Z | a、b、c…z | A 、B 、C …Z |
数字键0~9 | 0~9 | Alpha0 ~Alpha9 |
功能键F1~F12 | f1~f12 | F1 ~F12 |
退格键 | backspace | Backspace |
回车键 | return | Return |
空格键 | space | Space |
退出键 | esc | Esc |
Tab键 | tab | Tab |
上下左右方向键 | up、down、left、right | UpArrow 、DownArrow 、LeftArrow 、RightArrow |
左、右Shift键 | left shift、right shift | LeftShift 、RightShift |
左、右Alt键 | left alt、right alt | LeftAlt 、RightAlt |
左、右Ctrl键 | left ctrl、right ctrl | LeftCtrl 、RightCtrl |
三、游戏外设输入
3.1 外设输入 成员方法
成员方法 | 描述 |
---|---|
GetAxis() | 得到输入轴的值 |
GetAxisRaw() | 得到未经平滑处理的输入轴的数值 |
GetButton() | 虚拟键按下期间一直返回true |
GetButtonDown() | 虚拟键按下的第一帧返回true |
GetButtonUp() | 虚拟键松开的第一帧返回true |
- Unity默认为用户创建 Fire1、Fire2、Fire3、Jump以及虚拟轴Horizontal和Vertical。
四、移动设备的输入
IOS与Android系统中的操作通过触摸完成。(以前是按键)
4.1 移动端输入 成员变量
成员变量 | 描述 | |
---|---|---|
multiTouchEnabled | 系统是否支持多点触摸 | |
simulateMouseWithTouches | 屏幕触控模拟鼠标点击 | |
touchCount | 当前所有触摸状态列表长度 | 只读 |
touches | 当前所有触摸状态列表(分配临时变量) | 只读 |
touchSupported | 返回应用程序正在运行的设备是否支持触摸输入 |
4.2 移动端输入 成员方法
成员方法 | 描述 |
---|---|
GetTouch() | 返回指定的触摸数据对象(不分配临时变量) |
4.3 结构体Touch的变量
通过GetTouch()
或者touches
可访问移动设备的触摸数据,数据保存在Touch的结构体中,结构体Touch的变脸如下所示:
变量 | 说明 |
---|---|
fingerld | 触摸数据的唯一索引id |
position | 触摸的位置 |
deltaPosition | 触摸位置的改变量 |
deltaTime | 距离上次触摸数据变化的时间间隔 |
taoCount | 单击计数 |
phase | 触摸的状态描述 |
通过吊桶phase
可访问当前触摸状态,状态如下所示:
变量 | 说明 |
---|---|
Began | 手指刚触碰屏幕 |
Moved | 手指在屏幕上移动 |
Stationary | 手指触碰屏幕并从上一帧起没有移动 |
Ended | 手指离开屏幕 |
Cancled | 系统取消了跟踪触摸 |
五、自定义输入
创建自定义虚拟按键:
- 打开Unity菜单栏 -> Editor -> Project Setting
- 选择Input分栏
默认情况下Unity创建了18个输入轴(Axes),具体参数如下: