unity中通过实现底层接口实现非按钮(图片)的事件监听

编写监听脚本 PEListenter

  • 继承自MonoBehaviour类,并实现了IPointerDownHandlerIPointerUpHandlerIDragHandler接口,按照需求定义需要接收事件(鼠标按下、抬起、拖拽)的回调函数
//监听类(需要挂载在物体上面)
public class PEListenter : MonoBehaviour, IPointerDownHandler,IPointerUpHandler,IDragHandler
{
    //存储点击,抬起,拖拽事件的回调
    public Action<PointerEventData> onClickDown;
    public Action<PointerEventData> onClickUp;
    public Action<PointerEventData> onDrag;

    //OnPointerDown方法在用户按下鼠标时被调用,它接收一个PointerEventData参数,
    //可以通过该参数获取有关鼠标点击事件的信息。
    //当鼠标拖动时,Unity将调用此方法。它检查onClickDown回调函数是否为null,不为空,则调用回调并传递eventData参数。

    public void OnPointerDown(PointerEventData eventData)
    {
        if (onClickDown != null)
        {
            onClickDown(eventData);
        }
    }

    //OnPointerUp方法在用户抬起鼠标时被调用
    public void OnPointerUp(PointerEventData eventData)
    {
        if (onClickUp != null)
        {
            onClickUp(eventData);
        }
    }
    //OnDrag方法在用户拖动鼠标时被调用
    public void OnDrag(PointerEventData eventData)
    {
        if (onDrag != null)
        {
            onDrag(eventData);
        }
    }
}

操作函数封装

  • 这段代码是一个用于获取或添加组件的方法 GetOrAddComponect<T>(GameObject go) 和一个封装点击事件的方法 OnClickDown(GameObject go, Action<PointerEventData> cb)

 protected T GetOrAddComponect<T>(GameObject go)where T : Component
    {
        T t = go.GetComponent<T>();
        if (t == null)
        {
            t = go.AddComponent<T>();
        }
        return t;
    }
   //各类点击事件的封装
    protected void OnClickDown(GameObject go,Action<PointerEventData> cb)
    {
//调用GetOrAddComponect函数对go物体进行脚本添加,并赋值给实例化listener
//为listener内的点击事件传入回调函数
        PEListenter listener = GetOrAddComponect<PEListenter>(go);
        listener.onClickDown = cb;
    }
    protected void OnClickUp(GameObject go, Action<PointerEventData> cb)
    {
        //只有点击挂载了PEClicke脚本的物体才有鼠标事件的数据
        PEListenter listener = GetOrAddComponect<PEListenter>(go);
        listener.onClickUp = cb;
    }
    protected void OnDrag(GameObject go, Action<PointerEventData> cb)
    {
        //只有点击挂载了PEClicke脚本的物体才有鼠标事件的数据
        PEListenter listener = GetOrAddComponect<PEListenter>(go);
        listener.onDrag = cb;
    }
  • GetOrAddComponect<T>(GameObject go) 方法的目的是为了获取指定游戏对象 go 上的一个特定类型的组件 T,如果该组件不存在,则会自动添加该组件到游戏对象上。这个方法使用了泛型 <T>,使得可以动态地传入不同类型的组件。该方法返回类型为 T 的组件。

    • T:表示一个继承自 Component 类的类型,这样确保传入的类型是一个组件类型
    • go:表示要获取或添加组件的游戏对象。
  • OnClickDown(GameObject go, Action<PointerEventData> cb) 方法是一个封装了点击事件的方法,它接受两个参数:

    • go:表示要绑定点击事件的游戏对象。
    • cb:表示点击事件发生时要执行的回调函数,它接受一个 PointerEventData 参数,通常用于处理点击事件的具体逻辑
  • OnClickDown 方法内部,首先调用了 GetOrAddComponect<PEListenter>(go) 方法获取或添加了一个名为 PEListenter 的组件,并将返回的 PEListenter 实例赋值给 listener 变量。然后,将传入的点击事件回调函数 cb 赋值给 listener 实例的 onClickDown 委托,这样当点击事件发生时,就会执行这个回调函数。 

具体函数调用

 public void RegisterTouchEvts()
    {
        //鼠标按下,轮盘位置改变,点出现,记录鼠标开始位置
        //imgTouch是需要事件监听的非按钮物体
        OnClickDown(imgTouch.gameObject, (PointerEventData evt) =>
         {
            //当鼠标在非按钮物体按下,需要进行的操作    
         });
        //鼠标抬起,轮盘位置恢复,点隐藏
        OnClickUp(imgTouch.gameObject, (PointerEventData evt) => {
            //当鼠标在非按钮物体按下,需要进行的操作  
        });
        //拖拽,设置点的位置,在40范围内以及超出40
        OnDrag(imgTouch.gameObject, (PointerEventData evt) => {
            //当鼠标在非按钮物体按下,需要进行的操作  
        });
    }

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 21:44:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 21:44:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 21:44:03       82 阅读
  4. Python语言-面向对象

    2024-06-11 21:44:03       91 阅读

热门阅读

  1. 超宽输送带与普通输送带的区别是什么

    2024-06-11 21:44:03       29 阅读
  2. 日常练习——[BJ2011.X5] 选小寿星

    2024-06-11 21:44:03       32 阅读
  3. 设计模式大作业-服装管理系统(包调试成功)

    2024-06-11 21:44:03       23 阅读
  4. Http File Server 2.0(HFS)使用说明

    2024-06-11 21:44:03       28 阅读
  5. C++命名规则

    2024-06-11 21:44:03       31 阅读
  6. 安卓手机APP开发____activity简介

    2024-06-11 21:44:03       29 阅读
  7. python爬虫爬取豆瓣TOP250用csv文件

    2024-06-11 21:44:03       30 阅读