当前位置:   article > 正文

UE4 C++ —— UMG和C++交互_ue4 ubutton* button1 = nullptr;

ue4 ubutton* button1 = nullptr;

简述
在UE4开发中,我们想使用UMG创建显示界面,而在C++代码中编写逻辑处理代码。这样就需要UMG和C++进行交互,即在C++中引用UMG中的控件,并进行事件绑定等操作

交互方法
一,强转子集
GetRootWidget()        //获取根节点
GetChildAt()            //获取子节点

UMG控件呈树状结构,根据根节点可以获取到所有的子节点
二,反射绑定
UPROPERTY(Meta = (BindWidget))
UButton *ButtonOne;

绑定的类型和名称必须和蓝图内的一致
三,根据控件名获取
GetWidgetFromName()
获取到UWidget*类型,强转成指定类型

实例应用
创建C++空项目,新建两个C++类,分别继承于HUD和UserWidget,命名为MyHUD和MyWidget


创建两个继承于MyHUD和MyWidget的蓝图类,即BP_MyHUD和BP_MyWidget


BP_MyWidget需先创建UMG蓝图,然后在UMG蓝图中指定继承的父类


编辑BP_MyWidget,控件结构


BP_MyWidget显示效果


编译保存,打开VS,编写C++代码

源码
MyHUD.h

  1. #include "CoreMinimal.h"
  2. #include "GameFramework/HUD.h"
  3. #include "MyHUD.generated.h"
  4. UCLASS()
  5. class PROJECTDEMO2_API AMyHUD : public AHUD
  6. {
  7. GENERATED_BODY()
  8. protected:
  9. virtual void BeginPlay() override;
  10. public:
  11. UPROPERTY(EditAnywhere, Category = "UserWidget")
  12. TSubclassOf<class UMyWidget> WidgetClass;
  13. };

MyHUD.cpp

  1. #include "MyHUD.h"
  2. #include "Kismet/GameplayStatics.h"
  3. #include "MyWidget.h"
  4. void AMyHUD::BeginPlay()
  5. {
  6. Super::BeginPlay();
  7. UMyWidget* widget = CreateWidget<UMyWidget>(GetWorld(), WidgetClass);
  8. if (widget != nullptr)
  9. {
  10. widget->AddToViewport();
  11. }
  12. //获取控制器
  13. APlayerController *myPlayerController = Cast<APlayerController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
  14. //设置鼠标输入模式
  15. if (myPlayerController != nullptr)
  16. {
  17. myPlayerController->bShowMouseCursor = true;
  18. FInputModeGameOnly InputMode;
  19. InputMode.SetConsumeCaptureMouseDown(true);
  20. myPlayerController->SetInputMode(InputMode);
  21. }
  22. }

MyWidget.h

  1. #include "CoreMinimal.h"
  2. #include "Blueprint/UserWidget.h"
  3. #include "MyWidget.generated.h"
  4. class UImage;
  5. class UCanvasPanel;
  6. class UButton;
  7. UCLASS()
  8. class PROJECTDEMO2_API UMyWidget : public UUserWidget
  9. {
  10. GENERATED_BODY()
  11. public:
  12. UMyWidget(const FObjectInitializer& objectInitializer);
  13. virtual bool Initialize() override;
  14. UFUNCTION()
  15. void ButtonOneEvent();
  16. UFUNCTION()
  17. void ButtonTwoEvent();
  18. UFUNCTION(BlueprintCallable, Category = "UserWidget")
  19. void ButtonThreeEvent();
  20. public:
  21. //反射绑定
  22. UPROPERTY(Meta = (BindWidget))
  23. UButton *ButtonOne;
  24. UCanvasPanel* rootPanel;
  25. };

MyWidget.cpp

  1. #include "MyWidget.h"
  2. #include "CanvasPanel.h"
  3. #include "Image.h"
  4. #include "Button.h"
  5. #include "TextBlock.h"
  6. #include "Text.h"
  7. UMyWidget::UMyWidget(const FObjectInitializer& objectInitializer) :Super(objectInitializer)
  8. {
  9. }
  10. bool UMyWidget::Initialize()
  11. {
  12. if (!Super::Initialize())
  13. {
  14. return false;
  15. }
  16. //ButtonOne
  17. ButtonOne->OnClicked.__Internal_AddDynamic(this, &UMyWidget::ButtonOneEvent, FName("ButtonOneEvent"));
  18. //ButtonTwo
  19. rootPanel = Cast<UCanvasPanel>(GetRootWidget());
  20. if (rootPanel)
  21. {
  22. UButton* ButtonTwo = Cast<UButton>(rootPanel->GetChildAt(2));
  23. ButtonTwo->OnClicked.__Internal_AddDynamic(this, &UMyWidget::ButtonTwoEvent, FName("ButtonTwoEvent"));
  24. }
  25. //ButtonThere
  26. UButton* ButtonThere = (UButton*)GetWidgetFromName(TEXT("ButtonThree"));
  27. FScriptDelegate ButTwoDel;
  28. ButTwoDel.BindUFunction(this, "ButtonThreeEvent");
  29. ButtonThere->OnReleased.Add(ButTwoDel);
  30. return true;
  31. }
  32. void UMyWidget::ButtonOneEvent()
  33. {
  34. if (GEngine) {
  35. GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Yellow, "ButtonOneEvent");
  36. }
  37. }
  38. void UMyWidget::ButtonTwoEvent()
  39. {
  40. if (GEngine) {
  41. GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Yellow, "ButtonTwoEvent");
  42. }
  43. }
  44. void UMyWidget::ButtonThreeEvent()
  45. {
  46. if (GEngine) {
  47. GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Yellow, "ButtonThreeEvent");
  48. }
  49. }

注:在MyWidget中我们获取了Button的引用,并绑定OnClicked事件,在MyHUD中设置了鼠标显示模式和添加了Widget到视口。

编译保存,在World Settings指定HUD Class为BP_MyHUD


打开BP_MyHUD,指定Widget Class


编译运行,分别点击三个按钮,打印输出到屏幕

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/501466
推荐阅读
相关标签
  

闽ICP备14008679号