---@class BP_StarManager_C:AActor ---@field DefaultSceneRoot USceneComponent ---@field MaxStarNum int32 ---@field StarPointClass UClass ---@field StarClass UClass ---@field StartStarPoint AActor --Edit Below-- local BP_StarManager = { AllStarPoints = {}; -- 所有Star AllStars = {}; -- 默认的Star 用于被拾取后刷新位置 -- DefaultStarActor = nil; NowStarIndex = 1; NowStarPointIndex = 1; }; function BP_StarManager:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); if UGCGameSystem.IsServer() then self:InitParam() UGCEventSystem.AddListener(EventEnum.PlayerPickStar, self.PlayerPickStar, self) -- 校准星星的可视性 self.CheckStarVisHandle= UGCEventSystem.SetTimerLoop(self, self.CheckStarVis, 5) end end function BP_StarManager:InitParam() -- 获取摆放位置 local TempAllStarPoint = GameplayStatics.GetAllActorsOfClass(self, self.StarPointClass, {}) for i, v in pairs(TempAllStarPoint) do if self.StartStarPoint ~= v then self.AllStarPoints[#self.AllStarPoints + 1] = VectorHelper.ToLuaTable(v:K2_GetActorLocation()) end end table.Shuffle(self.AllStarPoints) -- 生成Star for i = 1, self.MaxStarNum do local Star = UGCGameSystem.SpawnActor(self, self.StarClass, VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), nil) self.AllStars[#self.AllStars + 1] = Star end -- 添加一个Star self:AddStarFromPos(self.StartStarPoint:K2_GetActorLocation(), false, false) UGCLogSystem.Log("[BP_StarManager_InitParam]") end function BP_StarManager:AddStarFromPos(NewPos, NeedToCheckFloor, NotifyClient) local TargetStar = self:GetNewStar() if NeedToCheckFloor then UGCLogSystem.Log("[BP_StarManager_AddStarFromPos] NewPos:%s", VectorHelper.ToString(NewPos)) local EndPos = {X = NewPos.X, Y = NewPos.Y, Z = NewPos.Z - 1500} local ObjectTypes = {ECollisionChannel.ECC_WorldStatic}; local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, NewPos, EndPos, ObjectTypes, false, {}, EDrawDebugTrace.None) if bHit then NewPos = HitResult.ImpactPoint end UGCLogSystem.Log("[BP_StarManager_AddStarFromPos] NewPos Finish:%s", VectorHelper.ToString(NewPos)) end TargetStar:SetPos(NewPos, NotifyClient) TargetStar:SetStarEnable(true, NotifyClient) end function BP_StarManager:PlayerPickStar(PlayerKey) if self:GetShowStartNum() <= 0 then self:AddStarFromPos(self:GetNewStarPos(), false, true) end UGCSendRPCSystem.ActorRPCNotify(PlayerKey, self, "PlayerPickStarEffect") end function BP_StarManager:PlayerPickStarEffect() SoundSystem.PlaySound(SoundSystem.ESound.Star) end function BP_StarManager:GetNewStarPos() local Res = self.AllStarPoints[self.NowStarPointIndex] self.NowStarPointIndex = (self.NowStarPointIndex % #self.AllStarPoints) + 1 return Res end function BP_StarManager:GetNewStar() local Res for i = 1, self.MaxStarNum + 1 do Res = self.AllStars[self.NowStarIndex] self.NowStarIndex = (self.NowStarIndex % #self.AllStars) + 1 if Res:GetEnableStar() == false then break end end return Res end function BP_StarManager:GetShowStartNum() local ShowStartNum = 0 for i, v in pairs(self.AllStars) do if v:GetEnableStar() then ShowStartNum = ShowStartNum + 1 end end return ShowStartNum end --[[ function BP_StarManager:ReceiveTick(DeltaTime) self.SuperClass.ReceiveTick(self, DeltaTime); end --]] function BP_StarManager:ReceiveEndPlay() if UGCGameSystem.IsServer() then for i, v in pairs(self.AllStars) do if UE.IsValid(v) then v:K2_DestroyActor() end end if self.CheckStarVisHandle then UGCEventSystem.StopTimer(self.CheckStarVisHandle) self.CheckStarVisHandle = nil end end self.AllStars = {} self.SuperClass.ReceiveEndPlay(self); end function BP_StarManager:CheckStarVis() local VisStars = {} for i, v in pairs(self.AllStars) do VisStars[i] = v:GetEnableStar() end UGCSendRPCSystem.ActorRPCNotify(nil, self, "ClientCalibrationStarVis", VisStars) end function BP_StarManager:ClientCalibrationStarVis(VisStars) UGCLogSystem.LogTree("[BP_StarManager_ClientCalibrationStarVis]", VisStars) for i, v in pairs(VisStars) do if self.AllStars[i] then self.AllStars[i]:ClientUpdateEnableEffect(v) else UGCLogSystem.LogError("[BP_StarManager_ClientCalibrationStarVis] AllStars[%s] is nil", tostring(i)) end end end function BP_StarManager:GetReplicatedProperties() return "AllStars" end --[[ function BP_StarManager:GetAvailableServerRPCs() return end --]] return BP_StarManager;