UGUI图片拖拽 详解

核心解释:

  一、需实现“开始拖拽”、“拖拽中”、“结束拖拽”三个UGUI内置的接口,分别是IBeginDragHandler ,IDragHandler,IEndDragHandler ,如图所示:
在这里插入图片描述
注意,实现这三个接口,需引入UnityEngine.EventSystems命名空间

  二、需要知道鼠标点在图片上时,它的世界坐标——目的是计算:鼠标点击的这个点,与图片中心的偏移量(下方代码中的offset)。用以下函数得到:
在这里插入图片描述
  三、如果不计算这个偏移量,鼠标一开始拖动图片,图片的中心会跑到鼠标的位置(如动图)——在拖动的整个过程中,加上这个偏移量,图片的中心就会保持在,像开始那样,离鼠标拖动点一定位置的地方。
在这里插入图片描述

在这里插入图片描述

代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 挂在要拖拽的ui上即可
/// </summary>
public class TuoDongImage : MonoBehaviour,IBeginDragHandler ,IDragHandler,IEndDragHandler 
{
    public bool isPrecision=true;  //精准拖拽为true ,鼠标一直在UI中心可以为false
    //存储图片中心点与鼠标点击点的偏移量
    private Vector3 offect;
    //存储当前拖拽图片的RectTransform组件
    private RectTransform m_rt;
    void Start()
    {
        m_rt = this.transform.GetComponent<RectTransform>();
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        //如果是精确拖拽则进行计算偏移量操作
        if (isPrecision)
        {
            // 存储点击时的鼠标坐标
            Vector3 tWorldPos;
            //UI屏幕坐标转换为世界坐标
            RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out tWorldPos);
            //计算偏移量   
            offect = transform.position - tWorldPos;
           
        }
        //否则,默认偏移量为0
        else
        {
            offect = Vector3.zero;
        }
        //m_rt.position = Input.mousePosition + offect;
        SetDraggedPosition(eventData);

    }

    //拖拽过程中触发
    public void OnDrag(PointerEventData eventData)
    {
        //m_rt.position = Input.mousePosition + offect;
        SetDraggedPosition(eventData);
    }

    //结束拖拽触发
    public void OnEndDrag(PointerEventData eventData)
    {
        //m_rt.position = Input.mousePosition + offect;
        SetDraggedPosition(eventData);
    }
    private void SetDraggedPosition(PointerEventData eventData)
    {
        //存储当前鼠标所在位置
        Vector3 globalMousePos;
        //UI屏幕坐标转换为世界坐标
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
        {
            //设置位置及偏移量
            m_rt.position = globalMousePos + offect;
        }
    }

}

补充:RectTransformUtility.ScreenPointToWorldPointInRectangle() 官方文档

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值