参考书籍: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:模拟平滑变化的输入,例如摇杆、方向盘。
mousePosition
得到当前鼠标位置Vector3
1.2 鼠标输入 成员方法
成员函数描述GetMouseButtonDown()
鼠标按键按下的第一帧返回true
GetMouseButtonUp()
鼠标按键松开的第一帧返回trueGetMouseButton()
鼠标按键按下期间一直返回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
GetKey()
按键按下期间返回true
GetKeyDown()
按键按下的第一帧返回true
GetKeyUp()
按键松开的第一帧返回true
GetAxis("Horizontal")
和GetAxis("Vertical")
用方向键或W、A、S、D键来模拟-1到1的平滑输入
2.2 常用按键名与KeyCode编码
键盘按键NameKeyCode字母键A、B、C…Za、b、c…zA
、B
、C
…Z
数字键0~90~9Alpha0
~Alpha9
功能键F1~F12f1~f12F1
~F12
退格键backspaceBackspace
回车键returnReturn
空格键spaceSpace
退出键escEsc
Tab键tabTab
上下左右方向键up、down、left、rightUpArrow
、DownArrow
、LeftArrow
、RightArrow
左、右Shift键left shift、right shiftLeftShift
、RightShift
左、右Alt键left alt、right altLeftAlt
、RightAlt
左、右Ctrl键left ctrl、right ctrlLeftCtrl
、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
触摸数据的唯一索引idposition
触摸的位置deltaPosition
触摸位置的改变量deltaTime
距离上次触摸数据变化的时间间隔taoCount
单击计数phase
触摸的状态描述
通过吊桶phase
可访问当前触摸状态,状态如下所示:
Began
手指刚触碰屏幕Moved
手指在屏幕上移动Stationary
手指触碰屏幕并从上一帧起没有移动Ended
手指离开屏幕Cancled
系统取消了跟踪触摸
五、自定义输入
创建自定义虚拟按键:
- 打开Unity菜单栏 -> Editor -> Project Setting
- 选择Input分栏
默认情况下Unity创建了18个输入轴(Axes),具体参数如下: