27. UE5 RPG同步面板属性(三)

在前两篇中,我们在C++中实现了对GameplayTag的创建,并且创建DataAsset存储数据,按照之前的规划:

  1. 首先我们需要通过c++去实现创建GameplayTag,这样可以在c++和UE里同时获取到Tag
  2. 创建一个DataAsset类,用于设置tag对应的属性和显示内容
  3. 创建AttributeMenuWidgetController实现对应逻辑

我们将在这一篇里实现对AttributeMenuWidgetController创建,可以将数据从AS里同步到UI上面。

创建AttributeMenuWidgetController

首先基于之前的创建的WidgetController的基类创建一个子类
在这里插入图片描述
将其命名为AttributeMenuWidgetController
在这里插入图片描述
覆盖一下父类的初始化属性函数和构件委托的函数,我们后续将在这两个函数内实现对属性面板的属性的广播。
我们并创建了一个委托AttributeInfoDelegate这个委托设置了BlueprintAssignable修饰符,那么就可以在蓝图里面作为回调绑定使用。
AttributeInfo参数只能在UE面板编辑,我们在上一篇添加了对应的Tag和属性名描述,作为显示内容,如果需要本地化,可以添加多个,切换中英文等其它语种的显示。

// 版权归暮志未晚所有。#pragma once#include "CoreMinimal.h"
#include "UI/WidgetController/MyWidgetController.h"
#include "AttributeMenuWidgetController.generated.h"class UAttributeInfo;
struct FMyAttributeInfo;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttibuteInfoSignature, const FMyAttributeInfo&, Info);/*** */
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAttributeMenuWidgetController : public UMyWidgetController
{GENERATED_BODY()public:virtual void BindCallbacksToDependencies() override;virtual void BroadcastInitialValues() override;UPROPERTY(BlueprintAssignable, Category="GAS|Attributes")//设置BlueprintAssignable可以在蓝图作为委托绑定监听FAttibuteInfoSignature AttributeInfoDelegate;protected:UPROPERTY(EditDefaultsOnly)//EditDefaultsOnly只能在UE面板编辑TObjectPtr<UAttributeInfo> AttributeInfo;
};

这两个函数我们将在后续对其内容进行实现。

在HUD设置Controller

之前,我们在HUD类设置了创建OverlayWidgetController,用于进入游戏时,主界面生命值和法力值的更新。
相应的,我们也将实现对AttributeMenuWidgetController的添加,作为AttributeMenuWidgetController的单例承载。
我们在HUD类里面创建一个承载它实例的变量,并添加一个获取方法

UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const FWidgetControllerParams& WCParams);UPROPERTY()TObjectPtr<UAttributeMenuWidgetController> AttributeMenuWidgetController;UPROPERTY(EditAnywhere)TSubclassOf<UAttributeMenuWidgetController> AttributeMenuWidgetControllerClass;

函数的实现这里,其实就是保证只实例化一次,后面的都复用它即可

