更新到 creator 2.0.1,之后,虽然修复 2.0 的这个bug(调用 cc.audioEngine.stop 之后,所有的 setFinishCallback 回调都无法触发),但是又引入的了新问题:
勾选“自动释放资源”,场景切换之后,会触发上个场景中所有已设置的 cc.audioEngine.setFinishCallback 回调。
经过试验,发现手动调用 cc.audioEngine.stop 也会直接触发 setFinishCallback 回调。估计是因为这个问题,导致勾选了 “自动释放资源”并切换场景后,会把上个场景的所有 setFinishCallback 回调都触发了个遍。
这样一来,如果我在场景1中有以下类似逻辑,切换到下个场景后,在 setFinishCallback 回调里面的逻辑就会报错了:
let clip1ID = cc.audioEngine.playEffect(this.clip1, false); cc.audioEngine.setFinishCallback(clip1ID, () => { // 音频 clip1 播放之后,执行更多游戏逻辑,例如:移动角色到下个位置等 this.roleNode.runAction(cc.moveBy(0.8, 0, 100)); // 更多逻辑 ... ... });
如以上代码所示,由于场景1切换之后,所有的节点都已被移除,所以当切换到下个场景就会出现类似报错:Uncaught TypeError: Cannot read property 'runAction' of null
所以,如果是手动调用 cc.audioEngine.stop,是不是不应该触发 setFinishCallback 回调呢?尤其是在“自动释放资源”的时候,更不应该触发这个“已经释放资源的场景”中设置的 setFinishCallback 回调。