IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity学习笔记之用粒子系统实现类似金币飞入金币条动画效果 -> 正文阅读

[游戏开发]Unity学习笔记之用粒子系统实现类似金币飞入金币条动画效果

? ? 耗时两天半终于完成了这个功能!先来看看最终效果!

? ??

? ? 其中粒子速度,粒子数量,?扩散效果等参数都可以在粒子系统参数里调整~总之就是都是可控的!美术想要啥效果让他们自己调去!

? ? 首先来讲一下用粒子系统来做这个的好处!首先就是效果好,其次就是参数可控,并且效率极高,粒子是有自己独立线程的,由unity自己进行优化,如果不用粒子系统用ugui来写这个效果的话就要面临网格重建,打破批处理而且效果不好,所以我还是选择粒子系统来完成这个需求。

? ? 好了现在来讲一下具体实现步骤!

? ? 首先要把粒子系统显示在UI上,此处我参考了博文如何让粒子系统显示在UI上,跟着步骤来就行了没啥难度。然后就需要去控制粒子的运动轨迹啦。思路大概就是在粒子发射后去获取这些粒子,再在update里去更新粒子位置,使其朝着目标位置靠拢。以下是具体的实现代码:

using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(ParticleSystem))]
public class ParticleTargetMove : MonoBehaviour
{

    private ParticleSystem par;

    private ParticleSystem.Particle[] arrPar;

    private int arrCount;

    public float speed = 0.1f;

    public float delayTime = 1f;

    public float originEmissionRate;

    public bool isActive;

    //public Vector3 pos = Vector3.zero;

    public float speedAdd;

    public float speedAddDelta = 2f;

    public bool oncePar = false;

    private Vector3 wPos;



    private void Awake()
    {
        par = this.GetComponent<ParticleSystem>();
        arrPar = new ParticleSystem.Particle[par.main.maxParticles];
        speedAdd = 0f;
        if (oncePar)
        {
            originEmissionRate = par.emission.GetBurst(0).count.curveMultiplier;
        }
        else
        {
            originEmissionRate = par.emission.rateOverTimeMultiplier;//par.emissionRate;
        }

    }

    private void setActive()
    {
        isActive = true;
    }

    //Dictionary<int, List<Vector3>> pointDic = new Dictionary<int, List<Vector3>>();

    private void Update()
    {
        if (!isActive || !par)
        {
            return;
        }
        arrCount = par.GetParticles(arrPar);
        if (arrCount < 1)
        {
            isActive = false;
            par.Stop();
            speedAdd = 0f;
        }
        else
        {
            speedAdd += Time.unscaledDeltaTime * speedAddDelta;
        }
        for (int i = 0; i < arrCount; i++)
        {
            Vector3 vector = wPos - arrPar[i].position;
            if (vector.magnitude <= (speed + speedAdd) * Time.unscaledDeltaTime)
            {
                arrPar[i].position = wPos;
                arrPar[i].remainingLifetime = 0f;
                //par.emissionRate = 0f;
                var emis = par.emission;
                emis.rateOverTimeMultiplier = 0;
            }
            else
            {
                arrPar[i].position += vector.normalized * (speed + speedAdd) * Time.unscaledDeltaTime;
                //arrPar[i].position = Vector3.Lerp(arrPar[i].position, Vector3.zero, this.speed * Time.unscaledDeltaTime);
            }
        }
        par.SetParticles(arrPar, arrCount);

    }

    public void Play(Vector3 _pos, int emit_count)
    {
        //if (par.isStopped)
        //{
        wPos = _pos;
        Invoke("setActive", delayTime + 0.01f);
        if (par == null)
        {
            par = this.GetComponent<ParticleSystem>();
        }
        if (oncePar)
        {
            var b = par.emission.GetBurst(0);
            b.count = new ParticleSystem.MinMaxCurve(originEmissionRate);
            //b.minCount = (short)originEmissionRate;
            //b.maxCount = (short)originEmissionRate;
            par.emission.SetBurst(0, b);
        }
        else
        {
            //par.emissionRate = originEmissionRate;
            var emis = par.emission;
            emis.rateOverTimeMultiplier = originEmissionRate;
        }
        speedAdd = 0;
        isActive = false;
        par.Stop();
        //par.Play(withChildren: true);
        //par.Play();
        par.Emit(emit_count);
        //pointDic.Clear();
        //}
    }
}

? ? 也没啥需要解释的,就是按照这个思路写的代码,需要播放这个粒子系统的时候就调用Play方法就行了。对粒子系统参数不熟悉的可以查阅官方手册或者查看这篇博客https://blog.csdn.net/m0_37679113/article/details/75893700

? ? 此处附上我的粒子系统参数

? ? 啊差点忘了,材质记得选择有透明通道的材质,我这儿选择的是

? ? 最后,为了使动画效果好一些,我这边还给粒子增添了序列帧动画。具体怎么给粒子增添序列帧动画可以参考这篇博文https://blog.csdn.net/ys5773477/article/details/53323985。此处附上我序列帧动画相关参数:

? ? 这样用粒子系统去实现金币或者其他资源的飞入资源条的动画效果就完成了!谢谢大家观看!谢谢!

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:38:06  更:2021-07-16 11:40:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 15:06:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码