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

news/2025/2/14 1:28:26/

一、铲子的组成

铲子包含很多部件组成,当拾取铲子的时候,只要点击铲子的任意一个部件就可以。
如图,点击【木柄】、【螺母】、【铁铲】都可以拾取该物体。
请添加图片描述
(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.ppmy.cn/news/62018.html

相关文章

三、Spring Cloud Alibaba组件nacos

一、什么是Nacos 官方地址&#xff1a; https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 概念&#xff1a; 服务&#xff08;Service&#xff09;是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。即集注册中心配置中心服务管理的一个平…

迪赛智慧数——饼图(玫瑰饼图):菜品味道受欢迎程度

效果图 大家最爱吃的竟是它&#xff01;咸鲜占比高达23.53%&#xff01; 民以食为天&#xff0c;你最喜欢的美食口味是什么呢&#xff1f; 好吃的太多&#xff0c;你应该很难确切地评出你心中的第一名吧。据数据调查显示&#xff0c;咸鲜口味最受欢迎&#xff0c;其次是麻辣、…

Binlog日志详解

binlog基本概念 binlog是一个二进制格式的文件&#xff0c;用于记录用户对数据库更新的SQL语句信息&#xff0c;例如&#xff1a;更改数据库表和更改内容的SQL语句都会记录到binlog里&#xff0c;但是不会记录SELECT和SHOW这类操作 binlog的特点 binlog在MySQL的Server层实现…

换个花样玩C++(8)吃不透内存布局,坑的是自己,万字经验告诉你类的内存布局

C++内存布局是老生常谈的话题,无论是笔试面试,都会涉及到该类问题,那么这一章节,我们就聊聊内存布局到底是怎么布局的,聊完之后我保证你仍然会回味无穷,并且我提供的几个例子也会让你再一步步踩入雷区。 C++程序的内存布局 C++的内存布局区域我们大体上分为四个:全局数据…

Redis实现延迟队列方法介绍

延迟队列&#xff0c;顾名思义它是一种带有延迟功能的消息队列。那么&#xff0c;是在什么场景下我才需要这样的队列呢&#xff1f; 1. 背景 我们先看看以下业务场景&#xff1a; 当订单一直处于未支付状态时&#xff0c;如何及时的关闭订单如何定期检查处于退款状态的订单是…

Windows 10教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Windows 10入门教程 - 从简单的步骤了解Windows 10&#xff0c;从基本到高级概念&#xff0c;包括概述&#xff0c;安装&#xff0c;入门&#xff0c;GUI基础知识&#xff0c;导航&#xff0c;开始菜单&#xff0c;任务栏&#xff0c;平板电脑模式&#xff0c;文件资…

第四十二章 Unity 下拉框 (Dropdown) UI

本章节我们介绍下拉框 (Dropdown)&#xff0c;我们点击菜单栏“GameObject”->“UI”->“Dropdown”&#xff0c;然后调整它的位置&#xff0c;效果如下 其实它的本质就是一个下拉列表&#xff0c;然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…

Optional的使用详解

工作中经常会调外部接口、或者查询表等&#xff0c;如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断: private boolean isNotNull(Object param) {if (param null) {return false;} else {return true;}}这样写其实功能上没有任何问…