一、Touch结构体介绍

      1、Touch是一个结构体,每当发生一次触摸,系统生成一个Touch类型的变量,存储本次触摸的相关信息;如果发生多点触控,那么系统就会生成多个Touch类型的变量。

      2、Touch结构体主要由以下成员变量:

           ①positon :触摸位置的坐标,是Vector2类型

           ②deltaPosition:触摸的位置变化量Vector2类型,当手指接触屏幕,向某一方向滑动时起始位置到终止位置的变化量

           ③deltaTime:触摸的时间变化量,是float类型

           ④phase:触摸所处阶段TouchPhase类型

           ⑤tapCount:单机数量,可以自动检测手指单机屏幕的次数

        3、TouchPhase是枚举类型,主要包含以下5种类型状态:

           ①Began:手指开始接触屏幕

           ②Moved:手指接触屏幕并在屏幕上滑动

           ③Stationary:手指接触屏幕并保持不动

           ④Ended:手指离开屏幕

           ⑤Canceled:取消本次触摸的跟踪

        4、Input类除了可以得到键盘与鼠标的输入值外,还可以得到手指触控

           ①Input.GetTouch(index:int):按序号获取触摸点(首个触摸点序号为0),返回Touch。

           例如:Inpute.GetTouch(0).phase==TouchPhase.Moved

           说明:Input.GetTouch(0)返回Touch结构体,Touch.phase返回TouchPhase枚举类型。

           ②Input.touchCount是静态整形变量,当一只手指接触到屏幕上时返回1,两个手指在屏幕上时返回2,以此类推。

           ③Input.touchs返回一个Touch类型数组,保存当前所有触摸点生成的Touch类型变量

二、手指触控的常见方式

        1、手游的开发过程中一般都具备以下触控方式:

           ①手指(在屏幕上)上、下、左、右滑动方向的识别

           ②手指双击识别

           ③手指停留识别

           ④双指触控识别

          2、实现一个上、下、左、右滑动示例:

 

/***
 *
 *  Title: 
 *         第23章_Unity游戏移植于手指触控识别
 *
 *  Description:
 *        功能:
 *          1: 划屏触控识别。
 *              上、下、左、右。
 *          2:  识别手指双击
 *          3:  手指停留
 *
 *  Date: 2019
 * 
 *  Version: 1.0
 *
 *  Modify Recorder:
 *     
 */
using UnityEngine;
using UnityEngine.UI;

public class IdentityFinger : MonoBehaviour {
    /*  控件显示  */
    public Text _TxtLeftRightTips;                     //左右划屏测试 
    public Text _TxtUpDownTips;                        //上下划屏测试               
    public Text _TxtDoubleClickTips;                   //双击划屏测试                 
    public Text _TxtFingerStationaryTips;              //停留划屏测试          
    //手指滑屏
    private Vector2 _VecDeltaArea;                      //滑屏区域    
    //手指双击
    private bool _BoolSecondClick = false;              //是否为第二次点击
    private float _FloFirstTime = 0F;                   //第一次点击时间
    private float _FloSencondTime = 0F;                 //第二次点击时间
    //手指停留时间
    private float _FloStationaryTime = 0F;              //手指停留的时间

	void Start () {
        //测试数值
        _VecDeltaArea = Vector2.zero;
	}

	void Update (){
        /* 手指离开屏幕 */
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Ended)){
            _VecDeltaArea = Vector2.zero;
            _TxtDoubleClickTips.text = "";
            _FloStationaryTime = 0;
            _TxtFingerStationaryTips.text = "";
        }
        /* 识别手指滑屏 */
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Moved)){
            _VecDeltaArea.x += Input.GetTouch(0).deltaPosition.x;
            _VecDeltaArea.y += Input.GetTouch(0).deltaPosition.y;
            if (_VecDeltaArea.x > 100){
                _TxtLeftRightTips.text = "右滑屏";
            }
            else if (_VecDeltaArea.x < -100){
                _TxtLeftRightTips.text = "左滑屏";
            }
            if (_VecDeltaArea.y > 100){
                _TxtUpDownTips.text = "上滑屏";
            }
            else if (_VecDeltaArea.y < -100){
                _TxtUpDownTips.text = "下滑屏";
            }
        }

        /* 手指双击识别(老方法)*/
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Began)){
            if (_BoolSecondClick){
                _FloSencondTime = Time.time;
                if (_FloSencondTime - _FloFirstTime > 0.02F && _FloSencondTime - _FloFirstTime < 0.3F){
                    _TxtDoubleClickTips.text = "发现双击!";
                }
            }
            _BoolSecondClick = true;
            _FloFirstTime = Time.time;
        }

        /*  手指双击测试(使用tapCount 属性)*/
        if (Input.GetTouch(0).tapCount == 2){
            _TxtDoubleClickTips.text = "发现双击!";
        }

        /* 手指停留识别 */
        if(Input.touchCount==1 && Input.GetTouch(0).phase==TouchPhase.Stationary){
            _FloStationaryTime += Input.GetTouch(0).deltaTime;
            if (_FloStationaryTime>1F){
                _TxtFingerStationaryTips.text = "发现停留";
            }
        }
	}
}//Class_end