新输入系统提供了对应的输入设备类,帮助我们对某一种设备输入进行检测
一、键盘输入
using UnityEngine.InputSystem;
Keyboard keyBoard = Keyboard.current;
(一)单个按键按下抬起长按
// 按下
if (keyBoard.enterKey.wasPressedThisFrame) { }
// 抬起
if (keyBoard.dKey.wasReleasedThisFrame) { }
// 长按
if (keyBoard.spaceKey.isPressed) { }
// 空格键当前帧是否按下
if (keyBoard.spaceKey.wasPressedThisFrame) print("空格键按下");
// 判断 D 键是否释放
if (keyBoard.dKey.wasReleasedThisFrame) print("D键抬起");
// 判断空格是否一直处于按下状态
if (keyBoard.spaceKey.isPressed) print("空格按下状态");
(二)通过事件监听按键按下
// 通过给 keyboard 对象中的 文本输入事件 添加委托函数
// 便可以获得每次输入的内容
keyBoard.onTextInput += (c) => { print("通过lambda表达式" + c); };
keyBoard.onTextInput += TextInput;
keyBoard.onTextInput -= TextInput;
private void TextInput(char c) {
print("通过函数进行事件监听" + c);
}
(三)任意键的处理
// keyBoard.anyKey
// wasPressedThisFrame
// wasReleasedThisFrame
// isPressed
// 任意键按下了
if (Keyboard.current.anyKey.wasPressedThisFrame) print("任意键按下");
二、鼠标输入
using UnityEngine.InputSystem;
Mouse mouse = Mouse.current;
(一)鼠标三个键位
鼠标左键:mouse.leftButton
鼠标右键:mouse.rightButton
鼠标中键:mouse.middleButton
鼠标向前、向后键:mouse.forwardButton、mouse.backButton
// 按下
if (mouse.leftButton.wasPressedThisFrame) { }
// 抬起
if (mouse.leftButton.wasReleasedThisFrame) { }
// 长按
if (mouse.rightButton.isPressed) { }
(二)鼠标位置
// 获取当前鼠标位置
mouse.position.ReadValue();
// 得到鼠标两帧之间的一个偏移向量
mouse.delta.ReadValue();
// 鼠标中间 滚轮的方向向量
mouse.scroll.ReadValue();
三、触屏输入
using UnityEngine.InputSystem;
Touchscreen ts = Touchscreen.current;
// 由于触屏相关都是在移动平台或提供触屏的设备上使用
// 所以在使用时最好做一次判空
if (ts == null) return;
(一)触屏手指信息
// 得到触屏手指数量
print(ts.touches.Count);
// 得到单个触屏手指
ts.touches[1]
// 得到所有触屏手指
foreach (var item in ts.touches) { }
(二)手指操作信息
// 获取指定索引手指
TouchControl tc = ts.touches[0];
// 按下 抬起
if (tc.press.wasPressedThisFrame) { }
if (tc.press.wasReleasedThisFrame) { }
// 长按
if (tc.press.isPressed) { }
// 点击手势
if (tc.tap.isPressed) { }
// 连续点击次数
print(tc.tapCount);
(三)手指位置等信息
// 位置
print(tc.position.ReadValue());
// 第一次接触时位置
print(tc.startPosition.ReadValue());
// 接触区域大小
tc.radius.ReadValue();
// 偏移位置
tc.delta.ReadValue();
// 得到当前手指的状态(阶段)
UnityEngine.InputSystem.TouchPhase tp = tc.phase.ReadValue();
switch (tp) {
case UnityEngine.InputSystem.TouchPhase.None: break; // 无
case UnityEngine.InputSystem.TouchPhase.Began: break; // 开始接触
case UnityEngine.InputSystem.TouchPhase.Moved: break; // 移动
case UnityEngine.InputSystem.TouchPhase.Ended: break; // 结束
case UnityEngine.InputSystem.TouchPhase.Canceled: break; // 取消
case UnityEngine.InputSystem.TouchPhase.Stationary: break; // 静止
default: break;
}
四、手柄输入
using UnityEngine.InputSystem;
Gamepad gamePad = Gamepad.current;
if (gamePad == null) return;
(一)手柄摇杆
// 摇杆方向
// 左摇杆方向向量
print(gamePad.leftStick.ReadValue());
// 右摇杆
print(gamePad.rightStick.ReadValue());
// 摇杆按下
// 右摇杆 按下抬起长按相关
// gamePad.rightStickButton
// 左摇杆
if (gamePad.leftStickButton.wasPressedThisFrame) { }
if (gamePad.leftStickButton.wasReleasedThisFrame) { }
if (gamePad.leftStickButton.isPressed) { }
(二)手柄方向键
// 对应手柄上4个方向键 上下左右
// gamePad.dpad.left
// gamePad.dpad.right
// gamePad.dpad.up
// gamePad.dpad.down
if (gamePad.dpad.left.wasPressedThisFrame) { }
if (gamePad.dpad.left.wasReleasedThisFrame) { }
if (gamePad.dpad.left.isPressed) { }
(三)手柄按钮
通用:
- Y、△:
gamePad.buttonNorth
- A、X:
gamePad.buttonSouth
- X、□:
gamePad.buttonWest
- B、○:
gamePad.buttonEast
右侧按钮:
- ○:
gamePad.circleButton
- △:
gamePad.triangleButton
- □:
gamePad.squareButton
- X:
gamePad.crossButton
- x:
gamePad.xButton
- a:
gamePad.aButton
- b:
gamePad.bButton
- Y:
gamePad.yButton
中央按钮:
- 中央键:
gamePad.startButton
/gamePad.selectButton
手柄肩部按键:
-
左上右上肩部键位 / 左右前方肩部键:
gamePad.leftShoulder
/gamePad.rightShoulder
-
左右后方触发键:
gamePad.leftTrigger
/gamePad.rightTrigger
五、其他输入
新输入系统中的输入设备类:
-
常用的
- Keyboard—键盘
- Mouse—鼠标
- Touchscreen—触屏
- Gamepad—手柄
-
其它
- Joystick—摇杆
- Pen—电子笔
- Sensor(传感器)https://docs.unity3d.com/Packages/com.unity.inputsystem@1.2/manual/Sensors.html#accelerometer
- Gyroscope—陀螺仪
- GravitySensor—重力传感器
- 加速传感器
- 光照传感器
- 等等
对于没有细讲的设备,平时在开发中不是特别常用
如果想要学习他们的使用,最直接的方式就是看官方的文档
或者直接进到类的内部查看具体成员,通过查看变量名和方法名即可了解使用方式
六、说明
新输入系统的设计初衷就是想提升开发者的开发效率,我们不提倡写代码来处理输入逻辑
之后学了配置文件相关知识后,都是通过配置文件来设置监听(监视窃听)的输入事件类型
我们只需要把工作重心放在输入触发后的逻辑处理
vitySensor—重力传感器
6. 加速传感器
7. 光照传感器
8. 等等
对于没有细讲的设备,平时在开发中不是特别常用
如果想要学习他们的使用,最直接的方式就是看官方的文档
或者直接进到类的内部查看具体成员,通过查看变量名和方法名即可了解使用方式