1일1알

Ability System Component (ASC) 본문

언리얼/Gameplay Ability System

Ability System Component (ASC)

영춘권의달인 2024. 6. 16. 16:26

Ability System Component (ASC)

ASC는 GAS의 핵심이 되는 액터 컴포넌트로, GAS시스템과의 상호작용을 처리한다. GA를 실행하거나 Attribute를 가지거나 GE에 의해 영향을 받으려는 액터에는 반드시 ASC가 있어야 한다.

 

ASC에는 OwnerActor와 AvatarActor가 있다. ASC와 직접적으로 연결된 액터를 ASC의 OwnerActor라고 하고, 물리적으로 표현되는 액터를 AvatarActor라고 한다.

 

OwnerActor와 AvatarActor는 같은 액터일 수도 있고, 다른 액터일 수도 있다.

대부분의 액터는 OwnerActor와 AvatarActor가 같고, 본인이 플레이하는 플레이어의 경우에는 OwnerActor는 PlayerState, AvatarActor는 컨트롤하는 Pawn으로 지정하는 것이 일반적이다.

이것은 멀티플레이 환경을 고려했을때 PlayerState가 서버에서 클라이언트로 주기적으로 정보를 배포하는 액터이기 때문이다.

 

ASC를 가지는 액터는 IAbilitySystemInterface 인터페이스를 상속받아서 

GetAbilitySystemComponent() 함수를 오버라이드하여 구현해야 한다. 이 함수는 ASC에 대한 포인터를 반환하도록 구현한다. ASC는 이 함수를 통해 GAS시스템 내부에서 서로 상호작용한다.

 

OnwerActor와 AvatarActor가 같은 경우에는 액터 클래스의 생성자에서 ASC를 생성하여 멤버변수로 저장하고, GetAbilitySystemComponent()에서는 이를 반환하도록 해준다.

 

OwnerActor와 AvatarActor가 다른 경우에 OwnerActor에서는 위와 같다. 주로 PlayerState의 생성자에서 ASC를 생성하고 멤버변수를 저장하고 GetAbilitySystemComponent()에서는 이를 반환하도록 해준다.

AvatarActor에도 GetAbilitySystemComponent()를 오버라이딩하여 ASC의 포인터를 반환하도록 해야하는데, OwnerActor의 ASC를 반환하도록 해주면 된다. 

주로 Pawn이 빙의되는 PossessedBy함수에서 PlayerState의 ASC를 가져와서 관련 작업을 해준다.

 

ASC 생성후에는 InitAbilityActorInfo함수에 OwnerActor와 AvatarActor를 전달하여 초기화 작업을 해준다.

// -------------------------------------------------------------------
// -------------- OwnerActor와 AvatarActor가 같은 경우 ----------------
// -------------------------------------------------------------------
AGDMinionCharacter::AGDMinionCharacter(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
	// 생성자에서 ASC 생성
	AbilitySystemComponent = CreateDefaultSubobject<UGDAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
}
void AGDMinionCharacter::BeginPlay()
{
	Super::BeginPlay();

	if (AbilitySystemComponent.IsValid())
	{
    	// ASC 초기화(OwnerActor, AvatarActor)
		AbilitySystemComponent->InitAbilityActorInfo(this, this);
	}
}

// -------------------------------------------------------------------
// -------------- OwnerActor와 AvatarActor가 다른 경우 ----------------
// -------------------------------------------------------------------
AGDPlayerState::AGDPlayerState()
{
	// PlayerState에서 ASC 생성, 멤버변수에 저장
	AbilitySystemComponent = CreateDefaultSubobject<UGDAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
}
UAbilitySystemComponent * AGDPlayerState::GetAbilitySystemComponent() const
{
	return AbilitySystemComponent;
}

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

	AGDPlayerState* PS = GetPlayerState<AGDPlayerState>();
	if (PS)
	{
		// PS의 GetAbilitySystemComponent()함수로 ASC를 얻어와서 멤버변수로 저장
		AbilitySystemComponent = Cast<UGDAbilitySystemComponent>(PS->GetAbilitySystemComponent());
		
        // ASC 초기화(OwnerActor, AvatarActor)
        PS->GetAbilitySystemComponent()->InitAbilityActorInfo(PS, this);
    }
}

 

 

 

'언리얼 > Gameplay Ability System' 카테고리의 다른 글

Attribute  (0) 2024.07.02
Ability Task (AT)  (0) 2024.06.17
Gameplay Tags  (0) 2024.06.16
Gameplay Abilities (GA)  (0) 2024.06.16
GAS (Gameplay Ability System) 개요  (1) 2024.06.16