Ability System Component And Attributes 문서를 기반으로 합니다.
Ability System Component (UAbilitySystemComponent) 은 액터와 GAS 사이를 잇는 다리 역할을 합니다. GAS와 상호작용 하려는 모든 액터는 소유한 Ability System Component가 필요하거나, 다른 액터가 소유한 Ability System Component에 접근할 수 있어야 합니다. Ability System Component를 사용하기 전에 프로젝트가 GAS 플러그인을 사용하도록 설정되어 있는지 확인하세요.
GAS를 사용하도록 액터의 Subclass를 설정하려면, IAbilitySystemInterface 인터페이스를 구현하고 GetAbilitySystemComponent 함수를 오버라이드 해야합니다. 이 함수는 액터와 연관된 Ability System Component를 반환해야 합니다. 대부분의 경우, 액터 클래스는 UPROPERTY를 붙여 Ability System Component를 포인터로 저장합니다. 액터가 자신만의 Ability System Component를 가지고 있는 것이 일반적이지만, 때로는 플레이어의 Pawn이나 Character와 같은 액터가 다른 액터가 소유한 Ability System Component를 사용하고 싶은 경우도 있습니다. (like. PlayerState, PlayerController) 이러한 경우의 이유는 플레이어의 점수나, 플레이어의 폰이나 캐릭터가 파괴되어 재생성될 때, 또는 플레이어가 새로운 폰이나 캐릭터를 소유할 때 재설정되지 않는 쿨다운 타이머 등이 포함될 수 있습니다. GAS가 이러한 동작을 지원합니다. 그래서 이것을 구현하기 위해서 액터의 GetAbilitySystemComponent 함수를 알맞게 오버라이드 해야합니다.
다음 절차는 Ability System Component를 활용하는 간단하고 흔한 패턴 입니다.
class AMyActor : public AActor, public IAbilitySystemInterface
//~ Begin IAbilitySystemInterface
/** Returns our Ability System Component. */
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
//~ End IAbilitySystemInterface
/** Ability System Component. Required to use Gameplay Attributes and Gameplay Abilities. */
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Abilities")
UAbilitySystemComponent* AbilitySystemComponent;
UAbilitySystemComponent* AMyActor::GetAbilitySystemComponent() const
{
return AbilitySystemComponent;
}
// Create a ability system
AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
AbilitySystemComponent->SetIsReplicated(true);
/** Interface for actors that expose access to an ability system component */
UINTERFACE(MinimalAPI, meta = (CannotImplementInterfaceInBlueprint))
class UAbilitySystemInterface : public UInterface
{
GENERATED_UINTERFACE_BODY()
};
class GAMEPLAYABILITIES_API IAbilitySystemInterface
{
GENERATED_IINTERFACE_BODY()
/** Returns the ability system component to use for this actor. It may live on another actor, such as a Pawn using the PlayerState's component */
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const = 0;
};
다른 액터가 소유한 Ability System Component을 사용하도록 액터를 설정할 수 있습니다. 예를 들어, Player State가 소유한 Ability System Component를 사용하는 Pawn의 경우가 있습니다. 이를 위해 액터의 GetAbilitySystemComponent 함수는 Owner로 부터 Ability System Component를 검색하거나, 액터에 미리 캐싱해야 합니다. 이러한 방식은 플레이어가 조종하는 액터가 피괴되고 재생성될 수 있는 프로젝트에서 주로 사용하며, 플레이어는 돈, 점수, 스킬 쿨타임과 같이 GAS 정보가 유지되기를 필요로 합니다. 또한 멀티 플레이에서 서버에서 클라로 배포되는 액터가 적절하므로, 플레이어 캐릭터의 ASC를 주로 PlayerState 클래스에 선언해 두는 것이 일반적입니다. 따라서 InitAbilityActorInfo할 때, Owner는 PlayerState, Avartar는 Character로 설정하는 것이 좋습니다.
UAbilitySystemComponent::InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor)
GAS는 여러 액터가 하나의 Ability System Component를 공유하는 것을 지원하지만, 단일 액터가 여러 개의 Ability System Component를 가지는 것을 지원하지 않습니다. 이렇게 할 경우, 액터의 Ability System Component를 변경, 조회, 검색할 때 모호성이 발생할 수 있습니다.