服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity 按钮事件封装操作(EventTriggerListener)

Unity 按钮事件封装操作(EventTriggerListener)

2022-11-11 14:02DaLiangChen C#

这篇文章主要介绍了Unity 按钮事件封装操作(EventTriggerListener),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

?
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using UnityEngine;
using UnityEngine.EventSystems;
namespace Mx.UI
{
    public class EventTriggerListener :UnityEngine.EventSystems.EventTrigger
    {
        public delegate void VoidDelegate(GameObject go);
        public VoidDelegate onClick;
        public VoidDelegate onDown;
        public VoidDelegate onEnter;
        public VoidDelegate onExit;
        public VoidDelegate onUp;
        public VoidDelegate onSelect;
        public VoidDelegate onUpdateSelect;
        /// <summary>
        /// 得到“监听器”组件
        /// </summary>
        /// <param name="go">监听的游戏对象</param>
        /// <returns>
        /// 监听器
        /// </returns>
        public static EventTriggerListener Get(GameObject go)
        {
            EventTriggerListener lister = go.GetComponent<EventTriggerListener>();
            if (lister==null)
            {
                lister = go.AddComponent<EventTriggerListener>();               
            }
            return lister;
        }
 
        public override void OnPointerClick(PointerEventData eventData)
        {
            if (onClick != null)
            {
                onClick(gameObject);
            }
        }
 
        public override void OnPointerDown(PointerEventData eventData)
        {
            if (onDown != null)
            {
                onDown(gameObject);
            }
        }
 
        public override void OnPointerEnter(PointerEventData eventData)
        {
            if (onEnter != null)
            {
                onEnter(gameObject);
            }
        }
 
        public override void OnPointerExit(PointerEventData eventData)
        {
            if (onExit != null)
            {
                onExit(gameObject);
            }
        }
 
        public override void OnPointerUp(PointerEventData eventData)
        {
            if (onUp != null)
            {
                onUp(gameObject);
            }
        }
    
        public override void OnSelect(BaseEventData eventBaseData)
        {
            if (onSelect != null)
            {
                onSelect(gameObject);
            }
        }
 
        public override void OnUpdateSelected(BaseEventData eventBaseData)
        {
            if (onUpdateSelect != null)
            {
                onUpdateSelect(gameObject);
            }
        }  
    }//Class_end
}

补充:Unity学习笔记——自定义EventTriggerListener事件

通常我们在Unity给按钮或者图片添加EventeTrigger事件都需要手动添加组件,或者通过代码继承系统提供接口实现功能。这样使用起来比较麻烦,所以我参考网上资料总结写了一个自定义的EventTriggerListener类,专门用于添加事件。

EventTriggerListener类,不需要挂载到物体上,继承EventTrigger,作为Common类直接使用

?
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using UnityEngine;
using UnityEngine.EventSystems;
public class EventTriggerListener : EventTrigger
{
    public delegate void voidDelegate(GameObject obj);
    public voidDelegate OnBtnDown;
    public voidDelegate OnBtnUp;
    public voidDelegate OnEnter;
    public voidDelegate OnExit;
    public voidDelegate OnStay;
    public voidDelegate OnClick;
    public voidDelegate OnDoubleClick;
    private float t1, t2;
    private bool isEnter = false;
    public void Update()
    {
        if (isEnter)
        {
            if (OnStay != null)
            {
                OnStay(gameObject);
            }
        }
    }
    public static EventTriggerListener Get(GameObject obj)
    {
        EventTriggerListener eventTriggerListener = obj.GetComponent<EventTriggerListener>();
        if (eventTriggerListener == null)
        {
            eventTriggerListener = obj.AddComponent<EventTriggerListener>();
        }
        return eventTriggerListener;
    }
    /// <summary>
    /// 判断是否是第二次点击
    /// </summary>
    private bool isTwo = true;
    private bool isOver = true;
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (OnBtnDown != null)
        {
            OnBtnDown(gameObject);
        }
        isTwo = !isTwo;
        if (!isOver)
        {
            return;
        }
        isOver = false;
        Invoke("SelectClick", 0.3f);
       
    }
    public void SelectClick()
    {
        if (isTwo)
        {
            if (OnDoubleClick!=null)
            {
                OnDoubleClick(gameObject);
            }
        }
        else
        {
            if (OnClick!=null)
            {
                OnClick(gameObject);
            }
        }
        isTwo = true;
        isOver = true;
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (OnBtnUp != null)
        {
            OnBtnUp(gameObject);
        }
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (OnEnter != null)
        {
            OnEnter(gameObject);
        }
        isEnter = true;
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (OnExit != null)
        {
            OnExit(gameObject);
        }
        isEnter = false;
    }
}

