前置条件:
在gamemode 中实现蓝图可调用函数 传入UUserWidget类实例 或者 派生自己UUserWidget类 蓝图UI类继承
例如
UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject", DisplayName = "Set InstanceVar", Keywords = " global InstanceVar"), Category = " Plugin")
static void SetInstanceVar(UObject* WorldContextObject, FString MyTag);//
//实现
void AjustdoitGameModeBase::SetInstanceVar(UObject* WorldContextObject, FString MyTag)
{
//APlayerController* pc = UGameplayStatics::GetPlayerController(GWorld, 0);
// GetWidgetFromName()
AjustdoitGameModeBase* pmode = Cast<AjustdoitGameModeBase>(GWorld->GetAuthGameMode());
pmode->strMsg = MyTag;
UKismetSystemLibrary::PrintString(WorldContextObject, TEXT("---##SetInstanceVar---"));
UKismetSystemLibrary::PrintString(WorldContextObject, MyTag);
}
➤ UMG与C++交互
UUserWidget类,获取WBP(WidgetBlueprint)节点树中的节点,有以下几种方式:
① UMG节点呈树状结构,可通过接口 GetRootWidget 获取根节点,再通过 GetChildAt 获得指定下标的所有子节点,其他相关接口(如 GetChildIndex、GetAllChildren等)在具体使用时可参考源码。
// 获取根节点画布面板
UCanvasPanel* rootPanel = Cast(GetRootWidget());
// 获取指定下标的节点,并通过Cast转换为对应类型指针,这里以 UTextBlock 类为例
UTextBlock* txtOb = Cast(rootPanel->GetChildAt(6)));
// 也可以通过 GetAllChildren 获取所有子节点,返回一个 TArray 数组
TArray<UWidget*> nodesArr = rootPanel->GetAllChildren();
② 通过UE提供的反射机制,进行反射绑定,即使用 UPROPERTY 定义成员变量,绑定蓝图中的节点,这里需要特别注意,定义的成员变量名必须和蓝图中节点名称一致。
// 这里以 UTextBlock 类为例
UPROPERTY(Meta = (BindWidget))
UTextBlock* TxtOb; // TxtOb 必须与WBP中节点的名称一致
③ 通过接口 GetWidgetFromName 获取节点,然后再使用 Cast 转换为对应的指针。
// 这里以 UTextBlock 类为例
UTextBlock* TxtOb = Cast(GetWidgetFromName(TEXT(“TxtNameInWBP”)));
④ 通过声明属性为 BlueprintImplementableEvent 的 UFUNCTION,在蓝图中重载函数,WBP中可以轻易获取到节点引用,将引用返回,在C++中调用,即可获取到节点引用。
// 这里以 UTextBlock 类为例
UFUNCTION(BlueprintImplementableEvent)
UTextBlock* GetTxt();
补充:还有一种方式,大致过程为获得 UUserWidget 的所有节点,将它们组装为一个Map,就可以轻易用Name作为Key来获取相应节点。