创建UserWidget显示Character的NetRole

96 阅读1分钟

写在前面

所谓的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);

添加完毕后,就会发现该组件被添加到蓝图中去了,接着做一些改动

image.png

image.png

Space改为屏幕,widgetClass改为蓝图,等

接着修改EventGraph:

image.png