• 2022-09-09 Unity InputSystem2——代码检测输入



    ​ 新输入系统提供了对应的输入设备类,帮助我们对某一种设备输入进行检测

    一、键盘输入
    using UnityEngine.InputSystem;
    
    Keyboard keyBoard = Keyboard.current;
    
    • 1
    • 2
    • 3

    (一)单个按键按下抬起长按

    // 按下
    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("空格按下状态");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    (二)通过事件监听按键按下

    // 通过给 keyboard 对象中的 文本输入事件 添加委托函数
    // 便可以获得每次输入的内容
    keyBoard.onTextInput += (c) => { print("通过lambda表达式" + c); };
    keyBoard.onTextInput += TextInput;
    keyBoard.onTextInput -= TextInput;
    
    private void TextInput(char c) {
        print("通过函数进行事件监听" + c);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (三)任意键的处理

    // keyBoard.anyKey
    // wasPressedThisFrame
    // wasReleasedThisFrame
    // isPressed
    
    // 任意键按下了
    if (Keyboard.current.anyKey.wasPressedThisFrame) print("任意键按下");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    二、鼠标输入
    using UnityEngine.InputSystem;
    
    Mouse mouse = Mouse.current;
    
    • 1
    • 2
    • 3

    (一)鼠标三个键位

    ​ 鼠标左键:mouse.leftButton

    ​ 鼠标右键:mouse.rightButton

    ​ 鼠标中键:mouse.middleButton

    ​ 鼠标向前、向后键:mouse.forwardButton、mouse.backButton

    // 按下
    if (mouse.leftButton.wasPressedThisFrame) { }
    
    // 抬起
    if (mouse.leftButton.wasReleasedThisFrame) { }
    
    // 长按
    if (mouse.rightButton.isPressed) { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (二)鼠标位置

    // 获取当前鼠标位置
    mouse.position.ReadValue();
    
    // 得到鼠标两帧之间的一个偏移向量 
    mouse.delta.ReadValue();
    
    // 鼠标中间 滚轮的方向向量
    mouse.scroll.ReadValue();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    三、触屏输入
    using UnityEngine.InputSystem;
    
    Touchscreen ts = Touchscreen.current;
    
    // 由于触屏相关都是在移动平台或提供触屏的设备上使用
    // 所以在使用时最好做一次判空
    if (ts == null) return;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (一)触屏手指信息

    // 得到触屏手指数量
    print(ts.touches.Count);
    
    // 得到单个触屏手指
    ts.touches[1]
        
    // 得到所有触屏手指
    foreach (var item in ts.touches) { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (二)手指操作信息

    // 获取指定索引手指
    TouchControl tc = ts.touches[0];
    
    // 按下 抬起
    if (tc.press.wasPressedThisFrame) { }
    if (tc.press.wasReleasedThisFrame) { }
    
    // 长按
    if (tc.press.isPressed) { }
    
    // 点击手势
    if (tc.tap.isPressed) { }
    
    // 连续点击次数
    print(tc.tapCount);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (三)手指位置等信息

    // 位置
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    四、手柄输入
    using UnityEngine.InputSystem;
    Gamepad gamePad = Gamepad.current;
    
    if (gamePad == null) return;
    
    • 1
    • 2
    • 3
    • 4

    (一)手柄摇杆

    // 摇杆方向
    // 左摇杆方向向量
    print(gamePad.leftStick.ReadValue());
    
    // 右摇杆
    print(gamePad.rightStick.ReadValue());
    
    // 摇杆按下
    // 右摇杆 按下抬起长按相关
    // gamePad.rightStickButton
    // 左摇杆
    if (gamePad.leftStickButton.wasPressedThisFrame) { }
    
    if (gamePad.leftStickButton.wasReleasedThisFrame) { }
    
    if (gamePad.leftStickButton.isPressed) { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (二)手柄方向键

    // 对应手柄上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) { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (三)手柄按钮

    通用:

    • 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

    五、其他输入

    ​ 新输入系统中的输入设备类:

    • 常用的

      1. Keyboard—键盘
      2. Mouse—鼠标
      3. Touchscreen—触屏
      4. Gamepad—手柄
    • 其它

      1. Joystick—摇杆
      2. Pen—电子笔
      3. Sensor(传感器)https://docs.unity3d.com/Packages/com.unity.inputsystem@1.2/manual/Sensors.html#accelerometer
      4. Gyroscope—陀螺仪
      5. GravitySensor—重力传感器
      6. 加速传感器
      7. 光照传感器
      8. 等等

    ​ 对于没有细讲的设备,平时在开发中不是特别常用
    ​ 如果想要学习他们的使用,最直接的方式就是看官方的文档

    ​ 或者直接进到类的内部查看具体成员,通过查看变量名和方法名即可了解使用方式

    六、说明

    ​ 新输入系统的设计初衷就是想提升开发者的开发效率,我们不提倡写代码来处理输入逻辑

    ​ 之后学了配置文件相关知识后,都是通过配置文件来设置监听(监视窃听)的输入事件类型
    ​ 我们只需要把工作重心放在输入触发后的逻辑处理

    vitySensor—重力传感器
    6. 加速传感器
    7. 光照传感器
    8. 等等

    ​ 对于没有细讲的设备,平时在开发中不是特别常用
    ​ 如果想要学习他们的使用,最直接的方式就是看官方的文档

    ​ 或者直接进到类的内部查看具体成员,通过查看变量名和方法名即可了解使用方式

  • 相关阅读:
    Qt模态对话框与非模态对话框
    微信小程序:用户基本信息的采集
    Git系列讲解 —— 提交日志(git log)的使用
    systemui状态栏添加新图标
    基于内外环PD控制的四旋翼飞行器控制系统simulink仿真
    WebGL笔记:矩阵的变换之平移的实现
    计算机毕业设计(附源码)python在线考试主观题评分系统
    MATLAB数字
    【Java】全套云HIS源码包含EMR、LIS(多医院、卫生机构使用)
    JAVA程序运行流程
  • 原文地址:https://blog.csdn.net/zheliku/article/details/126775304