用扩展方法来实现EventTrigger中事件的异步等待

news2024/11/28 20:43:31

一、什么是扩展方法?

扩展方法是一种C#语言提供的功能,允许我们向现有类型添加新的方法,而无需修改类型的源代码。扩展方法的优缺点如下:

二、它有什么优点?

1、不需要修改源类型的代码:使用扩展方法可以向现有类型添加新的方法,而无需修改类型的源代码。这使得我们可以对第三方库或系统类型进行扩展,而无需获取其源代码或进行修改。这可以减少代码维护的工作量和风险。

2、提高代码的可读性:使用扩展方法可以使代码更加简洁和易读。通过将通用的功能封装在扩展方法中,我们可以消除代码中的冗余和重复,从而使代码更加清晰和易于理解。

3、支持链式调用:扩展方法可以支持链式调用,使代码更加简洁和易读。通过在一个方法中返回this,我们可以使其它方法可以直接在该方法的返回值上进行调用,从而实现链式调用的效果。

三、它有什么缺点?

1、可能会引起命名冲突:由于扩展方法是静态方法,它们的名称必须是唯一的。如果我们在不同的命名空间中定义了具有相同名称和签名的扩展方法,那么在使用时可能会发生命名冲突,导致编译错误或运行时错误。

2、可能会引起误解:使用扩展方法可以使代码更加简洁和易读,但也可能会使代码更加晦涩和难以理解。如果我们在不同的代码中定义了许多扩展方法,可能会使代码难以理解和维护。

3、可能会影响性能:扩展方法是静态方法,它们的调用需要通过静态方法调用的方式进行。这可能会影响性能,特别是在频繁调用的情况下。但是,这种影响通常非常小,不会对应用程序的性能产生显著影响。

四、扩展方法就像一个人体的外骨骼

图片来自网络,侵删
【网络图片,侵删】

1、类似于外骨骼,扩展方法可以提供一些额外的功能和支持,使得我们能够更加高效地完成任务,从而提高我们的生产力和效率。同时,扩展方法也可以使我们的代码更加简洁和易于理解,从而提高代码的可读性和可维护性。

2、然而,就像外骨骼可能会增加残疾人的负担和复杂性一样,扩展方法也可能会增加代码的复杂性和难度。如果不适当使用扩展方法,可能会引入一些新的问题和错误,从而影响程序的性能和正确性。因此,使用扩展方法时,需要谨慎权衡和选择,以充分发挥其优势并避免潜在的问题。

四、实现EventTrigger上所有事件的异步等待方法

1、实现的过程:

  • 判断EventTrigger是否存在,没有则添加
  • 定义一个委托MyAction
  • 定义一个方法fn
  • 绑定委托MyAction+=fn
  • EventTrigger添加一个事件绑定,MyAction.invoke
  • 等待触发
  • 撤销委托绑定
  • 回收资源

2、代码

public static class ExtensionMethod
{
    /// <summary>
    /// 物体的EventTrigger事件触发异步方法
    /// </summary>
    /// <param name="gameObject">要互动的物体</param>
    /// <returns></returns>
    public static async UniTask OnEventTriggerAsync(this GameObject gameObject, EventTriggerType eventType)
    {
        //添加组件
        var hasEventTrigger = gameObject.GetComponent<EventTrigger>() != null;
        if (!hasEventTrigger) gameObject.AddComponent<EventTrigger>();
        bool triggered = false;

        //委托及实例方法
        Action myAction = null;
        Action fn = () =>
        {
            triggered = true;
        };

        //委托绑定
        myAction += fn;

        //事件触发
        gameObject.GetComponent<EventTrigger>().AddListener(eventType, (PointerEventData eventData) =>
        {
            if (myAction != null)
            {
                //Debug.Log("事件触发");
                myAction.Invoke();
            }
        });

        //等待事件触发
        await UniTask.WaitUntil(() => triggered == true);
        Debug.Log("");

        //取消绑定
        myAction -= fn;

        //资源清理:如果代码是并发执行,可能会把别人动态添加的eventTrigger销毁掉,所以建议不销毁
        //if (!hasEventTrigger) GameObject.DestroyImmediate(gameObject.GetComponent<EventTrigger>());
        return;
    }
}

