0. 개요
이제 액터에 이펙트가 적용됐을 때 콜백 함수를 이용하는 방법에 대해 알아본다.
1. 코드
(1) ASC에 내장된 OnGameplayEffectAppliedDelegate
OnGameplayEffectApplied 델리게이트는 Gameplay Ability System Component 안에 정의되어있다.
인수로 ASC, EffectSpec, EffectHandle을 반환한다.
우리가 ASC를 수정해서 쓸 용도로 AuraAbilitySystemComponent를 만들었었다.
여기에 아래와 같이 새로운 콜백 함수를 정의한다.
// 이펙트 적용 콜백 함수
void EffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle);
(2) AuraCharacter에 정의된 함수 수정하기
이후 과정을 실행하기 전에, 캐릭터의 정보인 ActorInfo를 초기화함에 있어, 플레이어 캐릭터와 몬스터 캐릭터가 해당 함수를 오버라이딩 하도록 수정할 것이다.
(2-1) AuraCharacterBase
protected:
virtual void BeginPlay() override;
virtual void InitAbilityActorInfo();
(2-2) AuraCharacter
private:
virtual void InitAbilityActorInfo() override;
(2-3) AuraEnemy
protected:
virtual void BeginPlay() override;
virtual void InitAbilityActorInfo() override;
void AAuraEnemy::BeginPlay()
{
Super::BeginPlay();
InitAbilityActorInfo();
}
void AAuraEnemy::InitAbilityActorInfo()
{
AbilitySystemComponent->InitAbilityActorInfo(this, this);
}
(3) AuraAbilitySystemComponent 수정
이제 AuraAbilitySystemComponent에 GAS 액터들이 초기화되면 실행할 함수를 정의한다.
public:
//
void AbilityActorInfoSet();
(3-1) AuraCharacter
void AAuraCharacter::InitAbilityActorInfo()
{
AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
check(AuraPlayerState);
// 소유자 액터, 아바타 액터
AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
// Actor Info가 세팅되었음을 알림
Cast<UAuraAbilitySystemComponent>(AuraPlayerState->GetAbilitySystemComponent())->AbilityActorInfoSet();
(3-2) AuraEnemy
void AAuraEnemy::InitAbilityActorInfo()
{
AbilitySystemComponent->InitAbilityActorInfo(this, this);
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->AbilityActorInfoSet();
}
각 캐릭터(혹은 적)의 ActorInfo가 초기화 된 이후에, ASC를 AuraASC로 캐스팅하여 해당 함수를 실행하게끔 해준다.
(3-3) 델리게이트 바인딩
void UAuraAbilitySystemComponent::AbilityActorInfoSet()
{
OnGameplayEffectAppliedDelegateToSelf.AddUObject(this, &UAuraAbilitySystemComponent::EffectApplied);
}
해당 델리게이트는 동적 델리게이트가 아니므로 AddUObject를 사용하여 바인딩한다.
최종적으로 아래의 단계를 따라서 캐릭터에 이펙트가 적용되면 EffectApplied 함수가 실행되도록 할 수 있다.
- 캐릭터의 ActorInfo 초기화
-> 게임플레이 이펙트 적용 델리게이트 바인딩
-> ...
-> 이후 캐릭터에 이펙트 적용됨
-> OnGameplayEffectAppliedDelegateToSelf 델리게이트 발동
-> 콜백 함수인 캐릭터의 ASC의 EffectApplied 함수 실행
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
5-7. 에셋 태그를 위젯 컨트롤러로 전달(Broadcast)하기 (1) | 2024.09.02 |
---|---|
5-6. 액터가 보유한 태그 가져오기 - GetAllAssetTags (0) | 2024.08.30 |
5-4. 게임플레이 이펙트 - (2) 게임플레이 태그 적용하기 (0) | 2024.08.30 |
5-3. 게임플레이 태그 생성하기 - (2) 데이터 테이블에서 생성하기 (0) | 2024.08.30 |
5-2. 게임플레이 태그 생성하기 - (1) 에디터에서 생성하기 (0) | 2024.08.30 |