cocos creator--cc_loader代码加载和释放资
2020-08-13 本文已影响0人
Thomas游戏圈
前言
在Cocos Creator游戏开发中,经常需要动态加载资源,所以了解并熟悉cc.loader的使用非常必要。
一、 cc.loader简介
1:有三个默认的Pipeline:
(1) assetLoader: 主要用于加载资源, 加载asset类型资源,和释放这些资源;
(2) downloader: 主要用于下载文件, 文本,图像,脚本,声音,字体, 自定义的download;
(3) loader: 第三个默认的Pipeline,可以加载json, image, plist, fnt, uuid;
2: 资源分为本地(assets目录下)与远程资源;
3: 加载异步的;
二、 本地资源加载
1: 在代码里面加载资源必须要求资源在assets/resources/文件夹下;
(1)根据场景的依赖关系来打包我们的资源; 去掉不用的资源
(2)无法判断在代码里面加载的资源,是哪些?-->所有的resources目录下的资源,都会被打包进去,你在代码里面就能加载到它了。
如果资源不在代码里面加载,一般不要放到resources目录下 ,如果放到了,这个资源不关你有没有用,都会被打包进去;
2: 资源的url不需要加assets/resources这个部分,路劲不需要加这个前缀;
3:cc.loader.loadRes(url, onComplete回掉函数);
4: loadResArray([], type类型, progressCallback, completeCallback);
5: loadResDir (url [type ] [progressCallback ] [completeCallback ]) 加载一个路径下的资源;
6: getRes(url, [type]); 获取资源id;
![](https://img.haomeiwen.com/i19040694/3e697027d7687876.png)
const {ccclass, property} = cc._decorator;
@*ccclass*
export default class GameMgr extends *cc*.*Component* {
@property(cc.*AudioSource*)
bgAudio : *cc*.*AudioSource* = null;
@property({type:cc.*Sprite*, tooltip:"精灵组件"})
bgSprite : *cc*.*Sprite* = null;
onLoad () {
*this*.localLoad();
}
localLoad(){
cc.loader.loadRes("bg", function(*err*, *ret*){
if(err){
cc.error(err.messager || err);
return;
}
// 动态加载的音效资源
*this*.bgAudio.clip = ret;
*this*.bgAudio.play();
}.bind(*this*));
// 动态加载图片
cc.loader.loadRes("imgs/disk", **<u>cc.SpriteFrame</u>**, function(*err*, *ret*){
if(err){
cc.error(err.messager || err);
return;
}
*console*.log(ret)
*console*.log(*this*.bgSprite);
*this*.bgSprite.spriteFrame = ret;
}.bind(*this*));
}
}
运行结果如下:
![](https://img.haomeiwen.com/i19040694/6d511156dd0f1772.png)
三、 远程资源加载
1: cc.loader.load(url, 结束回掉函数);
2: cc.loader.load({url: “”, type: “”}, 结束回掉函数);
3: 远程加载任意类型文件;
我们采用NodeJS环境测试。
![](https://img.haomeiwen.com/i19040694/a78898aacde8a6aa.png)
注意:NodeJS环境中需要设置跨域访问,如下:
//设置跨域访问
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
GameMgr.ts代码修改如下:
onLoad () {
//this.localLoad();
*this*.remoteLoad();
}
remoteLoad(){
cc.loader.load({url:"http://127.0.0.1:6080/res/bg.mp3", type:"mp3"},function(*err*, *ret*){
if(err){
cc.error(err.message || err);
return;
}
// 动态加载的音效资源
*this*.bgAudio.clip = ret;
*this*.bgAudio.play();
}.bind(*this*));
cc.loader.load("http://127.0.0.1:6080/res/disk.png",function(*err*, *ret*){
if(err){
cc.error(err.message || err);
return;
}
//console.log(ret);
// 加载时候会自动识别资源类型,cc.Texture2D
*this*.bgSprite.spriteFrame**<u>.</u>****<u>setTexture</u>****<u>(ret)</u>**;
// 需要修改图片精灵所在节点的大小
*this*.bgSprite.**<u>node.</u>****<u>setContentSize</u>****<u>(ret.width, ret.height)</u>**;
}.bind(*this*));
}
四、 资源卸载
1:每个场景有个自动释放资源
勾选上这个场景的资源会自动释放,不勾选上这个场景的资源不释放
2: 代码加载的资源,默认是不会受这个选项的影响的,除非设置
cc.loader.setAutoRelease(url, brealse)
3: 手动释放资源
loadRes/ releaseRes
load / release
releaseAsset (资源对象的object);