unity中用异步的whenAny,实现:当点击铲子任一部件,拾取整个铲子

news2025/1/16 2:04:16

一、铲子的组成

铲子包含很多部件组成,当拾取铲子的时候,只要点击铲子的任意一个部件就可以。
如图,点击【木柄】、【螺母】、【铁铲】都可以拾取该物体。
请添加图片描述
(1)打开高亮
(2)等待土铲被点击:任一部件被点击即可
(3)关闭高亮,取走土铲

二、实现的思路

用异步实现:等待任意一个部件被点击

  • 1、whenAny的关键代码:等待任意一个子部件被点击
    注意如何用select来包装一个任务列表
var allTasks = mamoty.GetComponentsInChildren<Transform>().Select(t => t.gameObject.OnClickAsync());
await UniTask.WhenAny(allTasks);
  • 2、物体被点击的异步实现
    (1)配合Collider碰撞体使用
    (2)注意组件和委托的清理
    /// <summary>
    /// 3D物体的异步点击方法
    /// </summary>
    /// <param name="gameObject"></param>
    /// <returns></returns>
    public static async UniTask OnClickAsync(this GameObject gameObject, EventTriggerType eventType = EventTriggerType.PointerClick)
    {
        //碰撞体判断
        if (!gameObject.GetComponent<Collider>()) Debug.LogWarning($"{gameObject}建议加上相应形状的collider组件");

        //添加组件
        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)
            {
                myAction.Invoke();
            }
        });

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

        //取消绑定
        myAction -= fn;

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

三、土铲拾取的主要流程

 //取土铲
 FlowGetMamoty = async () =>
  {
      //打开高亮
      if (mamoty.GetComponent<Highlighter>() == null) mamoty.AddComponent<Highlighter>();
      mamoty.GetComponent<Highlighter>().tween = true;

      //等待土铲被点击:任一部件被点击
      var allTasks = mamoty.GetComponentsInChildren<Transform>().Select(t => t.gameObject.OnClickAsync());
      await UniTask.WhenAny(allTasks);
      
      //关闭高亮,取走土铲 
      mamoty.GetComponent<Highlighter>().tween = false;
      await mamoty.DoMove(openedPos, closedPos, closeDuration);
  };

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

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

相关文章

为什么要通过API接口来获取数据

API接口&#xff08;应用编程接口 application/programming接口&#xff09;&#xff0c;准许应用程序通过定义的接口标准来访问另一个应用程序或服务的编程方式。简单来说&#xff0c;API就是两个软件或系统之间的通信语言或接口。 在当今的互联网时代&#xff0c;数据无处不…

Geospatial和Redis事务操作

一、Geospatial 1.简介 基于位置信息服务 (Location-Based Service,LBS) 的应用。 Redis3.2 版本后增加了对 GEO 类型的支持。主要来维护元素的经纬度。redis 基于这种类型&#xff0c;提供了经纬度设置、查询、范围查询、距离查询、经纬度hash等一些相关操作。 2.GEO底层结构…

DataEase 数据源插件分享 - 时序数据库 InfluxDB

前言 InfluxDB 是一个时序数据库&#xff0c;使用的是非标准的 SQL 语法&#xff0c;我使用 DataEase 的插件扩展机制开发了此数据源插件&#xff0c;在这里共享出来&#xff0c;想用的朋友可以下载安装使用。 插件包下载地址 https://north-dataease-1251506367.cos.ap-bei…

Centos 7.X WordPress博客网站详细教程 FTP/PHP/mysql/Apache环境构建

此教程适用于服务器系统为centos 7.x&#xff0c;php安装版本为7.4&#xff0c;mysql安装本部为5.7. 一、mysql安装 1.1 安装三个工具 yum install wget yum install vim yum install unzip 1.2 下载并安装msql 在线下载安装包&#xff1a; wget https://dev.mysql.com/g…

JZS-7/221静态可调延时中间继电器 JOSEF约瑟

JZS-7/2系列静态可调延时中间继电器品牌&#xff1a;JOSEF约瑟型号&#xff1a;JZS-7/2名称&#xff1a;静态可调延时中间继电器额定电压&#xff1a;48380V触点容量&#xff1a;10A/250V返回系数&#xff1a;≤15%延时范围&#xff1a;15ms3s15ms5s15ms10s JZS-7/2系列静态可…

SQL中使用的运算符号详解

文章目录 前言1. 算术运算符加法与减法运算符乘法与除法运算符求模&#xff08;求余&#xff09;运算符 2. 比较运算符1&#xff0e;等号运算符2&#xff0e;安全等于运算符3&#xff0e;不等于运算符4. 空运算符5. 非空运算符6. 最小值运算符7. 最大值运算符8. BETWEEN AND运算…

射频功率放大器(RF PA)线性化技术及分类介绍

基本概念 射频功率放大器(RF PA)是发射系统中的主要部分&#xff0c;其重要性不言而喻。在发射机的前级电路中&#xff0c;调制振荡电路所产生的射频信号功率很小&#xff0c;需要经过一系列的放大&#xff08;缓冲级、中间放大级、末级功率放大级&#xff09;获得足够的射频功…

Zabbix“专家坐诊”第190期问答汇总

