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

news/2024/11/8 14:49:03/

一、什么是扩展方法?

扩展方法是一种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 updatevoid Start(){WaitEvent();}private async UniTask WaitEvent(){while (true){//等待拖动await cube.OnEventTriggerAsync(EventTriggerType.Drag);Debug.Log("拖动发生");//等待点击await cube.OnEventTriggerAsync(EventTriggerType.PointerClick);Debug.Log("点击发生");}}
}

请添加图片描述


http://www.ppmy.cn/news/56365.html

相关文章

Spring--AOP详细介绍--和详细代码演示证明理解

目录 Spring--AOP详细介绍 基本介绍 代码演示—入门 需求说明 定义一个接口类Vehicle 定义一个实现接口类的Car类 定义一个实现接口类的Ship类 创建测试类Test.java 来思考一下&#xff0c; 解决方案-动态代理方式-2 修改 Car类 修改 Ship类 创建VehicleProxyProvid…

Packet Tracer - 静态路由故障排除

Packet Tracer - 静态路由故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 172.31.1.1 255.255.255.128 不适用 S0/0/0 172.31.1.194 255.255.255.252 不适用 R2 G0/0 172.31.0.1 255.255.255.0 不适用 S0/0/0 172.31.1.193 255.255…

开源,点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现

GitHub地址&#xff1a;point-cloud-viewer GitCode地址&#xff1a;point-cloud-viewer 文章目录 使用教程以及相关工具库Step 1 搭建环境Step 2 使用Cmake构建工程Step3 使用VS 编写code并编译执行 点云处理及三维重建软件(PCV)的设计与实现一&#xff0c; 软件总体设计1.1 软…

Android 9.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在9.0的系统rom原生开发中,在产品对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中 最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

【id:58】【20分】C. 复数运算(友元函数)

时间限制 1s 内存限制 128MB 题目描述 复数类的声明如下&#xff1a; class Complex { private: double real; // 实部 double imag; // 虚部 public: Complex(); Complex(double r, double i); // 友元函数&#xff0c;复数c1 c2(二参数对象相加) friend Complex addCom(co…

【Linux】入门介绍

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注​ 目录 前言 Linux背景介绍 1.发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 官网 4. 企业应用现状 5. 发行版…

如何理解自动化测试数据驱动与关键字驱动的区别?

一、关键字驱动KDT(Keyword-driven testing) 1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段&#xff0c;它是当前比较流行的一种框架之一&#xff0c;并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保…

JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码

以下为实现通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积的代码和运行截图 目录 前言 一、通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以…