笔记:设置粒子系统参数可能遇到的问题

一、获取粒子组件模块里的参数

1、首先确定目标参数具体在哪个模块里;

详情可具体参考自己Unity版本里的ParticleSystem组件;

2、可先获取物体身上的粒子组件:

//获取curEffect的子物体身上的粒子系统组件
ParticleSystem _particle = curEffect.transform.GetComponentInChildren<ParticleSystem>();

3、直接获取模块里的参数:

如直接获取main模块里的持续时间(float类型)和是否循环(bool类型)参数:


ParticleSystem _particle = curEffect.transform.GetComponentInChildren<ParticleSystem>();

data.duration= _particle.main.duration;//float类型
data.looping= _particle.main.loop;//bool类型

4、对应参数需根据属性设置具体获取:

有的参数有多重设置,比如:emmission模块里的粒子的发射数量:可设定一个常量,也可设定为两个常数范围区间,甚至可以设定为曲线;

这时获取参数,就根据需求自己,在参数后面选择对应api获取;

ParticleSystem _particle = curEffect.transform.GetComponentInChildren<ParticleSystem>();

data.emmission = _particle.emission.rateOverTime.constant;   //float类型

var x = _particle.emission.rateOverTime.curve;   //AnimationCurve类型
AnimationCurve y = _particle.emission.rateOverTime.curveMax;   //AnimationCurve类型

 

二、修改粒子组件上某一模块里的参数;

1、直接修改粒子组件上某一模块里的某个参数;

因为粒子获取到模块是只读的,获取到模块不能修改;不能直接修改粒子的某个模块的某个参数;

(1)首先获取粒子组件里的某个模块;

(2)通过模块修改模块里的某个参数; 

//先获取粒子系统的main组件
ParticleSystem.MainModule _module = _particle.main;
//然后修改main模块里的某个参数
_module.loop = data.looping;
_module.duration = data.duration;

//获取粒子系统的emission组件
ParticleSystem.EmissionModule _emission = _particle.emission;
//然后修改emission模块里的某个参数
_emission.rateOverTime = data.emmission;

2、不能直接修改粒子参数的修改方法;

上面方法可直接设置粒子的数量,如Emission的RateOverTime;

但有的需要将所有粒子停止销毁才能修改,如Main的duration;

报错:

Setting the duration while system is still playing is not supported. Please wait until the system has stopped and all particles have expired or call Stop with ParticleSystemStopBehavior.StopEmittingAndClear to completely stop the system.
UnityEngine.MainModule:set_duration(Single)

不支持在系统仍在播放时设置持续时间。请等待直到系统停止并且所有的粒子都过期,或者使用ParticleSystemStopBehavior调用Stop。StopEmittingAndClear完全停止系统。
UnityEngine.MainModule: set_duration(Single)

 (1)初始解决方法:

1)网上查询,使用_particle.Stop(),但还是会报错;

2)中间测试,使用_particle.Pause();(暂停)也不行;

3)解决方法:粒子的父物体关闭curEffect.SetActive(false),间接关闭粒子系统,可以正常修改;

4)缺点:每次修改,本来执行一段时间的粒子有重头开始播放,粒子效果体验感差;

(2)正确修改方法:

1)问题:

正确修改粒子的持续时间是要停止所有的粒子,而_particle.Stop()方法确实是停止所有的粒子,不明白那里有问题;

报错提示的StopEmittingAndClear方法也不清楚怎么使用;

2)发现:

后面想着会不会停止粒子的时间和修改粒子时间之间不能马上执行,正准备使用协程错开时间间隔,然后发现_particle.Stop(),方法有重载!研究了下_particle.Stop()的几个重载,可以根据需求来设置不同程度的停止粒子效果;

3)正确的使用方法应该是:

_particle.Stop(true,ParticleSystemStopBehavior.StopEmittingAndClear);

_particle.Stop(true,ParticleSystemStopBehavior.StopEmittingAndClear);
_module.duration = data.duration;
_particle.Play();

 这样就可以不影响粒子播放效果,无暂停卡顿的修改运行中的粒子参数了。

猜你喜欢

转载自blog.csdn.net/weixin_43908355/article/details/123691908