unity 双指触控(以及多指触摸的代码原理分析)

双指触摸规律:从第一根触摸的手指开始 ,会从0开始为其编号,假设中间抬起手指,假设现在有两根手指,抬起编号为0的手指的话,将会导致原本编号为1的手指编号变为0,而当再次按下一根新手指时,原本编号0的手指的编号竟然会重新变成1,并且新的手指的编号会设置为0。

根据我对这种匪夷所思的现象的分析,最后终于想到了一个合理的解释方法:

存在一个用于记录每根手指的数组,每个按下的手指都会在按下的一瞬间获得一个不变的id,这个id就是其在数组中所属的下标,关于下标的确认方法,就是从零开始寻找有没有空缺的数组位,第一个空缺就分配给该手指,而Input.GetTouch(0).phase代码中的那个整型参数,并不是对应数组的下标,而是从数组0位开始寻找有手指的数组位置,找到的第一个就是参数0,第二个就是参数1,以此类推。当某根手指离开时,该处所处的id就会空出来,方便别的手指填补。所以这个参数不是id,而是"第x个存在的手指"。

 

样例需求:左侧滑动屏幕移动,右侧滑动屏幕攻击,那么只需要用两个如下的脚本分别编写代码即可,操作代码写在后面那三个空白函数里,然后识别规则函数里分别是判断坐标在屏幕左右即可。

using UnityEngine;

public class TwoFingerTouch : MonoBehaviour {

    private int fingerId = -1;  //触摸序号

    private void Update() {
        TwoFingerControl();
    }

    //双指触控管理函数
    private void TwoFingerControl() {
        if (Input.touchCount == 0) {
            if (fingerId != -1) {
                fingerId = -1;
                //异常处理代码(初始化布局等)
            }
        }
        else if (Input.touchCount == 1) {
            if (fingerId == -1 || fingerId == 0) {
                if (Input.GetTouch(0).phase == TouchPhase.Began) {
                    if (TouchCondition(Input.GetTouch(0).position)) {
                        if (fingerId == -1) {
                            fingerId = 0;
                            OnFingerDown(Input.GetTouch(0).position);
                        }
                    }
                }
                else if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary) {
                    if (fingerId == 0) {
                        OnFingerMove(Input.GetTouch(0).position);
                    }
                }
                else if (Input.GetTouch(0).phase == TouchPhase.Ended) {
                    if (fingerId == 0) {
                        fingerId = -1;
                        OnFingerUp(Input.GetTouch(0).position);
                    }
                }
            }
            else {
                if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary) {
                    OnFingerMove(Input.GetTouch(0).position);
                }
                else if (Input.GetTouch(0).phase == TouchPhase.Ended) {
                    fingerId = -1;
                    OnFingerUp(Input.GetTouch(0).position);
                }
            }
        }
        else if (Input.touchCount >= 2) {
            if (Input.GetTouch(0).phase == TouchPhase.Began) {
                if (TouchCondition(Input.GetTouch(0).position)) {
                    if (fingerId == -1) {
                        fingerId = 0;
                        OnFingerDown(Input.GetTouch(0).position);
                    }
                }
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary) {
                if (fingerId == 0) {
                    OnFingerMove(Input.GetTouch(0).position);
                }
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Ended) {
                if (fingerId == 0) {
                    fingerId = -1;
                    OnFingerUp(Input.GetTouch(0).position);
                }
            }

            if (Input.GetTouch(1).phase == TouchPhase.Began) {
                if (TouchCondition(Input.GetTouch(1).position)) {
                    if (fingerId == -1) {
                        fingerId = 1;
                        OnFingerDown(Input.GetTouch(1).position);
                    }
                }
            }
            else if (Input.GetTouch(1).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Stationary) {
                if (fingerId == 1) {
                    OnFingerMove(Input.GetTouch(1).position);
                }
            }
            else if (Input.GetTouch(1).phase == TouchPhase.Ended) {
                if (fingerId == 1) {
                    fingerId = -1;
                    OnFingerUp(Input.GetTouch(1).position);
                }
            }
        }
    }

    //按下执行函数
    private void OnFingerDown(Vector2 position) {
        //执行代码
    }

    //移动或静止执行函数
    private void OnFingerMove(Vector2 position) {
        //执行代码
    }

    //抬起执行函数
    private void OnFingerUp(Vector2 position) {
        //执行代码
    }

    //激活触摸条件
    private bool TouchCondition(Vector2 position) {
        //例子:只能从屏幕左侧开始滑动才会识别
        if (position.x < Screen.width * 0.5f) {
            return true;
        }
        else {
            return false;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值