Unity--UI事件触发器--EventTrigger

Unity–事件触发器–EventTrigger

1.EventTrigger简介

EventTrigger是Unity中用于处理UI事件的一个组件。它允许我们为UI元素(如按钮、图像等)添加事件监听器,从而响应各种交互事件,如鼠标点击、悬停、拖拽等。使用EventTrigger可以避免手动编写复杂的事件处理代码,使UI事件的响应更加简洁和易于管理。比手写UI的Event快很多,方便很多.

2.EventTrigger的使用步骤:

  1. 添加EventTrigger组件
    • 选择UI元素(如Image或Button)。
    • 在Inspector窗口中,点击“Add Component”。
    • 搜索并添加“EventTrigger”组件。
  2. 创建EventTrigger.Entry对象
    • 在脚本中,为每种需要监听的事件创建一个EventTrigger.Entry对象。
  3. 设置EventID和回调函数
    • 为每个EventTrigger.Entry对象设置eventID,这是一个枚举类型,表示不同的事件类型(如PointerEnterPointerClick等)。
    • 通过callback.AddListener方法添加回调函数。这些函数将在事件发生时被调用。
  4. 将Entry对象添加到EventTrigger
    • 将每个EventTrigger.Entry对象添加到EventTrigger组件的triggers列表中。
  5. 实现回调函数
    • 在脚本中实现回调函数,处理事件。例如,我们可以改变UI元素的颜色、播放声音或更新游戏状态。

