unity 监测UI EventTrigger事件

2023-11-06

如果想控制 只是监听点击一次 :设置Image的 Raycast Target 的bool值(这样子就不用反复的注销,注册监听了,注销只在销毁的时候)

 

EventTrigger的所有事件类型
PointerEnter = 0 鼠标进入
PointerExit = 1 鼠标离开
PointerDown = 2 鼠标按下
PointerUp = 3 鼠标抬起
PointerClick = 4 鼠标点击(鼠标抬起时已不在原UI上时不会触发,在PointerUp之后调用)
Drag = 5 鼠标拖拽
Drop = 6 拖拽结束时鼠标不在被拖拽UI上并且在另外一个UI上时触发(在PointerUp之后)
Scroll = 7 滑轮滚动时
UpdateSelected = 8 被选中后的每一帧
Select = 9 在被选中时
Deselect = 10 结束选中时
Move = 11 按方向键时
InitializePotentialDrag = 12 初始化拖拽(在PointerDown之后,PoinerUp之前调用,点击就会调用)
BeginDrag = 13 拖拽开始(鼠标按下不移动不会触发)
EndDrag = 14 拖拽结束
Submit = 15 默认为Enter键
Cancel = 16 默认为Esc键
————————————————

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public struct EventCallbackData {
    public EventTrigger eventTrigger;
    public UnityAction<BaseEventData> callback;
}

public class EventTriggerListener : MonoBehaviour
{
   // public delegate void MouseEvent(BaseEventData data);

    public static Dictionary<string, EventCallbackData> eventDict = new Dictionary<string, EventCallbackData>();

    #region 事件管理

