Unity觸屏操作 (主要是解決多點觸 屏問題)
阿新 • • 發佈:2019-01-07
1)、宣告允許多點觸屏
2)判斷手指觸控到螢幕的位置
3)判斷手指觸控到螢幕的數目
input.touchCount =0
return
input.touchCount =1
我們讓其來做點事: (移動攝像機左右移動)
1)用phase來判斷觸碰的狀態
Began:表示手指已觸控式螢幕幕
Move:手指在螢幕上移動
End:手指從螢幕上移開。這是一個觸控的最後狀態
Canceled:系統取消跟蹤觸控,如使用者把螢幕放到 他臉上或超過五個接觸同時發生。這是一個觸控 的最後狀態。
Stationary:手指觸控式螢幕幕,但並沒有移動。
2)當判斷Input.touches[0].phase ==TouchesPhase.Began
用一個Verctor2記錄下Input.touches[0].position
3)當判斷Input.touches[0].phase == TouchesPhase.Move
此時就可用來移動主攝像機了 Camin.main.tranform.translate(new Verctor3(Input.touches[0].position.x*Time.deltaTime, Input.touches[0].position.y*Time.deltaTime,0))
我們讓其來做點事 移動攝像機的Z軸控制 遠近,而達到物體放大 縮小的目的
1、定義變數來儲存兩個touchCount的開始位置 與所移動的距離
Vector2 finger1 = new Vector2()
Vector2 finger2 = new Vector2()
Vector2 mov1 = new Vector2()
Vector2 mov2 = new Vector2()
2、想像一個我們划動螢幕的動作 我們的兩個手指放下後一般會一個 手指定住,一個手指移動來放大, 當然也會有兩個手指都移動,但我 們只取這種狀態來作判斷即可
在一個for迴圈裡定義一個touch型別變數來 接收Input.touches[i]
1、對touch.phase作判斷 如果touch.phase ==touches.Ended 則break
2對touch.phase作判斷 如果touch.phase ==touches.Move
0、定議一個floa mov 來接收最終經過判斷所移動的值
mov = move.x+move.y
1、for迴圈作一個判斷i==1時對finger1、mov1、賦值
2、else裡對finger2、mov2賦值,並對比較finger1與finger2的X、Y
2)判斷手指觸控到螢幕的位置
3)判斷手指觸控到螢幕的數目
input.touchCount =0
return
input.touchCount =1
我們讓其來做點事: (移動攝像機左右移動)
1)用phase來判斷觸碰的狀態
Began:表示手指已觸控式螢幕幕
Move:手指在螢幕上移動
End:手指從螢幕上移開。這是一個觸控的最後狀態
Canceled:系統取消跟蹤觸控,如使用者把螢幕放到 他臉上或超過五個接觸同時發生。這是一個觸控 的最後狀態。
Stationary:手指觸控式螢幕幕,但並沒有移動。
2)當判斷Input.touches[0].phase ==TouchesPhase.Began
用一個Verctor2記錄下Input.touches[0].position
3)當判斷Input.touches[0].phase == TouchesPhase.Move
此時就可用來移動主攝像機了 Camin.main.tranform.translate(new Verctor3(Input.touches[0].position.x*Time.deltaTime, Input.touches[0].position.y*Time.deltaTime,0))
input.touchCount>1
1、定義變數來儲存兩個touchCount的開始位置 與所移動的距離
Vector2 finger1 = new Vector2()
Vector2 finger2 = new Vector2()
Vector2 mov1 = new Vector2()
Vector2 mov2 = new Vector2()
2、想像一個我們划動螢幕的動作 我們的兩個手指放下後一般會一個 手指定住,一個手指移動來放大, 當然也會有兩個手指都移動,但我 們只取這種狀態來作判斷即可
在一個for迴圈裡定義一個touch型別變數來 接收Input.touches[i]
1、對touch.phase作判斷 如果touch.phase ==touches.Ended 則break
2對touch.phase作判斷 如果touch.phase ==touches.Move
0、定議一個floa mov 來接收最終經過判斷所移動的值
mov = move.x+move.y
1、for迴圈作一個判斷i==1時對finger1、mov1、賦值
2、else裡對finger2、mov2賦值,並對比較finger1與finger2的X、Y
其實無論touchCount的數目是多少 我們都只取兩個點來做判斷即可
以下插入總體原始碼(這個與上面所講有點不同,這個直接掛在與要旋轉放大縮小的物體上)
using UnityEngine; using System.Collections; public class mobileChane : MonoBehaviour { // Use this for initialization private float mx; private float my; private float xSpeed =3; private float ySpeed =3; private Vector2 start; private Quaternion mRoation; void Start () { Input.multiTouchEnabled = true; } // Update is called once per frame void Update () { MoblieInput(); } void MoblieInput() { if(Input.touchCount ==0 ) { return; } if(Input.touchCount ==1) { if(Input.touches[0].phase ==TouchPhase.Began) { start = Input.touches[0].position; } if(Input.touches[0].phase ==TouchPhase.Moved) { mx += Input.touches[0].deltaPosition.x * xSpeed; my += Input.touches[0].deltaPosition.y * ySpeed; ; } mRoation = Quaternion.Euler(mx, my, 0); transform.rotation = mRoation; } else if(Input.touchCount>1) { Vector2 finger1 = new Vector2(); Vector2 finger2 = new Vector2(); Vector2 mov1 = new Vector2(); Vector2 mov2 = new Vector2(); // Vector2 mov = new Vector2(); for(int i = 0;i<2;i++) { Touch touch = Input.touches[i]; if(touch.phase == TouchPhase.Ended) { break; } if(touch.phase == TouchPhase.Moved) { float mov = 0; if(i==0) { finger1 = touch.position; mov1 = touch.deltaPosition; } else { finger2 = touch.position; finger2 = touch.deltaPosition; //開始做移動判斷 if(finger1.x>finger2.x) { mov = mov1.x; } else { mov = mov2.x; } if(finger1.y >finger2.y) { mov += mov1.y; } else { mov += mov2.y; } } Camera.main.transform.Translate(0, 0, mov * Time.deltaTime);//主要通過控制主攝像的遠近來放大縮小 } } } } }