본문 바로가기

게임프로그래밍/실습2

[실습2] 12. GAS 오너 액터와 아바타 액터 설정

1. 서론 - 오너 액터와 아바타 액터

 

어빌리티 시스템 컴포넌트에는 오너 액터와 아바타액터라는 개념이 있다.

 

오너 액터는 어빌리티 컴포넌트를 실제로 소유하고 있는 액터를 말한다. GAS도 컴포넌트니 당연히 액터에 의해 소유 될 수 있다.

 

아바타 액터의 경우 실제로 이 GAS를 사용하는 액터를 말한다.

 

에너미의 경우 이 둘이 동일하다. 에너미 클래스 자체가 주인이면서 또한 이 효과를 다룬다.

 

하지만 플레이어의 경우에는 다르다. GAS는 플레이어 스테이트 클래스에 있다. 즉, 오너는 스테이트 클래스이다. 하지만 이것을 다루는 액터는 플레이어(정확히는 캐릭터)클래스이다.

 

그렇기 때문에 이 둘을 명확히 설정할 필요가 있다.

 

액터 정보를 설정하는 함수는 존재한다. 이것을 언제 호출하고 설정해야할지를 고민해봐야 할 것이다.

 

플레이어가 실제로 캐릭터를 소유하는 시점이 가장 적절할 것이다. 이때를 위한 PossessedBy 라는 함수가 있다. 하지만 이 함수는 서버에서만 실행된다.

 

그렇기 때문에 클라이언트를 위해 다른 함수를 사용해야 한다.

 

또한 단순히 소유하기만해서 바로 함수를 호출할 수 있는 것이 아니다. PlayerState 클래스도 완전히 구성이 끝난 뒤어야 할 것이다.

 

에너미의 경우 단순히 비긴 플레이 함수에서 호출하면 된다.


2. 에너미 클래스 액터 인포 초기화 하기

 

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();

    AbilitySystemComponent->InitAbilityActorInfo(this, this);
}

 

에너미는 단순히 이렇게만 하면 끝이다.


3. 플레이어를 위해 인포 초기화하기

 

플레이어의 GAS는 플레이어 스테이트에 있다. 이것을 가져올 수 있어야 할 것이다.

 

캐릭터 클래스로 가보자. 필요한 함수들을 오버라이드하여 사용하도록 하자

 

class PRACTICE2_API AAuraCharacter : public AAuraCharacterBase
{
	GENERATED_BODY()

public:
	AAuraCharacter();

	virtual void PossessedBy(AController* NewController) override;
	virtual void OnRep_PlayerState() override;
};

 

OnRep_PlayerState() 함수는 플레이어 스테이트가 서버에서 구성이 되거나 변경사항이 있을때 클라이언트와의 동기화가 이루어지는데 이때 호출되는 함수이다.
 
AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>()
플레이어 스테이트를 가져오는 함수는 위와 같다.
void AAuraCharacter::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);

    AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);

    AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
    AttributeSet = AuraPlayerState->GetAttributeSet();
}

 

플레이어 스테이트를 가져와 액터 인포를 설정해주었다.

 

그리고 플레이어 스테이트를 가져온 김에 캐릭터 클래스에 존재하던 어빌리티 시스템 컴포넌트와 어트리뷰트 세트도 할당해주었다.

 

클라이언트도 동일한 작업을 해야 할 것이다.

 

위에 쓴 구문을 그대로 가져와야하는데 똑같은 구문을 다시 쓰는 것은 유지보수 측면에서 좋지 못하다. 함수로 만들어서 호출하는 방식으로 바꾸자.

 

void AAuraCharacter::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    InitAbilityActorInfo();
    
}

void AAuraCharacter::OnRep_PlayerState()
{
    Super::OnRep_PlayerState();

    InitAbilityActorInfo();
}

void AAuraCharacter::InitAbilityActorInfo()
{
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
    AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
    AttributeSet = AuraPlayerState->GetAttributeSet();
}

 

이렇게 해서 오너와 아바타 액터 설정이 완료 되었다.