Unity 按钮事件封装操作(EventTriggerListener)
作者:DaLiangChen 时间:2022-07-08 10:07:08
我就废话不多说了,大家还是直接看代码吧~
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类直接使用
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
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"); };
}
}
运行结果:
PS:单击和双击事件的同时监听会有冲突,所以通过Invoke()检测300ms内点击次数,每次按钮按下的时候检测。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/a451319296/article/details/111332897
标签:Unity,按钮,封装
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
idea热部署插件jrebel正式版及破解版安装详细图文教程
2023-05-27 03:28:59
![](https://img.aspxhome.com/file/2023/0/108940_0s.png)
Spring如何解决单例bean线程不安全的问题
2023-12-18 23:50:20
![](https://img.aspxhome.com/file/2023/8/90008_0s.jpg)
Java Spring @Lazy延迟注入源码案例详解
2023-06-24 05:21:07
![](https://img.aspxhome.com/file/2023/3/61243_0s.jpg)
SpringBoot项目如何打war包问题详解
2023-06-07 08:33:47
![](https://img.aspxhome.com/file/2023/3/71593_0s.png)
Springboot配置security basic path无效解决方案
2023-07-12 21:42:50
c#中多线程访问winform控件的若干问题小结
2023-09-23 17:04:27
java自动生成编号的实现(格式:yyMM+四位流水号)
2023-10-10 09:24:36
java web开发之购物车功能实现示例代码
2023-01-24 16:52:55
![](https://img.aspxhome.com/file/2023/0/102640_0s.png)
C#里SuperSocket库不能发现命令的原因
2023-05-20 20:19:37
Redis 订阅发布_Jedis实现方法
2023-11-10 03:38:41
Java中的synchronized关键字
2023-07-28 18:39:26
java验证电话号码的方法
2023-04-01 21:44:41
struts2自定义拦截器的示例代码
2021-12-01 16:24:52
![](https://img.aspxhome.com/file/2023/3/78243_0s.jpg)
Java设计模式之抽象工厂模式浅析讲解
2022-08-08 18:26:47
C#中SQL参数传入空值报错解决方案
2023-12-14 14:28:59
Android中Canvas的常用方法总结
2021-11-25 03:00:28
![](https://img.aspxhome.com/file/2023/1/111721_0s.png)
mybatis 集合嵌套查询和集合嵌套结果的区别说明
2022-10-12 15:17:02
![](https://img.aspxhome.com/file/2023/8/71858_0s.png)
Mybatis-plus多租户项目实战进阶指南
2023-10-10 18:14:43
Android开发Compose集成高德地图实例
2022-09-05 01:44:28
![](https://img.aspxhome.com/file/2023/6/96766_0s.png)
c#实现汉诺塔问题示例
2023-08-09 13:20:02