0. 개요
위젯에 정보를 표시할 때 데이터 에셋 -> 위젯 컨트롤러 -> 위젯 으로 정보를 전달한다.
이전에 Attribute Info 데이터 에셋을 사용하여 속성 메뉴의 속성 이름과 값을 설정했던 것처럼
Ability Info 데이터 에셋을 생성하여 UI에 스펠 아이콘을 표시하는 등의 작업을 할 수 있게 한다.
1. 어빌리티 정보 데이터 에셋
(1) AbilityInfo C++ 클래스 생성
DataAsset을 상속받는 C++ 클래스를 생성한다.
(2) AuraAbilityInfo 구조체 선언
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "GameplayTagContainer.h"
#include "AbilityInfo.generated.h"
USTRUCT(BlueprintType)
struct FAuraAbilityInfo
{
GENERATED_BODY()
// 스펠 태그
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FGameplayTag AbilityTag = FGameplayTag();
// 입력 태그
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FGameplayTag InputTag = FGameplayTag();
// 스펠 아이콘 이미지
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TObjectPtr<const UTexture2D> Icon = nullptr;
// 스펠 배경
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TObjectPtr<const UMaterialInterface> BackgroundMaterial = nullptr;
};
게임플레이 어빌리티에 대한 정보를 가진 구조체이다.
이 구조체를 이용하여 UI에 반영할 것이므로, 체력 마나 스펠 위젯에 설정할 요소들을 구조체로 묶는다.
(3) 태그로 어빌리티 정보 찾기 함수
UCLASS()
class AURA_API UAbilityInfo : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, category="AbilityInformation")
TArray<FAuraAbilityInfo> AbilityInformation;
FAuraAbilityInfo FindAbilityInfoForTag(const FGameplayTag& AbilityTag, bool bLogNotFound = false) const;
};
#include "AbilitySystem/Data/AbilityInfo.h"
FAuraAbilityInfo UAbilityInfo::FindAbilityInfoForTag(const FGameplayTag& AbilityTag, bool bLogNotFound) const
{
for (const FAuraAbilityInfo& Info : AbilityInformation)
{
if (Info.AbilityTag == AbilityTag)
{
return Info;
}
}
if (bLogNotFound)
{
UE_LOG(LogTemp, Display, TEXT(""));
}
return FAuraAbilityInfo();
}
태그가 일치하면 구조체를 반환하는 함수이다.
(3-1) 로그 카테고리 생성
위의 어빌리티 정보 찾기 함수에서 찾지 못했을때 로그로 해당 어빌리티에 대한 정보를 찾지 못했다는 것을 남길 것이다.
프로젝트가 점점 커지고 있으므로 따로 로그 카테고리를 만들어 사용하고자 한다.
IDE에서 새로 헤더와 클래스를 추가하고 매크로를 사용하여 로그에 LogAura 카테고리를 만든다.
- Visual Studio를 사용하고 있다면 디버그를 실행해 언리얼 에디터에서 빈 C++ 클래스를 생성해야 한다.
#pragma once
#include "CoreMinimal.h"
#include "Logging/LogMacros.h"
DECLARE_LOG_CATEGORY_EXTERN(LogAura, Log, All);
#include "AuraLogChannels.h"
DEFINE_LOG_CATEGORY(LogAura);
(3-2) 커스텀 로그 카테고리 사용
#include "AbilitySystem/Data/AbilityInfo.h"
#include "AuraLogChannels.h"
FAuraAbilityInfo UAbilityInfo::FindAbilityInfoForTag(const FGameplayTag& AbilityTag, bool bLogNotFound) const
{
for (const FAuraAbilityInfo& Info : AbilityInformation)
{
if (Info.AbilityTag == AbilityTag)
{
return Info;
}
}
if (bLogNotFound)
{
UE_LOG(LogAura, Error, TEXT("Can't Find Info for AbilityTag [%s] on AbilityInfo [%s]"), *AbilityTag.ToString(), *GetNameSafe(this));
}
return FAuraAbilityInfo();
}
이제 해당 커스텀 로그 채널 헤더를 포함하면 UE LOG에 스스로 만든 로그 카테고리를 사용할 수 있다.
2. 오버레이 위젯 컨트롤러
(1) OverlayWidgetController에 AbilityInfo 데이터 에셋 저장
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Widget Data")
TObjectPtr<UDataTable> MessageWidgetDataTable;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Widget Data")
TObjectPtr<UAbilityInfo> AbilityInfo;
(2) 데이터 에셋 인스턴스 생성
C++로 생성한 데이터 에셋을 이용하여 만든다.
(3) BP_OverlayWidgetController에 AbilityInfo 데이터 에셋 할당
3. DA_AbilityInfo 데이터 에셋에 데이터 채우기
이제 DA_AbilityInfo에 어빌리티에 대한 정보를 채워 넣는다.
(1) AuraGameplayTags에 Native 게임플레이 태그 생성
예시로 파이어볼트 어빌리티를 데이터 에셋에 넣을 것이므로 Native 게임플레이 태그를 생성한다.
// 어빌리티
FGameplayTag Abilities_Attack;
FGameplayTag Abilities_Summon;
FGameplayTag Abilities_Fire_FireBolt;
// 어빌리티
GameplayTags.Abilities_Attack = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Attack"),
FString("Attack Ability")
);
GameplayTags.Abilities_Summon = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Summon"),
FString("Summon Ability")
);
GameplayTags.Abilities_Fire_FireBolt = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Abilities.Fire.FireBolt"),
FString("FireBolt Ability")
);
(2) 어빌리티 정보 채우기
여기에서 Input Tag는 추후에 입력이 다른 키에 할당될 것을 생각하여 블루프린트 노출을 제거하고, C++에서 따로 코드를 작성할 것이다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
19-6. 오버레이 UI - (6) 위젯에 어빌리티 정보 표시하기, 스펠 키매핑 변경하기 (0) | 2025.01.14 |
---|---|
19-5. 오버레이 UI - (5) 오버레이 위젯 컨트롤러에서 위젯으로 어빌리티 정보 보내기 (0) | 2025.01.13 |
19-3. 오버레이 UI - (3) 경험치 바 (0) | 2025.01.13 |
19-2. 오버레이 UI - (2) 스펠 글로브 수정 후 오버레이에 배치 (0) | 2025.01.13 |
19-1. 오버레이 UI - (1) 체력/마나/스펠 UI, 스펠 슬롯 (0) | 2025.01.13 |