自己寫的一套用于Unity移動端手勢操作的判斷,主要有單指移動3D物體、單指旋轉3D物體、雙指縮放3D物體,這裡首先分開介紹雙指縮放3D物體,如下所示:
using UnityEngine;
using System.Collections;
public class ZoomControl : GestureControl
{
//記錄上一次手機觸摸位置判斷使用者是在左放大還是縮小手勢
private Vector2 oldPosition1;
private Vector2 oldPosition2;
//實時大小
Vector3 RealScale = new Vector3(1f, 1f, 1f);
//原始大小
float InitialScale = 0;
//縮放速度
public float ScaleSpeed = 0.1f;
//縮放比例
public float MaxScale = 2.5f;
public float MinScale = 0.5f;
void Start()
{
//擷取物體最原始大小
InitialScale = this.transform.localScale.x;
}
protected override void InputCheck()
{
#region 多點觸摸縮放(真實模型縮放)
if (Input.touchCount > 1)
{
status = 2;
StartCoroutine(CustomOnMouseDown());
}
#endregion
}
IEnumerator CustomOnMouseDown()
{
//當檢測到一直觸碰時,會不斷循環運作
while (Input.GetMouseButton(0))
{
//實時記錄模型大小
RealScale = this.transform.localScale;
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
//觸摸位置
Vector3 tempPosition1 = Input.GetTouch(0).position;
Vector3 tempPosition2 = Input.GetTouch(1).position;
//函數傳回真為放大,傳回假為縮小
if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2))
{
//判斷是否超過邊界
if (RealScale.x < InitialScale * MaxScale)
{
this.transform.localScale += this.transform.localScale * ScaleSpeed;
}
}
else
{
//判斷是否超過邊界
if (RealScale.x > InitialScale * MinScale)
{
this.transform.localScale -= this.transform.localScale * ScaleSpeed;
}
}
//備份上一次的觸摸位置
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
yield return new WaitForFixedUpdate();
}
}
//記錄手指位置與初始位置是縮小或放大
bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
{
float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (leng1 < leng2)
{
return true;
}
else
{
return false;
}
}
}