UAttributeMenuWidgetController* AMyHUD::GetAttributeMenuWidgetController(const FWidgetControllerParams& WCParams)
{if(AttributeMenuWidgetController == nullptr){AttributeMenuWidgetController = NewObject<UAttributeMenuWidgetController>(this, AttributeMenuWidgetControllerClass);AttributeMenuWidgetController->SetWidgetControllerParams(WCParams);AttributeMenuWidgetController->BindCallbacksToDependencies(); //绑定监听数值变化}return AttributeMenuWidgetController;
}

编译,打开UE,创建一个基于AttributeMenuWidgetController类的蓝图,这里创建蓝图的原因是我们需要通过蓝图去设置AttributeInfo的数据。
在这里插入图片描述
将我们之前创建的属性数据设置上去
在这里插入图片描述
接着到HUD蓝图这里,将AttributeMenuWidgetControllerClass类设置上蓝图。
在这里插入图片描述
这样,在项目运行得时候,这两个Controller都会被创建出来,去使用。

接下来就是需要考虑如何在UI里面去获取到Controller,我们之前对OverlayWidgetController的获取是在创建UI的时候,在Widget的事件里面通过蓝图设置过去的,但是在属性面板内,层级太多,我们一层层的设置过去太过于麻烦,下面,我们将使用一个新的方式能够在全局蓝图里获取Controller。

创建蓝图函数库获取Controller

我们创建一个蓝图函数库,可以通过静态函数在任意位置获取到对应的Controller,这样可以让结构更加的清晰,也更加方便。

首先打开UE,创建一个新的c++类,这个类继承至BlueprintFunctionLibrary
在这里插入图片描述
设置好名称
在这里插入图片描述
编辑器打开,创建两个静态函数,分别用于获取OverlayWidgetController和AttributeMenuWidgetController
BlueprintPure 为去掉在蓝图内使用时的执行接口,这样,我们不需要调用,也可以直接从节点获取返回。

// 版权归暮志未晚所有。#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyAbilitySystemBlueprintLibrary.generated.h"class UAttributeMenuWidgetController;
class UOverlayWidgetController;
/*** */
UCLASS()
class AURA_API UMyAbilitySystemBlueprintLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()public:UFUNCTION(BlueprintPure, Category="MyAbilitySystemLibrary|WidgetController")static UOverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);UFUNCTION(BlueprintPure, Category="MyAbilitySystemLibrary|WidgetController")static UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const UObject* WorldContextObject);
};

在函数实现这里,我们通过函数,从世界上下文的对象获取到本地的PlayerController,然后根据PlayerController获取到所需的配置项,再从HUD身上的函数获取Controller。
这里比较有意思的就是通过在一个世界上下文的对象可以获取到它所处的世界内的PlayerController。

// 版权归暮志未晚所有。#include "AbilitySystem/MyAbilitySystemBlueprintLibrary.h"#include "Kismet/GameplayStatics.h"
#include "Player/PlayerStateBase.h"
#include "UI/HUD/MyHUD.h"
#include "UI/WidgetController/MyWidgetController.h"UOverlayWidgetController* UMyAbilitySystemBlueprintLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{//获取到playerController, 需要传入一个世界空间上下文的对象,用于得到对应世界中的PC列表,0为本地使用的PCif(APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0)){//从PC获取到HUD,我们就可以从HUD获得对应的Controllerif(AMyHUD* HUD = Cast<AMyHUD>(PC->GetHUD())){APlayerStateBase* PS = PC->GetPlayerState<APlayerStateBase>();UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();UAttributeSet* AS = PS->GetAttributeSet();const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);return HUD->GetOverlayWidgetController(WidgetControllerParams);}}return nullptr;
}UAttributeMenuWidgetController* UMyAbilitySystemBlueprintLibrary::GetAttributeMenuWidgetController(const UObject* WorldContextObject)
{//获取到playerController, 需要传入一个世界空间上下文的对象,用于得到对应世界中的PC列表,0为本地使用的PCif(APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0)){//从PC获取到HUD,我们就可以从HUD获得对应的Controllerif(AMyHUD* HUD = Cast<AMyHUD>(PC->GetHUD())){APlayerStateBase* PS = PC->GetPlayerState<APlayerStateBase>();UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();UAttributeSet* AS = PS->GetAttributeSet();const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);return HUD->GetAttributeMenuWidgetController(WidgetControllerParams);}}return nullptr;
}

然后编译,我们在UE打开Overlay的UI,就可以直接右键获取,下面的事OverlayWidget里面的函数,上面的则是静态函数
在这里插入图片描述
我们直接将之前设置方式修改,
在这里插入图片描述
也能够实现之前的效果。

