原因:判断是否将一个UI物体拖放到另一个UI物体上面。

 1.拖拽实现可以直接用EventTrigger组件或者自己实现拖拽事件的接口完成;

 2.在OnDrag方法中借助PointEventData事件进行检测;

 3.关于PointEventData的介绍,参考博文:https://blog.csdn.net/qq_41056203/article/details/84875282;

 4.这次检测主要是靠PointEventData中的pointerEnter属性完成,该属性会返回鼠标滑入的UI物体,返回值为GameObject;

 5.由4可知需要检测鼠标的划入事件,就需要有Image的raycastTarget属性,raycastTarget代表是否接收UI事件;

 6.当实现拖动时,将自身的Image.raycastTarget设为false。

using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(Image))]//属性,会给挂在该脚本的UI强制添加Image组件,且在没有移除该脚本时,不能移除Image组件
public class CustomDrag : MonoBehaviour,IDragHandler,IEndDragHandler,IBeginDragHandler//I开头的为拖拽事件的接口,这选择实现接口的方法实现拖拽
{
    private Image myImg;//获取自身的Image组件,在拖动时将raycastTarget设为false
    public void OnDrag(PointerEventData eventData)//拖动时触发的函数,实时触发
    {
        print("OnDrag");
      
        Debug.Log(eventData.pointerEnter);//pointerEnter代表鼠标进入到的UI物体

    }

    public void OnEndDrag(PointerEventData eventData)//拖动结束时触发的函数,触发一次
    {
        print("OnEndDrag");
        myImg.raycastTarget = true;
    }

    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)//拖动开始触发的函数,触发一次,需要将自身的raycastTarget设为true。
    {
        print("OnBeginDrag");
        myImg = transform.GetComponent<Image>();

    }
}

这里要说一下,这里只是简单实现拖动函数,没有实现拖拽时物体跟随,自己可以凭想法添加自己想要实现的效果,还有就是之所以要将raycastTarget设为false就是当物体拖拽跟随时,会阻挡下面的物体接收鼠标事件。

  1.将拖拽事件脚本挂到目标物体上

    目标物体上记得要有Image组件,可以试试将Text上的Ratcast Target属性打开试试。

 

 

 

 

 

 

 

  

版权声明:本文为PanPan21原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/PanPan21/p/15130737.html