使用脚本自动挂载资源
官方的教程中有关于管理项目资源的用法, 这个教程告诉我们怎么使用assetdb来查询和创建删除资源,但是比较尴尬的事情是,一般我们查到资源是要使用或者要跟某些属性做关联的,但是就这个最关键的部分缺在官方文档中只字未提,甚至连API中都找不到,但是为了实现目的我只能不断的寻找油腻的师姐。
分析问题
- 首先编辑器一定有绑定资源的能力,比如说手动拖动,所以这个脚本自动绑定不是妄想
- 查询到的资源不是真实的资源对应资源(是包含type, url,uuid)的json对象,而创建SpriteFrame等资源的构造函数是传递真实资源对象的或者是filename,(filename至今都不知道什么算filename,我把自认为是filename的值传进去也不好使),但是filename由于没有例子所以老是传递不对,于是就只能传递真实的对象了,但是查询出来的又不是真实对象,所以这里就是最大的问题点
- 根据以上因素得知,编辑器有可能做了什么见不得人的勾当
- 多说无益,这种瞎推断从来都是毫无意义的,唯有调试时真理
- 首先在编辑器上做资源绑定是先拖动资源,然后资源就能被正确的序列化,那么我们可不可以在set方法中打断点来康康它之前做了什么呢。
- 创建只有一个精灵的场景或者预制件,在编辑器中打开开发者工具,在spriteFrame中的set出设置断点,然后在场景中拖动资源到检查器中,果不其然被卡主了,顺着调用栈查找让我发现了一个不得鸟的东西 cc.AssetLibrary
正文开始
cc.AssetLibrary 是官网一直在用却没有任何说明的对象,个人感觉就像以前的资源管理器。它可以加载uuid类型的资源,而且场景加载的时候就用到了它,也就是说,你只要知道了资源的uuid你就可以在代码的任何地方(不管是工作在编辑器环境还是在项目脚本中)加载到真实的资源对象,而不是json串。而且通篇查找你会发现好多组件都有它的身影
说了这么多到底这么用呢,上代码
将改代码拖入场景中,除了编辑器自动创建一个于脚本同名的node节点外会自动在改node下创建一个精灵节点,并挂载一张贴图
const {ccclass, property, executeInEditMode} = cc._decorator;
@ccclass
@executeInEditMode //该脚本可以在编辑器中执行(有生命周期的)
export default class NewClass extends cc.Component {
onLoad () {
if(CC_EDITOR){
Editor.assetdb.queryAssets( 'db://assets/**\/*', 'sprite-frame', ( err, results ) => {
results.forEach(function ( result ) {
console.log(result.url,
result.path,
result.uuid,
result.type,
result.isSubAsset);
});
let result = results[0];
let node = new cc.Node('reload texture');
let spriteComp = node.addComponent(cc.Sprite);
cc.AssetLibrary.loadAsset(result.uuid, function (err, sp) {
if (err) return Editor.error(err);
spriteComp.spriteFrame = sp;
});
this.node.addChild(node);
});
}
}
}