Unity 给控件添加事件处理的三种方式 以及IDragHandler IDropHandler的实现

1、写类的时候 添加对应事件的 Handler 接口  (常用)

2、给物体增加 EventTrigger 组件 -> AddComponent->添加对应的 事件处理 如图

 

 

 3、直接在代码里  获取到组件 然后添加 EventTrigger

一般使用第一种

 以下是实现拖拽效果的代码

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Test : MonoBehaviour, IInitializePotentialDragHandler, IBeginDragHandler,IDragHandler,IEndDragHandler
{
    private int _index;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Start===========");

        
    }

    public void ChangeColor(BaseEventData data)
    {
        Debug.Log("ChangeColor===========");
        if (_index == 0)
        {
            GetComponent<Image>().color = Color.blue;
        }
        else
        {
            GetComponent<Image>().color = Color.white;
        }

        _index = _index == 0 ? 1 : 0;
    }

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

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

    // 其他三个接口 依赖于 IDragHandler 接口   如果把IDragHandler 去掉  那么其他三个函数也不会响应
    public void OnDrag(PointerEventData eventData)
    {
        // eventData.position 这个值是 屏幕坐标  也就是它处于屏幕上的哪个位置  需要转换成世界坐标来用
        Debug.Log("OnDrag===========" + eventData.position);

        // 获取当前物体的 RectTransform
        var rect = GetComponent<RectTransform>();

        // 这个值 将用来保存 转换后的坐标 参数带out 关键字
        Vector3 pos = Vector3.zero;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.enterEventCamera,
            out pos);
        rect.position = pos;
    }

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

 

一般情况下 IDragHandler(拖动物体) 会和 IDropHandler(放下物体)IEndDragHandler 一起使用

注意 :这里 onDrop 函数 会比 onEndDrag 函数先执行

注意:IDropHandler 依赖于 IDragHandler   如果未继承IDragHandler接口 那么IDropHandler的 实现函数也是不会调用的 

posted @ 2021-04-04 13:57  一个新星的诞生  阅读(578)  评论(0)    收藏  举报