-
怎么让粒子特效忽略timeScale的影响
昨天有个需求想让粒子特效在timeScale等于0的时候依然正常进行,于是网上找了下相关的方法。结果搜到的大多数都是类似这样的代码
void Update()
{
if (_particle == null) return;
_deltaTime = Time.realtimeSinceStartup - _timeAtLastFrame;
_timeAtLastFrame = Time.realtimeSinceStartup;
if (Mathf.Abs(Time.timeScale) < 1e-6)
{
_particle.Simulate(_deltaTime, false, false);
_particle.Play();
}
}
效果是可以实现。但是要在update里循环更新,这样来实现需求有点繁琐和重度。 总感觉本来就是一句代码的事搞得很重度。于是自己找了下ParticleSystem的API,发现可以用这样来忽略timeScale的影响:
private void IgnoreTimeScale(GameObject go)
{
ParticleSystem[] particles = go.GetComponentsInChildren<ParticleSystem>();
foreach (var particle in particles)
{
var mainModule = particle.main;
mainModule.useUnscaledTime = true; //关键代码
}
}
这样一个方法就搞定了。不用update里循环调用Simulate方法
-
Simulate的用法
想让粒子系统忽略timeScale的影响,用上面的方法就可以了。下面记录一下 particleSystem.Simulate() 方法
public void Simulate(float t, bool withChildren, bool restart)
{
this.Simulate(t, withChildren, restart, true);
}
第一个参数 t: 可以理解为粒子系统向前推进 t 秒,然后暂停住
第二个参数 withChildren:可以理解是否让子节点的粒子系统也受影响
第三个参数 restart: 当为true时,把粒子系统的时间点重置为0秒开始。
----
所以想让粒子系统停在0秒时可以这样:Simulate(0 , true , true);
想让粒子系统继续运行,可以在update里循环调用 Simulate( Time.deltaTime , true , false);
-
重新启用粒子系统
粒子系统的重启,可以通过 禁用/启用 gameObject来实现
想让粒子系统重新运行,可以直接重启用gameObject:
go.SetActive(false);
go.setActive(true);
也可以用上面的Simulate方法()来实现。
网友评论