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);
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
20-9. 레벨업 - (1) 캐릭터 레벨 Getter 코드 리펙토링 (0) | 2025.01.16 |
---|---|
20-8. 경험치 - (7) 경험치 획득 처리, XPBar UI에 표시 (0) | 2025.01.16 |
20-6. 경험치 - (5) 이벤트를 기다리는 패시브 게임플레이 어빌리티 (0) | 2025.01.16 |
20-5. 경험치 - (4) 몬스터에 경험치 부여 (0) | 2025.01.15 |
20-4. 경험치 - (3) 경험치 변화 델리게이트 바인딩 (0) | 2025.01.15 |