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 方法就无法使用。

同一个动画类型不能同时出现在同一个物体上。(后面附加动画的时候应该把前一个动画关闭)。

猜你喜欢

转载自blog.csdn.net/qq_27461747/article/details/124849079