双指触摸规律:从第一根触摸的手指开始 ,会从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;
}
}
}