MultiTypeAssetLoadSystem.lua 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. local MultiTypeAssetLoadSystem = class("MultiTypeAssetLoadSystem")
  2. local GetChildMap = function(parentMap, key)
  3. local map = parentMap[key]
  4. if not map then
  5. map = {}
  6. parentMap[key] = map
  7. end
  8. return map
  9. end
  10. function MultiTypeAssetLoadSystem:ctor()
  11. self.owner = nil
  12. self.ownerCB = nil
  13. self.ownerProgressCB = nil
  14. self.assetMap = {}
  15. end
  16. function MultiTypeAssetLoadSystem:Dispose()
  17. self:Cancel()
  18. self.owner = nil
  19. self.ownerCB = nil
  20. self.ownerProgressCB = nil
  21. self.assetMap = nil
  22. self.allLoadNum = nil
  23. end
  24. function MultiTypeAssetLoadSystem:SetCompleteCB(owner, ownerCB, ownerProgressCB)
  25. self.owner = owner
  26. self.ownerCB = ownerCB
  27. self.ownerProgressCB = ownerProgressCB
  28. end
  29. function MultiTypeAssetLoadSystem:AddLoadAsset(resourceType, assetPath, assetName, num)
  30. if not assetName or assetName == '' then return end
  31. local assetMap = GetChildMap(self, 'assetMap')
  32. local typeAssetMap = GetChildMap(assetMap, resourceType)
  33. local assetNameMap
  34. if not assetPath or assetPath == '' then
  35. assetNameMap = typeAssetMap
  36. else
  37. assetNameMap = GetChildMap(typeAssetMap, assetPath)
  38. end
  39. if assetNameMap[assetName] then
  40. assetNameMap[assetName] = assetNameMap[assetName] + (num or 1)
  41. else
  42. assetNameMap[assetName] = (num or 1)
  43. end
  44. end
  45. function MultiTypeAssetLoadSystem:AddToLoadSystem(multiTypeAssetLoadSystem)
  46. for resourceType, typeAssetMap in pairs(self.assetMap) do
  47. for assetPath, assetNameMap in pairs(typeAssetMap) do
  48. if type(assetNameMap) == 'number' then
  49. multiTypeAssetLoadSystem:AddLoadAsset(resourceType, nil, assetPath, assetNameMap)
  50. else
  51. for assetName, _ in pairs(assetNameMap) do
  52. multiTypeAssetLoadSystem:AddLoadAsset(resourceType, assetPath, assetName)
  53. end
  54. end
  55. end
  56. end
  57. end
  58. function MultiTypeAssetLoadSystem:RemoveLoadAsset(resourceType, assetPath, assetName)
  59. local assetMap = self.assetMap
  60. if not assetMap then
  61. return
  62. end
  63. local typeAssetMap = assetMap[resourceType]
  64. if not typeAssetMap then
  65. return
  66. end
  67. if not assetPath or assetPath == '' then
  68. typeAssetMap[assetName] = nil
  69. else
  70. local assetNameMap = typeAssetMap[assetPath]
  71. if not assetNameMap then
  72. return
  73. end
  74. assetNameMap[assetName] = nil
  75. end
  76. end
  77. function MultiTypeAssetLoadSystem:RemoveLoadAllAsset()
  78. self.assetMap = {}
  79. end
  80. function MultiTypeAssetLoadSystem:Begin()
  81. self:Cancel()
  82. local assetMap = self.assetMap
  83. local hasLoad = false
  84. if assetMap then
  85. self.preloadSeqIds = {}
  86. for resourceType, typeAssetMap in pairs(self.assetMap) do
  87. for assetPath, assetNameMap in pairs(typeAssetMap) do
  88. if assetNameMap then
  89. if type(assetNameMap) == 'number' then
  90. if assetNameMap > 0 then
  91. local seqId = ManagerContainer.ResMgr:LuaLoadAssets(resourceType, nil, {assetPath}, self, self.OneEnd)
  92. if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then -- 同步返回的不处理
  93. self.preloadSeqIds[#self.preloadSeqIds + 1] = seqId
  94. hasLoad = true
  95. end
  96. end
  97. else
  98. local assetNames = {}
  99. for assetName, loadNum in pairs(assetNameMap) do
  100. if loadNum and loadNum > 0 then
  101. assetNames[#assetNames + 1] = assetName
  102. end
  103. end
  104. if #assetNames > 0 then
  105. local seqId = ManagerContainer.ResMgr:LuaLoadAssets(resourceType, assetPath, assetNames, self, self.OneEnd)
  106. if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then -- 同步返回的不处理
  107. self.preloadSeqIds[#self.preloadSeqIds + 1] = seqId
  108. hasLoad = true
  109. end
  110. end
  111. end
  112. end
  113. end
  114. end
  115. end
  116. -- 没有加载的东西就直接完成
  117. if not hasLoad then
  118. self.allLoadNum = nil
  119. self.preloadSeqIds = nil
  120. self:End()
  121. else
  122. self.allLoadNum = #self.preloadSeqIds
  123. end
  124. end
  125. --- 单个类型的资源加载完成
  126. function MultiTypeAssetLoadSystem:OneEnd(_, seqId)
  127. if ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then return end -- 同步返回的不处理
  128. for i = 1, #self.preloadSeqIds do
  129. if ManagerContainer.ResMgr:SeqIdEquals(seqId, self.preloadSeqIds[i]) then
  130. table.remove(self.preloadSeqIds, i)
  131. break
  132. end
  133. end
  134. if self.allLoadNum == nil then
  135. return
  136. end
  137. if not self.preloadSeqIds or #self.preloadSeqIds <= 0 then
  138. self.allLoadNum = nil
  139. self.preloadSeqIds = nil
  140. self:LoadProgressChanged(1)
  141. self:End()
  142. else
  143. if not self.allLoadNum or self.allLoadNum <= 0 then
  144. self:LoadProgressChanged(0)
  145. else
  146. self:LoadProgressChanged((self.allLoadNum - #self.preloadSeqIds) / self.allLoadNum)
  147. end
  148. end
  149. end
  150. function MultiTypeAssetLoadSystem:LoadProgressChanged(progress)
  151. if self.ownerProgressCB then
  152. if self.owner then
  153. self.ownerProgressCB(self.owner, progress)
  154. else
  155. self.ownerProgressCB(progress)
  156. end
  157. end
  158. end
  159. --- 预加载的资源已加载完成
  160. function MultiTypeAssetLoadSystem:End()
  161. if self.ownerCB then
  162. if self.owner then
  163. self.ownerCB(self.owner)
  164. else
  165. self.ownerCB()
  166. end
  167. end
  168. end
  169. function MultiTypeAssetLoadSystem:Cancel()
  170. if self.preloadSeqIds then
  171. for i = 1, #self.preloadSeqIds do
  172. ManagerContainer.ResMgr:UnloadAssetBySeqId(self.preloadSeqIds[i])
  173. end
  174. end
  175. self.allLoadNum = nil
  176. self.preloadSeqIds = nil
  177. end
  178. return MultiTypeAssetLoadSystem