美文网首页
Unity粒子特效忽略timeScale的影响

Unity粒子特效忽略timeScale的影响

作者: super41 | 来源:发表于2020-10-16 12:06 被阅读0次
  • 怎么让粒子特效忽略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方法()来实现。

相关文章

网友评论

      本文标题:Unity粒子特效忽略timeScale的影响

      本文链接:https://www.haomeiwen.com/subject/mlfzpktx.html