接着,我们在WBP_AttributeMenu里面使用静态函数获取到AttributeMenuWidgetController设置
在这里插入图片描述
可以做一下测试,打印一下Controller的名称
在这里插入图片描述
运行项目,点击打开属性面板,查看是否有名称打印。
在这里插入图片描述
这里有个问题,我们在设置OverlayWidgetController时,是在C++内,初始化UI属性显示的。

在这里插入图片描述
在函数内,执行逻辑是:

  1. OverlayWidget->SetWidgetController(OverlayWidgetController); //设置用户控件的控制器层
  2. 设置属性后,会调用WidgetControllerSet();执行函数,这个在UI里面可以
    在这里插入图片描述
    Widget会在WidgetControllerSet()执行后,进行Controller设置并绑定监听。
    在这里插入图片描述
  3. 接着就会执行OverlayWidgetController->BroadcastInitialValues();在函数内进行广播将数据广播出去实现了数据在UI上面初始显示。

但是属性面板是动态创建的,所以我们需要将BroadcastInitialValues设置为蓝图可调用
在这里插入图片描述
然后打开WBP_AttributeMenu里面,等构造完成后使用蓝图调用BroadcastInitialValues函数。
在这里插入图片描述
Event Construct事件是在自身和自己的子元素都创建完成后才会被调用,我在子元素的Event Construct后面打印11111111,在WBP_AttributeMenu里面打印Hello,发现在最后打印了Hello,证明我们在使用蓝图调用BroadcastInitialValues函数时,子元素可以在Event Construct里面绑定监听委托,即可实现初始化。
在这里插入图片描述
我说这么多的原因在于大家一定要了解清楚引擎的运行逻辑,这样才能更好的梳理逻辑学习以及使用内置的内容。

到这里,我们创建了AttributeMenuWidgetController,并实现了在Widget内的任意位置获取它,由于篇幅太长,我将在下一篇里,对AttributeMenuWidgetController内部进行实现,实现数据更新,直接同步到UI上面。

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

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

相关文章

2024/3/29打卡 填充——贪心

目录 题目 思路 代码 先来说下什么时候使用贪心和动态规划&#xff1a; 一个题目当寻找答案的过程中有大约 2的指数级&#xff08; 2^n&#xff09;个方案的时候&#xff0c;可以考虑用贪心和动态规划问题&#xff08;其实&#xff0c;我现在还不知道什么时候用 dfs 和 动态…

深度学习pytorch——数据增强(持续更新)

背景介绍 大量的数据是防止过拟合的关键&#xff0c;但是我们如何去获取大量的数据&#xff0c;是自己去拍摄、录制吗&#xff1f;显然这种方式有极高的成本。我们可以对同一张图片进行变换得到多张图片&#xff0c;比如原来只有10张图片&#xff0c;通过变换变成了20张图片&a…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

低代码平台与自动化软件开发的关系

引言 随着信息技术的不断发展&#xff0c;软件开发领域也在不断演进。在追求更高效、更快速的软件开发过程中&#xff0c;低代码平台和自动化软件开发技术日益受到关注。低代码平台以其可视化开发界面和快速构建应用的能力&#xff0c;为非专业开发人员提供了参与软件开发的机会…

Typora for Mac/Win:让Markdown编辑更高效,创作更自由

在数字化时代&#xff0c;文本编辑已成为我们日常生活与工作中的重要环节。Markdown作为一种轻量级标记语言&#xff0c;以其简洁、易读、易写的特性&#xff0c;受到了广大用户的喜爱。而Typora&#xff0c;作为一款专为Markdown设计的文本编辑器&#xff0c;更是让Markdown编…

