UEC++UI个人方案

这里是个人的使用习惯仅供参考

角色附加UI(如血条)

UI创建

在UE中创建控件并绘制页面,请注意本人喜欢用蓝图控件写UI,逻辑用C++做。注意在附加UI中常常需要选中整个画板,在右侧细节进行缩放,一般需要计算并记录下缩放后的尺寸备用。../attachment/Pasted image 20251025190746.png

C++头文件--配置

1 创建组件属性
UPROPERTY(VisibleAnywhere,BlueprintReadWrite,Category=Widget)  
class UWidgetComponent* WidgetComponent;

2 创建控件蓝图资源类
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")  
TSubclassOf<UUserWidget> HealthBarWidgetClass;

3 UI的引用
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")  
UUserWidget* HealthBar;
UPROPERTY()  
class UProgressBar* HealthBar_Progress;  
UPROPERTY()  
class UTextBlock* HealthBar_LevelBlock;  
UPROPERTY()  
UTextBlock* HealthBar_CurrentHealthBlock;  
UPROPERTY()  
UTextBlock* HealthBar_MaxHealthBlock;

C++源文件--配置

整体来说,头文件的配置加上构造函数的配置等于编译和保存的蓝图编辑器。

AMyCharacter::AMyCharacter(){
	1 创建ui组件和附加
	WidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("WidgetComp"));
	WidgetComponent->SetupAttachment(GetRootComponent());
	
	2 创建资源类引用,需要_C标识资源类引用
	static ConstructorHelpers::FClassFinder<UUserWidget> Finder(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/MyAsset/UI/StateBar.StateBar_C'"));  
	if (Finder.Succeeded())  
	{  
	    
	    3 保存资源类引用,我称之为载入ProtoType
	    HealthBarWidgtClass = Finder.Class//载入UI资源到资源类中
	    //WidgetComponent->SetWidgetClass(HealthBarWidgetClass);//将资源类载入到组件
	    4 组件配置
	    WidgetComponent->SetWidgetSpace(EWidgetSpace::World);//让UI作为单独的部件和角色绑定(与Screen相对)
	    WidgetComponent->SetDrawAtDesiredSize(true);//启动强制裁切WidgetComponent的尺寸  
	    WidgetComponent->SetDrawSize(FVector2D(1000.f,256.f));//指定WidgetComponent的尺  
	    WidgetComponent->SetRelativeLocation(FVector(0.f, 0.f, 120.f)); // 角色头顶上方  
	    WidgetComponent->SetPivot(FVector2D(0.5f, 0.5f)); // 设置中心点  
	    WidgetComponent->SetVisibility(true);  
	}
}


void AMyCharacter::BeginPlay()  
{  
    Super::BeginPlay();  

    if (WidgetComponent)  
    {   
	    1 相对于CreateWidgetClass 我称之载入具体实例,实例化和实例的载入
	    HealthBar = CreateWidget<UUserWidget>(GetWorld(),HealthBarWidgetClass);  
		WidgetComponent->SetWidget(HealthBar);  
		
		2 获取控件单元的引用
		HealthBar_Progress = Cast<UProgressBar>(HealthBar->GetWidgetFromName(TEXT("HealthBar")));  
		HealthBar_LevelBlock = Cast<UTextBlock>(HealthBar->GetWidgetFromName((TEXT("LevelBlock"))));  
		HealthBar_CurrentHealthBlock = Cast<UTextBlock>(HealthBar->GetWidgetFromName(TEXT("CurrentHealthBlock")));  
		HealthBar_MaxHealthBlock = Cast<UTextBlock>(HealthBar->GetWidgetFromName(TEXT("MaxHealthBlock")));
    }  
}

使用

1 设置数据或获取数据
HealthBar_CurrentHealthBlock->SetText(FText::AsNumber(CurrentHealth));
Text = HealthBar_CurrentHealthBlock->GetText();

2 调用蓝图函数,调用指定名称的函数。
FOutputDeviceNull Ar;
CallFunctionByNameWithArguments(TEXT("PrintHello"), Ar, nullptr, true);

其他组件自身的功能需要去查阅组件代码或者UE官网的API。

posted @ 2025-10-27 20:15  抓泥鳅的小老虎  阅读(1)  评论(0)    收藏  举报