어빌리티 시스템 컴포넌트 , 즉 UAbilitySystemComponent 는 액터와 게임플레이 어빌리티 시스템 사이의 가교 역할을 합니다. 게임플레이 어빌리티 시스템과 인터랙션해야 하는 액터는 자체 어빌리티 시스템 컴포넌트를 가지고 있거나 다른 액터가 소유한 어빌리티 시스템 컴포넌트에 액세스할 수 있어야 합니다. 어빌리티 시스템 컴포넌트를 사용하려고 하기 전에 프로젝트가 [게임플레이 어빌리티 시스템 플러그인][making-interactive-experiences\GameplayAbilitySystem]을 사용하도록 구성되어 있는지 확인해야 합니다.

기본적인 요구 사항

게임플레이 어빌리티 시스템을 사용하기 위해 AActor 서브클래스를 구성하려면 IAbilitySystemInterface 인터페이스를 구현하고 GetAbilitySystemComponent 함수를 오버라이드해야 합니다. 이 함수는 액터와 관련된 어빌리티 시스템 컴포넌트를 반환합니다. 대부분의 경우 액터 클래스는 모든 액터 타입의 모든 내장 컴포넌트와 유사하게 어빌리티 시스템 컴포넌트에 대한 포인터를 저장하는 UPROPERTY 라는 태그가 지정된 변수를 가지고 있습니다. 액터가 자체 어빌리티 시스템 컴포넌트를 가지고 있는 것이 일반적이지만 플레이어의 폰 또는 캐릭터와 같은 액터가 플레이어 스테이트, 플레이어 컨트롤러와 같이 다른 액터가 소유한 어빌리티 시스템 컴포넌트를 사용하려는 경우가 있습니다. 그 이유는 플레이어의 폰 또는 캐릭터가 소멸되고 리스폰되거나 플레이어가 새로운 폰 또는 캐릭터를 처리할 때 플레이어의 점수나 리셋되지 않고 오래 지속되는 어빌리티 쿨다운 타이머 같은 것들이 포함되기 때문입니다. 게임플레이 어빌리티 시스템은 이를 구현하고 액터의 GetAbilitySystemComponent 함수를 작성하여 사용하려는 어빌리티 시스템 컴포넌트를 반환하는 행동을 지원합니다.

구성 예시

다음 절차를 따르면 어빌리티 시스템 컴포넌트를 활용하는 간단하면서도 일반적인 패턴을 시작할 수 있습니다.

  1. 다음과 같이 클래스를 AActor 또는 서브클래스(APawn 및 ACharacter 가 일반적으로 사용되는 베이스 클래스임)의 자손으로 선언하고 헤더 파일에 IAbilitySystemInterface 를 정의로 추가합니다.

    class AMyActor : public AActor, public IAbilitySystemInterface
    
  2. IAbilitySystemInterface 는 오버라이드해야 하는 단 하나의 함수인 GetAbilitySystemComponent 를 가지고 있으므로 클래스 정의에서 이 함수를 선언합니다.

    //~ IAbilitySystemInterface 시작
    /** 어빌리티 시스템 컴포넌트를 반환합니다. */
    virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
    //~ IAbilitySystemInterface 끝
    
  3. 액터가 소멸되어 리스폰될 수 있는 경우에는 특히 어빌리티 시스템 컴포넌트를 플레이어 스테이트 같은 곳에 보관하는 것이 좋습니다. 이 예시에서는 편의를 위해 액터에 저장합니다.

    /** 어빌리티 시스템 컴포넌트입니다. 게임플레이 어트리뷰트 및 게임플레이 어빌리티를 사용하려면 필요합니다. */
    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Abilities")
    UAbilitySystemComponent* AbilitySystemComponent;
    
  4. 액터의 소스 파일에서 GetAbilitySystemComponent 함수를 작성합니다. 어빌리티 시스템 컴포넌트가 액터에 저장되어 있기 때문에 함수는 다음과 같이 매우 짧습니다.

    UAbilitySystemComponent* AMyActor::GetAbilitySystemComponent() const
    {
        return AbilitySystemComponent;
    }
    

고급 사용 시나리오

플레이어 스테이트가 소유한 어빌리티 시스템 컴포넌트를 사용하는 폰과 같이 다른 액터가 소유한 어빌리티 시스템 컴포넌트를 사용하는 액터를 구성할 수 있습니다. 이를 위해서는 액터의 GetAbilitySystemComponent 함수가 오너에서 어빌리티 시스템 컴포넌트를 얻거나 액터에 이를 미리 캐시해야 합니다. 이는 플레이어가 제어하는 액터가 소멸되어 리스폰될 수 있고 플레이어가 살아남기 위해 머니, 포인트, 긴 어빌리티 쿨다운과 같이 특정 게임플레이 어빌리티 시스템 정보가 필요한 프로젝트에서 가장 일반적으로 발생합니다. 이와 더불어 장비나 모듈형 머신 또는 신체 부위 표현하기 위해 액터가 자신에게 다른 액터를 어태치하는 프로젝트에서 사용될 수 있습니다. 이러한 경우, 어태치된 액터의 게임플레이 어빌리티 시스템 인터랙션은 메인 액터의 어빌리티 시스템 컴포넌트에 라우팅할 수 있습니다. 이를 구현할 수 있는 간단한 방법은 어태치된 액터의 GetAbilitySystemComponent 함수가 메인 액터로 전달되도록 하는 것입니다. 또한 액터가 다른 액터에 어태치되거나 처리되는 동안 캐시된 포인터를 유지하면 퍼포먼스를 향상할 수 있습니다.

<aside> 📌

게임플레이 어빌리티 시스템은 다수의 액터가 하나의 어빌리티 시스템 컴포넌트를 공유하는 것을 지원하지만 하나의 액터가 다수의 어빌리티 시스템 컴포넌트를 가지는 것은 지원하지 않습니다. 이렇게 하면 쿼리하고, 액터의 어빌리티 시스템 컴포넌트에 변경사항을 적용하고, 액터에서 컴포넌트를 얻을 때 모호함을 유발할 수 있기 때문입니다.

</aside>