轉載 雨松MOMO 2014年07月16日 於 雨松MOMO程序研究院 發表 Unity3D研究院之Time.timeScale、遊戲暫停(七十四)

項目裏面一直在用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變化的時候調用一下下面這個方法。就是遍歷一下當前保存的所有音頻對象,從新設置一下他們的播放頻率。

如果你有更好的建議,歡迎在下面給我留言,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章