异步编程小案例-FlayCoins

2024-09-06 12:52
文章标签 编程 异步 案例 flaycoins

本文主要是介绍异步编程小案例-FlayCoins,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

使用Dotween和UniTask 结合的方式实现金币飞入指定位置,这中间会用到UniTask和Dotween相关的知识点。

准备工作
  1. 最需要准备的无非就是导入 UniTask 我在上一篇已经说过了,这里还需要导入 Dotween,直接使用免费版本的即可。免费版本的Dotween可以直接在Unity Asset Store 里面下载导入。
  2. 场景的搭建也很简单结构如下图
  3. 制作一个简单的预制体金币的
    在这里插入图片描述
脚本编写

这里有有一个脚本啊直接挂载在CoinCollection 上面去。

using Cysharp.Threading.Tasks;
using DG.Tweening;
using System;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
// 注意如果没有添加好 宏 这里是无法在Dotween上使用UniTask的public class UniTaskTargetMove : MonoBehaviour
{public GameObject coin;public Transform coinParent;[SerializeField,Tooltip("金币生成的位置")] private Transform _locationPosition;[SerializeField,Tooltip("金币最终要飞到的位置")] private Transform _endPosition;[SerializeField] private Text _coinText;[Header("金币随机生成的范围")][SerializeField] private int _minX;[SerializeField] private int _maxX;[SerializeField] private int _minY;[SerializeField] private int _maxY;[SerializeField,Tooltip("金币生成的数量")] private int _coinAmount;[SerializeField,Tooltip("金币移动的时间")] private float _duration;private List<GameObject> coins = new List<GameObject>();private Tween tweenCoins;private int coinCount;CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();private void Start(){// CollectCoins();}[Button("cioinCollections")]private async void CollectCoins() {cancellationTokenSource.Cancel();SetCoins(0);for (int i = coins.Count-1; i >= 0; i--) {Destroy(coins[i]);}coins.Clear();List<UniTask> uniTasks = new List<UniTask>();for (int i = 0; i < _coinAmount; i++){var tempCoinPos = Instantiate(coin, coinParent);var xPosition = _locationPosition.position.x + UnityEngine.Random.Range(_minX, _maxX);var yPosition = _locationPosition.position.y + UnityEngine.Random.Range(_minY, _maxY);tempCoinPos.transform.position = new Vector3(xPosition, yPosition);uniTasks.Add (tempCoinPos.transform.DOPunchPosition(new Vector3(0,30,0),UnityEngine.Random.Range(0,1f)).SetEase(Ease.InOutElastic).ToUniTask());coins.Add(tempCoinPos);await UniTask.Delay(TimeSpan.FromSeconds(0.01f));}//await UniTask.Delay(TimeSpan.FromSeconds(1f));await UniTask.WhenAll(uniTasks);await moveCoinsTask();}private async UniTask moveCoinsTask() {List<UniTask> movecoinTaskList = new List<UniTask>();for (int i = coins.Count-1; i >= 0; i--){movecoinTaskList.Add(MoveCoinTask(coins[i]));await UniTask.Delay(TimeSpan.FromSeconds(0.05f)); // 等待0.05f}}/// <summary>/// 更新金币的数量/// </summary>/// <param name="value"></param>private void SetCoins(int value) {coinCount = value;_coinText.text = coinCount.ToString();}/// <summary>/// 移动金币/// </summary>/// <param name="coinInstance"></param>/// <returns></returns>private async UniTask MoveCoinTask(GameObject coinInstance) {await coinInstance.transform.DOMove(_endPosition.position, _duration).SetEase(Ease.InBack).ToUniTask();var temp = coinInstance;coins.Remove(coinInstance);Destroy(temp);await ReactToCollectionCoin();SetCoins(coinCount + 1);}/// <summary>/// 当金币到达endPosition后面的时候会 变大变小/// </summary>/// <returns></returns>private async UniTask ReactToCollectionCoin() {if (tweenCoins == null) {tweenCoins = _endPosition.DOPunchScale(new Vector3(1.5f, 1.5f, 1.5f), 0.1f).SetEase(Ease.InOutElastic);await tweenCoins.ToUniTask();tweenCoins = null;}}
}

这个效果用到了很多UniTask和DoTween相关的知识,这个也主要是为了更好的学习如何使用UniTask。

这篇关于异步编程小案例-FlayCoins的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142059

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员