0. 개요
아케인 파편 스펠과 같이 범위 공격 스펠은 BP_MagicCircle을 표시하고, 이후에 입력 태그 또는 마우스 왼쪽 버튼을 눌러 어빌리티를 활성화하도록 하고 있다.
해당 내용을 오버레이 UI에 '마우스 왼쪽 버튼 혹은 스펠 입력 버튼을 눌러 발동' 으로 표시한다.
1. 델리게이트
(1) GameplayCue Norify - Static 을 상속받는 C++ 클래스 생성
UCLASS()
class AURA_API UMessageCueNotify : public UGameplayCueNotify_Static
{
GENERATED_BODY()
public:
virtual void HandleGameplayCue(AActor* MyTarget, EGameplayCueEvent::Type EventType, const FGameplayCueParameters& Parameters) override;
};
#include "AbilitySystem/GameplayCueNotify/MessageCueNotify.h"
#include "AbilitySystemGlobals.h"
#include "AbilitySystemComponent.h"
#include "AbilitySystem/AuraAbilitySystemComponent.h"
void UMessageCueNotify::HandleGameplayCue(AActor* MyTarget, EGameplayCueEvent::Type EventType,
const FGameplayCueParameters& Parameters)
{
// 작동된 이후에만 호출
if (EventType != EGameplayCueEvent::Executed)
return;
UAbilitySystemComponent* ASC = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(MyTarget);
if (ASC == nullptr)
return;
UAuraAbilitySystemComponent* AuraASC = Cast<UAuraAbilitySystemComponent>(ASC);
if (AuraASC == nullptr)
return;
FGameplayTag Tag = Parameters.OriginalTag;
if (Tag.MatchesTag(FGameplayTag::RequestGameplayTag("GameplayCue.Message")))
{
AuraASC->OnMessageTagReceived.Broadcast(Parameters.OriginalTag);
}
}
큐의 파라미터로 전달받은 태그를 ASC의 델리게이트를 호출하여 넘겨주는 방식이다.
(2) ASC에서 델리게이트 선언
DECLARE_MULTICAST_DELEGATE_OneParam(FMessageTagReceived, const FGameplayTag&/*메시지 게임플레이 큐 태그*/);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMessageRemoved, const FGameplayTag&, Tag/*메시지 게임플레이 큐 태그*/);
FMessageTagReceived OnMessageTagReceived;
FMessageRemoved OnMessageRemoved;
(3) 오버레이 위젯 컨트롤러에 델리게이트 바인딩
(3-1) 오버레이 위젯 컨트롤러에서 델리게이트 선언
UPROPERTY(BlueprintAssignable, Category = "GAS|Messages")
FOnMessageRemoveSignature OnMessageRemoved;
오버레이 위젯 컨트롤러의 델리게이트를 통해 ASC의 델리게이트를 호출하기 위해 새로 선언한다.
(3-2) 델리게이트에 함수 바인딩
void UOverlayWidgetController::BindCallbacksToDependencies()
{
GetAuraASC()->OnMessageTagReceived.AddLambda([this](const FGameplayTag& Tag)
{
const FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
if (Row)
MessageWidgetRowDelegate.Broadcast(*Row);
});
GetAuraASC()->OnMessageRemoved.AddDynamic(this, &UOverlayWidgetController::MessageRemove);
ASC에서 이 델리게이트는 오버레이에 위젯을 표현하기 위함이므로, 오버레이 위젯 컨트롤러에서 데이터 테이블의 행을 가져와 기존의 Gameplay Effect의 Asset Tag를 불러오는 델리게이트를 사용할 수 있다.
void UOverlayWidgetController::MessageRemove(const FGameplayTag& Tag)
{
OnMessageRemoved.Broadcast(Tag);
}
MessageRemove 함수는 오버레이의 블루프린트 델리게이트인 OnMessageRemoved 델리게이트를 호출한다.
(3-3) WBP_Overlay에서 메시지 제거 OnMessageRemoved 바인딩
중앙에 메시지를 표시하는 위젯을 생성하고 위와 같이 구성한다.
생성 과정은 아래와 같다.
(3-3-1) WBP_CenterDescription 위젯 생성
(3-3-2) WBP_Overlay에 WBP_CenterDescription 배치
(4) 게임플레이 큐 GC_Message 생성
(5) DT_MessageWidgetData 행 추가
위젯 행 구조체를 수정하여 Message Type을 추가하였다.
UENUM(BlueprintType)
enum class EMessageType : uint8
{
Floating,
TextBox,
SpellDesc
};
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FGameplayTag MessageTag = FGameplayTag();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FText Message = FText();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<class UAuraUserWidget> MessageWidget;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UTexture2D* Image = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
EMessageType MessageType = EMessageType::Floating;
};
2. 위젯 생성 로직 수정
WBP_Overlay의 Handle Message Widget 함수의 구조를 개편한다.
(1) 아이템 획득 플로팅 텍스트와 메시지 박스
Message Type의 열거형 타입에 따라서 위젯을 생성하고 텍스트를 적용하여 표시한다.
(2) 스펠 정보 표시
텍스트 블록을 수정하여 캔버스에 추가한다.
3. 어빌리티에서 게임플레이 큐 적용
이 스펠 설명 텍스트는 범위 지정 스펠을 실행하면 나타나는 설명 문구이다.
(1) GA_ArcaneShards에서 BP_MagicCircle 생성 이후 게임플레이 큐 적용
(2) Aura Damage Gameplay Ability에 스펠 타입 열거형 추가
UENUM(BlueprintType)
enum ESpellType : uint8
{
NonTargeting,
Targeting,
Ranged,
Projectile
};
UPROPERTY(EditDefaultsOnly)
TEnumAsByte<ESpellType> SpellType = ESpellType::NonTargeting;
모든 어빌리티에 대해 스펠 타입을 변경한다.
(3) Aura Damage Gameplay Ability 에서 EndAbility 함수 오버라이드
void UAuraDamageGameplayAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled)
{
Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
AActor* AvatarActor = GetAvatarActorFromActorInfo();
if (AvatarActor == nullptr)
return;
AAuraCharacter* Aura = Cast<AAuraCharacter>(AvatarActor);
if (Aura == nullptr)
return;
UAuraAbilitySystemComponent* AuraASC = Cast<UAuraAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(AvatarActor));
if (AuraASC == nullptr)
return;
// 범위 스킬인지 체크
if (SpellType != ESpellType::Ranged)
return;
AuraASC->MessageRemove(FGameplayTag::RequestGameplayTag("GameplayCue.Message.WaitForExecute"));
}
어빌리티 -> ASC -> 오버레이 위젯 의 순서로 델리게이트가 호출된다.
이제 범위 지정 스펠에 대해서만 어떤 시점에서 게임플레이 큐를 적용하기만 하면 설명 텍스트는 어빌리티 종료 시점에 제거될 것이다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
31-7. UI - 속성 메뉴 한글화 (0) | 2025.04.30 |
---|---|
31-6. 캐릭터에 체력/마나 재생 적용 (0) | 2025.04.30 |
31-4. UI - 체크 포인트 폴리싱 - (2) 메시지 박스 (0) | 2025.04.29 |
[Top-Down RPG] Aura 초기 플레이 영상 (0) | 2025.04.28 |
31-3. UI - 체크 포인트 폴리싱 - (1) 체력 마나 회복 (0) | 2025.04.25 |