首先介紹一下Input.touches結構,這是一個觸摸數組,每個記錄代表着手指在屏幕上的觸碰狀態。每個手指觸控都是通過Input.touches來描述的:
fingerId |
觸摸的唯一索引 |
position |
觸摸屏幕的位置 |
deltatime |
從最后狀態到目前狀態所經過的時間 |
tapCount |
點擊數。Andorid設備不對點擊計數,這個方法總是返回1 |
deltaPosition |
自最后一幀所改變的屏幕位置 |
phase |
相位,也即屏幕操作狀態 |
其中phase(狀態)有以下這幾種:
Began |
手指剛剛觸摸屏幕 |
Moved |
手指在屏幕上移動 |
Stationary |
手指觸摸屏幕,但自最后一陣沒有移動 |
Ended |
手指離開屏幕 |
Canceled |
系統取消觸控跟蹤,原因如把設備放在臉上或同時超過5個觸摸點
|
在Unity 游戲運行在手機上時鼠標左鍵的操作可以用觸摸屏幕來代替,但是無法代替多點的觸控。(也就是說在調用getaxis和getmousebutton等方法時手機上進行觸摸屏幕也可以響應)
下面是通過在手機上進行操作來實現旋轉和放大縮小的代碼
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { public float rotateSpeed; public Vector2 nTouchPos1; public Vector2 nTouchPos2; public Vector2 oTouchPos1; public Vector2 oTouchPos2; // Update is called once per frame void Update() { //旋轉 if (Input.GetMouseButton(0)) { if (Input.touchCount == 1) { if (Input.GetTouch(0).phase == TouchPhase.Moved) { Debug.Log("開始旋轉"); float moveX = Input.GetTouch(0).deltaPosition.x; Debug.Log("滑動的距離" + moveX); transform.Rotate(Vector3.up * -rotateSpeed * moveX * Time.deltaTime); } } } ZoomInOut(); if (this.transform.position.y > 0) { return; } this.transform.Translate(new Vector3(0, 0.5f, 0) * Time.deltaTime); } bool IsEnLarge(Vector2 nPos1,Vector2 nPos2,Vector2 oPos1,Vector2 oPos2) { float nDis = Vector2.Distance(nPos1, nPos2); float oDis = Vector2.Distance(oPos1, oPos2); if(nDis<oDis) { return false; } else { return true; } } void ZoomInOut() { if(Input.touchCount==2) { if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved) { nTouchPos1 = Input.GetTouch(0).position; nTouchPos2 = Input.GetTouch(1).position; if(IsEnLarge(nTouchPos1,nTouchPos2,oTouchPos1,oTouchPos2)) { Vector3 nScale = transform.localScale*1.01f; transform.localScale = new Vector3(nScale.x, nScale.y, nScale.z); } else { Vector3 nScale = transform.localScale *0.99f; transform.localScale = new Vector3(nScale.x, nScale.y, nScale.z); } oTouchPos1 = nTouchPos1; oTouchPos2 = nTouchPos2; } } } }