问题一 Q&#xff1a;请问为啥用拓扑图监控交换机接口流量&#xff0c;获取不到数据&#xff0c;显示未知&#xff0c;键值也没错 &#xff0c;最新数据也能看到&#xff0c;是什么原因呢&#xff1f; A&#xff1a;把第一个值改成主机名。 问题二 Q&#xff1a;请问下zabbi…

如何进行AI换脸,AI换脸从 “0“ 到 “1” 详细教程 ——从配置环境开始

后续文章读起来可能会影响观看可以前往鄙人博客查看&#xff1a;http://www.anyuer.club/?id199 前言&#xff1a; 本人吃计算机这口饭的&#xff0c;说实话AI换脸很火的时候自己却没碰&#xff0c;挺吃亏的&#xff0c;最近时间比较充裕&#xff0c;整理了一下AI换脸的一个简…

Pyecharts 输出到 html 白屏?终极解决方案来了。

问题起因 公司内部网络&#xff0c;想要做个饼图输出到 html 。 找了教程&#xff1a;https://pyecharts.org/#/zh-cn/quickstart 我看教程写得这么规范&#xff0c;直接 CtrlC&#xff0c;CtrlV&#xff0c;百度来的代码怎么可能会有问题嘛&#xff01; 人生处处有惊喜。 样…

SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

场景 设计模式-策略模式在Java中的使用示例&#xff1a; 设计模式-策略模式在Java中的使用示例_java 策略模式示例_霸道流氓气质的博客-CSDN博客 上面讲了策略模式在Java中的使用示例。 下面看一个在SpringBoot中的实际使用示例。 业务场景: 有多个煤矿&#xff0c;信号灯…

推荐一些非常好用的DNS服务器

推荐一些非常好用的DNS服务器 1、114公共DNS服务器 1&#xff09; 老牌的114DNS&#xff0c;全国三网通用高速&#xff0c;纯净无劫持无需再忍受被强扭去看广告或粗俗网站之痛苦 DNS地址为&#xff1a;114.114.114.114 和 114.114.115.115 2&#xff09;拦截 钓鱼病毒木马网…

三顾茅庐,七面阿里,终拿25k*16offer,我的面试历程

写在片头&#xff1a;声明&#xff0c;勿杠 首先简单说一下&#xff0c;这三次面试阿里并不是一次性去面的&#xff0c;实际上第一次面试时候还在大四&#xff0c;找的实习岗&#xff0c;不太清楚是什么部门&#xff0c;别问我为什么还记得面试题&#xff0c;有记录和复盘的习…

DX算法还原

早在之前作者就写过一篇关于顶象的滑块验证&#xff0c;潦潦草草几句话就带过了。 出于互相学习的想法&#xff0c;给了一个大学生&#xff0c;奈何不讲武德把源码甩群里了&#xff0c;虽然在大佬们眼里不难&#xff0c; 不过拿着别人的东西乱传还是不太好。自认倒霉&#xf…

基于max30102的物联网病房监测系统(传感驱动和数据处理)

目录 一、实物展示 二、主体介绍 三、MAX30102的驱动 四、MAX30102的数据处理 奋斗一个星期&#xff0c;每个引脚都是扒皮焊接然后再把皮包回去的。这几天吸的垃圾气体感觉要少活两年。 一、实物展示 这次吸取上次教训&#xff0c;把线捆起来好多了 二、主体介绍 用的传感…

Python进阶篇

大家好&#xff0c;我是易安&#xff01;今天我们继续Python的学习&#xff0c;内容稍微有些多&#xff0c;不过我会尽可能举一些例子让你理解。 对象比较与拷贝 在前面的学习中&#xff0c;我们其实已经接触到了很多 Python对象比较和复制的例子&#xff0c;比如下面这个&…

【JVM】面试题总结

JVM 1、JVM 的运行时内存区域是怎样的2、堆和栈的区别3、Java 中的对象一定在堆上分配内存吗4、什么是 Stop The World5、JVM 如何判断对象是否存活6、JVM 有哪些垃圾回收算法7、什么是三色标记算法8、新生代和老年代的GC算法9、新生代和老年代的垃圾回收器有何区别10、Java 中…

【SVN】版本控制管理的文件(夹)如何重命名

目录 一、前言二、操作步骤1. 使用SVN重命名&#xff08;SVN rename&#xff09;2. 输入新名称3. 确定重命名4. 立刻进行一次提交&#xff08;commit&#xff09;5. 补充 三、可能遇到的问题1. 情况一2. 情况二3. 情况三 一、前言 如果只是在本地的文件系统中修改SVN中的文件&a…

迈巴赫GLS480升级行政四座,享受霸气豪华老板座

头等舱级后排独立座椅可奉上私人飞机般的旅程体验。无论是美观性还是功能性&#xff0c;商务型中央控制台都可为后排乘客带来巨大优势。例如&#xff0c;在电动开启盖板下方贴心地为乘客提供控温杯座以及储物箱。您可在扶手下方为您的智能手机进行无线感应充电。

亚马逊云科技开启您的云财务管理之旅:云财务运营

亚马逊云科技“开启您的云财务管理之旅”系列内容提出了关于如何启动和实施一个成功的云财务管理CFM战略的建议。云财务管理CFM的三个原则&#xff1a;SEE-查看、SAVE-节省和PLAN-计划。接下来介绍的是第四个阶段&#xff1a;RUN-运营。 在这一阶段&#xff0c;可以了解云财务管…