虚幻引擎5 GAS开发俯视角RPG游戏 P05-08 UI 部件数据表

1.目标:创建一个数据表,存储一些标签信息

Source/CC_Aura/Public/UI/WidgetController/CC_OverlayWidgetController.h:

cpp 复制代码
/*数据表行结构:用于存储标签信息*/
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FGameplayTag MessageTag = FGameplayTag();		//标签

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FText Message = FText();						//描述
	
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	TSubclassOf<UCC_UserWidget> MessageWidget;		//小部件

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	UTexture2D* Image = nullptr;					//图片
};

2.C++创建数据表指针:

cpp 复制代码
protected:
	/*消息部件数据表*/
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Widget Data")
	TObjectPtr<UDataTable> MessageWidgetDataTable;
	

3.在BP_OverlayWidgetController里配置数据表:

(1)蓝图创建数据表:

(2)配置数据表:

4.定义一个模板函数,从标签中找到数据行:

cpp 复制代码
/*通过标签查找数据表行*/
	template<typename T>
	T* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag);
	
cpp 复制代码
template <typename T>
T* UCC_OverlayWidgetController::GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag)
{
	return DataTable->FindRow<T>(Tag.GetTagName(), TEXT(""));
}

CC_OverlayWidgetController.cpp:

有红线,报错.这是因为Lambda函数是匿名函数,需要在[ ]里添加"this":

cpp 复制代码
CC_AbilitySystemComponent->OnEffectAssetTags.AddLambda(
		[this](const FGameplayTagContainer& AssetTags)
		{
			for(const FGameplayTag& Tag : AssetTags)
			{
				//对标签进行检测,如果不是信息标签,将无法进行广播
				FGameplayTag RequestGameplayTag = FGameplayTag::RequestGameplayTag(FName("Message"));
				if (Tag.MatchesTag(RequestGameplayTag))		//检测Tag是否是RequestGameplayTag的子标签
				{
					FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
				}
			}
		}
	);

5.现在我们的目的是:将数据表的行信息,广播给小部件

(1)所以,创建一个动态多播委托:

cpp 复制代码
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMessageWidgetRowSignature, FUIWidgetRow, Row);

(2)定义委托

cpp 复制代码
	/*委托:消息行*/
	UPROPERTY(BlueprintAssignable, Category="GAS|Messages")
	FOnMessageWidgetRowSignature OnMessageWidgetRowSignature;

(3)广播值的变化:

6.打开蓝图WBP_Overlay:

绑定委托事件:

7.GameplayEffect里添加标签:

完美

相关推荐
数智工坊4 分钟前
【深度学习RL】DQN:深度强化学习的里程碑——让AI从像素中学会玩Atari游戏
论文阅读·人工智能·深度学习·游戏·transformer
一只旭宝6 分钟前
【C++入门精讲13】异常处理
c++
计算机安禾16 分钟前
【c++面向对象编程】第5篇:类与对象(四):赋值运算符重载
java·前端·c++
样例过了就是过了20 分钟前
LeetCode热题100 颜色分类
c++·算法·leetcode
ZPC821022 分钟前
C++ 跨平台 UDP 收发测试程序
c++·算法·机器人
hanbr25 分钟前
C++ 类型转换与异常处理全解析
开发语言·c++
ym_xixi27 分钟前
《类和对象》—— 构造函数与析构函数总结
前端·c++·算法
凯瑟琳.奥古斯特31 分钟前
丑数II C++三指针解法(力扣264)
数据结构·c++·算法·leetcode·职场和发展
YYYing.31 分钟前
【C++项目之高并发内存池 (四)】三层缓存的空间回收流程详解
c++·笔记·缓存·高并发·内存池
小小de风呀32 分钟前
de风——【从零开始学C++】(六):模板初阶
开发语言·c++