当前位置: 首页 > news >正文

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

一.

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

2.加上Button 和 UserWidget的头文件

#include "CoreMinimal.h"
#include "Components/Button.h"
#include "Blueprint/UserWidget.h"
#include "MyUserWidget.generated.h"

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

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

	UPROPERTY(meta = (BindWidget))UButton* ButtonStart;UPROPERTY(meta = (BindWidget))UButton* ButtonQuit;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyHealth")//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")float CurrentLife = 100.f;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyHealth")float MaxLife = 100.f;void UpdateLife();virtual bool Initialize()override;UFUNCTION()void Start();UFUNCTION()void Quit();

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

bool UMyUserWidget::Initialize()
{if (!Super::Initialize()){return false;}//ButtonStart->OnClicked.AddDynamic(this,&MyUserWid);  //代理绑定ButtonStart->OnClicked.AddDynamic(this,&UMyUserWidget::Start);ButtonQuit->OnClicked.AddDynamic(this, &UMyUserWidget::Quit);return true;
}

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

void UMyUserWidget::Start()
{UpdateLife();GEngine->AddOnScreenDebugMessage(-1,5.f,FColor::Red,TEXT("Start"));
}void UMyUserWidget::Quit()
{GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Quit"));
}

二 蓝图里操作

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的头文件

#include "MyPlayerController.h"
#include "MyPawn.h"
#include"Blueprint/UserWidget.h"

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

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

7.效果如下:

点击

http://www.lryc.cn/news/308698.html

相关文章:

  • 抖店无货源违规频发,不能入驻?这个是真的吗?
  • HarmonyOS—开发云数据库
  • mysql查询某个数据库的数量有多少GB
  • table展示子级踩坑
  • xss过waf的小姿势
  • 【六袆 - MySQL】MySQL 5.5及更高版本中,InnoDB是新表的默认存储引擎;
  • 可移植性(兼容性)测试指南
  • 软件更新快讯-Obsidian更新-1.5.8 linux Appimage直装
  • Android Gradle开发与应用 (二) : Groovy基础语法
  • iptables学习
  • kafka 集群搭建
  • springboot-基础-eclipse配置+helloword示例
  • 关于HTML标签应用教程
  • 3. 台阶问题
  • 推荐一个 Obsidian 的 ChatGPT 插件
  • aws的RDS数据库开启慢查询日志
  • 一文读懂 Python 值传递和引用传递
  • Linux进阶——系统安全,重要文件,加固系统的相关配置
  • C++三级专项 字符串逆序
  • 【iOS ARKit】ARWorldMap
  • 敏捷开发最佳实践:质量维度实践案例之软硬一体持续交付
  • PMP证书的含金量如何?
  • Linux 下安装Jupyter
  • docker 基础(二)
  • LeetCode 刷题 [C++] 第236题.二叉树的最近公共祖先
  • vue3+vite 项目的创建
  • Windows Server 2022 使用ApacheDS用户认证
  • 【Oracle】Oracle清理日志空间
  • 数据抽取平台pydatax介绍--实现和项目使用
  • 容易发生内存泄漏的八个场景,你都知道吗?