雙指觸摸規律:從第一根觸摸的手指開始 ,會從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;
}
}
}