---@class WB_DistanceDefenseLine_C:UUserWidget ---@field CanvasPanel_Runs UCanvasPanel ---@field TextBlock_BreakThrough UTextBlock ---@field TextBlock_Len UTextBlock --Edit Below-- local WB_DistanceDefenseLine = { bInitDoOnce = false; Range = GlobalConfigs.ProjectSetting.ShowAttackerRange; WidgetRange = 300; PlayerMoveWidget = {} }; function WB_DistanceDefenseLine:Construct() WidgetLibrary.TextBlockBindingPropertyText(self.TextBlock_BreakThrough, self.UpdateBreakThrough, self) for i = 0 , self.CanvasPanel_Runs:GetChildrenCount() - 1 do local Item = self.CanvasPanel_Runs:GetChildAt(i) self.PlayerMoveWidget[i + 1] = Item Item:SetVis(false) end UGCEventSystem.AddListener(EventEnum.UpdateAttackers, self.UpdateAttackers, self) UGCEventSystem.SetTimerLoop(self, self.UpdatePlayerDis, 0.05) self.TextBlock_Len:SetText(self.Range .. "m") end -- 这个UI大概率不会二次利用就不抽象了,耦合度挺高的!!!!!!!!!!!!!!!!!!!!!!!! function WB_DistanceDefenseLine:UpdateBreakThrough() return UGCGameSystem.GameState:GetBreakThrough() .. "/" .. GlobalConfigs.ProjectSetting.BreakThroughMaxCount end function WB_DistanceDefenseLine:UpdateAttackers(Attackers) for i, v in pairs(self.PlayerMoveWidget) do v:SetPlayer(Attackers[i]) v:SetVis(false) end end function WB_DistanceDefenseLine:GetSimpleLineOfDefense() if not UE.IsValid(self.SimpleLineOfDefense) then self.SimpleLineOfDefense = UGCSystemLibrary.GetUniqueInstanceFromPath(GlobalConfigs.ProjectSetting.LineOfDefensePath) end if UE.IsValid(self.SimpleLineOfDefense) then self.LineOfDefensePos = self.SimpleLineOfDefense:K2_GetActorLocation() end return self.SimpleLineOfDefense end function WB_DistanceDefenseLine:UpdatePlayerDis() local LineOfDefense = self:GetSimpleLineOfDefense() if UE.IsValid(LineOfDefense) then for i, v in pairs(self.PlayerMoveWidget) do local PlayerKey = v:GetPlayerKey() if PlayerKey then local Pawn = UGCGameSystem.GameState:GetAlivePawn(PlayerKey) if UE.IsValid(Pawn) then local Length = VectorHelper.Length2D(VectorHelper.Sub2D(Pawn:K2_GetActorLocation(), self.LineOfDefensePos)) / 100 if Length <= self.Range then -- Length = math.clamp(Length, 0, self.Range) v:SetRenderTranslation({X = (1 - Length / self.Range) * self.WidgetRange, Y = 0}) v:SetVis(true) else v:SetVis(false) end end v:UpdateIsDead() end end end end -- function WB_DistanceDefenseLine:Tick(MyGeometry, InDeltaTime) -- end -- function WB_DistanceDefenseLine:Destruct() -- end return WB_DistanceDefenseLine;