본문 바로가기

게임프로그래밍/실습2

[실습2] 10. GAS와 Attribute Set 추가하기

1. 에너미에 GAS와 Attribute Set 추가하기

 

IDE에서 캐릭터의 베이스 클래스로 가자

 

UCLASS(Abstract)
class PRACTICE2_API AAuraCharacterBase : public ACharacter
{
    GENERATED_BODY()

public:
    AAuraCharacterBase();

protected:
    virtual void BeginPlay() override;

    UPROPERTY(EditAnywhere, Category="Combat")
    TObjectPtr<USkeletalMeshComponent> Weapon;

    UPROPERTY()
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;

    UPROPERTY()
    TObjectPtr<UAttributeSet> AttributeSet;
};

 

GAS와 어트리뷰트 세트를 저장할 변수를 만들었다. 두 속성은 플레이어는 캐릭터 클래스가 아닌 스테이트 클래스에서 사용하는데도 베이스 클래스에 설정하는 이유는 단순한 선호라고 한다. 굳이 여기에 넣지 않고 에너미 클래스에 넣어도 상관은 없다고 한다.
플레이어의 경우 해당 포인터를 사용하지 않는다.
에너미 클래스의 생성자로 가도록 하자.
 
AAuraEnemy::AAuraEnemy()
{
    GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);

    AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
}

 

어빌리티 시스템 컴포넌트는 말그대로 컴포넌트이기 때문에 이렇게 클래스에 추가해주어야 한다.

 

AbilitySystemComponent->SetIsReplicated(true);

 

그 다음 이렇게 복제가 일어나도록 설정을 해준다.

 

AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");

 

어트리뷰트 세트 또한 만들어주어야 한다.

 

이제 에너미에 대한 설정은 완료되었다. 전체코드는 아래와 같다.

 

AAuraEnemy::AAuraEnemy()
{
    GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);

    AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    AbilitySystemComponent->SetIsReplicated(true);

    AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
}

2. 플레이어에 GAS와 어트리뷰트 세트 추가하기

 

플레이어는 해당 컴포넌트들을 스테이트 클래스에서 관리할 것이다.

 

UCLASS()
class PRACTICE2_API AAuraPlayerState : public APlayerState
{
    GENERATED_BODY()

public:
    AAuraPlayerState();

protected:
    UPROPERTY()
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;

    UPROPERTY()
    TObjectPtr<UAttributeSet> AttributeSet;
};

 

단순히 이렇게 추가해주면 된다.

 

물론 당연히 생성자에서도 추가해주어야 한다.

 

AAuraPlayerState::AAuraPlayerState()
{
    NetUpdateFrequency = 100.f;

    AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    AbilitySystemComponent->SetIsReplicated(true);

    AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
}
 
이렇게 하면 캐릭터 클래스에 존재하는 GAS와 AS는 널포인터인채로 남을 것이다. 나중에 원하면 이것을 스테이트 클래스에서 불러와 설정할 수 있을 것이다.

3. GAS와 어트리뷰트 세트 Getter 만들기

 

GAS Getter를 만들기 위해 베이스 캐릭터 클래스에서 인터페이스 하나를 상속 받을 것이다.

 

public IAbilitySystemInterface

 

상속받을 인터페이스고 이를 위해서는 빌드파일을 추가(정확히는 위치변경)해야한다.

 

"GameplayAbilities"

 

프라이빗에 있는 해당 모듈을 퍼블릭으로 옮기자

 

#include "AbilitySystemInterface.h"

class PRACTICE2_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface
{
	GENERATED_BODY()

 

이제 이렇게 플레이어 스테이트 클래스에서 상속 받으면 된다.

 

해당 클래스에 들어가면 

virtual UAbilitySystemComponent* GetAbilitySystemComponent() const = 0;

 

위와 같은 순수가상함수가 있는 것을 볼 수 있다. 이제 이를 오버라이드 하자.

 

public:
	AAuraCharacterBase();
	virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
UAbilitySystemComponent* AAuraCharacterBase::GetAbilitySystemComponent() const
{
	return AbilitySystemComponent;
}

 

어빌리티 시스템 컴포넌트를 반환하면 된다.

 

이제 어트리뷰트 세트를 반환하는 함수를 만들자.

 

public:
    AAuraCharacterBase();
    virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
    UAttributeSet* GetAttributeSet() const { return AttributeSet; }

 

그냥 단순히 인라인 함수로 만들어도 된다.

 

현재는 플레이어가 이 함수를 쓰면 널포인터가 반환되니 주의해야 한다. 플레이어를 위해서는 플레이어 스테이트 클래스에서 이 두 함수를 구현해주도록 하자.

 

이제 캐릭터 클래스와 플레이어 스테이트를 연결하는 작업을 하면 된다.