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);
            }
        }
    );
}

따로 콜백 함수를 정의하기보다 간단한 람다를 이용하여 콜백 함수 대용으로 사용한다.

 

10-9. 람다(lambda) 표현식

1. 람다(lambda) 함수 객체(함수처럼 작동하는 객체)를 빠르게 만드는 문법. 아이템 id, 희귀도, 타입을 받는 클래스를 만든다. enum class ItemType { None, Armor, Weapon, Jewelry, Consumable }; enum class Rarity { Common,

crat.tistory.com