0. 개요

이제 액터에 이펙트가 적용됐을 때 콜백 함수를 이용하는 방법에 대해 알아본다.

 

 

1. 코드

(1) ASC에 내장된 OnGameplayEffectAppliedDelegate

OnGameplayEffectApplied 델리게이트는 Gameplay Ability System Component 안에 정의되어있다.

인수로 ASC, EffectSpec, EffectHandle을 반환한다.

 

4-8. 속성 세트 값 클램핑 - PreAttributeChange 함수, PostGameplayEffectExcute 함수

0. 개요이전 포스트에서 스택을 활용한 체력 회복 / 감소 액터를 만들었다.그러나 체력이 최대 체력보다 커지거나 0보다 작아지는 현상은 아직 수정하지 않았다.이번 포스트에서는 속성 세트의 P

crat.tistory.com

 

우리가 ASC를 수정해서 쓸 용도로 AuraAbilitySystemComponent를 만들었었다.

여기에 아래와 같이 새로운 콜백 함수를 정의한다.

// 이펙트 적용 콜백 함수
void EffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle);

 

 

(2) AuraCharacter에 정의된 함수 수정하기

이후 과정을 실행하기 전에, 캐릭터의 정보인 ActorInfo를 초기화함에 있어, 플레이어 캐릭터와 몬스터 캐릭터가 해당 함수를 오버라이딩 하도록 수정할 것이다.

 

2-6. 어빌리티 액터 정보(Ability Actor Info) 초기화하기

1. 어빌리티 액터 정보(Ability Actor Info)어빌리티 시스템 컴포넌트(Ability System Component)가 어빌리티 액터 정보를 통해 해당 컴포넌트의 주인 액터의 정보를 알 수 있다.(1) 소유자 액터(Owner Actor)물리

crat.tistory.com

 

(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 함수 실행