Unity粒子系统开发——设置粒子系统参数可能遇到的问题

19 篇文章 0 订阅
3 篇文章 0 订阅
一、获取粒子组件模块里的参数
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),间接关闭粒子系统,可以正常修改;

        存在问题:每次修改,本来执行一段时间的粒子有重头开始播放,粒子效果体验感差;

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();

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值