Unity - 粒子系统跟随路径移动

87 篇文章 269 订阅
8 篇文章 1 订阅

对于最新版的粒子系统Particle System,要让其跟随路径移动,无非就是借用其自身的API直接为每个粒子设置速度。

看一下最终的效果图:

这里写图片描述

这里写图片描述

这里写图片描述

编辑器

为了能在场景中更方便的编辑路径,我们要将路径点的编辑功能加入到Inspector界面,但同时我们并不想破坏ParticleSystem自身的Inspector界面,所以这需要在不替换掉ParticleSystem组件原有Editor扩展的情况下加入我们的扩展布局。

这里的思路来自于雨松MOMO的一篇文章:http://www.xuanyusong.com/archives/3931

方法十分简单粗暴,直接用反射获取ParticleSystemInspector类(这是Unity底层对于ParticleSystem组件的Inspector界面扩展类),创建一个实例,然后每次在我们自己的OnInspectorGUI()方法调用时,都调用一次ParticleSystemInspector实例的OnInspectorGUI()方法,也就是在ParticleSystem的Inspector界面同时保持了两种布局。

代码如下:

    private Assembly _assembly;
    private Type _particleSystemInspector;
    private MethodInfo _onInspectorGUI;
    private Editor _particleSystemEditor;

        //载入程序集
        _assembly = Assembly.GetAssembly(typeof(Editor));
        //获取ParticleSystemInspector类
        _particleSystemInspector = _assembly.GetTypes().Where(t => t.Name == "ParticleSystemInspector").FirstOrDefault();
        //获取OnInspectorGUI方法
        _onInspectorGUI = _particleSystemInspector.GetMethod("OnInspectorGUI", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
        //创建ParticleSystemInspector的实例
        _particleSystemEditor = CreateEditor(target, _particleSystemInspector);

然后在我们自己的Editor类的OnInspectorGUI()方法中,加一句话就可以了:

_onInspectorGUI.Invoke(_particleSystemEditor, null);

这样,再加上我们自己的布局代码,就可以在ParticleSystem的Inspector界面同时保持两种布局。

编辑路径

这里写图片描述

1.勾选路径模式前面的复选框,为开启路径模式,粒子系统的所有粒子都将忽略原有的生命值和速度,保证自身的生命值能够走到路径的结尾。
2.选中路径点,可以在场景中编辑路径点的位置。
3.右下角的加号为新增路径点。
4.Speed的值越小,粒子的移动速度越快。

代码实现

ParticleSystem的粒子类(Particle)有一个速度属性,包含了速度方向与速度值,我们只需要根据路径的变化改变其值就可以了:

//路径
public List<Vector3> Waypoints;

//获取当前的激活粒子
ParticleSystem.Particle[] ps = new ParticleSystem.Particle[PS.particleCount];
            int pCount = PS.GetParticles(ps);

            for (int i = 0; i < pCount; i++)
            {
            //计算生命值比例
                float proportion = (ps[i].startLifetime - ps[i].remainingLifetime) / ps[i].startLifetime;
                //判断所在的路径点
                int index = Mathf.FloorToInt(proportion * Waypoints.Count);
                if (index >= 0 && index < Waypoints.Count - 1)
                {
                    Vector3 direction = Waypoints[index + 1] - Waypoints[index];
                    //赋予新的速度
                    ps[i].velocity = direction * (1.0f / Speed) * (1.0f / transform.localScale.x);
                }
                else
                {
                //超出路径之后,粒子销毁
                    ps[i].remainingLifetime = 0;
                }
            }
            //重新设置粒子
            PS.SetParticles(ps, pCount);

源码链接

http://download.csdn.net/download/qq992817263/9948256

  • 15
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Unity是一款强大的游戏开发引擎,可以用于创建各种类型的游戏,包括3D、2D和虚拟现实等。Unity中的烟花粒子系统是一种用于模拟烟花效果的特殊效果工具。 在Unity中,烟花粒子系统可以通过创建一个或多个粒子系统来实现。我们可以调整粒子的颜色、形状、运动轨迹、发射速度和散射角度等参数来控制烟花的外观和行为。 烟花粒子系统的核心是粒子,它们是一组非常小的图像或网格对象,可以在3D空间中移动、旋转、缩放,并具有自己的生命周期。通过调整粒子的属性,如生命周期、大小、透明度和颜色,我们可以创建出各种炫目的烟花效果。 在Unity中,我们可以通过在场景中放置发射器和粒子系统来创建烟花效果。发射器是用于触发粒子系统的对象,当发射器受到触发时,粒子系统将开始发射粒子。我们可以为发射器指定发射速度、发射角度和发射模式等参数。 通过使用Unity的独特的粒子编辑器,我们可以轻松地调整烟花的效果。我们可以设置粒子的起始位置、速度、方向和形状,还可以添加各种特效,如颜色渐变、材质纹理和子发射器等。 总之,Unity的烟花粒子系统提供了一种简便而强大的方式来创建炫目的烟花效果。无论是制作游戏的特殊效果还是创建虚拟现实场景,Unity的烟花粒子系统都能帮助我们实现各种想象力无限的烟花效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神码编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值