【UE5】UMG C++父类绑定蓝图子类属性

news2024/11/17 17:42:02

有时我们在设计UMG时可能会使用到C++父类来处理一些通用逻辑,如果我们想要在C++父类中获取其派生子类的某个属性,如Image或Button等,我们可以通过使用UE提供的BindWidget元数据标签的方式来获取。

BindWidget

BindWidget元数据标签在官方文档中并没有出现,但引擎是支持这个标签的。

在看例子之前我们需要注意一些BindWidget的要求:

  • BindWidget标识的变量必须是public变量;
  • BindWidget标识的变量必须是UWidget类型及其派生类型;
  • BindWidget标识的变量必须是指针;
  • 蓝图子类中必须存在同类型的同名控件。

首先我们创建一个继承自UUserWidget的自定义C++类UCusWidget,然后创建一个public变量,然后在UPROPERTY中设置BindWidget元数据:

UCLASS()
class MYPROJECT_API UCusWidget : public UUserWidget
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, Meta = (BindWidget),Category = "CusWidget")
	UImage* CusImage;
	UPROPERTY(BlueprintReadWrite, Meta = (BindWidget),Category = "CusWidget")
	UTextBlock* CusText;

	virtual void NativeConstruct() override;
};

然后创建一个继承自UCusWidget的UMG蓝图UW_Cus,为UI添加一个Image并命名为CusImage,添加一个TextBlock并命名为CusText:

在这里插入图片描述

这样控件CusImage和CusText就和父类中的同名变量绑定了,如此父类便可以通过同名变量来控制子类的控件了。

这里我们在Widget构造时给与CusImage一个随机颜色并在CusText中显示颜色的RGBA值:

void UCusWidget::NativeConstruct()
{
	Super::NativeConstruct();
	if(CusImage)
	{
		CusImage->SetColorAndOpacity(FLinearColor::MakeRandomColor());
	}
	if(CusText)
	{
		CusText->SetText(FText::FromString(CusImage->ColorAndOpacity.ToString()));
	}
}

然后就可以看到结果了:

在这里插入图片描述

这里我在另一个Widget中封装了多个UW_Cus以便观察。

这里有一个坑需要注意,更新控件属性时应该使用对应的Set函数,如:CusImage->SetColorAndOpacity(FLinearColor::MakeRandomColor()),而不是直接赋值,如:CusImage->ColorAndOpacity = FLinearColor::MakeRandomColor(),直接赋值Widget不会更新样式。

BindWidgetOptional

BindWidget元数据需要强制绑定子蓝图的同名控件,而BindWidgetOptional功能上和BindWidget一致,但不需要强制绑定子蓝图中的同名控件,所以这就要求在书写C++代码时需要更严谨,因为它们修饰的变量都是指针,而使用BindWidgetOptional极容易出现空指针。

BindWidgetAnim

BindWidgetAnim是专门用来绑定UWidgetAnimation类型变量的元数据,和BindWidget一样,BindWidgetAnim对变量也有要求:

  • BindWidgetAnim标识的变量必须是public变量;
  • BindWidgetAnim标识的变量必须是UWidgetAnimation类型及其派生类型;
  • BindWidgetAnim标识的变量必须是指针;
  • BindWidgetAnim标识的变量必须是Transient变量;
  • 蓝图子类中必须存在同名的Widget动画。

关于Transient,Transient也是一个UPROPERTY的标识符,用于标识变量是否是临时变量,被标识的变量会被禁止序列化,如:

UCLASS()
class MYPROJECT_API UCusWidget : public UUserWidget
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, Meta = (BindWidgetOptional),Category = "CusWidget")
	UImage* CusImage;
	UPROPERTY(BlueprintReadWrite, Meta = (BindWidgetOptional),Category = "CusWidget")
	UTextBlock* CusText;
	UPROPERTY(BlueprintReadWrite,Transient, Meta = (BindWidgetAnim),Category = "CusWidget")
	UWidgetAnimation* StartAnime;

	virtual void NativeConstruct() override;	
};

BindWidgetAnimOptional

BindWidgetAnimOptional功能和BindWidgetOptional一样,用于非强制绑定动画的情况;

UE元数据参考

https://benui.ca/unreal/uproperty/#umg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++指南】类和对象(一):类和对象的定义和使用 基础讲解

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 文章思路 一、类的定义 1.类的定义 2.类的访问限定符 3.class与struct的使用区别 4.类域…

topo组态引入-记录

一、目录(vue-router映射到下面的index.vue界面) (自己记录,别下载不用看)

Prometheus:alertmanager实战分组、抑制、静默

1 项目目标 (1)熟练部署alertmanager (2)熟练整合alertmanagerPrometheus (3)熟练alertmanager分组、抑制、静默 2 项目准备 2.1 规划节点 主机名 主机IP 节点规划 prome-master01 10.0.1.10 服务…

Graylog日志丢失解决方案

