动态加载spine动画失败

creator 版本v1.10.2
代码如下

cc.loader.loadRes("effect/win", sp.SkeletonData ,(err, spData)=>{
            let newNode = new cc.Node();
           let sps =  newNode.addComponent(sp.Skeleton);
           this.node.addChild(newNode)
           sps.setSkeletonData(spData);
           sps.setSkin("default");
           sps.setAnimation(0, "win_1", true);
        })

打印断点发现是sp.Skeleton 中的_sgNode 为空;

skeleton.js
__preload 方法也被调用l
也调用了this._refresh()

这里要求.this._sgNode 不为空

setSkeletonData: function (skeletonData, ownsSkeletonData) {
        if (this._sgNode) {
            this._sgNode.setSkeletonData(skeletonData, ownsSkeletonData);
        }
    },
 _createSgNode: function () {
        var skeletonData = this.skeletonData;
        // this.skeletonData.notify
        if (skeletonData/* && self.atlasFile*/) {
            if (CC_JSB) {
                var uuid = skeletonData._uuid;
                if ( !uuid ) {
                    cc.errorID(7504);
                    return null;
                }
                var jsonFile = cc.loader.md5Pipe ? cc.loader.md5Pipe.transformURL(skeletonData.nativeUrl, true) : skeletonData.nativeUrl;
                var atlasText = skeletonData.atlasText;
                if (!atlasText) {
                    cc.errorID(7508, skeletonData.name);
                    return null;
                }
                var texValues = skeletonData.textures;
                var texKeys = skeletonData.textureNames;
                if ( !(texValues && texValues.length > 0 && texKeys && texKeys.length > 0) ) {
                    cc.errorID(7507, skeletonData.name);
                    return null;
                }
                var textures = {};
                for (var i = 0; i < texValues.length; ++i) {
                    textures[texKeys[i]] = texValues[i];
                }

                var sgNode = new sp._SGSkeletonAnimation();
                try {
                    sp._initSkeletonRenderer(sgNode, jsonFile, atlasText, textures, skeletonData.scale);
                }
                catch (e) {
                    cc._throw(e);
                    return null;
                }
                return sgNode;
            }
            else {
                var data = skeletonData.getRuntimeData();
                if (data) {
                    try {
                        return new sp._SGSkeletonAnimation(data, null, skeletonData.scale);
                    }
                    catch (e) {
                        cc._throw(e);
                    }
                }
            }
        }
        return null;
    },

而_createSgNode 则要求 skeletonDatas不为空, 所以现在骨骼动画不支持动态加载了?

没人解释下吗

11111,是我用错了吗?

你使用cc.loader.loadres这个方法时确认加载spine成功了吗?我一般会这么写

判断一下这个err参数是否存在先。

加判断是应该的,不过这里err为空,spkedata是有数据的

最终折腾好了

 cc.loader.loadRes("effect/win", sp.SkeletonData ,(err, spData)=>{
            if(err){
                cc.log("err ", err)
                return
            }
            let nodeNew = new cc.Node();
            let spCmpt =nodeNew.addComponent(sp.Skeleton);
            this.node.addChild(nodeNew);
            spCmpt.skeletonData = spData;
           
            spCmpt.setSkin("default");
            spCmpt.setAnimation(0, "eff_yndmn_dhk_r_e", true);
        })

得用 spCmpt.skeletonData = spData;
不能用 spCmpt.setSkeletonData()
怪我没看说明,上面说明了

    /**
     * !#en
     * Sets runtime skeleton data to sp.Skeleton.<br>
     * This method is different from the `skeletonData` property. This method is passed in the raw data provided by the Spine runtime, and the skeletonData type is the asset type provided by Creator.
     * !#zh
     * 设置底层运行时用到的 SkeletonData。<br>
     * 这个接口有别于 `skeletonData` 属性,这个接口传入的是 Spine runtime 提供的原始数据,而 skeletonData 的类型是 Creator 提供的资源类型。
     * @method setSkeletonData
     * @param {sp.spine.SkeletonData} skeletonData
     * @param {sp.spine.SkeletonData} ownsSkeletonData
     */