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;
        }
       
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_41995872/article/details/85244009