UEC++UI个人方案
这里是个人的使用习惯仅供参考
角色附加UI(如血条)
UI创建
在UE中创建控件并绘制页面,请注意本人喜欢用蓝图控件写UI,逻辑用C++做。注意在附加UI中常常需要选中整个画板,在右侧细节进行缩放,一般需要计算并记录下缩放后的尺寸备用。
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。

浙公网安备 33010602011771号