local Base = require("Battle/Logic/Level/LevelItemFactory/LevelItem") local LevelItem_WaitingZone = class("LevelItem_WaitingZone", Base) local LuaConst = LuaConst local EventSystem = require("Event/EventSystem") local VisualObject = require("Battle/Expression/VisualObject") local ColliderManager = require("Battle/Logic/Level/ColliderManager") local IterEntity = function(entity, i) i = i + 1 if i <= 1 then return i, entity end end function LevelItem_WaitingZone:initialize(data) Base.initialize(self,data) if data.ColliderType == LuaConst.LevelShapeType.Circle then self._colliderID = ColliderManager.CreateCircleCollider(data.ItemPos,data.Radius * data.Radius) elseif data.ColliderType == LuaConst.LevelShapeType.Square then self._colliderID = ColliderManager.CreateRectCollider(data.ItemPos,data.ItemDir,data.Length,data.Width) end ColliderManager.AddEnterEvent(self._colliderID, self.OnTriggerEnter, self) ColliderManager.AddStayEvent(self._colliderID, self.OnTriggerStay, self) ColliderManager.AddExitEvent(self._colliderID, self.OnTriggerExit, self) self._triggerEntityID = nil self._context = { HasExecutors = function() return self._triggerEntityID ~= nil end, IterExecutors = function() return IterEntity, self._triggerEntityID, 0 end, } self._entityWaitingDic = {} self._effect = nil end --region --***************生命周期***************-- function LevelItem_WaitingZone:OnActive() if Base.OnActive(self) then if self._colliderID then ColliderManager.ActiveCollider(self._colliderID, LogicUpdateManager.ValidSyncEntityIter) end local itemData = self.ItemData if not string.isNilOrEmpty(itemData.Object) then if itemData.IsStaticObject then self._object = VisualObject.CreateEffectObject(itemData.Object, ExpLevelManager.SceneObjParent) else if itemData.ColliderType == LuaConst.LevelShapeType.Circle then self._object = VisualObject.CreateEffectSphereTrigger(ExpLevelManager.SceneObjParent, itemData.Object, itemData.ShowRadius) elseif itemData.ColliderType == LuaConst.LevelShapeType.Square then self._object = VisualObject.CreateEffectBoxTrigger(ExpLevelManager.SceneObjParent, itemData.Object, itemData.ShowLength, 1, itemData.ShowWidth) else logging.error(LTAG.ERROR,"策划配置错误,元素ID", self.LevelItemID) end end if itemData.ShowRedPointType and itemData.ShowRedPointType > 0 then EventSystem.Dispatch(EventID.UI_MiniMap_AddItem, itemData.LevelItemID, itemData) LevelItemManager.Global:Notify_AddItemOnMap(itemData.LevelItemID) end if self._object then local px, pz = FP.tonumberV2(itemData.ItemPos) local dx, dz = FP.tonumberV2(itemData.ItemDir) self._object:SetPosition(px, 0, pz) self._object:SetDirection(dx, dz) end end return true end end function LevelItem_WaitingZone:OnDeactive() if Base.OnDeactive(self) then if self._colliderID then ColliderManager.DeActiveCollider(self._colliderID, LogicUpdateManager.SyncEntityIter) end table.clear(self._entityWaitingDic) local itemData = self.ItemData if itemData.ShowRedPointType and itemData.ShowRedPointType > 0 then EventSystem.Dispatch(EventID.UI_MiniMap_DeleteItem, itemData.LevelItemID) LevelItemManager.Global:Notify_DeleteItemOnMap(itemData.LevelItemID) end if self._object then self._object:Dispose() self._object = nil end return true end end function LevelItem_WaitingZone:OnDestroy() Base.OnDestroy(self) if self._colliderID then ColliderManager.DestroyCollider(self._colliderID) self._colliderID = nil end self._triggerEntityID = nil self._context = nil self._entityWaitingDic = nil self._object = nil end --region 生命周期 --region --***************事件相关***************-- function LevelItem_WaitingZone:OnTriggerStay(entity) local entityID = entity:GetEntityID() local time = self._entityWaitingDic[entityID] if time then time:Add(LuaConst.TimeSpan) if time >= self.ItemData.Time then self._entityWaitingDic[entityID] = nil self._triggerEntityID = entityID self:Dispatch(LuaConst.LevelConditionType.WaitingZone_Complete, self._context) self._triggerEntityID = nil EventSystem.Dispatch(EventID.Level_EndWait, entity) end end end function LevelItem_WaitingZone:OnTriggerEnter(entity) self._entityWaitingDic[entity:GetEntityID()] = FP.newV1(0) EventSystem.Dispatch(EventID.Level_StartWait, entity, FP.tonumberV1(self.ItemData.Time), self.ItemData.ProgressText) end function LevelItem_WaitingZone:OnTriggerExit(entity) self._entityWaitingDic[entity:GetEntityID()] = nil EventSystem.Dispatch(EventID.Level_EndWait, entity) end function LevelItem_WaitingZone:DoAction(actionType, ...) Base.DoAction(self, actionType, ...) if actionType == LuaConst.LevelActionType.WaitingZone_Active then self:OnActive() elseif actionType == LuaConst.LevelActionType.WaitingZone_Deactive then self:OnDeactive() end end --endregion 事件相关 --region --***************内部方法***************-- --endregion 内部方法 return LevelItem_WaitingZone