销毁龙骨动画报错

###销毁 dragonBones节点的时候报错 loopComplete of null

版本: 2.1.0
运行环境 web 谷歌浏览器

###操作逻辑

  1. 动态创建 带有 dragonBones的预制体
  2. 播放 预制体死亡动画
  3. 销毁 预制体

###代码片段

utils.getDaoguang( `/remoteRes/boss/${ conf.enemyRes }`, `${ conf.enemyRes }`, ( data ) => {
            if ( self.curBoss ) {
                self.curBoss = null;
            }
            self.curBoss = cc.instantiate( self.bossObj );
            self.curBoss.x = 0;
            self.curBoss.y = 0;
            self.bossPos.addChild( self.curBoss );

            let com = self.curBoss.getComponent( 'BossObject' );
            com.setDragonBones( data );
        } );

###class utils

utils.getDaoguang = function ( path, name, callback ) {
    let res = cc.loader.getRes( `${ path }/${ name }_ske.json` );
    if ( res ) {
        let atlasRes = cc.loader.getRes( `${ path }/${ name }_tex.json`,dragonBones.DragonBonesAtlasAsset );
        let dragonAsset = {};
        dragonAsset.asset = res;
        dragonAsset.atlasAsset = atlasRes;

        cc.loader.setAutoReleaseRecursively(res,true);
        cc.loader.setAutoReleaseRecursively( atlasRes , true );
        callback && callback( dragonAsset );
    } else {
        cc.loader.loadResDir( `${ path }/`, () => {
        }, ( err, assets ) => {
            if ( err ) {
                cc.error( '加载报错', path );
                return;
            }

            if ( assets.length <= 0 ) {
                return;
            }

            let dragonAsset = {};
            for ( const i in assets ) {
                cc.loader.setAutoReleaseRecursively(assets[i],true);
                if ( assets[ i ] instanceof dragonBones.DragonBonesAsset ) {
                    dragonAsset.asset = assets[ i ];
                } else if ( assets[ i ] instanceof dragonBones.DragonBonesAtlasAsset ) {
                    dragonAsset.atlasAsset = assets[ i ];
                }
            }

            callback && callback( dragonAsset );
        } );
    }
};

龙骨node 绑定脚本

onComplete( event ) {
        this._curArmatureName = this._armationDisplay.armatureName;
        if ( this._curArmatureName === gameGlobal.ENUM.boosAct.IDLE || this._curArmatureName === gameGlobal.ENUM.boosAct.DEATH ) {
            if ( this._curArmatureName === gameGlobal.ENUM.boosAct.DEATH ) {
                this.node.removeComponent( dragonBones.ArmatureDisplay );
                // 死掉
                this.node.parent.destroy();
            }
            return;
        }

        this.playArmatureByName( gameGlobal.ENUM.boosAct.IDLE );
    },

onDisable() {
        cc.loader.release( this._armationDisplay.dragonAsset );
        cc.loader.release( this._armationDisplay.dragonAtlasAsset );
        cc.sys.garbageCollect();

        this._armationDisplay.off( dragonBones.EventObject.COMPLETE, this.onComplete, this );
    },

PS:

如果在 onDisable 中用 cc.loader.release( this._armationDisplay.dragonAsset ); cc.loader.release( this._armationDisplay.dragonAtlasAsset ); 就不报loopComplete of null的错误.而是循环发出

The armature data has been disposed.
Please make sure dispose armature before call factory.clear().

的警告;

麻烦使用2.0.7测试一下,这个问题应该已经修复了的

2.1.0也有这个问题,有什么办法能解决下吗?

这个额问题是因为.资源被delete 了…但是动作还在继续.所以报错…可以先把动作停止.然后在清理资源…隔断时间才手动GC一次…

mark