Unity3D中暫停時的動畫及粒子效果實現
暫停是遊戲中經常出現的功能,而Unity3D中對於暫停的處理並不是很理想。一般的做法是將Time.timeScale
設定為0。Unity的文件中對於這種情況有以下描述;
The scale at which the time is passing. This can be used for slow motion effects….When timeScale is set to zero the game is basically paused …
timeScale表示遊戲中時間流逝快慢的尺度。文件中明確表示,這個引數是用來做慢動作效果的。對於將timeScale設定為0的情況,僅只有一個補充說明。在實際使用中,通過設定timeScale來實現慢動作特效,是一種相當簡潔且不帶任何毒副作用的方法,但是當將timeScale設定為0來實現暫停時,由於時間不再流逝,所有和時間有關的功能痘將停止,有些時候這正是我們想要的,因為畢竟是暫停。但是副作用也隨之而來,在暫停時各種動畫和粒子效果都將無法播放(因為是時間相關的),FixedUpdate也將不再被呼叫。
換句話說,最大的影響是,在timeScale=0的暫停情況下,你將無法實現暫停選單的動畫以及各種漂亮的點選效果。
但是並非真的沒辦法,關於timeScale的文件下就有提示:
Except for realtimeSinceStartup, timeScale affects all the time and delta time measuring variables of the Time class.
因為 realtimeSinceStartup
和 timeScale
無關,因此也就成了解決在暫停下的動畫和粒子效果的救命稻草。對於Unity動畫,在每一幀,根據實際時間尋找相應幀並取樣顯示的方法來模擬動畫:
AnimationState _currState = animation[clipName];
bool isPlaying = true;
float _progressTime = 0F;
float _timeAtLastFrame = 0F;
float _timeAtCurrentFrame = 0F;
bool _inReversePlaying = false;
float _deltaTime = 0F;
animation.Play(clipName);
_timeAtLastFrame = Time.realtimeSinceStartup;
while (isPlaying) {
_timeAtCurrentFrame = Time.realtimeSinceStartup;
_deltaTime = _timeAtCurrentFrame - _timeAtLastFrame;
_timeAtLastFrame = _timeAtCurrentFrame;
_progressTime += _deltaTime;
_currState.normalizedTime = _inReversePlaying ? 1.0f - (_progressTime / _currState.length) : _progressTime / _currState.length; animation.Sample(); //…repeat or over by wrap mode }
對於粒子效果,同樣進行計時,並通過粒子系統的Simulate方法來模擬對應時間的粒子狀態來完成效果,比如對於Legacy粒子,使Emitter在timeScale=0
暫停時繼續有效發射並顯示效果:
_deltaTime = Time.realtimeSinceStartup - _timeAtLastFrame;_timeAtLastFrame = Time.realtimeSinceStartup;if (Time.timeScale == 0 ){ _emitter.Simulate(_deltaTime); _emitter.emit = true;}
核心的程式碼基本都在上面了,可以根據這個思路完成實現。完整的程式碼和示例工程我放到了github上,有需要的朋友可以去檢視,也
相關文章
- Flutter動畫實現粒子漂浮效果Flutter動畫
- CSS3實現王者匹配時的粒子動畫效果CSSS3動畫
- CSS 滑鼠懸浮動畫暫停效果CSS動畫
- flutter實現B站播放器暫停時的header效果Flutter播放器Header
- CSS3中用background-image實現粒子動畫效果CSSS3動畫
- 教你如何用WPF實現文字粒子閃爍動畫效果動畫
- Flutter PIP(畫中畫)效果的實現Flutter
- css3 動畫的暫停和重新開始CSSS3動畫
- vue+樹莓派實現實時視訊播放暫停Vue樹莓派
- mpvue小程式迴圈動畫開啟暫停Vue動畫
- 5分鐘用動效工廠實現粒子動畫動畫
- OpenJDK 17中的Shenandoah可實現亞毫秒級GC暫停JDKNaNGC
- 動畫合成小技巧!CSS 實現動感的倒數計時效果動畫CSS
- 微信小程式iOS端如何暫停animated動畫微信小程式iOS動畫
- canvas 中普通動效與粒子動效的實現Canvas
- 「譯」如何實現互動式 WebGL 懸停效果Web
- Fiori裡花瓣的動畫效果實現原理動畫
- 【譯】使用者與Flutter互動時的粒子動畫Flutter動畫
- 加入購物車動畫效果實現動畫
- Flutter 類抽屜效果動畫實現。Flutter動畫
- Web 頁面如何實現動畫效果Web動畫
- 前端動畫效果實現的簡單比較前端動畫
- MaterialDesign系列文章(十二)ConstraintLayout實現的動畫效果AI動畫
- ManualResetEvent實現執行緒的暫停與恢復執行緒
- Canvas 實現畫中畫動畫效果–網易娛樂年度盤點H5動畫解密Canvas動畫H5解密
- Canvas 實現畫中畫動畫效果--網易娛樂年度盤點H5動畫解密Canvas動畫H5解密
- 萬彩動畫大師教程 | 如何實現物件的閃動的動畫效果動畫物件
- 短視訊直播原始碼,視訊計時效果,可隨時按鍵暫停原始碼
- CSS3動畫實現3D倒數計時效果CSSS3動畫3D
- jQuery中動畫的實現jQuery動畫
- 粒子效果
- ul>li*3 實現翻書動畫效果動畫
- css3實現動畫閃爍效果CSSS3動畫
- 使用SVG實現的一個Android播放/暫停按鈕SVGAndroid
- Flutter實戰動畫番外篇-翻頁效果實現Flutter動畫
- 暫停,掉線,遊戲工作室的現實難題遊戲
- js利用H5的requestAnimationFrame()API實現動畫效果JSH5requestAnimationFrameAPI動畫
- 用Provider實現商品加入購物車的動畫效果IDE動畫
- 【實戰】這個炫酷的播放粒子效果,你也可以學會!使用Web動畫API製作Web動畫API