当前位置:   article > 正文

Unity基础 - 游戏暂停 (Time.deltaTime=0) 时遇到的常见问题_unity 暂停游戏

unity 暂停游戏

问题

最近在开发游戏中遇到一些因为游戏暂停(Time.deltaTime = 0)导致的问题。主要是没有能够及时意识到游戏暂停会带来后续的变化,踩了一些坑,在此做一些记录。

我主要遇到以下3个问题:

  • 用于延迟触发的Invoke()没有正常工作
  • 用于Coroutine内部的WaitForSeconds()会直接阻塞住,后续代码没有正常执行
  • DoTween动画系统没有正常工作

解决方案

问题的关键是,原先依赖Time.deltaTime的程序,在Time.deltaTime变为0后,类似于“等待”这样的功能,都不会正常工作了,因为时间流速变成了0。

都需要替换成依赖Time.unscaledDeltaTime的系统。

Unity官方文档中对Time.unscaledDeltaTime的说明

WaitForSeconds

将Coroutine中的WaitForSeconds替换为WaitForSecondsRealTime。

private IEnumerator ExampleCoroutine()
    {   
    	Time.deltaTime = 0.0f;
    	
        Debug.Log("做点什么");
        
        yield return new WaitForSeconds(2.0f);   // 游戏时间流速为0了,会一直卡在这

        Debug.Log("这条代码不会执行");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
private IEnumerator ExampleCoroutine()
    {   
    	Time.deltaTime = 0.0f;
    	
        Debug.Log("做点什么");
        
        yield return new WaitForSecondsRealTime(2.0f);   // unscaledTime

        Debug.Log("过2秒后执行这条代码");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Invoke

可以用Coroutine和WaitForSecondsRealTime来配合实现类似于Invoke的功能。

DoTween

需要在链式调用中添加.SetUpdate(true),将isIndependentUpdate参数设置为true

在这里插入图片描述

tmp.DOFade(1.0f, 1f).SetUpdate(true);
  • 1

结论

当开发的需求涉及到Time.deltaTime变化时,要有意识地去考虑有哪些代码是依赖游戏时间流速的,并做出对应调整来避免Bug。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/633419
推荐阅读
相关标签
  

闽ICP备14008679号