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( "Chat18x", (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( "Chat18x", (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(url, (err, res: AudioClip) => { if (err) { logger.error(err); return; } cb && cb(res); }); } /** 加载远程资源*/ // private loadRemoteRes1(url1: string, suffix: string = 'png', cb) { // let tempStrArr: Array = 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(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(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(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; } } }