最近有个项目出现了动画完成 事件不回调的问题, 一开始还以为是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 完成事件不回调的问题相关推荐

  1. 使用 Apache OpenJPA 开发 EJB 3.0 应用,第 6 部分: 处理实体生命周期事件的回调

    企业应用开发过程中,经常会存在这样的需求:当企业应用中的某些数据被增加.删除.修改时,引发一些特定的动作,完成企业应用中的一些特别的要求,比如企业应用中要完成数据操作日志.处理数据之间的某种关系.或者 ...

  2. 如何了解事件中回调函数的参数

    经常碰到有人问: 事件中怎么获取某个对象? 事件中的参数有什么用? 我要某个数据,怎么在事件中获取? 其实,要解决这个问题很简单,甚至不用看API,自己去分析一下就好了.要做分析,只要在事件的回调函数 ...

  3. C# 委托、事件、回调 讲解

    一.C# 委托.事件.回调 基础概念 1.委托是C#中实现事件.回调的基础 2.委托的概念:Delegate C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针. 委托(Deleg ...

  4. Spine事件 AnimationState回调

    Coding for Spine Events and AnimationState callbacks Spine.AnimationState为动画提供了C#事件的回调功能.你可以使用这些来处理一 ...

  5. C#中委托、事件和回调的用法说明

    参考链接: C#中的委托和事件 - Part.1 - 技术 - 张子阳的博客 分分钟用上C#中的委托和事件 - 雾中人 - 博客园 C#回调函数的简单讲解与应用例子(最简单讲解,大神绕道)_sajia ...

  6. 详解C#委托,事件与回调函数

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected vo ...

  7. 小程序自定义分享事件及回调函数

    定义函数 在页面的js文件中定义 onShareAppMessage 函数时,表示该页面可以进行转发.可以在函数中设置页面转发的信息. 只有定义了该函数,小程序右上角的菜单中才会有转发按钮 用户点击转 ...

  8. C#学习笔记--详解委托,事件与回调函数

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected vo ...

  9. cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)

    第三讲 Touch 前面两篇我们学习的内容,足够我们做一款简单的小游戏.也能够说,我们已经入门了,能够蹒跚的走路了. 本篇将解说cocos2dx中非常重要的touch回调机制.你肯定记得第一章做定时器 ...

  10. 图解NodeJS【基于事件、回调的单线程高性能服务器】原理

    2019独角兽企业重金招聘Python工程师标准>>> 刚开始了解Node感觉很吊,各种说高性能,可是一直不理解为什么单线程会比多线程快?为什么异步IO比非阻塞IO快?因此,本篇在阅 ...

最新文章

  1. ISAPI在IIS7上的配置
  2. mysql安装源是什么_mysql官方源安装的一些问题
  3. 【剑指offer-Java版】05从尾到头打印链表
  4. 网站入口页双栏对称布局实现思路
  5. python制作图片数据集_Pytorch自己加载单通道图片用作数据集训练的实例
  6. boost::connected_components用法的测试程序
  7. 程序员修仙之路--优雅快速的统计千万级别uv
  8. 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
  9. Linux系统编程8:入门篇之简单明了说明如何在Linux中Git提交代码
  10. javaweb实现pdf预览
  11. python实现csv行列转置
  12. Python之编写登录接口
  13. vs code默认浏览器
  14. Linux 基于tar与openssl加密解密压缩包
  15. 13天Java进阶笔记-day11-网络编程和NIO
  16. 软件测试-柠檬班python全栈自动化50期测试学习笔记分享
  17. LaneATT代码复现环境配置
  18. 《铸梦之路》帧同步卡牌放置手游(斗罗大陆武魂觉醒、上古王冠)
  19. iOS模拟各种网络状态
  20. git Bash 命令行大全

热门文章

  1. 7-4 散列表查找(PTA程序设计)
  2. js实现城市名称拼音索引
  3. 实对称矩阵的特征值求法_特征值的最大值与最小值
  4. coreldrawx4缩略图显示不出来_CDR缩略图不显示怎么办?CorelDRAW缩略图不显示解决办法 - 优优下载站...
  5. 1.vue前端项目实战-登录功能
  6. 天鹰优化的半监督拉普拉斯深度核极限学习机用于分类
  7. 论文查重率这么高,是由什么原因造成的?
  8. matlab画图常用符号,matlab画图特殊符号
  9. python中win32api_Python win32api.SetCursorPos方法代码示例
  10. python win32api键盘_Python win32api.keybd_event模拟键盘输入