local Action_WaitPlayerJoin = { WaitTime = 0; WaitTeamPlayerNum = 2; WaitFinishEvent = ""; WaitFailureEvent = ""; AtLeastWaitingTime = 20; GameWillBeginWaitTime = 8; } -- 触发器激活时,将执行Action的Execute function Action_WaitPlayerJoin:Execute(...) UGCGameSystem.GameState:SetGameStateType(Enum.EGameState.Waiting) self.DoOnceGameWillBegin = true; self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) self.ModifiableWaitTime = self.WaitTime self.LastUpdateRemainTime = self.WaitTime self.JoinedPlayerNum = 0 -- 申请玩家加入 UGCGameSystem.GameState:UpdatePlayerJoin() self.bEnableActionTick = true return true end function Action_WaitPlayerJoin:Update(DeltaSeconds) local CurrentRealTime = GameplayStatics.GetRealTimeSeconds(self); local RemainTime = self.ModifiableWaitTime - (CurrentRealTime - self.EnterStateTime); RemainTime = RemainTime >= 0 and RemainTime or 0 local CurrentUpdateRemainTime = math.ceil(RemainTime) self.JoinedPlayerNum = #UGCGameSystem.GetAllPlayerState(false) if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then self.LastUpdateRemainTime = CurrentUpdateRemainTime end -- UGCLogSystem.Log("[Action_WaitPlayerJoin_Update]CurrentRealTime:%f, RemainTime:%f, CurrentUpdateRemainTime:%f, LastUpdateRemainTime:%f, EnterStateTime:%f, ModifiableWaitTime:%f", -- CurrentRealTime, RemainTime, CurrentUpdateRemainTime, self.LastUpdateRemainTime, self.EnterStateTime, self.ModifiableWaitTime -- ) local NowWaitTime = CurrentRealTime - self.EnterStateTime -- 玩家等待时间即将结束,且满足最低开局要求,发送即将开局信息 if (self.DoOnceGameWillBegin and self.JoinedPlayerNum >= 2 and self.LastUpdateRemainTime < self.GameWillBeginWaitTime) then self.DoOnceGameWillBegin = false UGCGameSystem.GameState:GameWillBeginNotify() self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) self.ModifiableWaitTime = self.LastUpdateRemainTime end -- 玩家满足直接开局要求,发送即将开局信息 if self.JoinedPlayerNum >= self.WaitTeamPlayerNum and NowWaitTime >= self.AtLeastWaitingTime then self.LastUpdateRemainTime = math.min(self.GameWillBeginWaitTime, self.LastUpdateRemainTime) if self.DoOnceGameWillBegin then self.DoOnceGameWillBegin = false UGCGameSystem.GameState:GameWillBeginNotify() self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) self.ModifiableWaitTime = self.LastUpdateRemainTime end -- 等待时间结束游戏开局 elseif CurrentUpdateRemainTime <= 0 then if self.JoinedPlayerNum >= 2 then UGCGameSystem.SendModeCustomEvent(self.WaitFinishEvent) self.LastUpdateRemainTime = 0 UGCLogSystem.Log("[Action_WaitPlayerJoin_Update] WaitFinish") else UGCGameSystem.GameState:SetGameStateType(Enum.EGameState.InsufficientNumberOfPeople) UGCGameSystem.SendModeCustomEvent(self.WaitFailureEvent) end self.bEnableActionTick = false end --更新GameState.WaitPlayerJoinTime UGCGameSystem.GameState.WaitPlayerJoinTime = self.LastUpdateRemainTime end return Action_WaitPlayerJoin