求助:动态加载龙骨资源后,无法播放龙骨动画。

  • Creator 版本: 2.4.10

  • 目标平台:微信小游戏,浏览器测试

已添加龙骨组件的节点中,脚本代码如下:
cc.loader.loadResDir(path, (error: Error, asset: any[]) => {

                if (error || asset.length <= 0) {

                    cc.log(`loadDir error`);

                    return;

                }

                asset.forEach((a) => {

                    if (a instanceof dragonBones.DragonBonesAsset) {

                        this.node.getComponent(dragonBones.ArmatureDisplay).dragonAsset = a;

                        cc.log(`ske is done`);

                    }

                    if (a instanceof dragonBones.DragonBonesAtlasAsset) {

                        this.node.getComponent(dragonBones.ArmatureDisplay).dragonAtlasAsset = a;

                        cc.log(`atlas is done`);

                    }

                });

            });

            this.node.getComponent(dragonBones.ArmatureDisplay).armatureName = `Armature`;

            this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation("walk", 0);

手动加载龙骨资源可以正常播放龙骨动画,但是动态加载龙骨资源且并无报错,却无法播放龙骨动画,求指点。

自问自答了,上贴真慢。龙骨资源的两个资源json在load语句中动态加载到节点龙骨组件后,程序运行到load语句外该节点的龙骨组件中两个json挂载的位置会被置空(null),所以在load外再播放龙骨动画不会生效,看起来只有动画第一帧(感觉是个残影),实际上龙骨动画需要的数据根本没有挂载到龙骨组件节点上。我之后就在脚本里新建了一个变量(数据格式是 dragonBones.ArmatureDisplay,姑且称该变量为x吧),在load语句中把获得的数据赋值到 x里,然后再load语句外就可以通过x再次给节点龙骨组件赋值(还必须在此之后设置好armatureName)来播放龙骨动画了。
不过除了要注意赋值json后再设置armatureName的顺序,我这种方法还需要再load中也给节点龙骨组件赋值json数据,否则无法显示任何图像。
代码如下:
//load并初次赋值,保证图像显示
this.loongDisplay = new dragonBones.ArmatureDisplay();

            cc.resources.loadDir(`path`, (error: Error, asset: any[]) => {

                if (error || asset.length <= 0) {

                    cc.log(`loadDir error`);

                    return;

                }

                asset.forEach((a) => {

                    if (a instanceof dragonBones.DragonBonesAsset) {

                        this.node.getComponent(dragonBones.ArmatureDisplay).dragonAsset = a;

                        this.loongDisplay.dragonAsset = a;

                    }

                    if (a instanceof dragonBones.DragonBonesAtlasAsset) {

                        this.node.getComponent(dragonBones.ArmatureDisplay).dragonAtlasAsset = a;

                        this.loongDisplay.dragonAtlasAsset = a;

                    }

                });
                this.node.getComponent(dragonBones.ArmatureDisplay).armatureName = "Armature";
            });

//load语句之后使用下列语句播放龙骨动画
this.node.getComponent(dragonBones.ArmatureDisplay).dragonAsset = this.loongDisplay.dragonAsset;

            this.node.getComponent(dragonBones.ArmatureDisplay).dragonAtlasAsset = this.loongDisplay.dragonAtlasAsset;

            this.node.getComponent(dragonBones.ArmatureDisplay).armatureName = "Armature";

            this.node.getComponent(dragonBones.ArmatureDisplay).playAnimation("walk", 0);

貌似这个问题,延迟一帧设置就没问题了 :thinking: