【Unity / Particle】计算 粒子特效 ParticleSystem 的播放时间长度

需求分析

项目开发过程中,特效往往是资源和性能开销的大户,一般都会使用池的方式来管理和重用特效资源,而不是每次在需要时就重新加载生成,这就需要有一套机制能够在特效播放结束后,自动回收特效,因而需要提前知道特效的播放时间长度。这是一种比较常见的情况,也可能会有其他的需求,比如特效A、B、C需要在每个特效播放完后立即播放另一个特效,实现连续播放多个特效的效果,由于特效是可能随时修改效果的,特效的播放时长不宜在程序内写死,做成配置也并不够方便,最好能够自动获取特效的播放时长。

先看单个Particle System,单个粒子系统的时间长度,最直观的是由其duration参数决定,但粒子系统还有很多其他参数会影响播放时长,比如开始播放延时startDelay,还有很多其他参数也会影响播放时长,这儿就不一一列举了,有兴趣的可以参考粒子系统的相关文档。

duration参数是一个float类型,直接计算即可。我们继续看startDelay参数,它在编辑器中,可以选择固定数值、随机范围和曲线等方式来决定实际值,因而我们无法直接获取其数值,反编译源代码可以看到以下类型。
ParticleSystem.MinMaxCurve类型的startDelay:

      public ParticleSystem.MinMaxCurve startDelay
  	[NativeType(CodegenOptions.Custom, "MonoMinMaxCurve", Header = "Runtime/Scripting/ScriptingCommonStructDefinitions.h")]
    [Serializable]
    public struct MinMaxCurve

由于一个粒子特效是由多个对象和数据类型嵌套而成,为了提高方法重用率和扩展性,我们决定使用扩展方法的方式,分层实现最终需求,关于扩展方法的介绍和使用,可以参考系列文章[C#扩展方法简介]

01.扩展 MinMaxCurve

在单个粒子系统中,有众多参数使用这个类型封装,因而我们有必要对其进行扩展,以简化其数值的获取。
用于获取MinMaxCurve类型实际最大值的扩展方法:

        public static float GetMaxValue(this ParticleSystem.MinMaxCurve minMaxCurve)
        {
   
            switch (minMaxCurve.mode)
            {
   
                case ParticleSystemCurveMode.Constant:
                    return minMaxCurve.constant;
                case ParticleSystemCurveMode.Curve:
                    return minMaxCurve.curve.GetMaxValue();
                case ParticleSystemCurveMode.TwoConstants:
                    return minMaxCurve.constantMax;
                case ParticleSystemCurveMode.TwoCurves:
                    var ret1 = minMaxCurve
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ls9512

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

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

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

打赏作者

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

抵扣说明:

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

余额充值