“疑難雜癥”又二記
“疑難雜癥”又二記
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,心裏依舊認為惴惴不安,由於個中“病根”自己並沒有找到,後來又經過了不少測試才算找到了些門路,“順藤摸瓜”式的總算“確診”了病因,原來這一切都是
自己大概學習過一些Hotween的實現源代碼,原理上來說還是挺傳統的,大概就是通過一個Update來不斷更新由Hotween.To或者From等API產生的ABSTweenComponent(Hotween中的Tweener,Sequence都繼承於他),當然個中細節非常多,在此就不一一贅述了。值得一提的就是Hotween在時間相關的邏輯上大抵都仰仗於Unity中的Time,也就是說,假設拿上面的代碼舉例:
Hotween.To(<effect run duration time>);
當中動畫(tween
問題出在WaitForSeconds的計時方式與Hotween的計時方式並不同樣!
(怎樣不同我並不十分清楚,有了解的朋友最好還是告之中的一個下)“天真的”推測一下,我估摸著非常有可能WaitForSeconds的計時要略快於Hotween的計時。也就是說,假設WaitForSeconds顯示時間已經過去了1s,Hotween這方可能仍然認為時間僅僅經過了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.WTF,Android版本號隨機崩潰!?
眼下將遊戲公布了一個Android測試版本號。在Galaxy Note(Android 4.1.1)上跑的還算能夠,可是放到紅米Note(Android 4.4.2)上就各種崩潰(差點兒是“隨時隨地”Crash),日誌上看大抵就是一個段錯誤,實在是令人費解。幾番google、多方嘗試之後,才算找到了一個Fix方案:
這裏有個仔細討論(上面的截圖也來自於此)。有興趣的朋友能夠看看 :)
OK,就這些了 ~
“疑難雜癥”又二記