1. 어빌리티 시스템 컴포넌트(Ability System Component)와 속성 세트(Attribute Set) 구현
GAS를 사용할 때 컴포넌트를 플레이어 스테이트와 Enemy 클래스에 구현하기 위해 AuraCharacterBase에서 포인터로 들고있도록 한다.
(1) 적 캐릭터에 GAS 구현
- AuraCharacterBase.h
UCLASS(Abstract)
class AURA_API AAuraCharacterBase : public ACharacter
{
GENERATED_BODY()
public:
AAuraCharacterBase();
protected:
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr<USkeletalMeshComponent> Weapon;
// GAS
UPROPERTY()
TObjectPtr<class UAbilitySystemComponent> AbilitySystemComponent;
UPROPERTY()
TObjectPtr<class UAttributeSet> AttributeSet;
};
- AuraEnemy.cpp
#include "Character/AuraEnemy.h"
#include "AbilitySystem/AuraAbilitySystemComponent.h"
#include "AbilitySystem/AuraAttributeSet.h"
#include "Aura/Aura.h"
AAuraEnemy::AAuraEnemy()
{
GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
// 멀티에서의 복제
AbilitySystemComponent->SetIsReplicated(true);
AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
}
Enemy 클래스에서 어빌리티 시스템 컴포넌트와 특성 세트를 CreateDefaultSubobject로 할당해준다.
플레이어 캐릭터에서는 할당하지 않은 채로 두고 플레이어 스테이트에서 GAS를 구현하도록 하면 된다.
(2) 플레이어 스테이트에 GAS 구현
위에 내용을 그대로 복사하여 플레이어 스테이트 클래스에 붙여넣기 한다.
2. 어빌리티 시스템 인터페이스 구현
외부에서 해당 액터의 어빌리티 시스템 컴포넌트에 접근하기 쉽도록 도와주는 인터페이스이다.
어빌리티, 이펙트, 큐를 사용하기 위해서 반드시 구현이 필요하다.
(1) 적 캐릭터에 구현
#include "CoreMinimal.h"
#include "AbilitySystemInterface.h"
#include "GameFramework/Character.h"
#include "AuraCharacterBase.generated.h"
UCLASS(Abstract)
class AURA_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
AAuraCharacterBase();
virtual class UAbilitySystemComponent* GetAbilitySystemComponent() const { return AbilitySystemComponent; }
protected:
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr<USkeletalMeshComponent> Weapon;
// GAS
UPROPERTY()
TObjectPtr<class UAbilitySystemComponent> AbilitySystemComponent;
UPROPERTY()
TObjectPtr<class UAttributeSet> AttributeSet;
};
어빌리티 시스템 인터페이스를 사용하려면 반드시 GetAbilitySystemComponent를 오버라이딩하여 구현해야 한다.
어빌리티 시스템 인터페이스의 헤더 파일을 보면 딱 저 함수만 있는데 Abstract로 되어 있기 때문에 오버라이딩 하지 않으면 오류가 발생한다.
이어서 속성 세트를 Get하는 함수도 만든다.
최종적으로는 다음과 같다.
#include "CoreMinimal.h"
#include "AbilitySystemInterface.h"
#include "GameFramework/Character.h"
#include "AuraCharacterBase.generated.h"
class UAbilitySystemComponent;
class UAttributeSet;
UCLASS(Abstract)
class AURA_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
AAuraCharacterBase();
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const { return AbilitySystemComponent; }
UAttributeSet* GetAttributeSet() const { return AttributeSet; }
protected:
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr<USkeletalMeshComponent> Weapon;
// GAS
UPROPERTY()
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
UPROPERTY()
TObjectPtr<UAttributeSet> AttributeSet;
};
(2) 플레이어 스테이트에 구현
#include "CoreMinimal.h"
#include "AbilitySystemInterface.h"
#include "GameFramework/PlayerState.h"
#include "AuraPlayerState.generated.h"
class UAbilitySystemComponent;
class UAttributeSet;
/**
*
*/
UCLASS()
class AURA_API AAuraPlayerState : public APlayerState, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
AAuraPlayerState();
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const { return AbilitySystemComponent; }
UAttributeSet* GetAttributeSet() const { return AttributeSet; }
protected:
// GAS
UPROPERTY()
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
UPROPERTY()
TObjectPtr<UAttributeSet> AttributeSet;
};
동일한 작업을 플레이어 스테이트에 구현한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
2-6. 어빌리티 액터 정보(Ability Actor Info) 초기화하기 (0) | 2024.08.14 |
---|---|
2-5. 복제 모드(Replication Mode) (0) | 2024.08.14 |
2-3. 멀티 플레이어에서의 GAS (0) | 2024.08.14 |
2-2. 플레이어 상태 클래스(Player State Class)와 GAS 기본 설정 (0) | 2024.08.14 |
2-1. 게임플레이 어빌리티 시스템(Gameplay Ability System - GAS) (0) | 2024.08.14 |