FGUI GTween 完成事件不回调的问题
最近有個項目出現了動畫完成 事件不回調的問題, 一開始還以為是FGUI的bug,在社區也沒找到答案。只能加日志一探究竟。
一、首先 FGUI 里面的動畫底層實現都是 GTweener。
包括 FGUI 編輯器制作的動畫, 通過代碼創建的 GObject.TweenMove 或者控件封裝的動畫 GProgressBar.TweenValue().
二、所有的GTween都被 對象池管理(TweenManager)
這里就有一個很關鍵的地方。一個被對象池管理的對象,持有其引用就有可能會引發問題。
來段有問題的偽代碼, (這就是我碰上的坑 查了好久才查到原因)
if(gtween != null && !gtween.completed) {gtween.Kill(false);gtween = null; }gtween = gobj.TweenMove(Vector2.one,1f).OnComplete(()=>{Debug.Log("完成!"); });第一眼看是不是沒什么問題, 播放動畫之前,判斷上一個動畫是否播放完成, 如果未完成就把上一個動畫殺死。
這段代碼是有問題的,其原因是 gtween 被對象池管理。gtween 完成后被別的地方拿去使用了。這個時候去Kill,有可能Kill 別的動畫,導致別處的動畫發生了異常,不播放了,并且沒有回調事件。
所以對象池中的問題盡量不要持有其引用。如果要持有其引用則需要確保你放回對象池后對象清空。所以上面代碼可以做出如下改動
if(gtween != null && !gtween.completed) {gtween.Kill(false);gtween = null; }gtween = gobj.TweenMove(Vector2.one,1f).OnComplete(()=>{gtween = null;Debug.Log("完成!"); });GTWeening 類中提供了GetTween方法來查找一個物體上的動畫。所以還可以改成以下方式
var gtween = TweenManager.GetTween(gobj,TweenPropType.XY); if(gtween != null)gtween.Kill(false);gtween = gobj.TweenMove(Vector2.one,1f).OnComplete(()=>{gtween = null;Debug.Log("完成!"); });GProgressBar.TweenValue 方法里頭就使用這個方式。
其他要注意的點:
如果要使用 GTween.To() 方法創建動畫 還需要 調用 SetTarget 方法,設置動畫類型以及目標。不然
GTWeening.GetTween 方法就無法使用。
同一個動畫類型不能同時出現在同一個物體上。(后面附加動畫的時候應該把前一個動畫關閉)。
總結
以上是生活随笔為你收集整理的FGUI GTween 完成事件不回调的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下添加用户的命令--usera
- 下一篇: 如何在服务台提交工单?