Unity 按钮事件封装操作(EventTriggerListener)
作者:DaLiangChen 发布时间:2022-07-08 10:07:08
标签:Unity,按钮,封装
我就废话不多说了,大家还是直接看代码吧~
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


猜你喜欢
- 享元模式概述享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现。属于结构型模式。类似于线程池,线程池可以避免
- 偶然在项目中用到播放视频时,需要横屏将视频全屏播放,所以需要监听屏幕的横竖屏切换事件。横竖屏切换监听效果: ConfigChang
- 本文介绍了idea 创建 maven web 工程流程(图文教程),分享给大家,具体如下:1创建一个project工作区间;2.创建一个ma
- 1.static静态变量1.静态变量被同一个类的所有对象共享2.static类变量在类加载的时候就生成使用static保存在class实例的
- IDEA版本:2020.3具体步骤一、开启IDEA的自动编译【静态】1.File->Settings。2.直接搜索Compiler,选
- volatile变量volatile是Java的关键词,我们可以用它来修饰变量或者方法。为什么要使用volatilevolatile的典型用
- 概述在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本
- @Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在
- 代码入下:import java.io.*; public class Practice { publ
- 由于之前一直在使用spring-boot开发,但一直苦恼于不知道如何利用debug调试代码.在网上查找了很多文章之后。学习之余决定把spri
- 1.1 JDK 14详细概述JDK 8 已经在 2014年 3月 18日正式可用,JDK 8作为长期支持(Long-Term-Support
- 首先,在main方法的类上添加注解:@ServletComponentScan(basePackages = "applicati
- 学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看。按照惯例,先看效果图,再决定要不要往
- 场景重现:1.微信小程序向后台发送请求 ——而后台web采用的springSecuriry没有token生成,就会拦截请求,,所以小编记录下
- 看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决
- Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相
- 什么是JWT,它是一种对API的保护方案,为什么要进行保护呢防泄漏:你肯定不希望你的数据能被别人随意调用,比如公司的机密信息,不可能每个人都
- 前言最近开发中用到许多对话框,之前都是在外面的代码中创建AlertDialog并设置自定义布局实现常见的对话框,诸如更新提示等含有取消和删除
- Consumer消费者Demo示例<?xml version="1.0" encoding="UTF-8
- 一、前言WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现。我们先看一下IP地址输入控件有什么特性:输满三个数字焦点会往右移键盘←