日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FGUI GTween 完成事件不回调的问题

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 完成事件不回调的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。