U4S1L4——触屏输入

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Touchscreen                                //触屏类
Touchscreen.current //获取当前触屏设备
touchscreen.touches.Count //得到触屏手指数量
touchscreen.touches //得到所有触屏手指(需要遍历)
touchscreen.touches[] //得到单个触屏手指
touchControl.press.wasPressedThisFrame //按下
touchControl.press.wasReleasedThisFrame //抬起
touchControl.press.isPressed //长按
touchControl.tap.isPressed //点击手势
touchControl.tapCount.ReadValue() //连击次数
touchControl.position.ReadValue() //接触位置
touchControl.startPosition.ReadValue() //第一次接触时的位置
touchControl.radius.ReadValue() //接触区域大小
touchControl.delta.ReadValue() //偏移位置
touchControl.phase.ReadValue() //得到当前手指的状态
TouchPhase //手指状态枚举

获取当前触屏设备

由于触屏相关都是在移动平台或提供触屏的设备上使用,所以在使用时最好做一次判空

1
2
3
Touchscreen ts = Touchscreen.current;
if (ts == null)
return;

得到触屏手指信息

  • 得到触屏手指数量

    1
    print(ts.touches.Count);
  • 得到单个触屏手指

    1
    2
    ts.touches[0]
    ts.touches[1]
  • 得到所有触屏手指

    1
    foreach (var touch in ts.touches) { }

手指按下 抬起 长按 点击

  • 获取指定索引手指

    1
    2
    3
    4
    5
    6
    7
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    }
    }
  • 按下 抬起

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    if (touchControl.press.wasPressedThisFrame)
    {
    print("手指按下");
    }
    if (touchControl.press.wasReleasedThisFrame)
    {
    print("手指抬起");
    }
    }
    }

  • 长按

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    if (touchControl.press.isPressed)
    {
    print("手指按下");
    }
    }
    }

  • 点击手势

    (没有在实际操作里触发,原因不明)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    if (touchControl.tap.isPressed)
    {
    print("手指点击");
    }
    }
    }
  • 连点次数

    这个连点次数是在连续点击(按下抬起)的次数,如果按下太久,按下后拖动,太久没有按下,都会让计数清零

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    print(touchControl.tapCount.ReadValue());
    }
    }

手指位置等相关信息

  • 位置

    1
    print(touchControl.position.ReadValue());
  • 第一次接触时位置

    1
    print(touchControl.startPosition.ReadValue());
  • 接触区域大小

    (没有在实际操作里触发,原因不明)

    1
    print(touchControl.radius.ReadValue());
  • 偏移位置

    1
    print(touchControl.delta.ReadValue());
  • 得到当前手指的状态

    注意,这里的手指状态枚举是****​UnityEngine.InputSystem.TouchPhase ,命名空间是****​UnityEngine.InputSystem ,而非UnityEngine

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    void Update()
    {
    if (Touchscreen.current != null)
    {
    TouchControl touchControl = Touchscreen.current.touches[0];
    UnityEngine.InputSystem.TouchPhase touchPhase = touchControl.phase.ReadValue();
    switch (touchPhase)
    {
    //无
    case UnityEngine.InputSystem.TouchPhase.None:
    print("无");
    break;
    //开始接触
    case UnityEngine.InputSystem.TouchPhase.Began:
    print("开始接触");
    break;
    //移动
    case UnityEngine.InputSystem.TouchPhase.Moved:
    print("移动");
    break;
    //结束
    case UnityEngine.InputSystem.TouchPhase.Ended:
    print("结束");
    break;
    //取消
    case UnityEngine.InputSystem.TouchPhase.Canceled:
    print("取消");
    break;
    //静止
    case UnityEngine.InputSystem.TouchPhase.Stationary:
    print("静止");
    break;
    }
    }
    }