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;
        }
    }

}

 

發佈了89 篇原創文章 · 獲贊 195 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章