0. 개요
게임 플레이 이팩트가 액터 또는 ASC에 적용되면 태그가 설정된다.
이후에 ASC의 EffectApplied 함수가 발동되면 브로드캐스트로 인해 위젯 컨트롤러에 바인딩 된 함수가 실행될 것이다.
태그를 UI 상으로 표시하기 위해 위젯 컨트롤러로 전달하는 방법을 알아본다.
1. 위젯 컨트롤러 델리게이트
(1) 델리게이트 선언
AuraAbilitySystemComponent에서 수정한다.
DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer& /*에셋 태그들*/)
public:
FEffectAssetTags EffectAssetTags;
외부에서 사용할 수 있도록 델리게이트 객체 EffectAssetTags는 퍼블릭 섹션에 위치한다.
(2) 브로드캐스트(Broadcast)
void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent *AbilitySystemComponent, const FGameplayEffectSpec &EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle)
{
// 이펙트 적용 시 무엇을 BroadCast 할 것인가??
// Tag가 적절
FGameplayTagContainer TagContainer;
EffectSpec.GetAllAssetTags(TagContainer);
EffectAssetTags.Broadcast(TagContainer);
}
외부 로직에 의해 EffectApplied가 호출되면 EffectAssetTags에 연결된 콜백 함수들에게 TagContainer를 넘기며 호출할 것이다.
(3) 바인딩(Binding)
위의 모든 단계가 호출되기 이전에 콜백 함수를 바인딩한다.
기존에 오버레이 위젯 컨트롤러에서 체력, 마나 등의 값이 변화하면 각각의 함수가 호출되도록 설정했었다.
OverlayWidgetController 클래스 본문의 BindCallbacksToDependencies 함수 최하단에 아래 코드를 추가한다.
void UOverlayWidgetController::BindCallbacksToDependencies()
{
//~~~~~~~~
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
[](const FGameplayTagContainer& AssetTags)
{
for (const FGameplayTag& Tag : AssetTags)
{
const FString Msg = FString::Printf(TEXT("GE Tag: %s"), *Tag.ToString());
GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Blue, Msg);
}
}
);
}
따로 콜백 함수를 정의하기보다 간단한 람다를 이용하여 콜백 함수 대용으로 사용한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
5-9. UI - (2) 데이터 테이블에서 정보 가져오기 (1) | 2024.09.02 |
---|---|
5-8. UI - (1) 위젯에 데이터 전달하기 - 데이터 테이블 (0) | 2024.09.02 |
5-6. 액터가 보유한 태그 가져오기 - GetAllAssetTags (0) | 2024.08.30 |
5-5. 게임플레이 이펙트 - (3) 델리게이트 (0) | 2024.08.30 |
5-4. 게임플레이 이펙트 - (2) 게임플레이 태그 적용하기 (0) | 2024.08.30 |