【Unity】使用Time.timeScale暂停游戏的时候的一些问题
来源:互联网 发布:windows 7库 快捷方式 编辑:程序博客网 时间:2024/04/29 11:13
使用Time.timeScale暂停游戏的时候的一些问题
Unity版本:5.2(win7 64位测试)
Unity中游戏暂停一般使用Time.timeScale = 0 来实现。Time.timeScale = 0 即将游戏运行的时间速度置为0,所以游戏中一切东西都看上去不动了(FixedUpdate根据时间来执行,所以不会执行,但是Update和LateUpdate是继续执行的,要想暂停Update和LateUpdate可以设置MonoBehaviour.enable = false)。
现在的需求是暂停游戏的时候,角色正在释放的效果是要继续的,这些效果包括代码实现的效果和动画实现的效果。来讲讲我遇到的坑
代码部分
DoTween忽略timeScale:很高兴地用上了DoTween,我们可以设置Tweener.SetUpdate(true)来忽略timeScale,所以大部分问题就这么欢快地解决了,在所有DoTween后面加上SetUpdate(true)。
DoTween对UI褪色的bug:但是当用DoTween对UI进行褪色处理时,遇到了问题:所有的UI都褪色了!当然这个问题我在上一篇博客中已经讲到了,这里给出替代方案:CrossFadeAlpha这个函数的第三个参数是bool isIgnoreTimeScale,将第三个参数设置为true就行了。
WaitForSeconds:为了在游戏暂停的时候延迟调用函数,使用了协程,StartCoroutine(某函数),携程中调用的函数使用了WaitForSeconds,一开始以为是协程的问题,后来一番查阅,知道了是WaitForSeconds的问题,它应该是计的timescale影响的时间,所以游戏暂停的时候不会执行,所以需要根据实际时间手动去实现:
IEnumerator HideLabel(GameObject labelPerfect, float waitTime, bool ignoreTimeScale = false) { if (ignoreTimeScale) { float start = Time.realtimeSinceStartup; while (Time.realtimeSinceStartup < start + waitTime) { yield return null; } } else yield return new WaitForSeconds(waitTime); float destroyTime = 0.3f; labelPerfect.GetComponent<Text>().CrossFadeAlpha(0, destroyTime, true); Destroy(labelPerfect, destroyTime); }
动画和例子效果部分
先推荐雨松momo的文章Unity3D研究院之Time.timeScale、游戏暂停(七十四)
因为暂时只用到了Animator来实现动画效果,所以这里只讲我遇到的Animator的忽略timeScale的方法,其他的可以参考雨松momo的文章
- Animator忽略timeScale:网上介绍说是使用 “`
Animator.updateMode = AnimatorUpdateMode.UnscaledTime; // 指定该Animator更新模式为不受scale影响
我使用了这段代码,并且游戏运行时面板中的Animator的UpdateMode属性也确实变成了UnscaledTime,但是动画还是暂停播放了,表示很无奈,这应该是这个版本Unity的bug吧。但是直接在面板中修改Animator的UpdateMode为UnscaledTime,动画顺利地在暂停状态播放了。
发现了一个不错的暂停游戏的方法,来自candycat
如果一个物体需要一个暂停动作,例如停止动画等等,可以让它的脚本实现OnPauseGame()函数,而在重启时实现OnResumeGame() 函数。那么暂停游戏可以通过调用所有对象上的OnPauseGame()函数:
Object[] objects = FindObjectsOfType (typeof(GameObject)); foreach (GameObject go in objects) { go.SendMessage ("OnPauseGame", SendMessageOptions.DontRequireReceiver); }
然后再调用OnResumeGame() 进行重启。
一个基本的脚本类似下面这样:
protected bool paused; void OnPauseGame () { paused = true; } void OnResumeGame () { paused = false; } void Update () { if (!paused) { // do movement } }
这样方法有一个非常大的好处就是,你可以自己定制所有物体在暂停和重启时的行为,例如存储和加载数据等等。
- 【Unity】使用Time.timeScale暂停游戏的时候的一些问题
- [Unity基础]对Time.timeScale的一些理解
- Time.TimeScale的一些结论
- 【Unity3D游戏开发】Time.timeScale=0暂停游戏的情况下播放动画 (七)
- 【Unity3D自学记录】Time.timeScale、游戏暂停
- unity中游戏暂停的问题
- Unity3D研究院之Time.timeScale、游戏暂停(七十四)
- Unity3D研究院之Time.timeScale、游戏暂停(七十四)
- Unity3D研究院之Time.timeScale、游戏暂停(七十四)
- 按ESC键暂停游戏 Time.timeScale = 0
- Unity3D研究院之Time.timeScale、游戏暂停(七十四)
- Unity3D中使用TimeScale暂停游戏后,开始游戏前的播放动画 比如3,2,1,Go!动画
- Time.timeScale(unity)
- Unity中的Time和Time.timeScale对协程的yield的影响
- 在Unity游戏开发中使用暂停的小技巧
- Unity关于Time.timeScale详解
- Unity中Time.timeScale详解
- Unity 让游戏暂停的方法
- 我的第一个CSDN博客
- HDU 5514 【2015沈阳现场赛 F】 Frogs
- OC重点知识:代理
- maven自动部署web项目到tomcat8(向下兼容7)
- 解决adb server is out of date. killing... 报错
- 【Unity】使用Time.timeScale暂停游戏的时候的一些问题
- OC中代理设计模式
- [2098]:分拆素数和
- git(三) git fetch 妙用
- 求素数(2个模板)
- soj 1685: Chopsticks(线性dp)
- SOA服务经验总结
- maven使用中遇到的问题总结
- 浅谈C/C++中的typedef和#define