UE5多人MOBA+GAS 29、创建一个等级UI
文章目录
制作一个材质函数提供两个材质使用
创建一个材质函数
在技能中替换一下
给等级的经验条创建一个UI材质
if(gradient == 0){ return 0;}if(gradient < thickness){ return 1;}return 0;
创建等级UI的cpp文件
// 幻雨喜欢小猫咪#pragma once#include \"CoreMinimal.h\"#include \"Blueprint/UserWidget.h\"#include \"Components/Image.h\"#include \"Components/TextBlock.h\"#include \"GAS/Core/CAttributeSet.h\"#include \"LevelGauge.generated.h\"/** * ULevelGauge * 用于显示角色等级进度的UI控件(包含进度条和文本显示) * 依赖GameplayAbilities系统实现属性绑定 */UCLASS()class CRUNCH_API ULevelGauge : public UUserWidget{GENERATED_BODY()public:virtual void NativeConstruct() override;private:/** * 材质参数名称(用于动态调整进度条材质) * 在编辑器中可配置,默认值为\"Percent\" */UPROPERTY(EditDefaultsOnly, Category = \"Visual\")FName PercentMaterialParamName = \"Percent\";// 等级进度条UPROPERTY(meta = (BindWidget))TObjectPtr<UImage> LevelProgressImage;// 等级文本UPROPERTY(meta = (BindWidget))TObjectPtr<UTextBlock> LevelText;// 数字格式化设置FNumberFormattingOptions NumberFormattingOptions;TObjectPtr<const UAbilitySystemComponent> OwnerASC;void UpdateGauge(const FOnAttributeChangeData& Data);};
// 幻雨喜欢小猫咪#include \"LevelGauge.h\"#include \"AbilitySystemBlueprintLibrary.h\"#include \"GAS/Core/CHeroAttributeSet.h\"void ULevelGauge::NativeConstruct(){Super::NativeConstruct();// 设置为无小数格式NumberFormattingOptions.SetMaximumFractionalDigits(0);// 获取角色APawn* OwnerPawn = GetOwningPlayerPawn();if (!OwnerPawn) return;// 通过角色获取ASC组件UAbilitySystemComponent* OwnerAbilitySystemComponent = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OwnerPawn);if (!OwnerAbilitySystemComponent) return;OwnerASC = OwnerAbilitySystemComponent;// 构造的时候触发一次修改UpdateGauge(FOnAttributeChangeData());// 绑定属性变化委托:// 监听经验属性变化(当前经验值)OwnerAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCHeroAttributeSet::GetExperienceAttribute()).AddUObject(this, &ULevelGauge::UpdateGauge);// 监听升级所需经验属性变化下一级的经验值OwnerAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCHeroAttributeSet::GetNextLevelExperienceAttribute()).AddUObject(this, &ULevelGauge::UpdateGauge);// 监听上一级经验属性变化该等级的启始经验值OwnerAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCHeroAttributeSet::GetPrevLevelExperienceAttribute()).AddUObject(this, &ULevelGauge::UpdateGauge);// 监听等级属性变化(用于显示当前等级)OwnerAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCHeroAttributeSet::GetLevelAttribute()).AddUObject(this, &ULevelGauge::UpdateGauge);}void ULevelGauge::UpdateGauge(const FOnAttributeChangeData& Data){// 查询属性值时的标记bool bFound;// 获取当前经验值float CurrentExperience = OwnerASC->GetGameplayAttributeValue(UCHeroAttributeSet::GetExperienceAttribute(), bFound);if (!bFound) return;// 获取升级所需经验值float NextLevelExperience = OwnerASC->GetGameplayAttributeValue(UCHeroAttributeSet::GetNextLevelExperienceAttribute(), bFound);if (!bFound) return;// 获取上一级经验值float PrevLevelExperience = OwnerASC->GetGameplayAttributeValue(UCHeroAttributeSet::GetPrevLevelExperienceAttribute(), bFound);if (!bFound) return;// 获取当前等级float CurrentLevel = OwnerASC->GetGameplayAttributeValue(UCHeroAttributeSet::GetLevelAttribute(), bFound);if (!bFound) return;// 更新等级LevelText->SetText(FText::AsNumber(CurrentLevel, &NumberFormattingOptions));// 计算进度百分比// 获取当前等级获取到的经验float Progress = CurrentExperience - PrevLevelExperience;// 获取到下一级等级需要获取到的经验float LevelExpAmt = NextLevelExperience - PrevLevelExperience;float Percent = Progress / LevelExpAmt;// 满级if (NextLevelExperience == 0.f){Percent = 1.f;}// 更新进度条材质if (LevelProgressImage){LevelProgressImage->GetDynamicMaterial()->SetScalarParameterValue(PercentMaterialParamName, Percent);}}
蓝图中创建UI并添加到主UI上
创建对应的蓝图类
再放进UI里
设置一下升级点数的获取