UE5多人MOBA+GAS 29、创建一个等级UI
文章目录
- 制作一个材质函数提供两个材质使用
- 创建等级UI的cpp文件
- 蓝图中创建UI并添加到主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里
设置一下升级点数的获取