unity手机端ui的跟随手指移动以及双手缩放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

//随意挂载
public class MapController : MonoBehaviour, IDragHandler, IPointerDownHandler
{   
    [SerializeField] private Transform image;//所要控制的UI
    public RectTransform canvas;//所在canvas

    private RectTransform curRecTran;
    private void Start()
    {
        curRecTran = transform.GetComponent<RectTransform>();
    }


    Vector3 offet;
    /// <summary>
    /// 记录初始手的位置以及地图中心的向量差
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerDown(PointerEventData eventData)
    {
        if (Input.touchCount == 1)
        {
            Vector3 mouseDown;
            //屏幕坐标转世界坐标
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(curRecTran, eventData.position,
    eventData.pressEventCamera, out mouseDown))
            {
                offet = curRecTran.position - mouseDown;
            }

        }
    }
/// <summary>
/// 移动
/// </summary>
/// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        if (Input.touchCount == 1)
        {
            if (RectTransformUtility.RectangleContainsScreenPoint(canvas, eventData.position))
            {
                Vector3 globalMousePos;
                if (RectTransformUtility.ScreenPointToWorldPointInRectangle(curRecTran, eventData.position,
        eventData.pressEventCamera, out globalMousePos))

                {
                    curRecTran.position = globalMousePos + offet;
                }
            }

        }

    }


    //放大缩小
    private bool isTwoTouch;
    private Vector3 firstTouch;
    private Vector3 secondTouch;
    private float twoTouchDistance;
    private float lastDistance;
    void Update()
    {

        //缩放代码
        if (Input.touchCount > 1)
        {
            //当第二根手指按下的时候
            if (Input.GetTouch(1).phase == TouchPhase.Began)
            {
                isTwoTouch = true;
                //获取第一根手指的位置
                firstTouch = Input.touches[0].position;
                //获取第二根手指的位置
                secondTouch = Input.touches[1].position;

                lastDistance = Vector2.Distance(firstTouch, secondTouch);
            }

            //如果有两根手指按下
            if (isTwoTouch)
            {
                //每一帧都得到两个手指的坐标以及距离
                firstTouch = Input.touches[0].position;
                secondTouch = Input.touches[1].position;
                twoTouchDistance = Vector2.Distance(firstTouch, secondTouch);

                //当前图片的缩放
                Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
                //两根手指上一帧和这帧之间的距离差
                //因为100个像素代表单位1,把距离差除以100看缩放几倍
                float changeScaleDistance = (twoTouchDistance - lastDistance) / 100;
                //因为缩放 Scale 是一个Vector3,所以这个代表缩放的Vector3的值就是缩放的倍数
                Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
                //图片的缩放等于当前的缩放加上 修改的缩放
                image.localScale = curImageScale + changeScale;
                //控制缩放级别
                image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, 0.5f, 10f), Mathf.Clamp(image.localScale.y, 0.5f, 10f), 1);
                //这一帧结束后,当前的距离就会变成上一帧的距离了
                lastDistance = twoTouchDistance;
            }

            //当第二根手指结束时(抬起)
            if (Input.GetTouch(1).phase == TouchPhase.Ended)
            {
                isTwoTouch = false;
                firstTouch = Vector3.zero;
                secondTouch = Vector3.zero;
            }
        }

    }


}

猜你喜欢

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