五、测试

using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;

public class Test : MonoBehaviour
{
    public GameObject cube;

    // Start is called before the first frame update
    void Start()
    {
        WaitEvent();
    }

    private async UniTask WaitEvent()
    {
        while (true)
        {
            //等待拖动
            await cube.OnEventTriggerAsync(EventTriggerType.Drag);
            Debug.Log("拖动发生");
            //等待点击
            await cube.OnEventTriggerAsync(EventTriggerType.PointerClick);
            Debug.Log("点击发生");
        }
    }
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工具-Snipaste与ScreenToGif 生产力工具,对截图进行勾画操作,并可将截图贴至电脑任意界面;快捷动态截图成gif

文章目录 1、演示1.1 snipaste1.2 ScreenToGif 2、操作2.1 snipaste2.2 ScreenToGif 1、演示 1.1 snipaste 1.2 ScreenToGif 2、操作 2.1 snipaste 进入官网&#xff0c;可根据系统进行下载 https://zh.snipaste.com/ 傻瓜式安装成功后&#xff0c;电脑的右下角有个小图标&a…

兰林:科技赋能健康产业 助力乡村振兴建设

万民健康创始人 万民智养中医创始人 万民星农CEO兰林 党建引领谋发展 &#xff0c; 旗帜下乡促振兴 。 乡村振兴&#xff0c;健康先行。自党的十八大以来&#xff0c;国家卫健委贯彻落实“以基层为重点”的党的卫生与健康工作方针&#xff0c;推动医疗卫生工作重心下移、资源下…

Springboot +Flowable,通过代码绘制流程图并设置高亮

一.简介 通过代码绘制一张流程图&#xff0c;并设置成高亮。 首先先来看一下绘制出来的效果图&#xff0c;截图如下&#xff1a; 已经执行的节点和连线用红色标记出来&#xff0c;大致上就是这么一个效果。 二.怎么实现 将一个流程图绘制成图片&#xff0c;相关的 API 在…

倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术

倾斜摄影超大场景的三维模型的顶层合并的轻量化处理技术 倾斜摄影超大场景的三维模型的顶层合并需要进行轻量化处理&#xff0c;以减小数据量和提高数据的传输和展示性能。以下是几种常用的轻量化处理技术&#xff1a; 1、网格简化&#xff1a;对三角面片数量过多的模型进行网…

10个常用的软件测试工具,你不容错过

在现代软件开发中&#xff0c;软件测试是不可或缺的一部分。为了确保软件产品的质量和稳定性&#xff0c;软件测试工具成为了测试团队的得力助手。 有许多优秀的软件测试工具可以帮助测试人员在各种测试活动中提高效率和准确性。 本文将介绍10个常用的软件测试工具&#xff0c;…

LeetCode第141题——环形链表(Java)

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…

多线程|基于阻塞队列和环形队列的生产者消费者模型架构

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; Linux专栏https://blog.csdn.net/yu_cblog/category_11786077.html?spm1001.2014.3001.5482操作系统专栏https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482手撕数据结构https:/…

办公软件中可以使用chatGPT吗?

随着ONLYOFFICE新品协作空间的发布&#xff0c;有很多朋友已经开始在工作区或桌面版用上chatGPT的朋友担心&#xff0c;在协作空间是否也可以正常使用chatGPT&#xff0c;我可以很负责的告诉大家&#xff0c;完全可以正常使用。 什么是ONLYOFFICE协作空间&#xff1f; 简言之&…

Java8新特性--Lambda表达式

一、简述 Lambda 表达式&#xff0c;也可称为闭包&#xff0c;它 允许把函数作为一个方法的参数 (函 数作为参数传递进方法中) Lambda 简化了匿名内部类的形式&#xff0c; 可以达到同样的效果&#xff0c;匿名内部类在 编译之后会创建一个新的匿名内部类 出来&#xff0c;而 L…

Daftart.ai:人工智能专辑封面生成器

前言 Daft Art AI是一款使用人工智能技术来帮助您制作专辑封面的软件&#xff0c;它可以让您在几分钟内&#xff0c;用简单的编辑器和精选的美学风格&#xff0c;为您的专辑或歌曲创建出惊艳的高质量的艺术品。Daft Art AI有以下几个特点&#xff1a;简单易用&#xff1a;您只…

CVE漏洞复现-CVE-2019-11043-PHP-FPM 远程代码执行漏洞

CVE-2019-11043-PHP-FPM 远程代码执行漏洞 漏洞描述 来自Wallarm的安全研究员Andrew Danau在9月14-16号举办的Real World CTF中&#xff0c;意外的向服务器发送%0a(换行符)时&#xff0c;服务器返回异常信息。由此发现了这个0day漏洞 当Nginx使用特定的 fastcgi 配置时&…

Java学习14(ThreadLocal详解)

对于ThreadLocal&#xff0c;大家的第一反应可能是很简单呀&#xff0c;线程的变量副本&#xff0c;每个线程隔离。那这里有几个问题大家可以思考一下&#xff1a; ThreadLocal的 key 是弱引用&#xff0c;那么在 ThreadLocal.get()的时候&#xff0c;发生GC之后&#xff0c;k…

Python小姿势 - # 如何在Python中实现基本的数据类型

如何在Python中实现基本的数据类型 Python是一门面向对象的编程语言&#xff0c;基本的数据类型包括整数、浮点数、字符串、布尔值、列表、元组、字典等。 整数是最基本的数据类型&#xff0c;一个整数可以是任意大小的&#xff0c;只要内存允许。 浮点数也称为实数&#xff0c…

Ubuntu/CentOS 安装gitlab

直接用命令 sudo apt install gitlab-ce 安装最新版 也可以用sudo apt-get install gitlab-ce15.10.2-ce.0 指定要安装的版本&#xff0c;具体参考https://forum.gitlab.com/t/installing-older-versions-of-gitlab-on-ununtu/29507 如果已经安装&#xff0c;可以把原来版本卸…

QT QVBoxLayout 垂直布局控件

本文详细的介绍了QVBoxLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、添加控件、布局控件、显示控件、添加空白行、设置间距 、添加间距、设置位置、设置外边距、设置边距、添加固定宽度、方向上、方向下、方向左、方向右等等、 样式表等操作。 实际开发中&#…

Qt | 实现一个简单的可以转动的仪表盘

环境&#xff1a;vs2017Qt5.14.2 效果图&#xff1a; 准备工作&#xff1a; 效果图中的可以转动的仪表盘效果分为三个部分&#xff1a; 背景图&#xff08;就是带去掉中间白色原点&#xff0c;去掉中间蓝色指针省下的部分&#xff09;&#xff1b;指针图片&#xff08;中间蓝…

客户端发布后,一体机无法下载和安装

一、问题描述&#xff1a;客户端和服务端在不同网段&#xff0c;可以ping通IP&#xff0c;但是主机名ping不通&#xff0c;客户端提示『OPC 找不到主机名』 解决方法&#xff1a; 修改客户端机器的『hosts』文件&#xff0c;路径为&#xff1a; 『C:\Windows\System32\driver…

【初学人工智能原理】【2】方差代价函数:知错

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白&#xff0c;由于缺少图片可能无法理解&#xff0c;故放到了最后&#xff0c;建议直接看代码&#xff08;代码放到了前面&#xff09;。 代码实…

一、linux系统基础

一、搭建Linux学习环境 如何安装linux操作系统: (1)安装独立的Linux系统,不再安装其他操作系统。 (2)安装Windows与Linux并存的多操作系统,启动时通过菜单选择要启动的操作系统。 (3)在虚拟机中安装Linux操作系统。 本次学习采用第三种方式,在虚拟机中安装linux操…

清理 C 盘空间最简单的方法

目录 一、清理C盘空间 二、删除休眠文件 三、删除软件缓存 四、清理临时文件 一、清理C盘空间 Windows系统内置的磁盘&#xff0c;都带有清理功能&#xff0c;我们可以先来清理磁盘空间&#xff0c;鼠标选择C盘&#xff0c;右键【属性】&#xff0c;可以看到有个【磁盘清理…