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

博客讲述了在使用FGUI时遇到的动画完成事件不回调的问题,深入分析了问题根源在于对象池管理的GTweener。文章强调了在处理对象池中的对象时,不应长时间持有引用,以免影响其他动画。提供了修正代码示例,包括使用GetTween方法查找并清除动画,以及避免同一动画类型同时存在。此外,还提醒了使用GTween.To()方法时需注意设置目标。
摘要由CSDN通过智能技术生成

最近有个项目出现了动画完成 事件不回调的问题, 一开始还以为是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 方法就无法使用。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值