1. 程式人生 > >“疑難雜癥”又二記

“疑難雜癥”又二記

for 動畫 man 4.4 rip har target rtti forum


“疑難雜癥”又二記


0. 引子

近來工作又遇到一些“疑難雜癥”,在此簡單記下,自省省人 ~

1. 都是WaitForSeconds 惹的禍 ~

眼下開發的遊戲非常多地方都用到了Hotween,個人感覺還是挺不錯的(題外話,Hotween的第二版Dotween應該也快正式Release了,各種改進令人期待 :)),推薦有興趣的朋友試試,雖說自己感覺Hotween的使用還挺順暢。只是小坑還是踩到了一個:

對於一些連續的tween效果,使用Hotween + yield return new WaitForSeconds的組合方式個人感覺還是挺easy理解的。於是項目中的不少地方都出現了類似以下這樣的形式的代碼:

Hotween.To(<effect run duration time>);

yield return new WaitForSeconds(<duration time>);

Hotween.To(...);

大部分情況下,上面的代碼都執行的非常好,可是在極少數的情況下(真機測試下情況尤甚)。會出現動畫(tween)出錯的情況,並且極難重現,非常隨機,自己斷斷續續的查了好久,設想了不少可能原因。也依此做了不少Fix,心裏依舊認為惴惴不安,由於個中“病根”自己並沒有找到,後來又經過了不少測試才算找到了些門路,“順藤摸瓜”式的總算“確診”了病因,原來這一切都是

WaitForSeconds惹的禍 :)

自己大概學習過一些Hotween的實現源代碼,原理上來說還是挺傳統的,大概就是通過一個Update來不斷更新由Hotween.To或者FromAPI產生的ABSTweenComponentHotween中的TweenerSequence都繼承於他),當然個中細節非常多,在此就不一一贅述了。值得一提的就是Hotween在時間相關的邏輯上大抵都仰仗於Unity中的Time,也就是說,假設拿上面的代碼舉例:

Hotween.To(<effect run duration time>);

當中動畫(tween

)的時間durationHotween大抵上便是由Time.time - tweenStartTime這類形式來加以控制的,這樣的控制方式非常直觀,一般來講也沒什麽問題。可是結合上WaitForSeconds就出岔子了……

問題出在WaitForSeconds的計時方式與Hotween的計時方式並不同樣!

(怎樣不同我並不十分清楚,有了解的朋友最好還是告之中的一個下)“天真的”推測一下,我估摸著非常有可能WaitForSeconds的計時要略快於Hotween的計時。也就是說,假設WaitForSeconds顯示時間已經過去了1sHotween這方可能仍然認為時間僅僅經過了0.9s……當然。實際程序執行中兩者的差距遠沒有如此誇張,可是不會一致基本上是肯定的。而當兩者的差距偶爾偏大,譬如說超過一幀時。“詭異”的動畫問題可能就會出現了,考慮上述代碼:

Hotween.To(<effect run duration time>);

yield return new WaitForSeconds(<duration time>);

// previous tweener could still running ……

Hotween.To(...);

盡管你使用WaitForSeconds等待了duration時間,但實際上相對Hotween而言,duration時間還沒有到(感覺頗有些相對論的味道 :))。動畫仍然會在yield之後繼續執行。這與你代碼的邏輯如果是相悖的,自然就會出現或這或那的奇怪問題……

基於此,我改變了一下動畫的控制方式,代碼大概是這個樣子:

bool isTweenEnd = false;

Hotween.To(<effect run duration time when end it will set “isTweenEnd” to true>);

while (!isTweenEnd) {

yield return null;

}

Hotween.To(...);

此番修改之後,之前各種奇怪的動畫問題總算是“消停”了,呼……

2.WTFAndroid版本號隨機崩潰!?

眼下將遊戲公布了一個Android測試版本號。在Galaxy NoteAndroid 4.1.1)上跑的還算能夠,可是放到紅米NoteAndroid 4.4.2)上就各種崩潰(差點兒是“隨時隨地”Crash),日誌上看大抵就是一個段錯誤,實在是令人費解。幾番google、多方嘗試之後,才算找到了一個Fix方案:

技術分享

這裏有個仔細討論(上面的截圖也來自於此)。有興趣的朋友能夠看看 :)

OK,就這些了 ~


“疑難雜癥”又二記