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

	if (AbilitySystemComponent)
	{
		AbilitySystemComponent->InitAbilityActorInfo(this, this);
	}

	// ASC MixedMode replication requires that the ASC Owner's Owner be the Controller.
	SetOwner(NewController);
}

void APAPlayerControllerBase::AcknowledgePossession(APawn* P)
{
	Super::AcknowledgePossession(P);

	APACharacterBase* CharacterBase = Cast<APACharacterBase>(P);
	if (CharacterBase)
	{
		CharacterBase->GetAbilitySystemComponent()->InitAbilityActorInfo(CharacterBase, CharacterBase);
	}

	//...
}​
void APACharacterBase::PossessedBy(AController * NewController)
{
	Super::PossessedBy(NewController);

	if (AbilitySystemComponent)
	{
		AbilitySystemComponent->InitAbilityActorInfo(this, this);
	}

	// ASC MixedMode replication requires that the ASC Owner's Owner be the Controller.
	SetOwner(NewController);
}

4.1 Ability System Component

어빌리티 시스템 컴포넌트 (Ability System Component, ASC)

  • GAS의 핵심: 어빌리티 시스템 컴포넌트 (ASC)는 Gameplay Ability System의 중추입니다. 이 컴포넌트는 시스템과의 모든 상호작용을 처리하고 관리합니다.
  • 역할: 게임플레이 어빌리티 (Gameplay Ability)를 구현하거나, 속성 (Attribute)을 지정하고, 게임플레이 효과 (Gameplay Effect)를 적용하기 원하는 모든 액터에는 반드시 ASC가 있어야 합니다.
  • 관리: ASC는 내부적으로 다음을 관리합니다:
    • 활성화된 게임플레이 효과
    • 사용 가능한 게임플레이 어빌리티
    • 관련 속성 데이터 (속성 자체의 복제는 AttributeSet에서 관장)

핵심 개념

  • 소유자 액터 (Owner Actor): ASC가 연결된 액터.
  • 아바타 액터 (Avatar Actor): ASC를 물리적으로 표현하는 액터.
  • 관계성: 소유자 액터와 아바타 액터가 같은 경우도 있고 (간단한 AI의 경우), 서로 다를 수도 있습니다 (플레이어가 조종하는 영웅 캐릭터의 경우). 일반적으로는 대부분의 액터가 자기 자신에게 직접 ASC를 가지게 됩니다. 하지만 MOBA처럼 리스폰 후에도 속성이나 효과가 유지되어야 하는 경우에는 PlayerState에 ASC를 배치합니다.

주의사항

  • PlayerState에 ASC 사용시: PlayerState에 ASC가 있다면 'NetUpdateFrequency' 값을 높여줘야 합니다. PlayerState 내의 디폴트 값이 낮게 설정되어 있어 클라이언트 쪽에서 속성이나 게임플레이 태그 변경이 느리게 반영될 수 있습니다. 'Adaptive Network Update Frequency' (네트워크 업데이트 빈도 적응)을 활성화하는 것을 잊지 마세요!

IAbilitySystemInterface 소유자 액터와 아바타 액터 (서로 다를 경우 ) 모두 IAbilitySystemInterface 인터페이스를 구현해야 합니다. 이 인터페이스는 반드시 오버라이드되어야 하는 하나의 함수가 있습니다. 이 함수는 자신의 ASC에 대한 포인터를 반환합니다.

 

UAbilitySystemComponent* GetAbilitySystemComponent() const;

 

 

4.1.1 Replication Mode

/**
 * 능력 시스템 복제 모드: 클라이언트에 게임플레이 효과가 어떻게 복제될지 결정
 *
 * - Full: 모든 게임플레이 정보를 모든 클라이언트에게 복제. 모든 GameplayEffect가 모든 클라이언트에 복제됩니다.
 * (싱글 플레이어 게임에 추천)
 * 
 * - Mixed: 시뮬레이션 프록시에는 최소한의 게임플레이 효과 정보만 복제하지만 소유자와 자율 프록시에는 전체 정보를 복제.
 * GameplayEffects는 소유 클라이언트에게만 복제됩니다. GameplayTags와 GameplayCues만 모두에게 복제됩니다.
 * (플레이어가 조종하는 액터에 대한 멀티플레이어 게임에 추천)
 * 
 * - Minimal: 최소한의 게임플레이 효과 정보만 복제. 소유된 AbilitySystemComponents에는 사용 불가 (대신 Mixed 사용).
 * GameplayEffects는 아무에게도 복제되지 않습니다. GameplayTags와 GameplayCues만 모두에게 복제됩니다.
 * (AI가 조종하는 액터에 대한 멀티플레이어 게임에 추천)

*/ 

 

