Unity3D研究院之Time.timeScale、游戏暂停(七十四)

转载 2015年07月06日 18:19:20

项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.timeScale才发现之前我理解错了一些东西。

Time.timeScale可以控制Update 和LateUpdate 的执行速度,举个例子说明一下。

Time.timeScale=1时,Update、LateUpdate、FixedUpdate 都按正常的时间来执行。

Time.timeScale=2时,Update和 LateUpdate的执行速度是之前的2倍,而FixedUpdate还是按正常时间来执行。

Sorry上面红色这部分确实是写错了,感谢网友在留言处给我的指正,谢谢。

正确的应该是timeScale不会影响Update和LateUpdate的执行速度。因为FixedUpdate是根据时间来的,所以timeScale只会影响FixedUpdate的速度。 再次抱歉。。 谢谢热心网友给我的指正。。 因为我的项目里在处理战斗部分的时候 大量使用 iTween 所以  2  3 倍加速 或者暂停 的功能直接修改timeScale 。 

Time.timeScale也误导了我很久,为什么这么说呢?我原先一直以为Time.timeScale = 0 的话所有的Update都不执行了。今天测试了一下发现原来不是这样的,无论Time.timeScale 等于多说Update和LateUpdate都会去执行,不信你可以自己做个实验看看。

Time.timeScale还会影响Time.time的时间,比如Time.timeScale = 2的话,那么Time.time的增长速度也会变成2倍速度。如果你想取到游戏的实际时间,那么使用Time.timeSinceLevelLoad就可以,前提是必须在Awake()方法以后再取,如果在Awake()方法里面取Time.realtimeSinceStartup会取出一个错误的值,在Start方法里面取的话就正常了。

总之一句话Time.timeScale影响的是Unity的游戏时间缩放比例。Unity里面所有跟时间有关系的东西都是根据timeScale来演算的。仔细想想现在的手游就是个 动画 和 粒子技能特效 还有UI位移特效,所以改他们的速度直接用Time.timeScale就可以完成。还有一个重要的东西就是人物移动 或者 技能移动的速度了, 根据时间的公式,时间 = 路程\速度 ,比如角色从起点跑到中间的一个预期时间, 或者一个技能的火球从攻击到打中目标的预期时间。 凡是处理时间的东东全用Time.time 这样就可以完美让Time.timeScale控制你的游戏了。

下面说说两个大家伙比较关心的话题。

1.游戏暂停

设置 Time.timeScale = 0;即可让游戏暂停。 其实我们暂停的主要是 人物动画,还有技能特效,比如一个火球打了一半。UI方面往往我们不希望暂停,比如暂停界面 有一些UI位移动画或者帧动画, 或者最起码要有个“取消暂停的按钮” 吧。 总不能游戏暂停了我点击按钮 按钮的点击动画 或者特效也暂停了吧。

所有的动画都是基于时间来的,因为Time.timeScale = 0了,所以Time.time也就不会在变化了。换句话来说如果游戏暂停以后想在暂停界面上继续播放一些不受Time.timeScale 影响的动画,那么我们就需要用到Time.realtimeSinceStartup

如果你的项目NGUI的版本还算比较新的话,你会发现在UITweener.cs处理UI动画的基类里面已经增加了一个属性叫public bool ignoreTimeScale = true; 它就是控制控制NGUI 的UI动画是否受到ignoreTimeScale影响。如下图所示,你可以看看NGUI在Update里面的实现,它也是根据时间来判断的。忽略timescale的话就用真实时间,不忽略的话就用Time.time 和Time.deltaTime。

Unity3D研究院之Time.timeScale、游戏暂停(七十四) - 雨松MOMO程序研究院 - 1

 

2.如何让游戏中某个游戏对象不受Time.timeScale影响。

动画不受timeScale影响:

http://answers.unity3d.com/questions/217351/animations-ignore-timescale.html

粒子特效不受timescale影响

https://gist.github.com/AlexTiTanium/5676482

经过我的测试发现timeScale = 0 时, 播放放粒子特效,效率上有很大问题非常的卡。

