UE4/CPP C++绑定UMG中的按钮事件

本文介绍如何在UE4中创建菜单界面,包括使用WidgetBlueprint和C++类进行联动开发,实现开始游戏和退出游戏的功能。文章详细展示了如何绑定按钮事件,并提供在新版UE4中有效的绑定方法。
  • 创建Widget Blueprint蓝图,命名为MainMenu;
  • 创建继承于Uesr Widget类的c++类,命名为MainUserWidget,设置MainMenu的父类为MainUserWidget
    这里写图片描述
  • 在MainMenu蓝图中拖入两个按钮分别命名为:StartGameBtn和QuitGameBtn;
  • 在c++类MainUserWidget.h文件中定义与按钮对应的属性:
public:
    UPROPERTY(Meta = (BindWidget))
        UButton* StartGameBtn;
    UPROPERTY(Meta = (BindWidget))
        UButton* QuitGameBtn;

属性的名字与按钮的名字对应。定义两个方法:

    UFUNCTION()
        void StartGame();
    UFUNCTION()
        void QuitGame();
  • 获得MainMenu中按钮的引用并赋值给类中的属性,并且绑定事件
    if (UButton* SBtn = Cast<UButton>(GetWidgetFromName("StartGameBtn")))
    {
        StartGameBtn = SBtn;
        UE_LOG(LogTemp, Warning, TEXT("StartGameBtn"));

        FScriptDelegate sgbDelegate;
        sgbDelegate.BindUFunction(this, "StartGame");
        StartGameBtn->OnReleased.Add(sgbDelegate);
    }

参考的文章,感谢作者的分享和对我的帮助:

  1. UE4C++获得UMG控件:https://blog.youkuaiyun.com/l171672538/article/details/78873264,但里面的绑定事件的方法在新版本的UE引擎中(我目前使用的是4.19.2)无法使用。

  2. [UE4]退出游戏的API(C++):http://aigo.iteye.com/blog/2291979,相当于蓝图中的Quit Game节点。里面的内容为以下代码:

    1. #include "KismetSystemLibrary.h"  
    2.   
    3. void ASomeActor::SomeActorFunction()  
    4. {  
    5.     UKismetSystemLibrary::QuitGame(this, nullptr, EQuitPreference::Quit);  // 主要调用的方法
    6. }  
  1. http://aigo.iteye.com/blog/2296218,这里面讲了创建一个与UMG蓝图相关联的类的方法。

  2. https://blog.youkuaiyun.com/zilisen/article/details/77645500,在这篇文章中找到了在新版本引擎中绑定按钮点击事件的方法:即使用FScriptDelegate

<think>好的,我现在需要帮助用户解决在UE4中将TextBlock与后台C++变量进行绑定的问题。首先,我得回忆一下UE4中的数据绑定机制。用户界面元素如TextBlock通常需要通过某种方式与后端数据连接,以便实时更新显示内容。 首先,用户提到的TextBlock是UMG中的一个小部件,用于显示文本。绑定C++变量可能需要使用UE4的属性系统或者委托。我记得数据绑定UE4中通常通过BlueprintReadWrite属性和绑定委托来实现。可能需要将C++变量暴露给蓝图,然后在UMG中创建一个绑定到该变量的函数。 接下来,我需要查阅UE4的文档或者教程,确认正确的步骤。根据引用[1]中提到ObjectProperty在Kivy中的使用,可能UE4中也有类似的属性系统,允许在C++中定义变量并在UI中绑定。引用[2]和[3]提到了代码完成和文档,可能需要用户查看UE4的编辑器内文档或使用Ctrl-Space来查找相关函数。 步骤可能包括:在C++类中定义UPROPERTY变量,并设置合适的元数据如BlueprintReadWrite,然后创建一个获取该变量值的函数。在UMG中,为TextBlock的文本属性绑定到这个函数。这样每当变量值改变时,TextBlock会自动更新。 另外,考虑到性能,可能需要使用事件或委托来通知UI更新,而不是每帧轮询变量值的变化。不过,UE4的数据绑定可能已经封装了这些细节,用户只需正确设置绑定即可。 需要验证这些步骤是否正确,是否有遗漏。比如,是否需要调用特定的函数来触发更新,或者是否需要在构造脚本中初始化绑定。此外,可能还需要在Widget蓝图中实现绑定逻辑,比如使用Bind Widget或事件图表。 最后,总结步骤并确保用户能够按照指导操作,同时提供相关的参考链接或文档,如UE4官方文档关于UMG和数据绑定的部分,帮助用户进一步查阅详细信息。</think>在Unreal Engine 4中实现TextBlock与C++变量的绑定,主要通过数据绑定机制和属性声明实现。以下是具体操作步骤: ### 一、基础绑定方法 1. **声明可绑定变量** 在C++类头文件中定义带有`UPROPERTY`宏的变量,并添加`BlueprintReadWrite`元数据: ```cpp UCLASS() class YOUR_API UMyWidget : public UUserWidget { GENERATED_BODY() public: UPROPERTY(BlueprintReadWrite, Category = "Data") FString CharacterName = "DefaultName"; }; ``` 2. **创建绑定函数** 在Widget蓝图类中: ```cpp UFUNCTION(BlueprintCallable, Category = "Data") FText GetCharacterName() const { return FText::FromString(CharacterName); } ``` 3. **UMG绑定设置** 在Widget蓝图中: - 选择TextBlock控件 - 点击Text属性的绑定按钮 - 选择`GetCharacterName`函数作为绑定源 ### 二、动态更新方案(推荐) 使用UE4的`OnPropertyChanged`事件实现实时更新: ```cpp DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnDataChanged); UCLASS() class YOUR_API UMyObject : public UObject { GENERATED_BODY() UPROPERTY(BlueprintAssignable) FOnDataChanged OnDataChanged; }; ``` 在数据更新时触发委托: ```cpp void UMyObject::SetCharacterName(const FString& NewName) { CharacterName = NewName; OnDataChanged.Broadcast(); } ``` ### 三、高级绑定技巧 1. **格式化文本绑定** ```cpp UFUNCTION(BlueprintCallable, meta=(DisplayName="GetFormattedText")) FText GetFormattedText() const { return FText::Format(NSLOCTEXT("GameUI", "Status", "HP: {0}"), CurrentHealth); // 引用UE4本地化系统[^3] } ``` 2. **异步加载绑定** ```cpp UFUNCTION(BlueprintCallable, meta=(DisplayName="GetLoadingStatus")) void GetLoadingStatus(UPARAM(ref) FText& OutText) const { AsyncTask(ENamedThreads::GameThread, [&OutText](){ OutText = FText::FromString("Loading..."); }); } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值