    /// <summary>
    /// 给目标物体添加响应事件
    /// </summary>
    /// <param name="target">目标物体</param>
    /// <param name="type">事件类型</param>
    /// <param name="call">响应函数</param>
    /// <param name="callId">响应函数的唯一标识符,用于后期移除事件</param>
    public static void AddListener(GameObject target, EventTriggerType type, UnityAction<BaseEventData> myFunction, string callId = null)
    {
        if (callId != null && eventDict.ContainsKey(callId))
        {
            Debug.LogError("响应函数标识符被占用:" + callId);
            return;
        }
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        if (!eventTrigger)
        {
            eventTrigger = target.AddComponent<EventTrigger>();
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        EventTrigger.Entry entry = new EventTrigger.Entry();
        bool isExist = false;
        for (int i = 0; i < entries.Count; i++)
        {
            if (entries[i].eventID == type)
            {
                entry = entries[i];
                isExist = true;
            }
        }
       // UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(call);
        if (callId != null)
        {
            EventCallbackData data = new EventCallbackData();
            data.callback = myFunction;
            data.eventTrigger = eventTrigger;
            eventDict.Add(callId, data);//添加事件信息进入字典
        }
        entry.callback.AddListener(myFunction);
        if (!isExist)
        {
            entry.eventID = type;
            eventTrigger.triggers.Add(entry);
        }
    }

    /// <summary>
    /// 移除指定的事件响应
    /// </summary>
    /// <param name="type">事件类型</param>
    /// <param name="callId">响应函数标识符</param>
    public static void RemoveListener(EventTriggerType type, string callId) {
        if (!eventDict.ContainsKey(callId))
        {
            Debug.LogError("事件移除失败!没有找到对应的事件标识符:" + callId);
            return;
        }
        EventCallbackData data = eventDict[callId];
        EventTrigger eventTrigger = data.eventTrigger;
        EventTrigger.Entry entry = GetEntry(eventTrigger,type);
        if (entry!=null)
        {
            entry.callback.RemoveListener(data.callback);
        }
    }

    /// <summary>
    /// 移除某一种事件的所有响应函数
    /// </summary>
    /// <param name="target">目标物体</param>
    /// <param name="type">事件类型</param>
    public static void RemoveListeners(GameObject target, EventTriggerType type)
    {
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        EventTrigger.Entry entry = GetEntry(eventTrigger, type);
        if (entry != null)
        {
            entry.callback.RemoveAllListeners();
        }
    }

    /// <summary>
    /// 移除物体身上所有的响应事件
    /// </summary>
    /// <param name="target">目标物体</param>
    public static void RemoveAllListeners(GameObject target)
    {
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        if (!eventTrigger)
        {
            return;
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        for (int i = 0; i < entries.Count; i++)
        {
            entries[i].callback.RemoveAllListeners();
        }
    }

    /// <summary>
    /// 获取指定事件的回调条目对象
    /// </summary>
    /// <param name="eventTrigger">EventTrigger组件</param>
    /// <param name="type">事件类型</param>
    /// <returns></returns>
    static EventTrigger.Entry GetEntry(EventTrigger eventTrigger,EventTriggerType type) {
        if (!eventTrigger)
        {
            return null;
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        for (int i = 0; i < entries.Count; i++)
        {
            if (entries[i].eventID == type)
            {
                return entries[i];
            }
        }
        return null;
    }

    #endregion


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity 监测UI EventTrigger事件 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • linux根据进程名称,查看后台任务的运行目录

    linux后台跑一堆python的时候想关闭一个程序都不知道哪个是哪个 使用ps ef也可以查看 不过内容比较多 容易误杀 所以我们改进一下 主要使用的命令有两个 pgrep 它可以列出所有这个进程名运行的进程id 比如pgrep pyth
  • HLSL Introduction

    By Chang Li High Level Shading Language HLSL a programming language for Graphic Processing Unit GPU in DirectX 9 10 11 s
  • VMware安装Linux后自动获取IP地址

    1 VMware网络连接设置为桥接模式 2 进入Linux系统 ifconfig查看IP地址信息 3 cd etc sysconfig network scripts 4 vim ifcfg eth0 5 ONBOOT yes 6 serv
  • smali文件对比java文件

    smali文件对比java文件 class 类名 super 父类 source 源文件名 implements 继承的接口 field 类成员变量 method 类方法 parameter 函数参数 p1 p2 locals x 局部变量
  • 活动目录服务详细操作

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 第一章 Active Directory与
  • 技术赋能水务数字化转型,上海市水旱灾害防御技术中心领导一行调研上海控安

    NEWS 3月1日下午 上海市水旱灾害防御技术中心主任张鹏一行莅临上海控安 对双方联合实验室建设及公司智慧水务板块业务进行调研指导 并就助力上海城市水务高质量发展及数字化转型相关工作展开交流讨论 上海控安总经理蒲戈光 首席信息官杨昆等平台公
  • 【旅行商问题】蚁群算法解决旅行商问题【Matlab】

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 旅行商问题 1 问题描述 2 数学模型 二 蚁群算法 1 引言 2 蚁群算法求解TSP原理 三 源代码 四 结果展示 五 备注 一 旅行商问题 1 问题描述 旅
  • 彻底卸载VMware虚拟机

    开始 gt 运行 gt regedit gt 找到HKEY LOCAL MACHINE gt Software gt VMware inc 把这个整个删除 关闭注册表后 重新运行VMware的安装文件 问题即可解决
  • 前端基础面试题(js、vue、react)

    文章目录 vue2面试题 js面试题 react面试题 vue2面试题 vue的双向绑定原理 双向绑定的原理也叫响应式原理 Vue它是采用数据劫持结合发布者 订阅者模式的方式 通过Object defineProperty 属性的sette
  • 【Redis】Centos7 如何正确的手动安装Redis,简单式安装

    安装包 手动官网下载 redis 4 0 1 tar gz 演示redis的版本 使用wget下载 centos 自带了wget wget http download redis io releases redis 4 0 1 tar gz
  • Acwing-870. 约数个数

    N的任何一个约数都是d的形式 而且d每一项的指数都不同 所以N的约数与 1 k的取法是一致的 N的每一个约数都对应了 1 k的一种取法 不同的取法对应不同的约数 由算数基本定理 每一个数的因式分解是唯一的 只要因式分解不一样 那么这两个数就
  • MySQL内置函数ifnull()

    ifnull mysql的一个内置函数 用于处理空值 NULL 如果不为 NULL ifnull 函数会返回第一个参数 否则返回第二个参数 例子 select ifnull select salary from Employee order
  • H5页面唤起关注公众号页面

    一 H5页面唤起关注公众号页面 上面已经说明如何判断用户是否已经关注公众号 那如何唤起关注页面 也就是如何跳转到关注页面引导用户关注呢 主要分为以下几个步骤 1 登录微信公众平台 2 点击微信号头像右击查看源代码 3 找到源代码中以下代码
  • 二极管详解

    一 基本概念 二极管由管芯 管壳和两个电极构成 管芯就是一个PN结 在PN结的两端各引出一个引线 并用塑料 玻璃或金属材料作为封装外壳 就构成了晶体二极管 如下图所示 P区的引出电极称为正极或阳极 N区引出的电极称为负极或阴极 1 二极管的
  • 【LVGL 学习】加入内部字体

    使用到的软件 LvglFontTool exe 字符转换工具 链接 http www lfly xyz forum php mod viewthread tid 24 extra page 3D1 软件界面 按照软件界面配置 1 打开lvg
  • 【卷积神经网络】卷积层,池化层,全连接层

    转于 入门PyTorch 卷积层是卷积神经网络的核心 大多数计算都是在卷积层中进行的 1 卷积层 1 1 概述 首先介绍卷积神经网络的参数 这些参数是由一些可学习的滤波器集合构成的 每个滤波器在空间上 宽度和高度 都比较小 但是深度和输入数
  • Spring Boot + Vue 开发网易云,QQ音乐(附源码)!

    来源 segmentfault com a 1190000021376934 前言 虽然 B S 是目前开发的主流 但是 C S 仍然有很大的市场需求 受限于浏览器的沙盒限制 网页应用无法满足某些场景下的使用需求 而桌面应用可以读写本地文件
  • Markdown嵌入视频

    博客 安卓之家 微博 追风917 CSDN 蒋朋的家 简书 追风917 博客园 追风917 操作 今天看到别人github里可以看youtube视频 小白表示惊呆了有木有 于是乎 于是乎 查看了下人家的代码 表示不懂 然后搜索了下 瞬间正能
  • 职场篇—从网络安全行业人才需求讲个人规划

    如果你是一名正在找工作的网络安全方向大学生 或者是刚刚踏入网络安全领域的新手 这篇文章很适合你 如果你是一名老网安人 看看有哪些你中招了 当你打开BOSS直聘 拉钩等招聘类网站后 在首页的快速导航页面很难找到关于网络安全岗位招聘的引导信息
  • unity 监测UI EventTrigger事件

    如果想控制 只是监听点击一次 设置Image的 Raycast Target 的bool值 这样子就不用反复的注销 注册监听了 注销只在销毁的时候 EventTrigger的所有事件类型 PointerEnter 0 鼠标进入 Pointe