举个例子啊,刀塔传奇大家都玩过吧?某个角色放技能的时候,其他所有人物动作全部暂停,并且打出去的技能也暂停。等着角色的技能全部放完,别人才恢复正常。 我觉得向做这类游戏,最好就不要 利用timeScale了,不然写起来太蛋疼了。 不过刀塔传奇也没有 1 倍 2倍  3倍速 的功能吧,呵呵。

3.timeScale变化时的声音。

当声音播放的同时去修改timescale的数值你会发现声音播放的很奇怪。如下代码所示,你可以封装一个方法,把IgnoreTimeScale作为参数传进去, 如果忽略timescale的话那么速度就应该是1否则就应该是Time.timeScale。

此时如果修改了Time.timeScale的数值的话,那么正在播放中的声音会非常奇怪。所以当每次播放音频的时候我们需要记录一下这个音频的状态,它是否需要忽略timeScale当前的数值。

每当timeScale变化的时候调用一下下面这个方法。就是遍历一下当前保存的所有音频对象,从新设置一下他们的播放频率。

如果你有更好的建议,欢迎在下面给我留言,谢谢。

 

【Unity】使用Time.timeScale暂停游戏的时候的一些问题

使用Time.timeScale暂停游戏的时候的一些问题Unity版本:5.2(win7 64位测试)Unity中游戏暂停一般使用Time.timeScale = 0 来实现。Time.timeSca...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2015年11月06日 02:08
  • 3929

unity3d 关于游戏暂停

前提条件:在项目中用过Time.timeScale = 0来实现游戏暂停问题: 暂停游戏后,暂停界面的按钮可能需要播放一个idle时的动画,Time.timeScale=0 会影响动画播放。受Time...
  • microsoftMSDNNET
  • microsoftMSDNNET
  • 2015年08月18日 20:33
  • 2756

Unity中游戏暂停和开始怎么实现?

(1)Time.timeScale = 0 可以暂停游戏,Time.timeScale = 1 恢复正常,但这是作用于整个游戏的设置,不单单是当前场景,记得在需要的时候重置回Time.timeScal...
  • qiaoquan3
  • qiaoquan3
  • 2016年05月07日 18:09
  • 16998

Unity3D研究院之Time.timeScale、游戏暂停(七十四)

Unity3D研究院之Time.timeScale、游戏暂停(七十四) 本帖最后由 雨松MOMO 于 2014-8-28 09:22 编辑        项目里面一直在用Time.timeS...
  • u010707274
  • u010707274
  • 2017年07月05日 18:51
  • 461

Unity3D研究院之Time.timeScale、游戏暂停(七十四)

项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.timeScale才发现之前我理解错了一些东西。 Time.timeScale可以控制Up...
  • damenhanter
  • damenhanter
  • 2015年11月03日 23:09
  • 406

转载 雨松MOMO 2014年07月16日 于 雨松MOMO程序研究院 发表 Unity3D研究院之Time.timeScale、游戏暂停(七十四)

项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.timeScale才发现之前我理解错了一些东西。 Time.timeScale可以控制Up...
  • qq_37656244
  • qq_37656244
  • 2017年06月07日 10:36
  • 306

Unity3D研究院之初探PoolManager插件(七十四)

前几天我在博客里面分享了为什么Unity实例化很慢的原因,并且也分享了一个缓存池的工具。有朋友给我留言说PoolManager插件非常好用,我抽空研究了一下确实很好用。PoolManager目前的最新...
  • huang9012
  • huang9012
  • 2014年08月22日 14:42
  • 5037

Unity3D研究院之两种方式播放游戏视频

Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,...
  • he_wen_jian
  • he_wen_jian
  • 2014年03月21日 23:28
  • 9645

Unity3D研究院之游戏开发中的人工智能AI

很久没有写Unity3D相关的东西了,是因为这段时间我深陷一款IOS的软件开发中。不过以后我还是会回归Unity3D游戏开发的。什么语言都在用,生活与工作都挺给力的嚯嚯。今天还是打开了久违的Unity...
  • woailvmengmeng
  • woailvmengmeng
  • 2013年10月15日 09:41
  • 2365

Unity3D研究院之两种方式播放游戏视频(二十五)

Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,...
  • taotaoah
  • taotaoah
  • 2016年01月29日 15:22
  • 523
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D研究院之Time.timeScale、游戏暂停(七十四)
举报原因:
原因补充:

(最多只允许输入30个字)