• 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.效果如下:

    点击

  • 相关阅读:
    【MySQL篇】多表查询知识点——子查询(全)
    MC我的世界大型生存服务器配置推荐首选I9-13900K高频服务器
    计算机算法分析与设计(24)---分支限界章节复习
    vulnhub Vegeta: 1
    Python教程:快速入门-函数、函数参数及三元运算符
    UG NX二次开发(C++)-CAM-根据刀具对程序组进行重新分组
    浅谈契约测试
    如何用 Java 爬取表单数据?
    obsidian和zotero联动
    Orphaned pod found - but volume paths are still present on disk的处理
  • 原文地址:https://blog.csdn.net/m0_64217692/article/details/136295447