Unity3D Android开发之触摸操作识别——单击/双击简单区分两种触屏方式

本人是自学的,可能逻辑不够清晰,如有误,欢迎交流。
##需求
需要区分左右手操作,有2种手势,假设红色为左手(单击),蓝色为右手(双击),并且一直跟踪区别左右手。然后其他根据左右手的具体操作,可在别的脚本通过调用该getTouch()即可。具体看下动图。

##效果图
这里写图片描述

这里写图片描述

##知识点
1、Input.getTouch(int index):按索引值获取一个Touch对象。

2、Touch.fingerId:特定的触摸,会持续下去,它是一个唯一的标识符,可用此跟踪任何触摸操作。当触摸从阵列中消失时,触摸将结束,此ID将用于另一次触摸

3、解释2、
①将手指按食指、中指、无名指的顺序触摸屏幕 :
食指触摸后,fingerID=0;
中指触摸后,fingerID=1;
无名触摸后,fingerID=2;
②之后中指离开屏幕:
食指还是fingerID=0;
无名指还是fingerID=2;
小指还是fingerID=3;
③这时又有一个手指触摸屏幕上:(不一定是中指)
食指还是fingerID=0
无名指还是fingerID=2;
小指还是fingerID=3;
新手指触摸后,fingerID=1;
新手指加入时,看到fingerID=1是空,就直接占用fingerID。后面再加新手指,就fingerID=4。

4.之前没搞清楚fingerID和getTouch()的参数间的关系,时不时出现bug,然后做了一些测试,如下图。
黑色字是我触碰操作,蓝色字是测试得的。
sakura

##代码

	public GameObject mouse_L, mouse_R;
    public int z = 9;   //鼠标离摄像机的z轴距离
    public Touch touch_L, touch_R;


    void Start()
    {
        //初始化左右touch为结束阶段(没触碰点)
        touch_L = new Touch();
        touch_L.phase = TouchPhase.Canceled;
        touch_R = new Touch();
        touch_R.phase = TouchPhase.Canceled;
    }

    void FixedUpdate()
    {
        //没有触碰点
        if (Input.touchCount == 0)
        {
            touch_L.phase = TouchPhase.Canceled;
            touch_R.phase = TouchPhase.Canceled;
            touch_L.fingerId = 0;
            touch_R.fingerId = 0;
        }
        //只有1触碰点
        else if (Input.touchCount == 1)
        {
            //刚触碰
            if (!IsTouch(touch_L) && !IsTouch(touch_R))
            {
                Debug.Log("ceshi:" + Input.GetTouch(0).tapCount);
                //多击/双击:右手
                if (Input.GetTouch(0).tapCount > 1)
                {
                    CreatTouch(0, "R"); //获取第1个触摸点默认右手(fingerID=0) 
                    touch_L.fingerId = 1;   //则第2个触摸点默认为左手(fingerID=1)
                    //Debug.Log("ceshi1:L ID:" + touch_L.fingerId + ",R ID:" + touch_R.fingerId + " ,touchCount" + Input.touchCount);
                }
                //单击:左手
                else
                {
                    CreatTouch(0, "L"); //获取第1个触摸点默认左手(fingerID=0) 
                    touch_R.fingerId = 1;   //则第2个触摸点默认为右手(fingerID=1
                }
            }
            else
            {
                if (Input.GetTouch(0).fingerId == touch_L.fingerId)
                {
                    CreatTouch(0, "L");
                }
                else if (Input.GetTouch(0).fingerId == touch_R.fingerId)
                {
                    CreatTouch(0, "R");
                }
                else
                {
                    Debug.Log("ceshi4:0 ID:" + Input.GetTouch(0).fingerId + ",phase:" +Input.GetTouch(0).phase);
                    Debug.Log("ceshi4:L ID:" + touch_L.fingerId + ",phase:" + touch_L.phase + ",R ID:" + touch_R.fingerId + ",phase:" + touch_R.phase + " ,touchCount" + Input.touchCount);
                }

            }
        }
        //2触碰点
        else if (Input.touchCount == 2)
        {
            CreatTouch(touch_L.fingerId, "L");
            CreatTouch(touch_R.fingerId, "R");

        }
    }
    
    bool IsTouch(Touch touch)
    {
        //当属于取消或结束,则没有触碰点
        if (touch.phase == TouchPhase.Canceled || touch.phase == TouchPhase.Ended)
            return false;
        return true;
    }

    //创建左/右手鼠标
    void CreatTouch(int i, string LorR)
    {
        if (LorR.Equals("L"))
        {
            touch_L = Input.GetTouch(i);  //获取第一个触摸点(默认左手)
            Vector3 touchPos_L = touch_L.position;  //获取左手坐标
            Vector3 pos_L = Camera.main.ScreenToWorldPoint(touchPos_L + new Vector3(0, 0, z));    //左触摸点的位置(相机屏幕坐标2d->3d + z轴偏移量)
            mouse_L.transform.position = pos_L; //左手触摸点的拖尾效果
        }
        else if (LorR.Equals("R"))
        {
            touch_R = Input.GetTouch(i);  //获取第二个触摸点(默认右手)
            Vector3 touchPos_R = touch_R.position;  //获取右手坐标
            Vector3 pos_R = Camera.main.ScreenToWorldPoint(touchPos_R + new Vector3(0, 0, z));//右触摸点的位置(相机屏幕坐标2d->3d + z轴偏移量)
            mouse_R.transform.position = pos_R; //右手触摸点的拖尾效果
        }
    }

猜你喜欢

转载自blog.csdn.net/Sakura_Jun/article/details/82718419