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