分享一个自动图集在预览模式获取图片的方法

在游戏启动的时候添加如下代码,其中引擎代码和图片资源路径替换成对应版本代码和自己工程的路径即可

if(CC_PREVIEW){
            //预览模式修改图片赋值方法和图集获取图片的方法。因为自动在预览模式不能直接获取图片,因此改为这种方式
            let spriteFrameDesc = Object.getOwnPropertyDescriptor(cc.Sprite.prototype, "spriteFrame");
            spriteFrameDesc.set = function(oldValue, oldForce) {
                //oldFunc为引擎源码
                let oldFunc = function(value, force){
                    var lastSprite = this._spriteFrame;
                    if (CC_EDITOR) {
                        if (!force && ((lastSprite && lastSprite._uuid) === (value && value._uuid))) {
                            return;
                        }
                    }
                    else {
                        if (lastSprite === value) {
                            return;
                        }
                    }
                    //设置九宫格
                    if(lastSprite && this.type == cc.Sprite.Type.SLICED){
                        value.insetTop = lastSprite.insetTop;
                        value.insetBottom = lastSprite.insetBottom;
                        value.insetLeft = lastSprite.insetLeft;
                        value.insetRight= lastSprite.insetRight;
                        value._calculateSlicedUV();
                    }
                    this._spriteFrame = value;
                    this._applySpriteFrame(lastSprite);
                    if (CC_EDITOR) {
                        this.node.emit('spriteframe-changed', this);
                    }
                }.bind(this);
                //oldFunc为引擎源码
                if(oldValue && typeof oldValue == 'string'){
                    let url = 'res/raw-assets/'+oldValue+'.png';
                    cc.loader.load(url, function(err, res){
                        if(err){
                            // console.log(err);
                        }
                        else{
                            if(cc.isValid(this)){
                                let spriteFrame = new cc.SpriteFrame(res);
                                oldFunc(spriteFrame, oldForce);
                            }
                        }
                    }.bind(this));
                }
                else{
                    oldFunc(oldValue, oldForce);
                }
            };
            Object.defineProperty(cc.Sprite.prototype, "spriteFrame", spriteFrameDesc);

            //图集获取图片直接返回图片路径,通过路径去获取图片
            let desc = Object.getOwnPropertyDescriptor(cc.SpriteAtlas.prototype, "getSpriteFrame");
            desc.value = function(key) {
                let keys = Object.keys(this._spriteFrames);
                if(keys.length > 0){
                    //引擎源码
                    let sf = this._spriteFrames[key];
                    if (!sf) {
                        return null;
                    } 
                    if (!sf.name) {
                        sf.name = key;
                    }
                    return sf;
                }
                let path = 'Texture/' + this.name + '/image/' + key;
                return path;
            }
            Object.defineProperty(cc.SpriteAtlas.prototype, "getSpriteFrame", desc);
        };
1赞