播放动画中切换场景导致崩溃 引擎版本1.8.2

可以让引擎组看看AnimationState这有啥隐藏问题

我测试了下,的确如你所说的情况,@jare 请有时间了看看吧。

1赞

AnimationState 播放动画, 没有维护 Animation的状态
这个bug我们直接绕开了, 看到别人提问了, 就顺便跟你说下.

1赞

这位大哥。。。请不要在项目里设置了 AnimationState.wrapMode 为 Loop 状态后,还在 update 中持续调用 state.play() 播放动画。。。
因为您自己在 update 中手动调用了 animationState 的 play,所以请在 onDisable 下调用 stop 函数手动的停止播放
这个真不是我们引擎的问题。。。:sweat:

update多浪费啊

您还真是 24 小时全程在线。。。。:grin:

麻烦您仔细看看啊,并没有在update里持续调用play啊,调用play之前会先判断是否正在播放,如果正在播放直接返回了啊!之所以在update里进行处理是为了实时判断是否需要播放。

一直执行这个判断,申明变量,多浪费啊

这样是不好可以改掉,但只要使用animationState进行播放循环动画,切场景就崩溃,不用animationState又判断不了当前动画是否在播放中。

意思是只要使用了animationState进行播放动画就必须手动停止动画吗?这个文档貌似没有涉及到。

是没有涉及的,但是我们调用的流程中释放 Animation 资源之前会将所有的 Clip 状态更改为 stop ,停止调用。
你在 update 里面一旦重新设置 play 就会导致重新的引用, 在 Destroy 阶段无法释放资源。

怎么就说不明白了嘛:joy:,和update没关系的,你直接在start里调用animationState的play方法也一样报错的,总之就是只要使用了animationState播放循环动画再切场景就报错。
这样仍然报错:

然而好像并没有像你说的这样做,只要使用animationState的play 方法播放循环动画就不能直接切换场景。

emmm. 刚才重新研究了一下,得到了个简单的答案。。。就是引擎现在没有做到这么自动化,您通过 AnimationState 操作的 Clip 在最后销毁阶段并没有 Stop 播放,所以暂时还是建议手动的调用 stop

嗯,这个按说都需要销毁了,引擎应该在销毁节点前把节点清零干净。

现在引擎内对 State 状态的操作是不会影响到 CCAnimation 管理器状态的,这导致在 onDisable 阶段引擎没有办法正确的判断当前是否有 Clip 在播放,因为你跳过了管理器,直接对 Clip 进行了操作。所以管理器 CCAnimation 组件状态还是默认的,Clip 是播放状态,因此没有释放。。。
简而言之: 非要使用 State 直接操作动画内容,请对她负责到底

是不是可以考虑给管理器(Animation)增加一个接口?用来判断当前是不是在播放某个动画或者直接返回当前是不是在播放动画中?因为现在要获取是不是在播放动画就必须使用AnimationState。还有一个能不能提供一个恢复到原来状态的接口?类似spine的setToSetUpPos这样的接口?比如一个动画,需要播放时循环播放,不需要播放时要恢复到原来的样子。

感觉不合理啊,在销毁节点时,管理器应该强制停止掉所有的Clip才正常,管理器肯定是知道内部有多少个clip的,无论你是不是单独操作了clip,管理器只要在销毁前停止掉所有clip就行了。