87 lines
2.9 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@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;