以上是最常见的几种事件,全部事件可以查看EventTrigger类。

使用方法:新建脚本BtnEvent,继承MonoBehaviour挂载到场景物体中,在Start()周期函数中给需要添加事件的物体添加事件(我这里直接挂载到需要注册事件的按钮上)其中gameObject是需要添加的物体gameObject

?
1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
public class BtnEvent : MonoBehaviour {
    void Start () {
        EventTriggerListener.Get(transform.gameObject).OnClick += (gameobj) => { Debug.Log("onclick"); };
        EventTriggerListener.Get(transform.gameObject).OnBtnDown += (gameobj) => { Debug.Log("OnBtnDown"); };
        EventTriggerListener.Get(transform.gameObject).OnBtnUp += (gameobj) => { Debug.Log("OnBtnUp"); };
        EventTriggerListener.Get(transform.gameObject).OnEnter += (gameobj) => { Debug.Log("OnEnter"); };
        EventTriggerListener.Get(transform.gameObject).OnExit += (gameobj) => { Debug.Log("OnExit"); };
        EventTriggerListener.Get(transform.gameObject).OnDoubleClick += (gameobj) => { Debug.Log("OnDoubleClick"); };
        EventTriggerListener.Get(transform.gameObject).OnStay += (gameobj) => { Debug.Log("OnStay"); };
    }  
}

运行结果:

Unity 按钮事件封装操作(EventTriggerListener)

PS:单击和双击事件的同时监听会有冲突,所以通过Invoke()检测300ms内点击次数,每次按钮按下的时候检测。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/a451319296/article/details/111332897

延伸 · 阅读

精彩推荐
  • C#c# 获取照片的经纬度和时间的示例代码

    c# 获取照片的经纬度和时间的示例代码

    这篇文章主要介绍了c# 获取照片的经纬度和时间的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    gisoracle6172022-10-19
  • C#C# 用什么方法将BitConverter.ToString产生字符串再转换回去

    C# 用什么方法将BitConverter.ToString产生字符串再转换回去

    这篇文章主要介绍了C# 用什么方法将BitConverter.ToString产生字符串再转换回去,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    森大科技4062022-08-20
  • C#c# 反射+自定义特性保存数据至本地

    c# 反射+自定义特性保存数据至本地

    这篇文章主要介绍了c# 反射+自定义特性保存数据至本地的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    ndtlyych9772022-10-24
  • C#图文介绍c#封装方法

    图文介绍c#封装方法

    在本篇内容里小编给大家分享的是关于c#使用封装方法以及相关知识点,对此有需要的朋友们可以学习下。...

    C#教程网7952022-03-07
  • C#C# 爬虫简单教程

    C# 爬虫简单教程

    这篇文章主要介绍了C# 爬虫的简单教程,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    张缺缺3462022-10-25
  • C#c#在WebAPI使用Session的方法

    c#在WebAPI使用Session的方法

    这篇文章主要介绍了c#在WebAPI使用Session的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    天涯过者10952022-02-25
  • C#WPF实现时钟特效

    WPF实现时钟特效

    这篇文章主要介绍了WPF实现时钟特效,过程很简单,感兴趣的小伙伴们可以参考一下...

    JackWang-CUMT8032021-11-03
  • C#C# TreeView从数据库绑定数据的示例

    C# TreeView从数据库绑定数据的示例

    这篇文章主要介绍了C# TreeView从数据库绑定数据的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    一朵小冯花5132022-11-08