问题描述 目前公司使用的日志方案是Graylog5.0版本,当接入的日志并发多时,就会出现日志丢失的情况。 目前硬件系统centos7.9 内核5.16.13。一台graylog和一台es服务器。 两台机器硬件配置 graylog CPU 36C 内存 150G 系统硬盘 500G (固态&…

盘点15款主流的项目管理软件,优缺点一目了然!

本文将盘点对15款主流的项目管理软件进行盘点: 简道云、Worktile、Teambition、Tower、泛微 e-office、用友项目管理软件、金蝶云星瀚项目管理、腾讯 TAPD、Asana、Trello、Jira、Basecamp、Monday.com、Wrike、Smartsheet。 在现代企业的运营中,项目管理…

uniapp,uview:inputnumber或者input,当type为number的时候,在ios里输入不了小数的问题

项目场景: 在做uniapp的H5页面时,有个需求是要输入框要能支持可以保留两位小数输入,不能输入负数和其他字符。心想这简单,直接用uview的inputnumber组件这不就好了,结果测试提bug说不能输入小数点,我心想我…

基于Hadoop+Zookeeper+Hive+HBase+Echarts的地区旅游大数据可视化管理系统设计与实现

绪论 研究背景 当今时代信息资源日益丰富大量,信息资源的利用对社会的发展起着主要作用,运用信息技术协助产业设计越来越成为行业发展的重要趋势。 旅游产业是典型的体验服务产业,在任何发展阶段,信息反馈的准确性与及时性都具…

【表格】EEG作为脑成像工具的分析与应用

EEG作为脑成像工具的分析与应用 【表格】EEG空间分析方法与应用 方法/应用描述关键点示例/公式备注全局场功率(GFP)量化头皮电位场的强度 G F P σ ( V t ) GFP \sigma(V_t) GFPσ(Vt​) 其中 V t V_t Vt​为t时刻各电极电压无具体公式,为标准差计算提供对同步活…

C和C++中数组的不同

本文选自公众号文章: https://mp.weixin.qq.com/s/xyUMWTyEu7-Uws8Zfxifpghttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%2FxyUMWTyEu7-Uws8Zfxifpg&skey%40crypt_963c540a_c8e6882f00ef27f0c27a8357dea50…

了解Redis数据持久化(下)

4.AOF 写后日志,避免宕机数据丢失 4.1 AOF说明 AOF日志存储的是Redis服务器的顺序指令序列只记录对内存进行修改的指令append-only file(AOF)AOF主要是主线程在执行,将日志写入磁盘的过程中,如果磁盘压力太大&#x…

USB3.2 摘录(九)

系列文章目录 USB3.2 摘录(一) USB3.2 摘录(二) USB3.2 摘录(三) USB3.2 摘录(四) USB3.2 摘录(五) USB3.2 摘录(六) USB3.2 摘录&…

HCIA--网络地址转换NAT技术

NAT(Network Address Translation,网络地址转换技术是为了缓解IPv4地址有限的问题。 NAT技术主要用于实现内部网络的主机访问外部网络。一方面NAT缓解了IPv4地址短缺的问题,另一方面NAT技术让外网无法直接与使用私有地址的内网进行通信,提升…

【ACL2024教程】大型语言模型对抗攻击的脆弱性,200多页ppt

本教程全面概述了大型语言模型(LLMs)在对抗攻击下暴露的脆弱性——这是一个可信机器学习中新兴的跨学科领域,结合了自然语言处理(NLP)和网络安全的视角。我们强调了单模态LLM、多模态LLM以及集成LLM的系统中现有的脆弱…

FPGA上板项目(三)——RAM测试

目录 实验内容实验原理实验步骤实验用时序波形HDL 代码仿真综合实现上板测试 实验内容 对 FPGA 内部的 RAM 进行数据读写操作。 实验原理 RAM (Random Access Memory),是可以进行数据交换的存储器,可读可写;而 ROM&…

Docker一行命令安装MySQL

1 前言 在Linux系统中安装MySQL数据库是一件繁琐的事情,经常遇到各种问题,浪费大量时间。Docker的出现很好的解决这个问题,下面然我们来学习如何在Docker中用一行命令安装MySQL。 2 安装Docker 这里以CentOS系统为例,步骤非常简…

这4款专业的思维导图工具教你怎么快速制作脑图。

思维导图怎么制作?其实很简单,在制作思维导图之前,先要明确自己的导图主体,然后就可以去选择一个合适的工具,就可以开始制作。如果不知道如何挑选工具的话,我可以帮助大家列举几个。 1、福昕365脑图 传送门…

关于前端布局的基础知识

float 横向布局 float 实现横向布局,需要向横着布局的元素添加float 其值left right 存在问题 如果使用float 所在父级五高度,会导致下方的元素上移 top的高度被吞了 解决方法: 给父级元素设置高度:不推荐,需要给父级…

盘点15款主流客户管理系统,助力企业选型!

本文将盘点15款主流客户管理系统: 简道云、纷享销客、销售易、HubSpot、Zoho CRM、SAP CRM、Oracle CRM、金蝶云星空 CRM、用友 CRM、悟空 CRM、Salesforce、Microsoft Dynamics 365、亿客 CRM、八百客 CRM、CloudCC CRM。 在当今的商业环境中,客户管理系…

能大致讲一下Chat GPT的原理吗?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 话题群精选了三位网友的回答,从不同的角度阐释了Chat GPT的原理。 第一位网友的回答: 不给你扯长篇大论&#…

SpringBoot整合MyBatis使用自定义TypeHandler

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…