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;
};
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();
}
이렇게 해서 오너와 아바타 액터 설정이 완료 되었다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 14. Attribute Accessors 매크로 사용하기 (0) | 2024.11.28 |
---|---|
[실습2] 13. 체력과 마나 어트리뷰트 만들기 (0) | 2024.11.28 |
[실습2] 11. Replication Mode (0) | 2024.11.28 |
[실습2] 10. GAS와 Attribute Set 추가하기 (0) | 2024.11.28 |
[실습2] 9. 플레이어 스테이트 클래스 생성 (0) | 2024.11.28 |