Gameplay Ability
GAS에서 캐릭터의 능력(공격,방어,회복 등)을 정의하고 발동하는 요소.
캐릭터의 각 능력을 UGameplyAbility 상속받은 클래스로 만들어 어떤 동작을 하는지 로직을 담고 ASC에 등록해준다. 쿨타임, 타겟팅 기능 등이 지원된다.
GA 클래스 만들기
UGameplayAbility를 상속받은 GA클래스를 만든다.
ActivateAbility함수를 오버라이드 한다. 이 함수의 구현부에 실행될 로직을 작성하면 된다.
로직 작성 후에는 EndAbility를 호출하여 어빌리티가 끝났음을 알려줘야 한다.
UCLASS()
class PG_API UGA_HealAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData) override
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
//TODO : 로직 실행
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}
};
ASC에 능력을 등록하기
ASC가 InitAbilityActorInfo 함수를 통해 완전히 초기화된 후에 작업한다.
어빌리티 클래스를 이용해 FGameplayAbilitySpec을 만들어서 ASC에 능력을 부여해주면 된다.
멀티플레이어 게임의 경우 반드시 서버에서 할 것.
void APGPlayerState::BeginPlay()
{
Super::BeginPlay();
if (HasAuthority() && AbilitySystemComponent)
{
FGameplayAbilitySpec HealSpec(UGA_HealAbility::StaticClass(), 1);
AbilitySystemComponent->GiveAbility(HealSpec);
}
}
FGameplayAbilitySpec은 특정 어빌리티를 어떤 레벨로, 어떤 방식으로 부여할지를 담은 구조체.
생성자는 아래와 같다.
FGameplayAbilitySpec(
TSubclassOf<UGameplayAbility> InAbility,
int32 InLevel,
int32 InInputID = INDEX_NONE,
UObject* SourceObject = nullptr
);
- InAbility : 실제로 부여할 어빌리티 클래스.
- InLevel : 부여하는 어빌리티의 레벨. 1이 기본 상태이며 추후 능력 레벨업이 가능하다.
- InInputID : 입력과의 연결을 위한 ID
- SourceObject : 능력의 소스 객체. 예를 들어, 아이템을 사용해서 생긴 능력이라면 그 아이템을 참조할 수 있다.
GA 발동하기
인자로 넣은 어빌리티의 클래스 또는 핸들을 ASC가 가지고 있다면, 찾아서 발동을 시도한다.
조건이 맞지 않으면 발동이 실패할 수 있다.
TryActivateAbilityByClass 는 클래스 기반으로 특정 어빌리티 하나를 발동하는 함수.
AbilitySystemComponent->TryActivateAbilityByClass(UGA_HealAbility::StaticClass());
TryActivateAbility 는 어빌리티 핸들을 기반으로 능력을 발동시킨다.
핸들(FGameplayAbilitySpecHandle)은 GiveAbility 에서 반환하는 것을 받아와도 되고 .Handle 로 얻어와도 된다.
FGameplayAbilitySpecHandle HealHandle = AbilitySystemComponent->GiveAbility(HealSpec);
//OR
FGameplayAbilitySpecHandle HealHandle = HealSpec.Handle;
위의 함수들은 서버에서 호출하는 능력 발동 함수이고,
클라이언트에서 요청하려면 ServerTryActivateAbilityByClass 또는 ServerTryActivateAbility를 호출한다.
'공부 잡동사니 > Unreal Engine' 카테고리의 다른 글
[UE5] GAS - AttributeSet (0) | 2025.04.17 |
---|---|
[UE5] GAS - GAS와 ASC (0) | 2025.04.17 |
[UE5] 달리기와 앉기 구현 / Line Trace (0) | 2025.04.04 |
[UE5] 1인칭 카메라 / 향상된 입력 시스템 (0) | 2025.04.01 |
[UE5] 멀티플레이어 기본 개념 (0) | 2025.03.26 |
댓글