--UI对象池 UIObjPool = UIObjPool or BaseClass() local UIObjPool = UIObjPool --类型ID,从1开始递增 UIObjPool.UIType = { AwardItem = 1, } --缓存对象信息 UIObjPool.UIInfo = { [UIObjPool.UIType.AwardItem] = {id = 1, max_num = 15, class_type = "AwardItem"}, } function UIObjPool:__init() UIObjPool.Instance = self self.is_init = false self.ui_pool = {} for k,v in pairs(UIObjPool.UIType) do self.ui_pool[v] = Array.New() end local pool_cont = GameObject.Find("UIObjPoolContainer") if not IsNull(pool_cont) then self.parent_cont = pool_cont.transform self.parent_cont.gameObject:SetActive(false) else self.parent_cont = panelMgr:GetParent("UI") end self:InitUIPool() end function UIObjPool:getInstance() if UIObjPool.Instance == nil then UIObjPool.New() end return UIObjPool.Instance end function UIObjPool:__delete( ) self:CancelStepTimer() for i=1, TableSize(UIObjPool.UIType) do local pool = self.ui_pool[i] for k,v in pairs(pool) do v:DeleteMe() end end self.ui_pool = {} end function UIObjPool:InitUIPool( ) --避免重复执行 if self.is_init then return end self.is_init = true --分步初始化对象池 self.pool_index, self.info_index = 1, 1 local pool_len = TableSize(UIObjPool.UIType) local item local function on_init( ) if self.pool_index > pool_len then self:CancelStepTimer() return end local info = UIObjPool.UIInfo[self.pool_index] if not info then self:CancelStepTimer() return end if self.info_index > info.max_num then self.pool_index = self.pool_index + 1 else item = _G[info.class_type].New(self.parent_cont) item:SetVisible(false) self.ui_pool[self.pool_index]:PushFront(item) self.info_index = self.info_index + 1 end -- print("huangcong:UIObjPool [start:68] TableSize():", TableSize(self.ui_pool)) end if not self.step_init_id then self.step_init_id = GlobalTimerQuest:AddPeriodQuest(on_init, 0.02, -1) end end function UIObjPool:CancelStepTimer( ) if self.step_init_id then GlobalTimerQuest:CancelQuest(self.step_init_id) self.step_init_id = nil end end --外部接口,从对象池获取对象(类型id, 对象的父节点) function UIObjPool:PopItem( ui_type, ui_parent) local pool = self.ui_pool[ui_type] local info = UIObjPool.UIInfo[ui_type] local item if pool and pool:GetSize() > 0 then item = pool:PopFront() if ui_parent then item:SetVisible(true) item.parent = ui_parent item.transform:SetParent(ui_parent) item:SetPosition(0,0) end if item.ResetInfo then item:ResetInfo() end else if info and ui_parent then item = _G[info.class_type].New(ui_parent) end end return item end --外部接口,存入对象池(类型id, ui对象) function UIObjPool:PushItem( ui_type, ui_item ) ------------------------- if ui_type == UIObjPool.UIType.AwardItem then if not ui_item.SetItemSize then GlobalEventSystem:Fire(LuaErrorModel.SEND_LUAERROR_MESSAGE,"存了一个奇怪的东西进AwardItem对象池,请把日志移交前端") print('---- UIObjPool.lua -- 存了一个奇怪的东西进AwardItem对象池') PrintCallStack() end end ------------------------- local info = UIObjPool.UIInfo[ui_type] local pool = self.ui_pool[ui_type] if (ui_item and ui_item.is_loaded) and pool:GetSize() < info.max_num then ui_item.transform:SetParent(self.parent_cont) ui_item:SetVisible(false) pool:PushFront(ui_item) else if ui_item then ui_item:DeleteMe() ui_item = nil end end end