local EventSystem = require('Event/EventSystem') local Base = require("Battle/Logic/Level/LevelItemFactory/LevelItem") local ColliderManager = require("Battle/Logic/Level/ColliderManager") local VisualObject = require("Battle/Expression/VisualObject") local LevelItem_SceneObject = class("LevelItem_SceneObject", Base) local LuaConst=LuaConst local FP=FP local table_remove=table.remove local table_insert=table.insert local TYPE_MODEL = 0 local TYPE_EFFECT = 1 local TYPE_CAMERA_EFFECT = 2 function LevelItem_SceneObject:initialize(data) Base.initialize(self,data) self._sceneObjectList = {} -- 所有创建的Object if data.ActiveDis == FP.Const.NegOne then self._colliderID = nil else self._colliderID = ColliderManager.CreateCircleCollider(data.ItemPos,data.ActiveDis) ColliderManager.AddEnterEvent(self._colliderID,self.TryBornObjects,self) end end --region --***************生命周期***************-- function LevelItem_SceneObject:OnActive() if Base.OnActive(self) then self._refreshTimer = nil if self._colliderID then ColliderManager.ActiveCollider(self._colliderID, LogicUpdateManager.ValidSyncEntityIter) else self:TryBornObjects() end return true end end function LevelItem_SceneObject:OnDeactive() if Base.OnDeactive(self) then self:ClearObject() if self._colliderID then ColliderManager.DeActiveCollider(self._colliderID) end self._refreshTimer = nil return true end end function LevelItem_SceneObject:OnDestroy() Base.OnDestroy(self) if self._colliderID then ColliderManager.DestroyCollider(self._colliderID) self._colliderID = nil end self._sceneObjectList = nil end function LevelItem_SceneObject:OnUpdate() if not self._refreshTimer then return end self._refreshTimer:Sub(LuaConst.TimeSpan) if self._refreshTimer <= FP.Const.Zero then self._refreshTimer = nil if self.ItemData.ObjectType == TYPE_CAMERA_EFFECT then self:BornCameraObjects() else self:BornSceneObjects() end end end --endregion 生命周期 --region --***************事件相关***************-- function LevelItem_SceneObject:DoAction(actionType) if actionType == LuaConst.LevelActionType.SceneObject_Active then self:OnActive() elseif actionType == LuaConst.LevelActionType.SceneObject_Deactive then self:OnDeactive() end end --endregion 事件相关 --region --***************内部方法***************-- function LevelItem_SceneObject:TryBornObjects() self._refreshTimer = self.ItemData.RefreshDelayTime ColliderManager.DeActiveCollider(self._colliderID) end function LevelItem_SceneObject:BornSceneObjects() local data = self.ItemData local count = data.Count local itemPosV2 = data.ItemPos local forwardV2 = data.ItemDir local rightV2 = FP.V2.GetRightByForward(forwardV2) local layout = data.LayoutType local scale = data.Scale local scaleX,scaleY,scaleZ = scale.x,scale.y,scale.z local posY = data.ItemPosY local path = data.ObjectPath if layout == LuaConst.EntityLayoutType.OriginPos then for i = 1,count do local positionV2 = itemPosV2 self:CreateObject(path,positionV2,forwardV2,scaleX,scaleY,scaleZ,posY) end elseif layout == LuaConst.EntityLayoutType.Random_Circle then for i = 1,count do local radian = LogicRandom.GetRangeValue(nil, FP.Const.Zero, FP.Const.PI2 ,36) local radius = LogicRandom.GetRangeValue(nil, FP.Const.Zero, data.Radius ,37) local offX = radius * FP.Math.Cos(radian) local offZ = radius * FP.Math.Sin(radian) local positionV2 = itemPosV2 + FP.newV2(offX,offZ) self:CreateObject(path,positionV2,forwardV2,scaleX,scaleY,scaleZ,posY) end elseif layout == LuaConst.EntityLayoutType.Random_Square then for i= 1,count do local halfLength = data.Length / 2 local halfWidth = data.Width / 2 local randLength = LogicRandom.GetRangeValue(nil, -halfLength,halfLength ,38) local randWidth = LogicRandom.GetRangeValue(nil, -halfWidth, halfWidth , 39) local positionV2 = itemPosV2 + rightV2 * randLength + forwardV2 * randWidth self:CreateObject(path,positionV2,forwardV2,scaleX,scaleY,scaleZ,posY) end elseif layout == LuaConst.EntityLayoutType.Matrix then local orgOffsetCol = data.Gap * (data.Col - 1) / 2 local orgOffsetRow = data.Gap * (data.Row - 1) / 2 local orgPosV2 = itemPosV2 - rightV2 * orgOffsetCol - forwardV2 * orgOffsetRow local index = 0 for i=0,data.Col - 1 do for j = 0,data.Row - 1 do local positionV2 = orgPosV2 + rightV2 * i * data.Gap + forwardV2 * j * data.Gap self:CreateObject(path,positionV2,forwardV2,scaleX,scaleY,scaleZ,posY) if index >= count then break end end if index >= count then break end end end end function LevelItem_SceneObject:BornCameraObjects() local data = self.ItemData local count = data.Count local path = data.ObjectPath local scale = data.Scale local scaleX,scaleY,scaleZ = scale.x,scale.y,scale.z for i = 1,count do local object = VisualObject.CreateVisualObjectInCamera(path,0.32) object:SetScale(scaleX, scaleY, scaleZ) table_insert(self._sceneObjectList,object) end end function LevelItem_SceneObject:ClearObject() while true do local object = table_remove(self._sceneObjectList) if not object then break end object:Dispose() end end function LevelItem_SceneObject:CreateObject(path,positionV2,forwardV2,scaleX,scaleY,scaleZ,posY) local object = VisualObject.CreateVisualObject(path,ExpLevelManager.SceneObjParent) local px, pz = FP.tonumberV2(positionV2) local dx, dz = FP.tonumberV2(forwardV2) if posY then object:Invoke("SetPositionDirectlyAndDirection", dx, dz,px, posY, pz) else object:SetPositionAndDirection(dx, dz,px, 0, pz) end object:AccumScale(scaleX, scaleY, scaleZ) table_insert(self._sceneObjectList,object) end --endregion 内部方法 return LevelItem_SceneObject