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。

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

动画不受timeScale影响:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

static IEnumerator Play ( Animation animation , string clipName , bool useTimeScale , System . Action onComplete )
{
if ( ! useTimeScale )
{
AnimationState _currState = animation [ clipName ] ;
bool isPlaying = true ;
float _startTime = 0F ;
float _progressTime = 0F ;
float _timeAtLastFrame = 0F ;
float _timeAtCurrentFrame = 0F ;
float deltaTime = 0F ;
animation . Play ( clipName ) ;
_timeAtLastFrame = Time . realtimeSinceStartup ;
while ( isPlaying )
{
_timeAtCurrentFrame = Time . realtimeSinceStartup ;
deltaTime = _timeAtCurrentFrame - _timeAtLastFrame ;
_timeAtLastFrame = _timeAtCurrentFrame ;
_progressTime += deltaTime ;
_currState . normalizedTime = _progressTime / _currState . length ;
animation . Sample ( ) ;
if ( _progressTime >= _currState . length )
{
if ( _currState . wrapMode != WrapMode . Loop )
{
isPlaying = false ;
}
else
{
_progressTime = 0.0f ;
}
}
yield return new WaitForEndOfFrame ( ) ;
}
yield return null ;
if ( onComplete != null )
{
onComplete ( ) ;
}
}
else
{
animation . Play ( clipName ) ;
}
}

粒子特效不受timescale影响

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

using UnityEngine ;
using System . Collections ;
public class ParticaleAnimator : MonoBehaviour {
  
private void Awake ( )
{
particle = GetComponent < ParticleSystem > ( ) ;
}
// Use this for initialization
void Start ( )
{
lastTime = Time . realtimeSinceStartup ;
}
// Update is called once per frame
void Update ( )
{
float deltaTime = Time . realtimeSinceStartup - ( float ) lastTime ;
         particle . Simulate ( deltaTime , true , false ) ; //last must be false!!
         lastTime = Time . realtimeSinceStartup ;
}
private double lastTime ;
private ParticleSystem particle ;
}

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

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

3.timeScale变化时的声音。

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

1
2
3
4
5
6

//添加一个声音组件
AudioSource source = gameObject . AddComponent < AudioSource > ( ) ;
//设置播放声音的速度。 默认速度是1 ,那如果我们加速了,那就应该是 Time.timeScale
source . pitch = IgnoreTimeScale ? 1 : Time . timeScale ;
//播放声音
source . Play ( ) ;

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

1
2
3
4
5
6
7
8

//创建一个音频的字典
private static Dictionary < AudioSource , bool > soundList = new Dictionary < AudioSource , bool > ( ) ;
//播放声音
source . Play ( ) ;
//把音频对象加入字典中,value 就是是否忽略timescale
soundList . Add ( source , IgnoreTimeScale ) ;

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

1
2
3
4
5
6
7
8
9
10

     public static void TimeScaleChanged ( )
     {
foreach ( AudioSource source in soundList . Keys )   
{   
if ( source != null )
{
source . pitch = soundList [ source ] ? 1 : Time . timeScale ;
}
}   
     }

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

Time之游戏暂停功能相关推荐

  1. python暂停和恢复游戏_pygame游戏之旅 添加游戏暂停功能

    pygame游戏之旅 添加游戏暂停功能 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  pygame游戏之旅 添加游戏暂停功能.txt ] (友情提示:右键点上行 ...

  2. pygame游戏之旅13:添加游戏暂停功能

    定义暂停函数: def paused():largeText = pygame.font.SysFont('comicsansms',115)TextSurf, TextRect = text_obj ...

  3. 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现...

    CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此  假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊 ...

  4. java连连看倒计时_0053 游戏连连看增加倒计时和暂停功能和提示功能

    原标题:0053 游戏连连看增加倒计时和暂停功能和提示功能 上节课增加了更多的功能,让游戏可以持续玩下去,并处理了游戏结束和重新开始. 这节课来增加更多的功能:提示功能.倒计时功能和暂停功能. 将关卡 ...

  5. Cocos2d-x游戏暂停、继续游戏、重新开始界面的实现---之游戏开发《赵云要格斗》(10)

    这里是 Evankaka 的博客,欢迎大家前来讨论与交流------      转载请注明出处http://blog.csdn.net/evankaka/article/details/4293611 ...

  6. 【Cocos游戏实战】功夫小子第六课之游戏主功能场景的分析和实现

    本节课的视频教程地址是:第六课在此 如果本教程有帮助到您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,可以免费领取30天学习时间,免费拿极客学院VIP,1000+高清视频,学习Andro ...

  7. 【cocos2d-x入门实战】微信飞机大战之十一:游戏暂停和触摸屏蔽

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11999229 一个游戏打到一半尿点咋整?难道要憋着...这不科学啊! 好吧, ...

  8. unity3d 关于游戏暂停

    前提条件:在项目中用过Time.timeScale = 0来实现游戏暂停 问题: 暂停游戏后,暂停界面的按钮可能需要播放一个idle时的动画,Time.timeScale=0 会影响动画播放. 受Ti ...

  9. 推荐一款带暂停功能的轮播组件,不要谢我,我叫红领巾!

    阅读目录 一.效果展示 1.先跟大家见个面,打个招呼 2.什么?切换太慢了?好,加快速度! 3.加入其他功能 4.图片太小,看不出效果?好,那来个大图感受下! 5.如果你不想要右上角的小图标,照样可以 ...

最新文章

  1. 2022-2028年中国互联网+房车行业深度调研及投资前景预测报告
  2. 7.分布式数据库HBase第3部分
  3. 判断js中的数据类型的方法
  4. 多媒体基础:动画和视频知识笔记
  5. EventUtil.addHandler方法
  6. 认清业务、技术与软件系统的价值链
  7. ZZULIOJ 1121: 电梯
  8. Linux内核分析 - 网络[五]:vlan协议-802.1q
  9. Matlab软件包及安装
  10. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档
  11. IOS日历控件JTCalendar
  12. vvic/搜款网API接口(item_search-根据关键词取商品列表 )
  13. 解决电脑因System进程而变得很卡
  14. MATLAB矩阵基础知识(二)
  15. 划水总结剑指offer 链表系列1
  16. 安装pytorch报错及解决
  17. 【TDA2x学习】番外篇一、TDA2x工程学习手记
  18. 用python爬取全国315个城市肯德基老爷爷的店面信息,看看又是什么神奇的发现
  19. VSCode代码格式化快捷键
  20. 2022全开源企业发卡网源码+修复短网址BUG等

热门文章

  1. 蚂蚁金服二轮面试(P7岗)经验分享
  2. [附源码]java毕业设计基于的楼盘销售管理系统论文2022
  3. DIV+CSS实操五:经管系网页内容模块内容添加(二)
  4. html页面中给元素添加事件常见的3种语法
  5. 用c++做一个简单的打飞机小游戏(详细说明与注释)
  6. 关于Android LiveCD的几点问题
  7. [模式识别].(希腊)西奥多里蒂斯第四版笔记2之__基于贝叶斯决策理论的分类器
  8. android emulator创建avd命令
  9. java arraycopy方法_Java System.arrayCopy()方法
  10. 06 flowable DMN部署单独使用