天天看點

Unity移動端手勢操作——縮放3D物體

自己寫的一套用于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;
        }
    }
}