当前位置:   article > 正文

unity.UGUI事件系统之Drag滑动事件_unity ondrag不一直触发

unity ondrag不一直触发

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

而且他们站之间有依赖关系另外三个都需要依赖于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");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

最后面们看一个扩展
这个是在当鼠标松开的时候在执行,而且他的执行是在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();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/122974
推荐阅读
相关标签
  

闽ICP备14008679号