• UE5 C++ Widget练习 Button 和 ProgressBar创建血条


    一.

    1.C++创建一个继承Widget类的子类, 命名为MyUserWidget

    2.加上Button 和 UserWidget的头文件

    1. #include "CoreMinimal.h"
    2. #include "Components/Button.h"
    3. #include "Blueprint/UserWidget.h"
    4. #include "MyUserWidget.generated.h"

    3.声明两个按钮 组件,两个浮点数。每次按Start按钮,当前生命值就减一。和两个准备用来代理调用的函数Start,Quit。减少并更新生命值状态的函数UpdateLife。

    并且重写Initialize函数,实现初始化。相当于Actor里个Begin()。

    1. UPROPERTY(meta = (BindWidget))
    2. UButton* ButtonStart;
    3. UPROPERTY(meta = (BindWidget))
    4. UButton* ButtonQuit;
    5. UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyHealth")
    6. //UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
    7. float CurrentLife = 100.f;
    8. UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyHealth")
    9. float MaxLife = 100.f;
    10. void UpdateLife();
    11. virtual bool Initialize()override;
    12. UFUNCTION()
    13. void Start();
    14. UFUNCTION()
    15. void Quit();

    4.使用Button里的,OnClicked 绑定代理。

    1. bool UMyUserWidget::Initialize()
    2. {
    3. if (!Super::Initialize())
    4. {
    5. return false;
    6. }
    7. //ButtonStart->OnClicked.AddDynamic(this,&MyUserWid); //代理绑定
    8. ButtonStart->OnClicked.AddDynamic(this,&UMyUserWidget::Start);
    9. ButtonQuit->OnClicked.AddDynamic(this, &UMyUserWidget::Quit);
    10. return true;
    11. }

    5.代理时,按下按钮里的函数再套用减少血量的函数。

    1. void UMyUserWidget::Start()
    2. {
    3. UpdateLife();
    4. GEngine->AddOnScreenDebugMessage(-1,5.f,FColor::Red,TEXT("Start"));
    5. }
    6. void UMyUserWidget::Quit()
    7. {
    8. GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Quit"));
    9. }

    二 蓝图里操作

    1.创建一个Widget Blueprint。

    2.加入三个组件,按钮组件需要和C++里命名一样。

    3.将新建的UMG_Widget里的classsetting里的继承的父类,修改为MyUserWiget。这样C++里的逻辑就在这里了。

    4.将ProgessBar里Percent,创建绑定的蓝图函数。

    5.这里的C++声明过的参数可以直接访问到,计算现阶段血量的百分比,赋值给ProgressBar

    6.在PlayerController里面,添加这个Widget。之前PlayerController里曾设置Pawn,并绑定相机。

    官方文档:

    C++里的写法如下:

    新添加Blueprint/UserWidget.h的头文件

    1. #include "MyPlayerController.h"
    2. #include "MyPawn.h"
    3. #include"Blueprint/UserWidget.h"

    UClass指针 指向 动态加载LoadClass类(MyUserWidget),UserWidget指针 指向 用CreateWidget实例化UClass指向的类。并将它 AddToViewport。

    1. void AMyPlayerController::BeginPlay()
    2. {
    3. Super::BeginPlay();
    4. UClass* widgetClass = LoadClass(NULL,TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/UMG_Widget.UMG_Widget_C'")); //动态加载
    5. UUserWidget* MyWidgetClss = nullptr;
    6. MyWidgetClss = CreateWidget(GetWorld(),widgetClass); //创建UUserWidget
    7. MyWidgetClss->AddToViewport();
    8. }

    7.效果如下:

    点击

  • 相关阅读:
    JSP out.print()和out.write()方法的不同之处
    LeetCode-1408-数组中的字符串匹配
    java串口通讯开发rxtxSerial.dll的闪退问题解决
    Laravel 的事件监听器与服务提供者和服务容器的二三事
    C#开发的OpenRA游戏之属性BodyOrientation(6)
    RDB与AOF持久化【Redis】及缓存雪崩、击穿、穿透
    动态规划-线性DP问题总结(一)
    使用Docker部署Nacos集群
    Android之AMessage机制存/取原理(四十四)
    Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第7章 Vue.js高级进阶 7.1 安装vue-cli
  • 原文地址:https://blog.csdn.net/m0_64217692/article/details/136295447