0. 개요

이제 패시브 게임플레이 어빌리티가 게임플레이 이벤트를 기다리고 있게 했으므로 게임플레이 이벤트를 보내는 방법에 대해 알아본다.

 

 

1. XP 전달 이벤트

(1) AuraAttributeSet에서 XP 이벤트 보내기

void SendXPEvent(const FEffectProperties& Props);
void UAuraAttributeSet::SendXPEvent(const FEffectProperties& Props)
{
    // 대상의 클래스와 레벨 가져옴
    if (ICombatInterface* CombatInterface = Cast<ICombatInterface>(Props.TargetCharacter))
    {
        // XP 보상 계산
        int32 TargetLevel = CombatInterface->GetCharacterLevel();
        ECharacterClass TargetClass = CombatInterface->GetCharacterClass();

        const int32 XPReward = UAuraAbilitySystemLibrary::GetXPRewardForClassAndLevel(Props.TargetCharacter, TargetClass, TargetLevel);

        // 이벤트 전달
        const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get();
        
        // 페이로드 수정
        FGameplayEventData Payload;
        Payload.EventTag = GameplayTags.Attributes_Meta_IncomingXP;
        Payload.EventMagnitude = XPReward;

        UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(Props.SourceCharacter, GameplayTags.Attributes_Meta_IncomingXP, Payload);
    }
}

몬스터의 레벨과 클래스에 따른 경험치 부여량을 가져온다.

SendGameplayEventToActor 함수에 매개 변수로 넘겨주기 위한 게임플레이 태그와 페이로드를 만들어 플레이어 캐릭터에 전달한다.

 

 

(2) PostGameplayEffectExecute 함수 수정

void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData & Data)
            const bool bFatal = NewHealth <= 0.f;
            if (bFatal)
            {
                ICombatInterface* CombatInterface = Cast<ICombatInterface>(Props.TargetAvatarActor);
                if (CombatInterface)
                {
                    // 사망
                    CombatInterface->Die();
                }
                SendXPEvent(Props);
            }

이제 적 몬스터가 죽으면 본인과 타겟의 ASC, AS, Character, Controller의 정보를 담은 Props를 넘기게 된다.

 

 

(3) 디버그

이제 디버그를 실행하면 아래와 같은 크래시가 발생한다.

CombatInterface에 구현된 GetCharacterClass 함수는 블루프린트 Native 이벤트 이므로 C++ 코드에서 실행하기 위해서는 Execute_GetCharacterClass 함수를 실행해야 한다.

void UAuraAttributeSet::SendXPEvent(const FEffectProperties& Props)
{
    // 대상의 클래스와 레벨 가져옴
    if (ICombatInterface* CombatInterface = Cast<ICombatInterface>(Props.TargetCharacter))
    {
        // XP 보상 계산
        int32 TargetLevel = CombatInterface->GetCharacterLevel();
        ECharacterClass TargetClass = ICombatInterface::Execute_GetCharacterClass(Props.TargetCharacter);