UnityUI炸出金币再收集的特效

2023-11-19

完成的效果,在指定位置生成一定数量的货币ICON,然后扩散出去。等待一定时间后,汇集到指定位置。

在这里插入图片描述
在这里插入图片描述

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UICurrencyCollect : MonoBehaviour
{
  
  [Header("[Count Param]")]
  public int maxIcon; //最大Icon数量
  public int minIcon; //最少Icon数量
  public int maxCurrency; //到达最大Icon数量时候的数量
  [Header("[Boomb Param]")]
  public float range; //炸出范围
  public float timeToBoom;  //飞出时间
  public float timeToStop;  //飞出后停滞的时间
  public float timeToCollect; //飞去固定位置的时间
  [Header("[UnityObj]")]

  public Image prefab; //复制的预设

  //--------------- status --------------
  public bool isPlaying { get { return ani != null; } }
  public Sprite sprite
  {
    get { return prefab.sprite; }
    set { prefab.sprite = value; }
  }
  public Vector3 startPos
  {
    get { return _startPos; }
    set { this._startPos = value; }
  }
  //--------------- private -------------
  Coroutine ani;
  Transform parentOfCurrency;
  Vector3 _startPos;


  private void Start()
  {
    _startPos = this.transform.position;
    prefab.gameObject.SetActive(false);
  }
  //--------------- function ------------
  public void BoombToCollectCurrency(int count, Vector3 to)
  {
    if (isPlaying) return;
    CreateParent();
    int coinCount = count / maxCurrency * maxIcon;
    coinCount = Mathf.Clamp(coinCount, minIcon, maxIcon);
    ani = StartCoroutine(_BoombToCollectCurrency(coinCount, to));
  }

  public void StopAni()
  {
    if (!isPlaying) return;
    StopAllCoroutines();
    ani = null;
    DestroyImmediate(parentOfCurrency.gameObject);
  }

  //----------- boomb ani -----------------

  IEnumerator _BoombToCollectCurrency(int count, Vector3 to)
  {
    List<Transform> currencyObj = new List<Transform>();
    for (int i = 0; i < count; i++)
    {
      currencyObj.Add(CreateCurrencyObj());
    }
    yield return StartCoroutine(ExporeOut(currencyObj));
    yield return new WaitForSeconds(timeToStop);
    yield return StartCoroutine(FlyToPos(currencyObj, to));
    Destroy(parentOfCurrency.gameObject);
    ani = null;
  }

  IEnumerator ExporeOut(List<Transform> currencyObj)
  {
    List<Vector3> toPos = new List<Vector3>();
    List<Vector3> fromPos = new List<Vector3>();
    foreach (Transform obj in currencyObj)
    {
      Vector3 pos = Random.insideUnitCircle;
      pos = pos * range + obj.transform.position;
      toPos.Add(pos);
      fromPos.Add(obj.transform.position);
    }
    float timer = 0;
    while (timer < timeToBoom)
    {
      timer += Time.deltaTime;
      for (int i = 0; i < currencyObj.Count; i++)
      {
        Vector3 from = fromPos[i];
        Vector3 to = toPos[i];
        Transform obj = currencyObj[i];
        Vector3 pos = Vector3.Lerp(currencyObj[i].transform.position, to, timer / timeToBoom);
        obj.transform.position = pos;
      }
      yield return null;
    }
  }
  IEnumerator FlyToPos(List<Transform> currencyObj, Vector3 to)
  {
    Vector3 toPos = to;
    List<Vector3> fromPos = new List<Vector3>();
    foreach (Transform obj in currencyObj)
      fromPos.Add(obj.transform.position);
    float timer = 0;
    while (timer < timeToCollect)
    {
      timer += Time.deltaTime;
      for (int i = 0; i < currencyObj.Count; i++)
      {
        Vector3 from = fromPos[i];
        Transform obj = currencyObj[i];
        Vector3 pos = Vector3.Lerp(from, to, timer / timeToCollect);
        obj.transform.position = pos;
      }
      yield return null;
    }
  }



  Transform CreateCurrencyObj()
  {
    GameObject obj = GameObject.Instantiate(prefab.gameObject);
    obj.SetActive(true);
    obj.transform.SetParent(parentOfCurrency);
    //obj.GetComponent<Image>().sprite = sprite;
    obj.transform.position = parentOfCurrency.transform.position;
    return obj.transform;
  }

  void CreateParent()
  {
    GameObject obj = new GameObject("parentOfCurrency");
    parentOfCurrency = obj.transform;
    parentOfCurrency.SetParent(this.transform);
    parentOfCurrency.position = startPos;

  }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnityUI炸出金币再收集的特效 的相关文章

随机推荐

  • Python的复制,深拷贝和浅拷贝的区别

    在python中 对象赋值实际上是对象的引用 当创建一个对象 然后把它赋给另一个变量的时候 python并没有拷贝这个对象 而只是拷贝了这个对象的引用 一般有三种方法 alist 1 2 3 a b 1 直接赋值 传递对象的引用而已 原始列
  • 三目运算的多目运算技巧(三种及三种以上的状态怎么使用)

    1 使用场景 当有人一提到三目运算就会想着用0 1代表男女等的显示问题 只有两种状态值 但你有没有想过当状态不止两种的时候 比如三种及以上的时候 也可以使用三木运算呢 答案是可以 比如常用的vue数据渲染的时候 div class Bott
  • IntelliJ Idea 常用快捷键列表

    IntelliJ Idea 常用快捷键列表 Ctrl Shift Enter 语句完成 否定完成 输入表达式时按 键 Ctrl E 最近的文件 Ctrl Shift E 最近更改的文件 Shift Click 可以关闭文件 Ctrl OR
  • linux 内核学习3-自己编译一个ARM Linux内核

    linux 内核学习3 自己编译一个ARM Linux内核 1 目的 编译一个ARM版本的内核镜像 谁让我是做Android的呢 并且在QEMU上运行 2 准备工作 2 1 开发环境 ubuntu 18 4虚拟机 linux内核版本 4 1
  • 高清人脸数据集—FFHQ

    FFHQ全称Flickr Faces Hight Quality Flickr Faces HQ 是英伟达作为生成对抗网络 GAN 的基准创建的 也用于Style GAN的训练数据集中 于2019年开源 FFHQ是一个高质量的人脸数据集 包
  • 悟空CRM9.0(JAVA版)正式发布

    悟空CRM9 0 JAVA版 悟空软件长期为企业提供企业管理软件 CRM HRM OA ERP等 的研发 实施 营销 咨询 培训 服务于一体的信息化服务 悟空软件以高科技为起点 以技术为核心 以完善的售后服务为后盾 秉承稳固与发展 求实与创
  • 归一化

    归一化方法 线性归一化 也称min max标准化 离差标准化 是对原始数据的线性变换 使得结果值映射到 0 1 之间 转换函数如下 x x
  • Java的扩容机制

    类别 初始容量 扩容方式 最大容量 HashMap 16 达到0 75就乘2 2的30次方 HashSet 16 达到0 75就乘2 2的30次方 Hashtable 11 达到0 75就乘2 1 Integer MAX VALUE 8 A
  • react基础--组件通讯:props基础、子传父、父传子、兄弟组件通讯、context跨级组件、props进阶

    目录 一 props基础 1 1 概述 1 2 函数组件通讯 1 2 1 基本用法 1 2 1 对象数据传递 1 3 类组件通讯 1 4 props的特点 二 组件通讯三种方式 2 1 父传子 2 2 子传父 2 3 兄弟组件通讯 三 co
  • 【Easy-RL】中科院-清华-北大3位作者贡献的200页强化学习总结笔记

    深度强化学习实验室 官网 http www neurondance com 论坛 http deeprl neurondance com 编辑 DeepRL 核心贡献者 王琦 杨毅远 江季 关于本书 Easy RL 由开源组织 Datawh
  • 最大公约数 辗转相除的原理

    最大公约数 指两个或多个整数共有约数中最大的一个 Go代码如下 package main import fmt func gcd x y int int for y 0 x y y x y return x func main fmt Pr
  • HJ32 密码截取(c++/最长回文子串)

    一 暴力解 O N 3 include
  • cpu的出错概率?

    我今天想到了一个很不懂的问题 cpu执行指令会出错吗 出错的概率是多少 为什么服务器能够不间断的工作很长时间呢 难道cpu指令级的东西不会出错 操作系统怎么避免这些错误呢 2012 5 27 找到一篇文章 http wuyudong blo
  • MATLAB实现五种边缘检测

    一 原理 常用的边缘检测算法有拉普拉斯边缘检测算法 Robert边缘检测算子 Sobel边缘检测算子 Prewitt边缘检测算子 Canny边缘检测算子 二 代码 filename pathname uigetfile jpg bmp gi
  • 一些办公技巧的分享

    分享一 借助微信聊天转换图片的格式 如果你只想要将照片转换成同一种格式 我们可以借助微信的聊天界面 它可以将图片转换成JPG格式 具体操作步骤如下 打开微信的任意聊天对话框 发送图片 然后按下鼠标右键 多选照片 点击 保存 确定 即可 分享
  • git 生成补丁文件及打补丁

    一 patch 和diff 的区别 Git 提供了两种补丁方案 一是用git diff生成的UNIX标准补丁 diff文件 二是git format patch生成的Git专用 patch 文件 diff文件只是记录文件改变的内容 不带有c
  • R语言函数之——ifelse

    ifelse 向量化的函数 在向量赋值的时候 特别有用 如下面例子 gt x lt 1 10 gt y lt ifelse x gt 5 0 10 gt y 1 10 10 10 10 10 0 0 0 0 0 把向量中的NA换为0 gt
  • Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查

    漏洞简述 3月31日 spring 官方通报了 Spring 相关框架存在远程代码执行漏洞 并在 5 3 18 和 5 2 20 RELEASE 中修复了该漏洞 漏洞评级 严重 影响组件 org springframework spring
  • 测试IP和端口是否被封锁

    操作 将自己IP和端口分别输入以下两个网站的测试栏中 国内测试 http tool chinaz com port 国外测试 https www yougetsignal com tools open ports 判断 如果国内的显示关闭
  • UnityUI炸出金币再收集的特效

    完成的效果 在指定位置生成一定数量的货币ICON 然后扩散出去 等待一定时间后 汇集到指定位置 代码 using System Collections using System Collections Generic using Unity