unity.UGUI事件系统之Drag滑动事件

Drag滑动事件主要有四个event他们分别是:
IInitializePotentialDragHandler, 初始化,鼠标最对应地方摁下出发(鼠标Down)每次点击触发一次
IBeginDragHandler, 鼠标移动出发,第一下移动触发一次
IDragHandler, 一直 触发
IEndDragHandler 结束(鼠标Up)鼠标点击松开触发一次

总的来说就是看图:

在这里插入图片描述
在这里插入图片描述
主要是实现方式也是认为为继承接口

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

public class s3Test : MonoBehaviour,IInitializePotentialDragHandler,IBeginDragHandler,IDragHandler,IEndDragHandler
    //                                      
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("BeginDrag");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("OnDrag");
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("EndDrag");
    }

    public void OnInitializePotentialDrag(PointerEventData eventData)
    {
        Debug.Log("initialDrag");
    }
}

而且他们站之间有依赖关系另外三个都需要依赖于OnDrag。没有他,另外i三个都是无法触发的.
那么我们来实现一个简单的拖拽物体功能
并且添加了一个小优化:就是我们拖拽物体移动之后,物体或默认的移动到中央位置.这个是不美观的,我们记录一下偏移量,然后吧偏移转入物体看代码:

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

public class s3Test : MonoBehaviour,IInitializePotentialDragHandler,IBeginDragHandler,IDragHandler,IEndDragHandler
    //                                      
{
    Vector3 offset;//记录偏移
    public void OnBeginDrag(PointerEventData eventData)
    {
    //在一开始的时候就记录好偏移量
        Debug.Log("BeginDrag");
        var rect = GetComponent<RectTransform>();
        offset = Vector3.zero;
        Vector3 pos = Vector3.zero;
        //这里多提以一下,因为我们在做UI的时候很多东西都是会让人迷糊的,
        //位置处理很多时候都会不适配,所以一定要调好函数,不然就会出现偏差
        //来自蒟蒻的提醒
        //该函数能够将鼠标位置转化为世界坐标
        //ps:还有screenpointToWorldPostion
        
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos);
        offset = pos - rect.position;
        Debug.Log(offset);
    }

    public void OnDrag(PointerEventData eventData)
    {
        var rect  = GetComponent<RectTransform>();
        Vector3 pos = Vector3.zero;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos);
        rect.position = pos-offset;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("EndDrag");
    }

    public void OnInitializePotentialDrag(PointerEventData eventData)
    {
        Debug.Log("initialDrag");
    }
}

最后面们看一个扩展
这个是在当鼠标松开的时候在执行,而且他的执行是在EndDrag后面执行的

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

public class s3Test : MonoBehaviour,IDragHandler,IDropHandler
    //, IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler
    //                                      
{
    Vector3 offset;
    public void OnDrag(PointerEventData eventData)
    {
        var rect = GetComponent<RectTransform>();
        Vector3 pos = Vector3.zero;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera, out pos);
        rect.position = pos - offset;
    }

    public void OnDrop(PointerEventData eventData)
    {
        Debug.Log("Drop");
        //throw new System.NotImplementedException();
    }
}

Drag遇见问题
拖拽物体的层级导致事件响应出错
说明:我们拖拽的物体应该默认为最高层级的
可以给他添加一个canvas,和graphic raycaster,勾选Override Sorting,并设置Sort Order就可以了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值