美文网首页
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