ResUtil.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. *
  3. * @file ResUtil.ts
  4. * @author
  5. * @description Cocos方法整合,如果Cocos版本升级,造成API修改,仅需修改此处
  6. */
  7. import { Asset, assetManager, AssetManager, director, ImageAsset, resources, SceneAsset, Texture2D } from "cc";
  8. //export type Constructor<T extends Asset> = new () => T;
  9. export const headImgExt = ".head";
  10. export module ResUtil {
  11. /**
  12. * @description 原生加载资源
  13. * @param object {url: 远程地址 option: 参数类型}
  14. * @returns
  15. */
  16. export function loadRemote<T extends Asset>(url:string, option?: any):Promise<T>{
  17. return new Promise((resolve, reject) => {
  18. assetManager.loadRemote<T>(url, option, (err: Error | null, asset: T) => {
  19. resolve && resolve(err ? null : asset);
  20. });
  21. });
  22. }
  23. /**
  24. * 加载bundle
  25. * @param bundleName
  26. * @returns
  27. */
  28. export function loadBundle(bundleName: string):Promise<AssetManager.Bundle> {
  29. return new Promise((resolve, reject) => {
  30. assetManager.loadBundle(bundleName, (err, bundle) => {
  31. resolve && resolve(err ? null : bundle);
  32. });
  33. });
  34. }
  35. /**获取已加载的bundle*/
  36. export function getBundle(bundleName?: string):AssetManager.Bundle|null{
  37. if (null == bundleName || '' === bundleName) {
  38. return resources;
  39. } else {
  40. return assetManager.getBundle(bundleName)!;
  41. }
  42. }
  43. /**
  44. * 加载资源
  45. * @param path 资源名
  46. * @param bundle 所属包名或 包
  47. * @type 资源类型
  48. * @returns
  49. */
  50. export async function loadAsset<T extends Asset>(path: string, bundle?: string | AssetManager.Bundle):Promise<T>{
  51. let bd:AssetManager.Bundle;
  52. if(!bundle) bundle='';
  53. if(typeof bundle === 'string'){
  54. bd = getBundle(bundle);
  55. if(!bd) bd = await loadBundle(bundle);
  56. } else if (bundle instanceof AssetManager.Bundle) {
  57. bd = bundle;
  58. }
  59. const asset = bd.get<T>(path);
  60. if (null != asset) {
  61. return Promise.resolve(asset);
  62. }
  63. return new Promise((resolve, reject) => {
  64. bd.load<T>(path,(err, asset: T) => {
  65. resolve(err ? null : asset);
  66. });
  67. });
  68. }
  69. export async function loadDir<T extends Asset>(path: string, bundle?: string | AssetManager.Bundle,progressCallback?: (completed: number, total: number) => void):Promise<T[]>{
  70. let bd:AssetManager.Bundle;
  71. if(!bundle) bundle='';
  72. if(typeof bundle === 'string'){
  73. bd = getBundle(bundle);
  74. if(!bd) bd = await loadBundle(bundle);
  75. } else if (bundle instanceof AssetManager.Bundle) {
  76. bd = bundle;
  77. }
  78. return new Promise((resolve, reject) => {
  79. bd.loadDir<T>(path,(finished:number,total:number,item)=>{
  80. progressCallback?.(finished,total);
  81. }, (err, assets:T[]) => {
  82. resolve(err ? null : assets);
  83. });
  84. });
  85. }
  86. export async function loadAssets<T extends Asset>(list: string[], bundle?: string | AssetManager.Bundle,progressCallback?: (completed: number, total: number) => void):Promise<T[]>{
  87. let bd:AssetManager.Bundle;
  88. if(!bundle) bundle='';
  89. if(typeof bundle === 'string'){
  90. bd = getBundle(bundle);
  91. if(!bd) bd = await loadBundle(bundle);
  92. } else if (bundle instanceof AssetManager.Bundle) {
  93. bd = bundle;
  94. }
  95. return new Promise((resolve, reject) => {
  96. bd.load<T>(list,(finished: number, total: number, item:any) => {
  97. progressCallback?.(finished,total);
  98. }, (err: Error | null, data) => {
  99. resolve(err ? null : data);
  100. });
  101. });
  102. }
  103. export async function loadScene(scene_name:string, bundle?: string | AssetManager.Bundle,show:Boolean=false):Promise<SceneAsset>{
  104. let bd:AssetManager.Bundle;
  105. if(!bundle) bundle='';
  106. if(typeof bundle === 'string'){
  107. bd = getBundle(bundle);
  108. if(!bd) bd = await loadBundle(bundle);
  109. } else if (bundle instanceof AssetManager.Bundle) {
  110. bd = bundle;
  111. }
  112. return new Promise((resolve, reject) => {
  113. bd.loadScene(scene_name, (err, asset:SceneAsset) => {
  114. resolve(err ? null : asset);
  115. if(show)director.loadScene(scene_name);
  116. });
  117. });
  118. }
  119. export function releaseAll():void{
  120. assetManager.releaseAll();
  121. }
  122. export function releaseAsset(asset:Asset){
  123. assetManager.releaseAsset(asset);
  124. }
  125. export function release(path:string|null,bundle?: string | AssetManager.Bundle){
  126. let bd:AssetManager.Bundle;
  127. if(!bundle) bundle='';
  128. if(typeof bundle === 'string'){
  129. bd = getBundle(bundle);
  130. } else if (bundle instanceof AssetManager.Bundle) {
  131. bd = bundle;
  132. }
  133. if(path && path!=''){
  134. bd?.release(path);
  135. }else{
  136. bd?.releaseAll();
  137. }
  138. }
  139. /**
  140. * 自定义头像加载流程
  141. * 加载头像使用 ResUtil.loadRemote({url, option:{ext:headImgExt}})
  142. */
  143. export function registerHeadImgLoader() {
  144. assetManager.downloader.register(headImgExt, (content, options, onComplete) => {
  145. onComplete(null, content);
  146. });
  147. assetManager.parser.register(headImgExt, downloadDomImage);
  148. assetManager.factory.register(headImgExt, createTexture);
  149. }
  150. function createTexture(id: string, data: any, options: any, onComplete: Function) {
  151. let out: Texture2D | null = null;
  152. let err: Error | null = null;
  153. try {
  154. out = new Texture2D();
  155. const imageAsset = new ImageAsset(data);
  156. out.image = imageAsset;
  157. } catch (e) {
  158. err = e as any as Error;
  159. }
  160. onComplete && onComplete(err, out);
  161. }
  162. function downloadDomImage(url: string, options: any, onComplete: Function) {
  163. const img = new Image();
  164. if (window.location.protocol !== 'file:') {
  165. img.crossOrigin = 'anonymous';
  166. }
  167. function loadCallback() {
  168. img.removeEventListener('load', loadCallback);
  169. img.removeEventListener('error', errorCallback);
  170. if (onComplete) {
  171. onComplete(null, img);
  172. }
  173. }
  174. function errorCallback() {
  175. img.removeEventListener('load', loadCallback);
  176. img.removeEventListener('error', errorCallback);
  177. if (onComplete) {
  178. onComplete(new Error(url));
  179. }
  180. }
  181. img.addEventListener('load', loadCallback);
  182. img.addEventListener('error', errorCallback);
  183. img.src = url;
  184. return img;
  185. }
  186. }