4.1.2 Setup and Initialization

 

"ASC는 일반적으로 OwnerActor의 생성자 안에서 만들어지고 명시적으로 복제되도록 표시됩니다. 이 작업은 C++로 수행되어야 합니다.

AGDPlayerState::AGDPlayerState()
{
	// Create ability system component, and set it to be explicitly replicated
	AbilitySystemComponent = CreateDefaultSubobject<UGDAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
	AbilitySystemComponent->SetIsReplicated(true);
	//...
}

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

	if (AbilitySystemComponent)
	{
		AbilitySystemComponent->InitAbilityActorInfo(this, this);
	}

	// ASC MixedMode replication requires that the ASC Owner's Owner be the Controller.
	SetOwner(NewController);
}


void APAPlayerControllerBase::AcknowledgePossession(APawn* P)
{
	Super::AcknowledgePossession(P);

	APACharacterBase* CharacterBase = Cast<APACharacterBase>(P);
	if (CharacterBase)
	{
		CharacterBase->GetAbilitySystemComponent()->InitAbilityActorInfo(CharacterBase, CharacterBase);
	}

	//...
}
  • "ASC는 서버와 클라이언트 양쪽에서 소유자 액터(OwnerActor) 및 아바타 액터(AvatarActor) 정보를 사용하여 초기화되어야 합니다. 이 초기화는 Pawn이 Controller(컨트롤러)를 가진 후 (즉 '소유'된 후) 진행하는 것이 좋습니다. 단일 플레이어 게임의 경우에는 서버 상에서 초기화하는 것에 대해서만 고려하면 됩니다."
  • ⇒ GAS 시스템의 핵심인 ASC의 정상적인 작동을 위해서는 서버와 클라이언트 각각에서 초기화가 필요합니다. 이때 해당 ASC가 속한 액터가 '소유'되었는지를 확인한 후 이 작업을 하는 것이 중요합니다. '소유'란 게임 캐릭터 (일반적으로 Pawn)가 플레이어나 AI의 컨트롤러에 의해 조작될 수 있는 상태임을 의미합니다. 단일 플레이어 게임이라면 서버 쪽 초기화만 신경 쓰면 됩니다.
  • "플레이어가 조종하는 캐릭터에 ASC가 Pawn 내에 존재할 경우, 일반적으로 서버에서는 Pawn의 PossessedBy() 함수 안에서, 클라이언트에서는 PlayerController의 AcknowledgePossession() 함수 안에서 초기화합니다."
  • ⇒ 플레이어 캐릭터를 구현한 Pawn 자체에 ASC가 있는 경우, 일반적으로 다음의 방식으로 초기화를 합니다. * 서버: Pawn이 컨트롤러에 의해 소유될 때 (PossessedBy() 함수 내부) * 클라이언트: 플레이어의 컨트롤러가 해당 Pawn에 소유되었다는 사실이 전달될 때 (AcknowledgePossession() 함수 내부)

이렇게 하는 이유는 게임의 구조에 따라 서버쪽과 클라이언트 쪽 사이에 소유관계가 확립되는 시점이 다를 수 있기 때문입니다.




참조 : https://github.com/tranek/GASDocumentation#concepts-asc-rm,

참조2: https://docs.unrealengine.com/5.0/ko/gameplay-ability-system-for-unreal-engine

'개발일지(Unreal5) > GAS[Gameplay Ability System]' 카테고리의 다른 글

AGameplayAbilityWorldReticle  (0) 2025.03.01
Unreal Engine GAS - Gameplay Cue  (0) 2025.02.14
FGameplayAbilityTargetData  (0) 2025.02.14
4.5 게임플레이 이펙트  (0) 2024.02.21
4.2 Gameplay Tags  (0) 2024.02.20

+ Recent posts