示例代码:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class EventTriggerExample : MonoBehaviour
{public Image myImage;void Start(){// 获取EventTrigger组件EventTrigger eventTrigger = myImage.GetComponent<EventTrigger>();// 创建EventTrigger.Entry对象EventTrigger.Entry entry = new EventTrigger.Entry();// 设置事件IDentry.eventID = EventTriggerType.PointerClick;// 添加回调函数  也可以写拉姆达表达entry.callback.AddListener((data) => { OnPointerClick((PointerEventData)data); });// 将Entry添加到EventTriggereventTrigger.triggers.Add(entry);}// 回调函数实现public void OnPointerClick(PointerEventData data){Debug.Log("Image clicked!");// 这里可以添加点击事件的逻辑}
}

在上面的代码中,当我们点击myImage时,OnPointerClick函数将被调用,并输出一条消息到控制台。
EventTrigger非常适合处理简单的UI交互,特别是当我们需要为多个UI元素添加相同类型的事件处理时。它提供了一种清晰、模块化的方法来管理UI事件。

3.白话版本

由于UI的Event都要自己写, 非常麻烦. 为了解决这个问题, Unity将UI中的Event写了一个类,这个类包含了许多UI响应事件, 那么我们只需要这用这个类中的方法就可以快速自定义UI的响应事件. 这就是EventTrigger.

这个组件是处理UI事件的一种便捷方式,因为它允许我们通过添加事件监听器来响应不同的事件,而不需要手动编写每个事件的监听代码

现在有一个Image上,我们需要实现鼠标进入 离开和点击的事件响应. 那么需要再Image上添加EventTrigger组件.

然后再自己代码中获得Image上的EventTrigger组件.

简略步骤

  1. 获得EventTrigger组件
  2. 声明EventTrigger组件中的内部类Entry对象
  3. 设置Entry的EventID和callback函数
  4. 将声明好的Entry对象添加到EventTrigger中的List类型的列表trigger中即可

需要注意的是Entry中的EventID是一个枚举类型, 里面包含了常用的操作. 以下是具体的ID名称和值

 public enum EventTriggerType{PointerEnter = 0,PointerExit = 1,PointerDown = 2,PointerUp = 3,PointerClick = 4,Drag = 5,Drop = 6,Scroll = 7,UpdateSelected = 8,Select = 9,Deselect = 10,Move = 11,InitializePotentialDrag = 12,BeginDrag = 13,EndDrag = 14,Submit = 15,Cancel = 16}

同时,callback回调函数使用.AddListener的方式进行添加函数. 其中参数是一个BaseEventData. 根据自己的需要可以将参数转换为自己需要的类型, 比如鼠标的位置, 将BaseEventData类型转换为PointerEventData.

例如以下代码是获得数鼠标进入时候的坐标x和y

private void OnPointerExit(BaseEventData eventData)
{// 转换数据类型PointerEventData pointerEventData = eventData as PointerEventData;Debug.Log("鼠标进入位置:" + "x =" + pointerEventData.position.x + " y=" + pointerEventData.position.y);
}

具体代码如下:

1.获得EventTrigger组件

image = this.transform.Find("Image").GetComponent<Image>();
EventTrigger eventTrigger = image.GetComponent<EventTrigger>();

2.声明EventTrigger组件中的内部类Entry对象

enterEntry = new EventTrigger.Entry();

3.设置Entry的EventID和callback函数

enterEntry.eventID = EventTriggerType.PointerEnter; // 设置事件ID
enterEntry.callback.AddListener(OnPointerEnter);	// 设置事件响应函数// 事件响应函数
private void OnPointerEnter(BaseEventData eventData)
{// 自定义逻辑// 根据需求将 eventDataeventData 进行类型转换}

4.将声明好的Entry对象添加到EventTrigger中的List类型的列表trigger中即可

eventTrigger.triggers.Add(enterEntry);

完成代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class EventTriggerTest : MonoBehaviour
{// private Image image;//  1. 声明EventTrigger中的内部类private EventTrigger.Entry enterEntry;private EventTrigger.Entry exitEntry;private EventTrigger.Entry clickEntry;private EventTrigger eventTrigger;void Start(){image = this.transform.Find("Image").GetComponent<Image>();eventTrigger = image.GetComponent<EventTrigger>();// 鼠标进入//2. 给内部类添加事件ID和监听函数enterEntry = new EventTrigger.Entry();enterEntry.eventID = EventTriggerType.PointerEnter;enterEntry.callback.AddListener(OnPointerEnter);// 鼠标离开exitEntry = new EventTrigger.Entry();exitEntry.eventID = EventTriggerType.PointerExit;exitEntry.callback.AddListener(OnPointerExit);// 鼠标点击clickEntry = new EventTrigger.Entry();clickEntry.eventID = EventTriggerType.PointerClick;clickEntry.callback.AddListener(OnPointerClick);// 3.添加到 image中的EventTriggereventTrigger.triggers.Add(enterEntry);eventTrigger.triggers.Add(exitEntry);eventTrigger.triggers.Add(clickEntry);}private void OnPointerClick(BaseEventData eventData){Debug.Log("鼠标点击");image.color = Color.red;}private void OnPointerExit(BaseEventData eventData){// 转换数据类型// 3. 根据需求获取相关数据PointerEventData pointerEventData = eventData as PointerEventData;Debug.Log("鼠标离开位置:" + "x =" + pointerEventData.position.x + " y=" + pointerEventData.position.y);}public void OnPointerEnter(BaseEventData eventData){// 转换数据类型PointerEventData pointerEventData = eventData as PointerEventData;Debug.Log("鼠标进入位置:" + "x =" + pointerEventData.position.x + " y=" + pointerEventData.position.y);}// Update is called once per framevoid Update(){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nfs和web服务器的搭建

&#xff08;一&#xff09;web服务器的搭建 1.配置基本环境 要点有&#xff0c;yum源&#xff0c;包含nginx和阿里云&#xff08;或者腾讯云或者华为云&#xff09;&#xff0c;这里的相关知识可以参考之前的yum配置笔记 2.安装nginx yum -y install nginx 3.验证并且开启服…

源码编译安装,及nginx服务控制、监控块

1.源码编译安装&#xff1a; [root17dns ~]# wget https://nginx.org/download/nginx-1.27.0.tar.gz 2.解压&#xff1a; [root17dns ~]# tar -zxvf nginx-1.27.0.tar.gz 3.安装gcc等工具 [root17dns ~]# yum -y install gcc gcc-c [root17dns ~]# yum -y install make lrzsz …

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; 本次钉钉杯大数据挑战赛的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

如何学习Doris:糙快猛的大数据之路(从入门到专家)

引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…

Django实战:开启数字化任务管理的新纪元

&#x1f680; Django实战&#xff1a;开启数字化任务管理的新纪元 &#x1f310; &#x1f4d6; 引言 在数字化转型的浪潮中&#xff0c;任务管理的智能化成为提升组织效能的关键。今天&#xff0c;我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…

双指针-【3,4,5,6,7,8】

第三题&#xff1a;快乐数 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想&#xff1a; 1.每个…

SpringBoot上传超大文件导致OOM,完美解决办法

问题描述 上传大文件报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] …

调用百度的大模型API接口实现AI对话!手把手教程!

本文介绍如何使用百度的大模型API接口实现一个AI对话项目 1 注册百度云 2 获取API接口 3 配置环境 4 代码编写与运行 5 chat models 1 注册百度云 搜索百度云&#xff0c;打开官网注册&#xff0c;充值一点点大米&#xff08;收费很低&#xff0c;大概生成几个句子花费一毛…

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分&#xff0c;具有公网IP的服务器我们简称为服务端&#xff0c;内网的服务器我们可以简称为客户端&#xff0c;frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…

好的STEM编程语言有哪些?

STEM是科学&#xff08;Science&#xff09;&#xff0c;技术&#xff08;Technology&#xff09;&#xff0c;工程&#xff08;Engineering&#xff09;&#xff0c;数学&#xff08;Mathematics&#xff09;四门学科英文首字母的缩写&#xff0c;STEM教育简单来说就是在通过在…

如何通过✅ IPIDEA代理IP,轻松实现数据采集和市场拓展工作(下)

如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作 如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作前言IPIDEA爬虫实战实战Demo演示总结 如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作 前言 在当今全球化市场的…

微信小游戏之三消(三)道具相关方法

设计一个 game class。负责了游戏的核心控制逻辑&#xff0c;包括游戏状态管理、方块和道具的生成与效果处理&#xff0c;以及游戏的重新开始和复活流程。通过这些方法&#xff0c;脚本实现了游戏的基本玩法和用户交互。 主要游戏控制方法 gameStart()&#xff1a;开始游戏&am…

MySQL常见指令

MySQL中的数据类型 大致分为五种&#xff1a;数值&#xff0c;日期和时间&#xff0c;字符串&#xff0c;json&#xff0c;空间类型 每种类型也包括也一些不同的子类型&#xff0c;根据需要来选择。 如数值类型包括整数类型和浮点数类型 整数类型根据占用的存储空间的不同 又…

Cocos Creator2D游戏开发(7)-飞机大战(5)-让子弹飞

飞机大战(5)-碰撞及积分 参考敌机的生成 子弹由飞机生成,放在player_node节点子弹重复使用,要使用预制体;子弹新增了动画 ①创建一个预制体 命名为playerBullet_prefab ② 双击预制体将bullet1图片拖入预制体 保存,关闭(场景编辑器里面的) ③ 发射子弹 player加入代码 prop…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

Spring验证码

前言&#xff1a;使用Hutool 1.什么是Hutool&#xff1f; 2.代码复制到test类中 3.代码爆红&#xff0c;说明需要引入依赖 4.根据名取Maven仓库相关依赖 5.在pom.xml文件中进行配置 6.引入成功 7. 运行程序 打开d盘&#xff0c;发现已经生成了验证码的图片&#xff0c;路径在…

Codeforces Round 654 (Div. 2) C. A Cookie for You (模拟)

我认为这道题就是个脑筋急转弯。 首先我们知道当a b < n m的时候&#xff0c;饼干总数都不够人的总数&#xff0c;那肯定是NO。 并且注意题干&#xff0c;我们可以得知当a b的时候&#xff0c;第一类和第二类人可以任意选两种饼干中的一种。 之后我们可以分类讨论一下。 …

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…