585 lines
15 KiB
TypeScript
585 lines
15 KiB
TypeScript
import {
|
|
_decorator,
|
|
AssetManager,
|
|
assetManager,
|
|
Component,
|
|
Node,
|
|
director,
|
|
Prefab,
|
|
resources,
|
|
Sprite,
|
|
SpriteFrame,
|
|
Texture2D,
|
|
v2,
|
|
SpriteAtlas,
|
|
ImageAsset,
|
|
instantiate,
|
|
AudioClip,
|
|
Asset,
|
|
JsonAsset,
|
|
Material,
|
|
VideoPlayer,
|
|
VideoClip,
|
|
} from "cc";
|
|
const { ccclass, property } = _decorator;
|
|
import { logger } from "db://assets/Scripts/Main/Common/Logger";
|
|
|
|
@ccclass("ResManager")
|
|
export default class ResManager {
|
|
private static _I: ResManager = null;
|
|
public static get I(): ResManager {
|
|
if (!ResManager._I) {
|
|
ResManager._I = new ResManager();
|
|
}
|
|
return ResManager._I;
|
|
}
|
|
|
|
/**切换场景 */
|
|
enterScene(i_sceneName: string) {
|
|
director.loadScene(i_sceneName, () => {});
|
|
}
|
|
|
|
/** 场景-跳转到主界面场景*/
|
|
goMainScene() {
|
|
this.enterScene("MainScene");
|
|
}
|
|
|
|
/** 场景-跳转到游戏场景*/
|
|
goGameScene() {
|
|
this.enterScene("GameScene");
|
|
}
|
|
|
|
/** 场景-跳转到自定义场景*/
|
|
goCustomScene(sceneName: string) {
|
|
this.enterScene(sceneName);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// /**加载bundle */
|
|
// loadBundle(bundleName, cb?) {
|
|
// let bundle = assetManager.getBundle(bundleName)
|
|
// if (bundle) { cb && cb(bundle); return; }
|
|
// assetManager.loadBundle(bundleName, (err: Error, _bundle: AssetManager.Bundle) => {
|
|
// if (!err) {
|
|
// cb && cb(_bundle);
|
|
// }
|
|
// });
|
|
// }
|
|
/**移除bundle */
|
|
removeBundle(bundleName) {
|
|
let bundle = assetManager.getBundle(bundleName);
|
|
if (bundle) {
|
|
bundle.releaseAll();
|
|
assetManager.removeBundle(bundle);
|
|
}
|
|
}
|
|
/**预加载bundle中的PB*/
|
|
preLoadSubpackagePrefab(url: string, cb) {
|
|
let bundle = assetManager.getBundle("PB");
|
|
if (bundle) {
|
|
bundle.preload(url, Prefab, (err, res) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
cb && cb();
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"PB",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.preLoadSubpackagePrefab(url, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
/**预加载bundle中的文件*/
|
|
preLoadSubpackageFile(url: string, pkgName: string, ftype, succCB, failCB) {
|
|
let bundle = assetManager.getBundle(pkgName);
|
|
if (bundle) {
|
|
bundle.preload(url, ftype, (err, res) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
failCB && failCB(err);
|
|
return;
|
|
}
|
|
succCB && succCB();
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
pkgName,
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
failCB && failCB(err);
|
|
return;
|
|
}
|
|
this.preLoadSubpackageFile(url, pkgName, ftype, succCB, failCB);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
/** 加载bundle中的PB*/
|
|
loadSubpackagePrefab(url: string, cb) {
|
|
let bundle = assetManager.getBundle("Chat18x");
|
|
if (bundle) {
|
|
bundle.load(url, Prefab, (err, res: Prefab) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
let cc_N = instantiate(res);
|
|
cb && cb(cc_N);
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"PB",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.loadSubpackagePrefab(url, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
/**获取pb节点 */
|
|
getPrefab(path: string, cb: Function, target: Node) {
|
|
this.loadSubpackagePrefab(path, (pb: Prefab) => {
|
|
if (target && !target.isValid) {
|
|
pb.destroy();
|
|
return;
|
|
}
|
|
pb["path"] = path;
|
|
cb && cb(pb);
|
|
});
|
|
}
|
|
|
|
/** 加载bundle中的PB*/
|
|
loadSubpackage3DModel(url: string, cb) {
|
|
let bundle = assetManager.getBundle("Model3D");
|
|
if (bundle) {
|
|
bundle.load(url, Prefab, (err, res: Prefab) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
let cc_N = instantiate(res);
|
|
cb && cb(cc_N);
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"Model3D",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.loadSubpackage3DModel(url, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
/** 改变图片--bundle资源 sprite-frame类型的图片*/
|
|
changeBundleVideo(
|
|
spt: VideoPlayer,
|
|
url: string,
|
|
packageName: string,
|
|
cb: Function = null
|
|
) {
|
|
if (!spt || !url) return;
|
|
let spttemp: any = spt;
|
|
spttemp.frameUrl = url;
|
|
let bundle = assetManager.getBundle(packageName);
|
|
if (bundle) {
|
|
bundle.load(url, VideoClip, (err, res: VideoClip) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
if (spttemp.frameUrl != url) {
|
|
return;
|
|
}
|
|
spt.clip = res;
|
|
//spt.spriteFrame = res;
|
|
cb && cb(res);
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
packageName,
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.changeBundleVideo(spt, url, packageName, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
/** 改变图片--bundle资源 sprite-frame类型的图片*/
|
|
changeBundleSpriteFrame(
|
|
spt: Sprite,
|
|
url: string,
|
|
packageName: string,
|
|
cb: Function = null
|
|
) {
|
|
if (!spt || !url) return;
|
|
let spttemp: any = spt;
|
|
spttemp.frameUrl = url;
|
|
let bundle = assetManager.getBundle(packageName);
|
|
if (bundle) {
|
|
bundle.load(
|
|
url + "/spriteFrame",
|
|
SpriteFrame,
|
|
(err, res: SpriteFrame) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
if (spttemp.frameUrl != url) {
|
|
return;
|
|
}
|
|
spt.spriteFrame = res;
|
|
cb && cb(res);
|
|
}
|
|
);
|
|
} else {
|
|
assetManager.loadBundle(
|
|
packageName,
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.changeBundleSpriteFrame(spt, url, packageName, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
/** 改变图片--bundle资源 texture类型的图片*/
|
|
changeBundleTexture(
|
|
spt: Sprite,
|
|
url: string,
|
|
packageName: string,
|
|
cb: Function = null
|
|
) {
|
|
if (!spt || !url) return;
|
|
let bundle = assetManager.getBundle(packageName);
|
|
if (bundle) {
|
|
bundle.load(url + "/texture", Texture2D, (err, res: Texture2D) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
let spriteFrame = new SpriteFrame();
|
|
spriteFrame.texture = res;
|
|
spt.spriteFrame = spriteFrame;
|
|
cb && cb(res);
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
packageName,
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.changeBundleTexture(spt, url, packageName, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
/** 加载bundle中的音频文件*/
|
|
getAudio(url: string, cb) {
|
|
//let bundle = assetManager.getBundle("Audio");
|
|
// if (bundle) {
|
|
// bundle.load(url, AudioClip, (err, res: AudioClip) => {
|
|
// if (err) {
|
|
// logger.log(err);
|
|
// return;
|
|
// }
|
|
// cb && cb(res);
|
|
// });
|
|
// } else {
|
|
resources.load(url, AudioClip, (err, res: AudioClip) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
cb && cb(res);
|
|
});
|
|
//}
|
|
}
|
|
|
|
/** 加载bundle中的配置表*/
|
|
loadSubpackageDataTable(url: string, cb) {
|
|
let bundle = assetManager.getBundle("DataTable");
|
|
if (bundle) {
|
|
bundle.load(url, JsonAsset, (err, res: JsonAsset) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
cb && cb(res);
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"DataTable",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.loadSubpackagePrefab(url, cb);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//region 加载远程音频
|
|
/** 加载远程资源*/
|
|
loadRemoteAudio(url: string, cb: Function = null) {
|
|
assetManager.loadRemote<AudioClip>(url, (err, res: AudioClip) => {
|
|
if (err) {
|
|
logger.error(err);
|
|
return;
|
|
}
|
|
cb && cb(res);
|
|
});
|
|
}
|
|
|
|
/** 加载远程资源*/
|
|
// private loadRemoteRes1(url1: string, suffix: string = 'png', cb) {
|
|
// let tempStrArr: Array<string> = url1.split(".");
|
|
// let aimStr = url1;
|
|
// if (tempStrArr.length > 1) {
|
|
// aimStr = tempStrArr[0];
|
|
// }
|
|
// let url: string = `http://tk3h5.hgwl710.com/Fish/DEV/TS/Res/`;
|
|
// url += aimStr + '.' + suffix;
|
|
// if (url1.includes("://")) { url = url1 }
|
|
// assetManager.loadRemote<ImageAsset>(url, { cacheEnabled: true }, (err, res: ImageAsset) => {
|
|
// if (!err) {
|
|
// const spriteFrame = new SpriteFrame();
|
|
// const texture = new Texture2D();
|
|
// texture.image = res;
|
|
// spriteFrame.texture = texture;
|
|
// cb && cb(spriteFrame);
|
|
// }
|
|
// })
|
|
// }
|
|
|
|
/** 加载远程图片 */
|
|
changeRemoteSpriteFrame(spt: Sprite, url: string, cb: Function = null) {
|
|
if (!spt || !url) return;
|
|
// 临时加了一个字段,用来保存当前加载的资源路径
|
|
let spttemp: any = spt;
|
|
// 在异步回调时判断这个组件是不是还在加载同一个 url,避免多次调用时产生覆盖冲突
|
|
spttemp.frameUrl = url;
|
|
// 加载
|
|
assetManager.loadRemote<ImageAsset>(url, (err, res: ImageAsset) => {
|
|
logger.log("changeRemoteSpriteFrame方法加载远程图片: ", url);
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
if (spttemp.frameUrl != url) {
|
|
return;
|
|
}
|
|
const spriteFrame = new SpriteFrame();
|
|
const texture = new Texture2D();
|
|
texture.image = res;
|
|
spriteFrame.texture = texture;
|
|
spt.spriteFrame = spriteFrame;
|
|
cb && cb(res);
|
|
});
|
|
}
|
|
|
|
/** 加载远程视频 */
|
|
loadRemoteVideo(spt: VideoPlayer, url: string, cb: Function = null) {
|
|
if (!spt || !url) return;
|
|
// // 临时加了一个字段,用来保存当前加载的资源路径
|
|
// let spttemp:any = spt;
|
|
// // 在异步回调时判断这个组件是不是还在加载同一个 url,避免多次调用时产生覆盖冲突
|
|
// spttemp.frameUrl = url;
|
|
// // 加载
|
|
// assetManager.loadRemote<VideoClip>(url, (err, res: VideoClip) => {
|
|
// logger.log("加载远程视频: ", url);
|
|
// if (err) {
|
|
// logger.error(err);
|
|
// return;
|
|
// }
|
|
// if (!spt.isValid) {
|
|
// return;
|
|
// }
|
|
// if (spttemp.frameUrl != url) {
|
|
// return;
|
|
// }
|
|
// spt.clip = res;
|
|
// cb && cb(res);
|
|
// })
|
|
|
|
logger.log("loadRemoteVideo方法加载远程视频: ", url);
|
|
spt.resourceType = VideoPlayer.ResourceType.REMOTE;
|
|
spt.remoteURL = url;
|
|
cb && cb(null);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/** 加载resources里的PB path:不带后缀*/
|
|
public loadResourcePrefab(path: string, cb) {
|
|
resources.load(path, Prefab, (err, res: Prefab) => {
|
|
if (!err) {
|
|
cb && cb(res);
|
|
} else {
|
|
// loader.rlease(path);
|
|
}
|
|
});
|
|
}
|
|
/** 加载resources里的图片*/
|
|
private loadResourceRes(path: string, cb) {
|
|
resources.load(path, ImageAsset, (err, res: ImageAsset) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
cb && cb(res);
|
|
});
|
|
}
|
|
/** 加载resources里图集里的图片*/
|
|
// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame
|
|
// 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型
|
|
private loadResourceAtlas(sptName: string, path: string, cb) {
|
|
resources.load(path, SpriteAtlas, (err, res: SpriteAtlas) => {
|
|
const frame = res.getSpriteFrame(sptName);
|
|
if (!err) {
|
|
cb && cb(frame);
|
|
} else {
|
|
// loader.release(path);
|
|
}
|
|
});
|
|
}
|
|
/** 改变图片--resources里sprite-frame类型的图片*/
|
|
changeResourceSpriteFrame(spt: Sprite, path: string, cb: Function = null) {
|
|
if (!spt || !path) return;
|
|
resources.load(
|
|
path + "/spriteFrame",
|
|
SpriteFrame,
|
|
(err, res: SpriteFrame) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
|
|
spt.spriteFrame = res;
|
|
cb && cb(res);
|
|
}
|
|
);
|
|
}
|
|
/** 改变图片--resources里texture类型的图片*/
|
|
changeResourceTexture(spt: Sprite, path: string, cb: Function = null) {
|
|
if (!spt || !path) return;
|
|
resources.load(path + "/texture", Texture2D, (err, res: Texture2D) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
if (!spt.isValid) {
|
|
return;
|
|
}
|
|
|
|
let spriteFrame = new SpriteFrame();
|
|
spriteFrame.texture = res;
|
|
spt.spriteFrame = spriteFrame;
|
|
cb && cb(res);
|
|
});
|
|
}
|
|
|
|
//设置图片置灰
|
|
SetGray(spt: Sprite, isGray: boolean) {
|
|
//cc.assetManager.builtins.getBuiltin("material", "builtin-" + name)
|
|
if (isGray) {
|
|
let bundle = assetManager.getBundle("Materials");
|
|
if (bundle) {
|
|
bundle.load("ui_sprite_gray", Material, (err, res: Material) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
// spt.setSharedMaterial(res, 0)
|
|
spt.customMaterial = res;
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"Materials",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.SetGray(spt, isGray);
|
|
}
|
|
);
|
|
}
|
|
} else {
|
|
// spt.setSharedMaterial(null, 0)
|
|
spt.customMaterial = null;
|
|
}
|
|
}
|
|
|
|
/**设置图片模糊*/
|
|
SetBlur(spt: Sprite, isBule: boolean) {
|
|
if (isBule) {
|
|
let bundle = assetManager.getBundle("Materials");
|
|
if (bundle) {
|
|
bundle.load("mohu", Material, (err, res: Material) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
// spt.setSharedMaterial(res, 0)
|
|
spt.customMaterial = res;
|
|
});
|
|
} else {
|
|
assetManager.loadBundle(
|
|
"Materials",
|
|
(err: Error, _bundle: AssetManager.Bundle) => {
|
|
if (err) {
|
|
logger.log(err);
|
|
return;
|
|
}
|
|
this.SetBlur(spt, isBule);
|
|
}
|
|
);
|
|
}
|
|
} else {
|
|
// spt.setSharedMaterial(null, 0)
|
|
spt.customMaterial = null;
|
|
}
|
|
}
|
|
}
|