unity手機單指移動,雙指縮放

要求所掛載對象身上有碰撞器以及重力

掛載以下組件

using UnityEngine;
using UnityEngine.UI;

public class ObjectDragger : MonoBehaviour
{

    private Vector3 screenPoint;
    private Vector3 offset;

    bool dragged = false;

    private Vector3 newPosition;//賦值給物體的座標位置
    private Rigidbody body;
    Vector3 mapInitScale;
    void Start()
    {
        //獲取自身重力
        //body = gameObject.GetComponent<Rigidbody>();
        //獲取自身初始座標
        newPosition = transform.position;
        mapInitScale=transform.localScale;
    }

    Vector3 oldPosition1;
    Vector3 oldPosition2;

    bool isImage = false;
    void OnMouseDown()
    {
        if (Input.touchCount==1)
        {
            //按下鼠標時獲取自身當前座標的屏幕座標
            screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
            //按下鼠標時記錄物體的世界座標,和鼠標世界座標的向量偏移
            offset = gameObject.transform.position -
                Camera.main.ScreenToWorldPoint(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPoint.z));
        }
        else if (Input.touchCount > 1)
        {
            isImage = true;
            //記錄初始位置
            oldPosition1 = Input.GetTouch(0).position;
            oldPosition2 = Input.GetTouch(1).position;
        }
      
    }

    void OnMouseDrag()
    {
        //保證單指移動
        if (Input.touchCount==1)
        {
            //按下拖動鼠標時
            dragged = true;           
        }
        else if (Input.touchCount > 1)
        {
            //按下拖動鼠標時
            dragged = false;         
            isImage = true;
        }      
    }

    private void OnMouseExit()
    {
        dragged = false;
    }

    void FixedUpdate()
    {   
        if (dragged)
        {
            dragged = false;
            //當前鼠標的屏幕座標
            Vector3 curScreenPoint = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPoint.z);
            //保持物體與鼠標的位置偏移量
            newPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
        }

        if (Input.touchCount > 1)
        {
            dragged = false;
            //保證重新開始雙指觸摸記錄的初始位置不是鬆開手時的位置,而是初始觸摸的位置
            if (Input.GetTouch(0).phase == TouchPhase.Began || Input.GetTouch(1).phase == TouchPhase.Began)
            {
                //記錄初始位置
                oldPosition1 = Input.GetTouch(0).position;
                oldPosition2 = Input.GetTouch(1).position;
            }
            if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                //計算出當前兩點觸摸點的位置
                var tempPosition1 = Input.GetTouch(0).position;
                var tempPosition2 = Input.GetTouch(1).position;

                float currentTouchDistance = Vector3.Distance(tempPosition1, tempPosition2);
                float lastTouchDistance = Vector3.Distance(oldPosition1, oldPosition2);

                //計算上次和這次雙指觸摸之間的距離差距
                //然後去更改攝像機的距離
                float distance = (currentTouchDistance - lastTouchDistance) * 0.2f * Time.deltaTime;

                if (isImage)
                {
                    transform.localScale += mapInitScale * distance;
                }
               
                //限制最小
                if (transform.localScale.x < 4)
                {
                    transform.localScale = mapInitScale * 0.5f;
                }
                //限制最大
                if (transform.localScale.x > 16)
                {
                    transform.localScale = mapInitScale * 2;
                }
                //備份上一次觸摸點的位置,用於對比
                //也是鬆開手時的位置
                oldPosition1 = tempPosition1;
                oldPosition2 = tempPosition2;
            }
            if (Input.GetTouch(0).phase == TouchPhase.Ended || Input.GetTouch(1).phase == TouchPhase.Ended)
            {
                isImage = false;
            }

        }
        
        
    }

    void LateUpdate()
    {
        if (Input.touchCount == 1)
        {
            //移動代碼
            transform.position = newPosition;
        }
       
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章