• Unity UGUI事件接口概述


      UGUI 系统虽然提供了很多封装好的组件,但是要实现一些特定的功能还是显得非常有限,这时候就需要使用事件接口来完成UI功能的实现。比如我们想实现鼠标移动到图片上时自动显示图片的文字介绍,一般思路会想到写个射线来检测,但其实这样的检测UGUI已经替我们完成了,我们只需要实现检测到目标对象后所要执行的代码即可!
      UI 组件都是基于 UGUI 封装好的类和接口以及一些 Editor 文件来进行封装制作供开发者使用的,开发者利用这些封装好的工具,只需更专注于功能开发即可。UGUI 的代码是开源的,开发者可以查阅 UGUI 系统的具体细节来进行更深入的学习。UGUI 源码传送门:Unity-Technologies/UI
      Unity官方也为开发者提供了很多完整的案例,可以在 Assets Store上进行下载,搜索“Unity Samples: UI”。

    【接口介绍】

    命名空间:using UnityEngine.EventSystems;

    IPointerEnterHandler

    该接口实现方法如下:

    public void OnPointerEnter(PointerEventData eventData)
    {
        //当鼠标光标移入该对象时触发
    }

    IPointerExitHandler

    该接口实现方法如下:

    public void OnPointerExit(PointerEventData eventData)
    {
        //当鼠标光标移出该对象时触发
    }

    IPointerDownHandler

    该接口实现方法如下:

    public void OnPointerDown(PointerEventData eventData)
    {
        //鼠标点击A对象,按下鼠标时A对象响应此事件
    }

    IPointerUpHandler

    该接口实现方法如下:

    public void OnPointerUp(PointerEventData eventData)
    {
        //鼠标点击A对象,抬起鼠标时响应
        //无论鼠标在何处抬起(即不在A对象中)
        //都会在A对象中响应此事件
        //注:响应此事件的前提是A对象必须响应过OnPointerDown事件
        Debug.Log("OnPointerUp " + name);
    }

    IPointerClickHandler

    该接口实现方法如下:

    public void OnPointerClick(PointerEventData eventData)
    {
        //鼠标点击A对象,抬起鼠标时A对象响应此事件
        //注:按下和抬起时鼠标要处于同一对象上
    }

    IDragHandler

    该接口实现方法如下:

    public void OnDrag(PointerEventData eventData)
    {
        //当鼠标在A对象按下并拖拽时 A对象每帧响应一次此事件
        //注:如果不实现此接口,则后面的四个接口方法都不会触发
        Debug.Log("OnDrag " + name);
    
        if (Input.GetMouseButton(0))
        {
            //拖拽移动图片
            SetDraggedPosition(eventData);
        }
    }
    private void SetDraggedPosition(PointerEventData eventData)
    {
        var rt = gameObject.GetComponent<RectTransform>();
        Vector3 globalMousePos;
         if(RectTransformUtility.ScreenPointToWorldPointInRectangle(rt,eventData.position, eventData.pressEventCamera, out globalMousePos))
        {
            rt.position = globalMousePos;
        }
    }

    IInitializePotentialDragHandler

    该接口实现方法如下:

    public void OnInitializePotentialDrag(PointerEventData eventData)
    {
        //当鼠标在A对象按下还没开始拖拽时 A对象响应此事件
        //注:此接口事件与IPointerDownHandler接口事件类似
        // 二者的执行顺序:先执行IPointerDownHandler,然后执行此接口事件
        Debug.Log("OnInitializePotentialDrag " + name);
    }

    IBeginDragHandler

    该接口实现方法如下:

    public void OnBeginDrag(PointerEventData eventData)
    {
        //当鼠标在A对象按下并开始拖拽时 A对象响应此事件
        // 此事件在OnInitializePotentialDrag之后响应 OnDrag之前响应
        Debug.Log("OnBeginDrag " + name);
    }

    IEndDragHandler

    该接口实现方法如下:

    public void OnEndDrag(PointerEventData eventData)
    {
        //当鼠标抬起时 A对象响应此事件
        Debug.Log("OnEndDrag " + name);
    }

    IDropHandler

    该接口实现方法如下:

    public void OnDrop(PointerEventData eventData)
    {
        //A、B对象必须均实现IDropHandler接口,且A至少实现IDragHandler接口
        //当鼠标从A对象上开始拖拽,在B对象上抬起时 B对象响应此事件
        //此时name获取到的是B对象的name属性
        //eventData.pointerDrag表示发起拖拽的对象(GameObject)
        Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
    }
  • 相关阅读:
    a==null和a.equals("null")的区别
    PHP_EOL换行符
    mysql 重启
    异或的用法
    so easy(并查集+unordered_map)
    牛客练习赛51 C 勾股定理
    Period II
    Simpsons’ Hidden Talents
    POJ-1961 Period
    poj-2406 Power Strings
  • 原文地址:https://www.cnblogs.com/unity3ds/p/10470295.html
Copyright © 2020-2023  润新知