暂停游戏

一般实现游戏暂停的方法就是令Time.timeScale = 0。但是我们经常会发现一些匪夷所思的问题,而很多时候是何Update函数有关。


根据官方文档可知,设置Time.timeScale为0将回暂停所有和帧率无关的事情。这些主要是指所有的物理事件和依赖时间的函数、刚体力和速度等,而且FixedUpdate会被暂停(不是Update)。但是,动画(Animations)和任何你放到Update中的通过Time.deltaTime来控制的位移也会属于和帧率无关的一类:不管你的帧率具体是多少,它们总是在相同的时间旋转或平移。


但是,Update函数本身的执行是不会受Time.timeScale的影响的。根据上一点我们知道,Update是依赖你的机器的,它的调用次数和你的机器渲染一样快慢(一些特殊情况除外);性能高的机器,帧率高,Update函数执行次数也就多。因此,当使用Time.timeScale = 0时,游戏看起来是被冻结了,这是因为所有和时间有关的事情都被暂停了。但是,我们的游戏仍在渲染,也就是说Update函数仍在执行。


还有一点,Time.timeScale为0时,Time.deltaTime将为0。这意味着,如果你使用Time.deltaTime来控制旋转和位移等,那么Time.timeScale = 0也将使这些物体停止运动。


如果使用Time.timeScale = 0来暂停游戏,那么下面两种方法可能可以帮助你:

  • 把所有的移动都放到FixedUpdate中(不太可能)
  • Update中,所有的移动都使用Time.deltaTime控制

当然,还有另一种比较麻烦但扩展性很强的方法。如果一个物体需要一个暂停动作,例如停止动画等等,可以让它的脚本实现OnPauseGame()函数,而在重启时实现OnResumeGame() 函数。那么暂停游戏可以通过调用所有对象上的OnPauseGame()函数:
[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Object[] objects = FindObjectsOfType (typeof(GameObject));  
  2. foreach (GameObject go in objects) {  
  3.     go.SendMessage ("OnPauseGame", SendMessageOptions.DontRequireReceiver);  
  4. }  

然后再调用OnResumeGame() 进行重启。

一个基本的脚本类似下面这样:
[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. protected bool paused;  
  2.    
  3. void OnPauseGame ()  
  4. {  
  5.     paused = true;  
  6. }  
  7.    
  8. void OnResumeGame ()  
  9. {  
  10.     paused = false;  
  11. }  
  12.    
  13. void Update ()  
  14. {  
  15.     if (!paused) {  
  16.     // do movement  
  17.     }  
  18. }  

这样方法有一个非常大的好处就是,你可以自己定制所有物体在暂停和重启时的行为,例如存储和加载数据等等。

转载  http://blog.csdn.net/candycat1992/article/details/24884667

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值