---@class WBP_SkillBtn_Item_C:UAEUserWidget ---@field Button_Skill UButton ---@field CanvasPanel_CD UCanvasPanel ---@field CanvasPanel_SkillSlot UCanvasPanel ---@field Image_BG UImage ---@field Image_BG_Level UImage ---@field Image_CDTime UImage ---@field Image_SkillIcon UImage ---@field TextBlock_CDTime UTextBlock ---@field TextBlock_SkillName UTextBlock ---@field SkillSlot TEnumAsByte --Edit Below-- local WBP_SkillBtn_Item = { SkillName = -1, SkillLevel = 1, CurrentSkillCDDurationTimer = 0, CurrentSkillCDDuration = 0, LastCDSeconds = 0, MatInst_CD = nil, IsPassiveSkill = false, Color_Normal = {R = 1.0, G = 1.0, B = 1.0, A = 1.0}, Color_Disable = {R = 0.2, G = 0.2, B = 0.2, A = 1.0}, SkillBGColor = { R = 0, G = 0, B = 0, A = 0.4 }, -- 默认颜色 }; function WBP_SkillBtn_Item:Construct() self.bCanEverTick = true self.Button_Skill.OnPressed:Add(self.OnSkillButtonPressed, self) self.MatInst_CD = self.Image_CDTime:GetDynamicMaterial() self.MatInst_CD:SetScalarParameterValue("Mask_Percent", 0) self.Image_BG_Level:BindingProperty("ColorAndOpacity", self.SetLevelBGColorAndOpacity, self) self.Image_SkillIcon:BindingProperty("Visibility", self.SetIconVisibility, self) self.Image_SkillIcon:BindingProperty("ColorAndOpacity", self.SetIconColorAndOpacity, self) self.Image_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) self.TextBlock_SkillName:BindingProperty("Text", self.SetSkillNameText, self) self.TextBlock_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) self.TextBlock_CDTime:BindingProperty("Text", self.SetCDTimeText, self) end function WBP_SkillBtn_Item:Destruct() self.MatInst_CD = nil end function WBP_SkillBtn_Item:SetIconVisibility(ReturnValue) return self.SkillName > 0 and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed end function WBP_SkillBtn_Item:SetIconColorAndOpacity(ReturnValue) ---区分主动/被动技能 return self.IsPassiveSkill and self.Color_Disable or self.Color_Normal end function WBP_SkillBtn_Item:SetLevelBGColorAndOpacity(ReturnValue) return self.SkillName > ESkillName.Heal and GlobalConfigs.QualityColor[self.SkillLevel] or self.SkillBGColor end function WBP_SkillBtn_Item:SetCDTimeText(ReturnValue) return tostring(self.LastCDSeconds) end function WBP_SkillBtn_Item:SetCDTimeVisibility(ReturnValue) return self.CurrentSkillCDDurationTimer > 0 and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed end function WBP_SkillBtn_Item:SetSkillNameText(ReturnValue) return self.SkillName > -1 and GameDataManager.GetSkillNameStrByName(SkillName) or "未装备" end function WBP_SkillBtn_Item:SetIconTexture(InTexture) UIManager.LoadTexture(self.Image_SkillIcon, InTexture) end function WBP_SkillBtn_Item:SetupSkillButton(SkillName, SkillLevel) self.SkillLevel = SkillLevel self.SkillName = SkillName self.IsPassiveSkill = GameDataManager.GetSkillTypeByName(SkillName) == ESkillType.Passive --主动/被动技能处理 local IconPath = GameDataManager.GetSkillIconPathByName(SkillName) if IconPath ~= "" then self:SetIconTexture(IconPath) end self.TextBlock_SkillName:SetText(GameDataManager.GetSkillNameStrByName(SkillName)) end function WBP_SkillBtn_Item:OnSkillButtonPressed() if self.SkillName < 0 then return end if self.IsPassiveSkill == true then UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] SkillName = %d is Passive Skill", self.SkillName) return end if self.CurrentSkillCDDurationTimer > 0 then UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] SkillName = %d is in CD", self.SkillName) return end UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] Request cast skill. SkillName = %d", self.SkillName) GameDataManager.GetLocalPlayerController():ClientOnCastSkill(self.SkillSlot) end function WBP_SkillBtn_Item:OnSkillCD(Slot, CoolDownDuration) if self.SkillSlot ~= Slot then return end self.CurrentSkillCDDuration = CoolDownDuration self.CurrentSkillCDDurationTimer = CoolDownDuration self.LastCDSeconds = math.floor(CoolDownDuration) end function WBP_SkillBtn_Item:Tick(MyGeometry, InDeltaTime) if self.CurrentSkillCDDurationTimer > 0 then self.CurrentSkillCDDurationTimer = self.CurrentSkillCDDurationTimer - InDeltaTime if self.CurrentSkillCDDurationTimer <= 0 then self.CurrentSkillCDDurationTimer = 0 return end local CDSeconds = math.ceil(self.CurrentSkillCDDurationTimer) if CDSeconds ~= self.LastCDSeconds then self.LastCDSeconds = CDSeconds UE.Log("[WBP_SkillBtn_Item:Tick] SkillName=%d, CurCD=%d", self.SkillName, CDSeconds) end local CDPercent = self.CurrentSkillCDDurationTimer / self.CurrentSkillCDDuration self.MatInst_CD:SetScalarParameterValue("Mask_Percent", CDPercent) end end return WBP_SkillBtn_Item;