代码如下:
let state = anim.play();
state.once(‘finished’, () => {
console.log(‘finished’);
});
state.once(‘stop’, () => {
console.log(‘stop’);
});
必然会先打印stop,既然这样,监听finished的意义在哪?
因为这个问题产生几次BUG了,实在忍无可忍了,希望官方能给个解决方案
代码如下:
let state = anim.play();
state.once(‘finished’, () => {
console.log(‘finished’);
});
state.once(‘stop’, () => {
console.log(‘stop’);
});
必然会先打印stop,既然这样,监听finished的意义在哪?
因为这个问题产生几次BUG了,实在忍无可忍了,希望官方能给个解决方案
你这是想表达什么呢?
总觉得这里逻辑上没啥问题啊?必然是先停止再结束,总不能先结束再停止吧
这种顺序的话,怎么知道是动画播放完了而不是用户手工中断?
关键是这个状态也并不是拿来处理这类逻辑的吧?既然是手工中断,那么在手动中断这里加个标签,在结束时判断标签是否为true不就能判断了?
通过其它方法处理当然是没问题
对于anim这个模块我是做了封装的,完成、停止等事件都有不同的回调,比如场景切换,用户操作,或者在prefab中,有的需要先stop触发事件,而动画播放完,就不能再触发stop
这样的话代码更简练逻辑更清晰,否则到处要做标记,很麻烦
我只是不太明白,如果动画播放完毕时,只触发finished,外部停止只触发stop有什么弊端?
很早以前我好像尝试过通过duration来判断是不是到了最后一帧,是的话就采用finish的回调,stop回调作废,但好像之前遇到了啥BUG,就懒得搞这个事了
源码暂时不敢去改,没时间做大量测试
lastframe试过了,只loop、pingpong之类的循环动画有效
还有种方式,在最后一帧添加个帧事件当作lastframe这类来处理怎么样?
帧事件我从来就不用,感觉用ui层面的东西处理程序逻辑靠不住,哈哈
手动中断不会触发finish吧?
手动中断不会触发,是对的
但如果不是手动中断,是动画播放完,会先触发stop,然后又finished,就两个回调都触发了
我看了一下文档,发现这么触发是有必要的,你可以测试一下。就是当动画正常播放完成是,stop和finish事件都会触发,但是当我们在动画播完之前手动调用anim.stop时,finish事件是不会触发的。因此这两个事件如果是用来区分动画是否正常结束的,这也是有必要的。
我没验证过上面的说法,你可以测一下。
你可以只监听finish事件,然后在你手动调用anim.stop的地方,再手动执行finish事件的回调(如果需要的话)
解决不了问题的兄弟
不管是手动中断还是播放完,都会先触发stop,就已经产生了回调,那你怎么知道这个stop是因为播放完而不是手动中断触发的?
他意思是不监听stop,只监听finish,这样finish可以判断为播放完成,如果是手动中断,就在手动调用stop的地方自己去处理手动的逻辑
不改源码的话,stop回调中延迟一帧判断是否有finish回调;改源码可以把正常结束和播放完调用stop回调传不同参数