写在前面
所谓的UserWidget,就是我们平常看到在游戏里面显示在玩家上方那些UI组件,他和普通的UWidget不太一样,普通的UWidget常常是用来做界面UI的。
创建UUserWidget的C++子类
// header
class BLASTER__API UBlasterUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
// 和继承这个类的蓝图widget进行元素绑定 注意名字要相同
UPROPERTY(meta = (BindWidget))
class UTextBlock *DisplayText{nullptr};
void SetDisPlayText(FString displayText);
UFUNCTION(BlueprintCallable)
void showPlayerNetRole(APawn *InPawn);
protected:
virtual void NativeDestruct() override;
};
// cpp
void UBlasterUserWidget::NativeDestruct()
{
// 离开当前level时
Super::NativeDestruct();
// 从父元素上方脱离, 你可以把userwidget当成一个节点,就像html Node节点一样,如果调用这个函数就从父元素上脱离了
RemoveFromParent();
}
void UBlasterUserWidget::SetDisPlayText(FString displayText)
{
// 设显示内容
this->DisplayText->SetText(FText::FromString(displayText));
}
void UBlasterUserWidget::showPlayerNetRole(APawn *InPawn)
{
if (!InPawn)
return;
auto localRole = InPawn->GetLocalRole();
FString tag{};
switch (localRole)
{
case ENetRole::ROLE_Authority:
tag = FString("Role Authority");
break;
case ENetRole::ROLE_AutonomousProxy:
tag = FString("Role AutonomousProxy");
break;
case ENetRole::ROLE_SimulatedProxy:
tag = FString("Role SimulatedProxy");
break;
case ENetRole::ROLE_None:
tag = FString("Role None");
break;
}
SetDisPlayText(tag);
}
创建UserWidget子类蓝图
在Content文件夹的相应位置写上WBP..., 继承自该c++类。
创建TextBlock,注意命名和c++中相同
在Character上使用该组件
// header 添加
private:
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
class UWidgetComponent *OverheadWidget;
// cpp 构造器添加
// 创建一个widget
OverheadWidget = CreateDefaultSubobject<UWidgetComponent>("OverHeadWidget");
// 将其设置到SceneComponent上去
OverheadWidget->SetupAttachment(RootComponent);
添加完毕后,就会发现该组件被添加到蓝图中去了,接着做一些改动
Space改为屏幕,widgetClass改为蓝图,等
接着修改EventGraph: