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

问题

最近在开发游戏中遇到一些因为游戏暂停(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("这条代码不会执行");
    }
private IEnumerator ExampleCoroutine()
    {   
    	Time.deltaTime = 0.0f;
    	
        Debug.Log("做点什么");
        
        yield return new WaitForSecondsRealTime(2.0f);   // unscaledTime

        Debug.Log("过2秒后执行这条代码");
    }

Invoke

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

DoTween

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

在这里插入图片描述

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

结论

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

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值