ResMgr.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { Asset, AssetManager, assetManager } from 'cc'
  2. import { ArrayUtil } from '../util/ArrayUtil'
  3. import { Debug } from '../util/Debug'
  4. import { PREVIEW } from 'cc/env'
  5. const Tag: string = 'ResMgr'
  6. export class ResMgr {
  7. public static get Assets() {
  8. return assetManager.assets
  9. }
  10. private static _loadedRefRes: Object = {}
  11. public static get LoadedRes(): Object {
  12. return this._loadedRefRes
  13. }
  14. public static loadBundle(Bundle: string, onComplete: Function = null): Promise<AssetManager.Bundle> {
  15. return new Promise<AssetManager.Bundle>((resolve, reject) => {
  16. let startTime: number = Date.now()
  17. if (assetManager.getBundle(Bundle)) {
  18. Debug.Warn(Tag, `资源包${Bundle}已加载,无需重复加载`)
  19. resolve(assetManager.getBundle(Bundle))
  20. } else {
  21. Debug.Log(Tag, `资源包${Bundle}开始加载`)
  22. assetManager.loadBundle(Bundle, (err: Error, bundle: AssetManager.Bundle) => {
  23. if (err) {
  24. Debug.Error(Tag, `资源包${Bundle}加载失败 err:${err}`)
  25. reject(err)
  26. } else {
  27. let endTime: number = Date.now()
  28. Debug.Log(Tag, `资源包${Bundle}加载完毕,用时${endTime - startTime}ms`)
  29. onComplete && onComplete(bundle)
  30. resolve(bundle)
  31. }
  32. })
  33. }
  34. })
  35. }
  36. public static preloadDir(Bundle: string, dir: string = "./"): Promise<void> {
  37. return new Promise<void>(async (resolve, reject) => {
  38. Debug.Log(Tag, `开始预加载资源包${Bundle}下的文件夹${dir}`)
  39. let bundle: AssetManager.Bundle = assetManager.getBundle(Bundle)
  40. if (!bundle) {
  41. bundle = await this.loadBundle(Bundle)
  42. }
  43. let startTime: number = Date.now()
  44. bundle.preloadDir(dir, (err: Error, items) => {
  45. if (err) {
  46. Debug.Error(Tag, `资源包${Bundle}下的文件夹${dir}预加载失败,err:${err}`)
  47. reject(err)
  48. } else {
  49. let endTime: number = Date.now()
  50. Debug.Log(Tag, `资源包${Bundle}下的文件夹${dir}预加载完毕,用时${endTime - startTime}ms`)
  51. resolve()
  52. }
  53. })
  54. })
  55. }
  56. public static loadDir(Bundle: string, dir: string = "./", ref: boolean = false): Promise<void> {
  57. return new Promise<void>(async (resolve, reject) => {
  58. Debug.Log(Tag, `开始加载资源包${Bundle}下的文件夹${dir}`)
  59. let bundle: AssetManager.Bundle = assetManager.getBundle(Bundle)
  60. if (!bundle) {
  61. bundle = await this.loadBundle(Bundle)
  62. }
  63. let startTime: number = Date.now()
  64. bundle.loadDir(dir, (err: Error, assets: Asset[]) => {
  65. if (err) {
  66. Debug.Error(Tag, `资源包${Bundle}下的文件夹${dir}加载失败,err:${err}`)
  67. reject(err)
  68. } else {
  69. if (ref) {
  70. if (!this._loadedRefRes.hasOwnProperty(Bundle)) {
  71. this._loadedRefRes[Bundle] = []
  72. }
  73. for (let i = 0; i < assets.length; i++) {
  74. const asset: Asset = assets[i]
  75. if (!ArrayUtil.has(this._loadedRefRes[Bundle], asset)) {
  76. this._loadedRefRes[Bundle].push(asset)
  77. asset.addRef()
  78. }
  79. }
  80. }
  81. let endTime: number = Date.now()
  82. Debug.Log(Tag, `资源包${Bundle}下的文件夹${dir}加载完毕,用时${endTime - startTime}ms`)
  83. resolve()
  84. }
  85. })
  86. })
  87. }
  88. public static loadRes<T extends Asset>(Bundle: string, resName: string, relative_path: string = "", ref: boolean = false): Promise<T> {
  89. return new Promise<T>(async (resolve, reject) => {
  90. let path: string = relative_path + resName
  91. Debug.Log(Tag, `开始加载资源包${Bundle}下的文件${path}`)
  92. let bundle: AssetManager.Bundle = assetManager.getBundle(Bundle)
  93. if (!bundle) {
  94. bundle = await this.loadBundle(Bundle)
  95. }
  96. let startTime: number = Date.now()
  97. bundle.load(path, (err: Error, asset: T) => {
  98. if (err) {
  99. Debug.Error(Tag, `资源包${Bundle}下的文件${path}加载失败,err:${err}`)
  100. reject(err)
  101. } else {
  102. let endTime: number = Date.now()
  103. if (ref) {
  104. if (!this._loadedRefRes.hasOwnProperty(Bundle)) {
  105. this._loadedRefRes[Bundle] = []
  106. }
  107. if (!ArrayUtil.has(this._loadedRefRes[Bundle], asset)) {
  108. this._loadedRefRes[Bundle].push(asset)
  109. asset.addRef()
  110. }
  111. }
  112. Debug.Log(Tag, `资源包${Bundle}下的文件${path}加载完毕,用时${endTime - startTime}ms`)
  113. resolve(asset)
  114. }
  115. })
  116. })
  117. }
  118. public static getRes<T extends Asset>(Bundle: string, resName: string, relative_path: string = ""): T {
  119. let bundle: AssetManager.Bundle = assetManager.getBundle(Bundle)
  120. if (!bundle) {
  121. Debug.Error(Tag, `资源包${Bundle}暂未加载,无法获取资源${resName}`)
  122. return null
  123. }
  124. let path: string = relative_path + resName
  125. const res: T = bundle.get(path)
  126. if (!res) {
  127. Debug.Warn(Tag, '资源获取失败', path)
  128. }
  129. return res
  130. }
  131. public static isLoaded(Bundle: string, resName: string, relative_path: string = ""): boolean {
  132. let bundle: AssetManager.Bundle = assetManager.getBundle(Bundle)
  133. if (!bundle) {
  134. Debug.Error(Tag, `资源包${Bundle}暂未加载`)
  135. return false
  136. }
  137. let path: string = relative_path + resName
  138. return !!bundle.get(path)
  139. }
  140. public static release(Bundle: string): void {
  141. if (!this._loadedRefRes.hasOwnProperty(Bundle)) {
  142. Debug.Warn(this.name, `暂未记录资源包${Bundle}中任何资源,无需释放`)
  143. return
  144. }
  145. let assets: Asset[] = this._loadedRefRes[Bundle]
  146. let len: number = assets.length
  147. for (let i = 0; i < len; i++) {
  148. const asset: Asset = assets[i]
  149. if (!asset.isValid) {
  150. Debug.Warn(this.name, `忽略无效资源,${asset.name}:${asset.uuid}`)
  151. continue
  152. }
  153. asset.decRef()
  154. }
  155. delete this._loadedRefRes[Bundle]
  156. Debug.Log(this.name, `释放资源包${Bundle}中的${len}个资源`)
  157. }
  158. public static getSpriteFrame<T extends Asset>(Bundle: string, resName: string, relative_path: string = ""): T {
  159. return this.getRes<T>(Bundle, resName + "/spriteFrame", relative_path)
  160. }
  161. }
  162. if (PREVIEW) {
  163. globalThis.ResMgr = ResMgr
  164. globalThis.AssetMgr = assetManager
  165. }