SysInfoMiniView = SysInfoMiniView or BaseClass() local SysInfoMiniView = SysInfoMiniView SysInfoMiniView.MAX_MSG_COUNT = 5 function SysInfoMiniView:__init() self.msg_list = Array.New() self.total_time = 1 self.play_step = 0.5--这个数字较大时,TryPopMessage函数时冷却时间不足会中断提示,但没有清除信息表,会有问题,虽然每次切场景会有校正 self.last_time = 0 self.message_wnd_list = {} self.index = 0 self.can_show = true self.prefab_asset = nil self:LoadAsset() end function SysInfoMiniView:LoadAsset() local function call_back(objs) self.prefab_asset = objs[0] self:CreateMessageContainer() if self.need_to_refresh then self:TryPopMessage() self.need_to_refresh = false end end lua_resM:loadPrefab(self,"message","miniMessage", call_back) local event = function () self.msg_list:Clear() end self.scene_id = GlobalEventSystem:Bind(SceneEventType.OPEN_SCENE_LOAD_VIEW,event) local func = function () self.msg_list:Clear() end self.account_change_id = GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT,func) self.role_change_id = GlobalEventSystem:Bind(EventName.CHANGE_ROLE,func) end function SysInfoMiniView:__delete() for k,v in pairs(self.message_wnd_list) do v:DeleteMe() end self.message_wnd_list = {} if self.account_change_id then GlobalEventSystem:UnBind(self.account_change_id) self.account_change_id = nil end if self.role_change_id then GlobalEventSystem:UnBind(self.role_change_id) self.role_change_id = nil end if self.scene_id then GlobalEventSystem:UnBind(self.scene_id) self.scene_id = nil end end function SysInfoMiniView:CreateMessageContainer() if self.prefab_asset then local item = nil for index = 0, SysInfoMiniView.MAX_MSG_COUNT do item = MessageItem.New(panelMgr:GetParent("Top"),self.prefab_asset,nil,function() self:TryPopMessage() end) self.message_wnd_list[index] = item end end end function SysInfoMiniView:TryPopMessage() local size = Array.GetSize(self.msg_list) if size <= 0 then return end local content = Array.Get(self.msg_list,0) if content then for k,v in pairs(self.message_wnd_list) do if v.state == 2 then v:CreateFoutAnim() break end end local cur_time = TimeUtil:getClientTime() if cur_time - self.last_time >= self.play_step then self.last_time = cur_time if self.index > SysInfoMiniView.MAX_MSG_COUNT then self.index = 0 end local item = self.message_wnd_list[self.index] if item.state == 0 then item:CreateFinAnim(content) self.msg_list:PopFront() self.index = self.index + 1 elseif item.state ~= 3 then item:CreateFoutAnim() end end end end function SysInfoMiniView:AppendMessage(content) if not self.prefab_asset then return end -- local item = self.message_wnd_list[self.index - 1 < 0 and 0 or self.index - 1] -- if item.content == content then -- item:CreateFinAnim(content) -- self.msg_list:PopFront() -- self.last_time = TimeUtil:getClientTime() -- return -- end local count = self.msg_list:GetSize() local cur_time = TimeUtil:getClientTime() if count > 0 then local msg = self.msg_list:Get(count - 1) if msg ~= nil and msg == content then local diff = cur_time - self.last_time if diff < self.play_step then return end end end if count > SysInfoMiniView.MAX_MSG_COUNT then self.msg_list:PopFront() end self.msg_list:PushBack(content) self:TryPopMessage() end function SysInfoMiniView:SetHide(bool) self.can_show = false if TableSize(self.message_wnd_list) > 0 then for i = 0, SysInfoMiniView.MAX_MSG_COUNT do self.message_wnd_list[i].gameObject:SetActive(not bool) end end end