---@class WB_XinHaoQuan_C:UUserWidget ---@field CanvasPanel_Poison UCanvasPanel ---@field CanvasPanel_Update UCanvasPanel ---@field HorizontalBox_Alive UHorizontalBox ---@field HorizontalBox_Dis UHorizontalBox ---@field Image_ UImage ---@field Image_XinHaoQuan UImage ---@field TextBlock_Circle UTextBlock ---@field TextBlock_CountDown UTextBlock ---@field TextBlock_LastDis UTextBlock ---@field WidgetSwitcher_Main UWidgetSwitcher --Edit Below-- ---@type WB_XinHaoQuan_C local WB_XinHaoQuan = { bInitDoOnce = false; }; WB_XinHaoQuan.XinHaoQuanMaterial = nil; function WB_XinHaoQuan:Construct() self.XinHaoQuanMaterial = self.Image_XinHaoQuan:GetDynamicMaterial(); end WB_XinHaoQuan.CircleUpdateTime = 0.85; WB_XinHaoQuan.UpdateCount = 0; WB_XinHaoQuan.PointCount = 0; function WB_XinHaoQuan:Tick(MyGeometry, InDeltaTime) if LocalPlayerKey == nil then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed) return end local System = PoisonCircleSystem.GetPoisonCircleSystem(); local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey); if not UE.IsValid(System) then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed) return end local State = UGCGameSystem.GameState.RoundInfo.RoundState; --UGCLogSystem.Log("[WB_XinHaoQuan:Tick] State = %s", tostring(State)); if State == RoundState.InRound then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible); else self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed); return; end if UE.IsValid(Pawn) and Pawn:IsAlive() then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible) local CurrentInfo = System:GetCurrentInfo(); -- 当前中心 local PawnLoc = Pawn:K2_GetActorLocation() local CenterLoc = CurrentInfo.Center local Dis = VectorHelper.GetDistance2D(PawnLoc, CenterLoc) / 100; if Dis < CurrentInfo.Radius then self:PlayerInCircle(InDeltaTime); self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed); self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); else self:PlayerOutCircle(InDeltaTime); self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.CanvasPanel_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.TextBlock_LastDis:SetText(string.format('%0.fm', Dis - CurrentInfo.Radius)); -- 计算能够存活多久 local Health = UGCPawnAttrSystem.GetHealth(Pawn); local Time = Health / Pawn.PoisonDamage; if Time >= 10 then self.TextBlock_CountDown:SetText(tostring(math.floor(Time))); else self.TextBlock_CountDown:SetText(string.format('%0.1f', Time)); end --- 安全区的进度 if self.XinHaoQuanMaterial == nil then self.XinHaoQuanMaterial = self.Image_XinHaoQuan:GetDynamicMaterial(); end self.XinHaoQuanMaterial:SetScalarParameterValue("Mask_Percent", 1. - Health / UGCPawnAttrSystem.GetHealthMax(Pawn)); end else self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed); end --- 正在刷圈 if System:GetCurrState() == PoisonCircleSystem.CircleState.RUNNING then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.TextBlock_Circle:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.UpdateCount = self.UpdateCount + InDeltaTime; if self.UpdateCount >= self.CircleUpdateTime then self.UpdateCount = self.UpdateCount - self.CircleUpdateTime; local s = '' for i = 1, self.PointCount + 1 do s = s .. '. ' end self.TextBlock_Circle:SetText(string.format('安全区刷新中' .. s)) self.PointCount = (self.PointCount + 1) % 3 end else self.TextBlock_Circle:SetVisibility(ESlateVisibility.Collapsed); end end --- 玩家在安全区内 ---@param InDeltaTime float function WB_XinHaoQuan:PlayerInCircle(InDeltaTime) end -- 当前的半径 function WB_XinHaoQuan:UpdatePoisonCircle(InDeltaTime) -- 获取全局的 信号圈 local System = PoisonCircleSystem.GetPoisonCircleSystem(); if not UE.IsValid(System) then self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); return ; end --- 正在刷圈 if System:GetCurrState() == PoisonCircleSystem.CircleState.RUNNING then self.TextBlock_Circle:SetVisibility(ESlateVisibility.SelfHitTestInvisible); local Info = System:GetCurrentInfo(); local Material = self.Image_XinHaoQuan:GetDynamicMaterial() Material:SetScalarParameterValue("Mask_Percent", Info.CurrentPercent); self.UpdateCount = self.UpdateCount + InDeltaTime; if self.UpdateCount >= self.CircleUpdateTime then self.UpdateCount = self.UpdateCount - self.CircleUpdateTime; local s = '' for i = 1, self.PointCount + 1 do s = s .. '. ' end self.TextBlock_Circle:SetText(string.format('安全区刷新中' .. s)) self.PointCount = (self.PointCount + 1) % 3 end else self.TextBlock_Circle:SetVisibility(ESlateVisibility.Collapsed); end end --- 玩家在安全区外 ---@param InDeltaTime float function WB_XinHaoQuan:PlayerOutCircle(InDeltaTime) end function WB_XinHaoQuan:DistanceToPoisonCenter() if LocalPlayerKey == nil then return ; end -- 检查玩家是否存活 local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey); if UE.IsValid(Pawn) and Pawn:IsAlive() then self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible); local System = PoisonCircleSystem.GetPoisonCircleSystem(); local CurrentInfo = System:GetCurrentInfo(); -- 当前中心 local PawnLoc = Pawn:K2_GetActorLocation() local CenterLoc = CurrentInfo.Center local Dis = VectorHelper.GetDistance2D(PawnLoc, CenterLoc) / 100; if Dis < CurrentInfo.Radius then -- 说明当前没事 self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed); else -- 说明当前在圈外 self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.TextBlock_LastDis:SetText(string.format('%0.fm', Dis - CurrentInfo.Radius)) -- 显示还有多长时间存活 end else -- 关闭 self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed); end end return WB_XinHaoQuan;