---@class BP_TrackWidegt_C:AActor ---@field Widget UWidgetComponent ---@field DefaultSceneRoot USceneComponent ---@field TargetPlayerKey int64 --Edit Below-- ---@type BP_TrackWidegt_C local BP_TrackWidegt = { SetVisHandle = nil; bIsVis = false; Dis = -1; LocalPawnPos = {X = 0., Y = 0., Z = 0.}; TickFrequency = 25; }; function BP_TrackWidegt:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); if UGCGameSystem.IsServer() then else -- self:GetWidget():SetVisibility(ESlateVisibility.Collapsed) self:AutoSetVis() self:ClientUpdatePlayerKey(self.TargetPlayerKey) self.CustomReceiveTickHandle = UGCEventSystem.SetTimerLoop(self, self.CustomReceiveTick, 1. / self.TickFrequency) if self.SetVisHandle == nil then self.SetVisHandle = UGCEventSystem.SetTimerLoop(self, self.AutoSetVis, 1) end UGCEventSystem.AddListener(EventEnum.PlayerIsAliveIsChange, self.AutoSetVis, self) end end function BP_TrackWidegt:ReceiveEndPlay() if self.SetVisHandle then UGCEventSystem.StopTimer(self.SetVisHandle) self.SetVisHandle = nil end if self.CustomReceiveTickHandle then UGCEventSystem.StopTimer(self.CustomReceiveTickHandle) self.CustomReceiveTickHandle = nil end if UGCGameSystem.IsServer() then else UGCEventSystem.RemoveListener(EventEnum.PlayerIsAliveIsChange, self.AutoSetVis, self) end self.SuperClass.ReceiveEndPlay(self); end --[[ function BP_TrackWidegt:GetReplicatedProperties() return end --]] --[[ function BP_TrackWidegt:GetAvailableServerRPCs() return end --]] function BP_TrackWidegt:CustomReceiveTick() if self.bIsVis then local LocalPawn = UGCSystemLibrary.GetLocalPlayerPawn() -- local TrackPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey) local TrackPawn = UGCGameSystem.GameState:GetAlivePawn(self.TargetPlayerKey) if UE.IsValid(LocalPawn) then self.LocalPawnPos = LocalPawn:K2_GetActorLocation() end if UE.IsValid(TrackPawn) then self:K2_SetActorLocation(TrackPawn:K2_GetActorLocation()) self:GetWidget():SetVis(true) else self:GetWidget():SetVis(false) end self.Dis = VectorHelper.Length(VectorHelper.Sub(self:K2_GetActorLocation(), self.LocalPawnPos)) self:GetWidget():UpdateDis(self.Dis) end end function BP_TrackWidegt:SetTrackPlayerKey(InPlayerKey) self.TargetPlayerKey = InPlayerKey UGCSendRPCSystem.ActorRPCNotify(nil, self, "ClientUpdatePlayerKey", InPlayerKey) end function BP_TrackWidegt:ClientUpdatePlayerKey(NewPlayerKey) if self.TargetPlayerKey ~= NewPlayerKey then self.TargetPlayerKey = NewPlayerKey -- 刷新显示状态 self:AutoSetVis() if self.TargetPlayerKey == nil or self.TargetPlayerKey < 0 then --if self.SetVisHandle == nil then -- self.SetVisHandle = UGCEventSystem.SetTimerLoop(self, self.AutoSetVis, 0.3) --end else --if self.SetVisHandle then -- UGCEventSystem.StopTimer(self.SetVisHandle) -- self.SetVisHandle = nil --end end end end function BP_TrackWidegt:GetWidget() return self.Widget:GetUserWidgetObject() end function BP_TrackWidegt:AutoSetVis() local NewVis = false if self.TargetPlayerKey > 0 then local TrackPlayerTeamID = UGCGameSystem.GameState:GetPlayerTeamIDByPlayerKey(self.TargetPlayerKey) local LocalPlayerTeamID = UGCGameSystem.GameState:GetPlayerTeamIDByPlayerKey(UGCSystemLibrary.GetLocalPlayerKey()) local TargetPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey) local GameState = UGCGameSystem.GameState --UGCLogSystem.Log("[BP_TrackWidegt_AutoSetVis]1") if TargetPawn and TrackPlayerTeamID ~= LocalPlayerTeamID and GameState and GameState:GetPlayerIsAlive(self.TargetPlayerKey)then -- if TargetPawn and TrackPlayerTeamID ~= LocalPlayerTeamID then --UGCLogSystem.Log("[BP_TrackWidegt_AutoSetVis]2") NewVis = true end end if self.bIsVis ~= NewVis then -- 设置UI可视性 self.bIsVis = NewVis if self.bIsVis == false then self:GetWidget():SetVis(false) end end end function BP_TrackWidegt:OnRep_TargetPlayerKey() self:ClientUpdatePlayerKey(self.TargetPlayerKey) end return BP_TrackWidegt;