cc.Animation.playAdditive方法播放序列帧动画有机率会强制中断

Creator 版本:v1.8.0
目标平台: Web
详细报错信息,包含调用堆栈:无任何报错

重现方式:
0. 用的都是prefab格式创建的node,animation组件内含数个clips(待机、被打、死亡…),分开测试皆可正常播放动画。

  1. Play On Load属性设定为true,node创建之后默认播放loop形式的待机动画。
  2. 在子弹击中node时呼叫playAdditive方法来播放单一事件动画,例如:被打,播完之后会返回待机loop动画。
  3. 场上的小喽啰数量多时(1秒内会呼叫多次playAdditive方法的意思),BOSS的单一事件动画有机率会直接在不定秒数中断,直接切回待机loop动画。

额外线索:

  1. 已有写逻辑代码控制呼叫playAdditive方法的时机,已确定完整播完1次动画后才会再开放flag,让播放动画事件能够呼叫到playAdditive方法。
  2. 小喽啰的动画长度皆小于2秒,BOSS的动画有些会大于2秒。
  3. 每个动作的序列帧动画数量平均30张。

不知道大家有没有发生过这个状况呢?
虽然只是机率50%左右的偶发现象,但是因为BOSS通常比较大只,所以发生的时候还挺别扭的

你把声音全部关了。再测测

声音全部关掉之后,状况依然存在

50% 的几率很高了。麻烦提交一个demo,我们重现看看,谢谢!

@jare 快速制作了一个demo,是由官方示例"game-space-shooter"修改而来
animation_test.zip (404.6 KB)
重现方式:

  1. 等待大只的sheep boss出现
  2. sheep boss出现之后点击鼠标按钮朝它射击,让它持续播放normal动画
  3. 观察animation播放的情况,即可看到偶发的动画播放异常 - normal动画还没播完就切回loop动画了
  4. 50%发生率的定义:boss入场到出场的期间只要出现一次动画播放异常,当次周期即算为异常
  5. 可以去修改"Level.js"来控制不出普通sheep,单独测试boss即可发现动画播放异常发生率极低

新的线索:

  1. 发生动画播放异常与序列帧动画张数无关
  2. 既使场上只有一个node在跑cc.Animation.playAdditive方法,依然会出现播放异常
  3. 普通sheep也会出現播放异常,与动画时间长度无关

为啥用playAdditive播放,而不用play播放,你这属于切换不同的播放动画

这只是一个简单的多重动画播放思路而已,如果用playAdditive方法不能实现(或是暂时有bug无法解决),也只能用play方法+自己写代码控制来实现了

你这样相当于是是对同一个节点播放了多个不同的动画,而如果这多个动画影响的属性是一样的时候就会出现你这样的表现了(同一个时间会有多个spriteframe来选择)

这里应该用 play + 代码控制了

可是playAdditive方法的特性不就是如此吗?以下是部份文档内容(http://docs.cocos.com/creator/manual/zh/animation/scripting-animation.html)

“Animation 是支持同时播放多个动画的,播放不同的动画并不会影响其他的动画的播放状态,这对于做一些复合动画比较有帮助。”


看来是我对于文档的理解错误了
"同时播放多个动画"的前提是它们影响的node组件/属性必须不同,而这个sheep的例子是同为cc.SpriteFrame属性,自然无法这样使用playAdditive方法

play + 代码控制已经完成,一切正常了,感谢各位大神的回应
以下设计思路提供给大家

  1. 自己写的播放动画代码必须要能分辨出欲播放的是loop属性动画或是normal属性动画
  2. 在每次播放loop属性动画呼叫cc.Animation.play的时候顺便记下播放了哪一个loop属性动画
  3. 播放normal属性动画时必须侦测何时播放完毕,并在播放完毕callback中回放之前记下来的loop属性动画
1赞