在gamemode 中实现蓝图可调用函数 传入UUserWidget类实例 或者 派生自己UUserWidget类 蓝图UI类继承

前置条件:
在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来获取相应节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值