Midjourney绘图欣赏系列(十四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

香港服务器怎么看是CN2 GT线路还是CN2 GIA线路?

不知道有没有小伙伴们注意过&#xff0c;很多人在租用香港服务器的时候都习惯性选择 CN2 线路&#xff1f;仿佛香港服务器是否采用 CN2 线路成为个人企业选择香港服务器的一个标准。其实&#xff0c;香港服务器有CN2、优化直连(163)、BGP多线(包含了国际和国内线路)&#xff0c…

(C语言)fgets与fputs函数详解

目录 1. fputs函数详解 1.1 向文件流输入数据 1.2 向标准输出流输出数据 2. fgets函数详解 2. 1 从文件流中得到数据 2.2 从标准输入流读取数据 1. fputs函数详解 头文件&#xff1a;stdio.h 函数有两个参数&#xff1a;str 与 stream 作用&#xff1a;写一串字符串到流…

零拷贝技术、常见实现方案、Kafka中的零拷贝技术的使用、Kafka为什么这么快

目录 1. 普通拷贝 2. 数据拷贝基础过程 2.1 仅CPU方式 2.2 CPU&DMA方式 3.普通模式数据交互 4. 零拷贝技术 4.1 出现原因 4.2 解决思路 4.2.1 mmap方式 4.2.2 sendfile方式 4.2.3 sendfileDMA收集 4.2.4 splice方式 5. Kafka中使用到的零拷贝技术 参考链接 本…

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

uniapp 微信小程序 输入框跟随手机键盘弹起

需求&#xff1a;手机键盘弹起后&#xff0c;页面底部的输入框跟随弹起&#xff0c;且页面不被顶上去 html: <textareaclass"textinput"placeholder-class"input-place"auto-height:maxlength"2000"v-model"text"placeholder"…

微机原理-基于8086倒计时多路抢答器系统

**单片机设计介绍&#xff0c;微机原理-基于8086倒计时多路抢答器系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 微机原理-基于8086倒计时多路抢答器系统概要主要关注于利用8086微处理器设计和实现一个具有倒计时功能的多路抢答器系统…

鸿蒙OS开发实例:【消息传递】

介绍 在HarmonyOS中&#xff0c;参考官方指导&#xff0c;其实你会发现在‘指南’和‘API参考’两个文档中&#xff0c;对消息传递使用的技术不是一对一的关系&#xff0c;那么今天这篇文章带你全面了解HarmonyOS 中的消息传递 概况 参照官方指导&#xff0c;我总结了两部分…

关于Oracle VM VirtualBox无法查询IP地址的原因

1.如下&#xff0c;输入ifconfig却没有显示我框住的显示IP。 2.原因有可能&#xff1a; &#xff08;1&#xff09;主机没连上网络。 &#xff08;2&#xff09;虚拟机网络设置不正确。

生成 SSH 公钥

Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型 -C 注释 输出&#xff0c;如&#xff1a; 中间…

【OpenCV】 OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语…

LabVIEW转动设备故障诊断系统

LabVIEW转动设备故障诊断系统 随着工业自动化技术的不断进步&#xff0c;转动设备在电力、化工、船舶等多个行业中扮演着越来越重要的角色。然而&#xff0c;这些设备在长期运行过程中难免会出现故障&#xff0c;如果不能及时诊断和处理&#xff0c;将会导致生产效率下降&…

总结UDP协议各类知识点

前言 本篇博客博主将详细地介绍UDP有关知识点&#xff0c;坐好板凳发车啦~ 一.UDP特点 1.无连接 UDP传输的过程类似于发短信&#xff0c;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 2.不可靠传输 没有任何的安全机制&#xff0c;发送端发…

【AI】命令行调用大模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【AI】命令行调用大模型引入正文初始化项目撰写脚本全局安装 成果展示 【AI】命令…

探索高效开发大屏可视化项目模板:es-big-screen

一、引言 在数据驱动的时代&#xff0c;大屏可视化已经成为了展示数据和信息的重要手段。本文将介绍一个基于 Vue 3、Echarts、高德地图和 Pinia 开发的大屏可视化项目模板——es-big-screen&#xff0c;它提供了丰富的功能&#xff0c;包括大屏适配、图表组件&#xff08;Ech…