虚幻引擎5 GAS开发俯视角RPG游戏 P06-28 构建属性菜单小部件控制器

1.创建属性菜单小部件控制器

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

cpp 复制代码
// 版权归陈超所有

#pragma once

#include "CoreMinimal.h"
#include "UI/WidgetController/CC_WidgetController.h"
#include "CC_AttributeMenuWidgetController.generated.h"

/**
 * 
 */
UCLASS(Blueprintable)
class CC_AURA_API UCC_AttributeMenuWidgetController : public UCC_WidgetController
{
	GENERATED_BODY()

public:
	//广播初始值
	virtual void BroadcastInitialValues() override;

	//依赖的绑定回调函数
	virtual void BindCallbacksToDependencies() override;
	
	
};

Source/CC_Aura/Private/UI/WidgetController/CC_AttributeMenuWidgetController.cpp:

cpp 复制代码
// 版权归陈超所有


#include "UI/WidgetController/CC_AttributeMenuWidgetController.h"

void UCC_AttributeMenuWidgetController::BroadcastInitialValues()
{
	
}

void UCC_AttributeMenuWidgetController::BindCallbacksToDependencies()
{
	
}

2.构建蓝图函数库:

添加静态函数,能随地得到小部件的控制器

Source/CC_Aura/Public/BlueprintFunctionLibrary/CC_BlueprintFunctionLibrary.h

cpp 复制代码
// 版权归陈超所有

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "CC_BlueprintFunctionLibrary.generated.h"

class UCC_AttributeMenuWidgetController;
class UCC_OverlayWidgetController;
/**
 * 
 */
UCLASS()
class CC_AURA_API UCC_BlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintPure, Category="CC_BlueprintFunctionLibrary|OverlayWidgetController")
	static UCC_OverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);
	
	UFUNCTION(BlueprintPure, Category="CC_BlueprintFunctionLibrary|AttributeMenuWidgetController")
	static UCC_AttributeMenuWidgetController* GetAttributeMenuWidgetController(const UObject* WorldContextObject);
	
};

Source/CC_Aura/Private/BlueprintFunctionLibrary/CC_BlueprintFunctionLibrary.cpp:

cpp 复制代码
// 版权归陈超所有


#include "BlueprintFunctionLibrary/CC_BlueprintFunctionLibrary.h"

#include "Kismet/GameplayStatics.h"
#include "Player/CC_PlayerState.h"
#include "UI/HUD/CC_HUD.h"
#include "UI/WidgetController/CC_WidgetController.h"

UCC_OverlayWidgetController* UCC_BlueprintFunctionLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{
	APlayerController* PlayerController = UGameplayStatics::GetPlayerController(WorldContextObject, 0);
	if (!PlayerController) return nullptr;

	ACC_HUD* CC_HUD = Cast<ACC_HUD>(PlayerController->GetHUD());
	if (!CC_HUD) return nullptr;
	
	ACC_PlayerState* PlayerState = PlayerController->GetPlayerState<ACC_PlayerState>();
	if (!PlayerState) return nullptr;

	UAbilitySystemComponent* AbilitySystemComponent = PlayerState->GetAbilitySystemComponent();
	if (!AbilitySystemComponent) return nullptr;

	UAttributeSet* AttributeSet = PlayerState->GetAttributeSet();
	if (!AttributeSet) return nullptr;
	
	FWidgetControllerParams WidgetControllerParams(PlayerController, PlayerState, AbilitySystemComponent, AttributeSet);
	
	return CC_HUD->GetOverlayWidgetController(WidgetControllerParams);
}

UCC_AttributeMenuWidgetController* UCC_BlueprintFunctionLibrary::GetAttributeMenuWidgetController(const UObject* WorldContextObject)
{
	APlayerController* PlayerController = UGameplayStatics::GetPlayerController(WorldContextObject, 0);
	if (!PlayerController) return nullptr;

	ACC_HUD* CC_HUD = Cast<ACC_HUD>(PlayerController->GetHUD());
	if (!CC_HUD) return nullptr;
	
	ACC_PlayerState* PlayerState = PlayerController->GetPlayerState<ACC_PlayerState>();
	if (!PlayerState) return nullptr;

	UAbilitySystemComponent* AbilitySystemComponent = PlayerState->GetAbilitySystemComponent();
	if (!AbilitySystemComponent) return nullptr;

	UAttributeSet* AttributeSet = PlayerState->GetAttributeSet();
	if (!AttributeSet) return nullptr;
	
	FWidgetControllerParams WidgetControllerParams(PlayerController, PlayerState, AbilitySystemComponent, AttributeSet);
	
	return CC_HUD->GetAttributeMenuWidgetController(WidgetControllerParams);
}

其中,在CC_HUD类中,添加属性菜单控制器,以及获取方法:

Source/CC_Aura/Public/UI/HUD/CC_HUD.h:

cpp 复制代码
	UPROPERTY()
	TObjectPtr<UCC_AttributeMenuWidgetController> AttributeMenuWidgetController;	
	
	UPROPERTY(EditAnywhere)
	TSubclassOf<UCC_AttributeMenuWidgetController> AttributeMenuWidgetControllerClass;
	
cpp 复制代码
UCC_AttributeMenuWidgetController* GetAttributeMenuWidgetController(const FWidgetControllerParams& FWCParams);

Source/CC_Aura/Private/UI/HUD/CC_HUD.cpp:

cpp 复制代码
UCC_AttributeMenuWidgetController* ACC_HUD::GetAttributeMenuWidgetController(const FWidgetControllerParams& FWCParams)
{
	if (AttributeMenuWidgetController == nullptr)	
	{
		AttributeMenuWidgetController = NewObject<UCC_AttributeMenuWidgetController>(this, AttributeMenuWidgetControllerClass);		
		AttributeMenuWidgetController->SetWidgetControllerParams(FWCParams);		
	}
	return AttributeMenuWidgetController;
}

3.创建属性菜单小部件控制器蓝图BP_AttributeMenuWidgetController:

在HUD中配置:

4.在WBP_AttributeMenu中添加控制器:

验证:

在回调函数中,打印控制器:

效果:

相关推荐
吹什么轩19 分钟前
c++复习:模拟实现list来更好的理解和应用list
开发语言·c++
AmyLin_200126 分钟前
PDF 色彩保真工程实践【5】核心实现(下):拼装 Image XObject、页面资源与内容流
c++·pdf·sdk·颜色空间·印刷·icc·cmyk
乱七八糟的屋子1 小时前
MTL4 (Matrix Template Library) 超详细实战教程|C++高性能稠密/稀疏矩阵计算
c++·矩阵·稀疏矩阵·mtl4·matrixtemplate·c++线性代数·高性能数值计算
依然鸣2 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
有点。2 小时前
C++深度优先搜索(二)
开发语言·c++·深度优先
小小龙学IT4 小时前
Taskflow:用一张“任务图“玩转现代 C++ 并行编程开源项
c++·开源·github
wuminyu4 小时前
JUC包的AQS与JVM的ObjectMonitor机制对比分析
java·linux·c语言·jvm·c++
魔术师Dix4 小时前
一个轮子:Luban Skill 制作演示
游戏·unity·ai编程
就不掉头发4 小时前
C++函数模板
java·开发语言·c++
极客侃科技5 小时前
游戏本办公两用笔记本推荐,来酷斗战者 战7000P 酷睿版兼顾两种需求
游戏