| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- local MultiTypeAssetLoadSystem = class("MultiTypeAssetLoadSystem")
- local GetChildMap = function(parentMap, key)
- local map = parentMap[key]
- if not map then
- map = {}
- parentMap[key] = map
- end
- return map
- end
- function MultiTypeAssetLoadSystem:ctor()
- self.owner = nil
- self.ownerCB = nil
- self.ownerProgressCB = nil
- self.assetMap = {}
- end
- function MultiTypeAssetLoadSystem:Dispose()
- self:Cancel()
- self.owner = nil
- self.ownerCB = nil
- self.ownerProgressCB = nil
- self.assetMap = nil
- self.allLoadNum = nil
- end
- function MultiTypeAssetLoadSystem:SetCompleteCB(owner, ownerCB, ownerProgressCB)
- self.owner = owner
- self.ownerCB = ownerCB
- self.ownerProgressCB = ownerProgressCB
- end
- function MultiTypeAssetLoadSystem:AddLoadAsset(resourceType, assetPath, assetName, num)
- if not assetName or assetName == '' then return end
- local assetMap = GetChildMap(self, 'assetMap')
- local typeAssetMap = GetChildMap(assetMap, resourceType)
- local assetNameMap
- if not assetPath or assetPath == '' then
- assetNameMap = typeAssetMap
- else
- assetNameMap = GetChildMap(typeAssetMap, assetPath)
- end
- if assetNameMap[assetName] then
- assetNameMap[assetName] = assetNameMap[assetName] + (num or 1)
- else
- assetNameMap[assetName] = (num or 1)
- end
- end
- function MultiTypeAssetLoadSystem:AddToLoadSystem(multiTypeAssetLoadSystem)
- for resourceType, typeAssetMap in pairs(self.assetMap) do
- for assetPath, assetNameMap in pairs(typeAssetMap) do
- if type(assetNameMap) == 'number' then
- multiTypeAssetLoadSystem:AddLoadAsset(resourceType, nil, assetPath, assetNameMap)
- else
- for assetName, _ in pairs(assetNameMap) do
- multiTypeAssetLoadSystem:AddLoadAsset(resourceType, assetPath, assetName)
- end
- end
- end
- end
- end
- function MultiTypeAssetLoadSystem:RemoveLoadAsset(resourceType, assetPath, assetName)
- local assetMap = self.assetMap
- if not assetMap then
- return
- end
- local typeAssetMap = assetMap[resourceType]
- if not typeAssetMap then
- return
- end
- if not assetPath or assetPath == '' then
- typeAssetMap[assetName] = nil
- else
- local assetNameMap = typeAssetMap[assetPath]
- if not assetNameMap then
- return
- end
- assetNameMap[assetName] = nil
- end
- end
- function MultiTypeAssetLoadSystem:RemoveLoadAllAsset()
- self.assetMap = {}
- end
- function MultiTypeAssetLoadSystem:Begin()
- self:Cancel()
- local assetMap = self.assetMap
- local hasLoad = false
- if assetMap then
- self.preloadSeqIds = {}
- for resourceType, typeAssetMap in pairs(self.assetMap) do
- for assetPath, assetNameMap in pairs(typeAssetMap) do
- if assetNameMap then
- if type(assetNameMap) == 'number' then
- if assetNameMap > 0 then
- local seqId = ManagerContainer.ResMgr:LuaLoadAssets(resourceType, nil, {assetPath}, self, self.OneEnd)
- if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then -- 同步返回的不处理
- self.preloadSeqIds[#self.preloadSeqIds + 1] = seqId
- hasLoad = true
- end
- end
- else
- local assetNames = {}
- for assetName, loadNum in pairs(assetNameMap) do
- if loadNum and loadNum > 0 then
- assetNames[#assetNames + 1] = assetName
- end
- end
- if #assetNames > 0 then
- local seqId = ManagerContainer.ResMgr:LuaLoadAssets(resourceType, assetPath, assetNames, self, self.OneEnd)
- if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then -- 同步返回的不处理
- self.preloadSeqIds[#self.preloadSeqIds + 1] = seqId
- hasLoad = true
- end
- end
- end
- end
- end
- end
- end
- -- 没有加载的东西就直接完成
- if not hasLoad then
- self.allLoadNum = nil
- self.preloadSeqIds = nil
- self:End()
- else
- self.allLoadNum = #self.preloadSeqIds
- end
- end
- --- 单个类型的资源加载完成
- function MultiTypeAssetLoadSystem:OneEnd(_, seqId)
- if ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then return end -- 同步返回的不处理
- for i = 1, #self.preloadSeqIds do
- if ManagerContainer.ResMgr:SeqIdEquals(seqId, self.preloadSeqIds[i]) then
- table.remove(self.preloadSeqIds, i)
- break
- end
- end
- if self.allLoadNum == nil then
- return
- end
- if not self.preloadSeqIds or #self.preloadSeqIds <= 0 then
- self.allLoadNum = nil
- self.preloadSeqIds = nil
- self:LoadProgressChanged(1)
- self:End()
- else
- if not self.allLoadNum or self.allLoadNum <= 0 then
- self:LoadProgressChanged(0)
- else
- self:LoadProgressChanged((self.allLoadNum - #self.preloadSeqIds) / self.allLoadNum)
- end
- end
- end
- function MultiTypeAssetLoadSystem:LoadProgressChanged(progress)
- if self.ownerProgressCB then
- if self.owner then
- self.ownerProgressCB(self.owner, progress)
- else
- self.ownerProgressCB(progress)
- end
- end
- end
- --- 预加载的资源已加载完成
- function MultiTypeAssetLoadSystem:End()
- if self.ownerCB then
- if self.owner then
- self.ownerCB(self.owner)
- else
- self.ownerCB()
- end
- end
- end
- function MultiTypeAssetLoadSystem:Cancel()
- if self.preloadSeqIds then
- for i = 1, #self.preloadSeqIds do
- ManagerContainer.ResMgr:UnloadAssetBySeqId(self.preloadSeqIds[i])
- end
- end
- self.allLoadNum = nil
- self.preloadSeqIds = nil
- end
- return MultiTypeAssetLoadSystem
|