본문 바로가기
::protected/언리얼4&5

Game Ability System(aka.GAS)

by 해맑은욱 2023. 10. 4.

## GAS의 특징

게임플레이 태그(GameplayTag)를 기반으로 모듈화된 클래스로 동작하며, 어빌리티의 리플리케이션을 자체적으로 지원함.

태그기반으로 동작하기 때문에 예외처리가 무척 간편하며 비교적 쉽게 리플리케이션 처리가 가능함.

또한 어빌리티가 모듈로 나뉘어져있기 때문에 캐릭터와 스킬이 다양한 게임에 적합함.

-

## GAS의 요소

GameplayAbility : 게임플레이 어빌리티

; 게임 내 어빌리티가 하는 일, (있다면) 시전하는 데 드는 비용, 언제 어떤 상황에서 사용할 수 있는지 등을 정의

GameplayEffect  : 게임플레이 이펙트

; 액션이 어떤 영향을 주는지 정의.(체력, 마나, 데미지, 버프/디버프 등)

GameplayCue : 게임플레이 큐

; GA가 발동되었을 때 어떤 효과가 일어나는지(사운드 및 파티클)을 정의.

-

## AbilitySystemComponent

액터(Actor)와 게임플레이 어빌리티 시스템 사이의 가교 역할을 함. 액터가 자체 어빌리티 시스템 컴포넌트를 가지고 있거나,

다른 액터가 소유한 어빌리티 시스템 컴포넌트에 접근할 수 있어야 함.

*게임플레이 어빌리티 시스템을 사용하기 위해선 IAbilitySystemInterface 인터페이스를 구현하고 GetAbilitySystemComponent 함수를 오버라이드 해야함.

class GAS_API ATestPawn : public ADefaultPawn, public IAbilitySystemInterface

//~ IAbilitySystemInterface Begin
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
//~ IAbilitySystemInterface End

-

## GameplayAbility

#어빌리티 부여 및 회수

; 액터가 어빌리티를 사용하려면, AbilitySystemComponent(어빌리티 시스템 컴포넌트)에 어빌리티를 부여(grant)해야함.

at "AbilitySystemComponent"

// FGameplayAbilitySpec로 추가할 어빌리티를 나타내며, FGameplayAbilitySpecHandle를 반환.
FGameplayAbilitySpecHandle GiveAbility(const FGameplayAbilitySpec& AbilitySpec);

// 반드시 서버에서 실행! FGameplayAbilitySpec로 추가할 어빌리티를 나타내며, FGameplayAbilitySpecHandle 를 반환.
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities", meta = (DisplayName = "Give Ability And Activate Once", ScriptName = "GiveAbilityAndActivateOnce"))
FGameplayAbilitySpecHandle K2_GiveAbilityAndActivateOnce(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);

// 지정한 어빌리티를 어빌리티 시스템 컴포넌트에서 제거.
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities")
void ClearAbility(const FGameplayAbilitySpecHandle& Handle);

// 지정한 어빌리티 실행이 완료되면 어빌리티 시스템에서 제거. 어빌리티가 실행 중이지 않으면 즉시 제거.
void SetRemoveAbilityOnEnd(FGameplayAbilitySpecHandle AbilitySpecHandle);

// 어빌리티 시스템 컴포넌트에서 모든 어빌리티를 제거. FGameplayAbilitySpecHandle 이 필요없음.
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category="Gameplay Abilities")
void ClearAllAbilities();

 

#기본 사용 방법(실행 주기)

 at "GameplayAbility"

// 호출자가 어빌리티 실행을 시도하지 않아도 어빌리티 사용 가능 여부를 알려줌.
virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags = nullptr, const FGameplayTagContainer* TargetTags = nullptr, OUT FGameplayTagContainer* OptionalRelevantTags = nullptr) const;

// 어빌리티에 관련된 게임 코드를 실행하지만, 어빌리티 사용 가능 여부는 검사하지 않음.
void CallActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, FOnGameplayAbilityEnded::FDelegate* OnGameplayAbilityEndedDelegate = nullptr, const FGameplayEventData* TriggerEventData = nullptr);

// at AbilitySystemComponent. 어빌리티를 실행하는 전형적인 방식.
// CanActivateAbility를 호출 어빌리티 실행 여부를 판단하고, 가능할 경우 CallActivateAbility를 호출.
UFUNCTION(BlueprintCallable, Category = "Abilities")
bool TryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool bAllowRemoteActivation = true);

// 어빌리티 실행을 마치면 실행되며 어빌리티를 종료함. 경우에 따라 종료를 확인한 후 행동이 필요할때 사용.
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled);

 

#GameplayTag(프로젝트에 태그를 정의/추가해야 사용가능)

; 여러 게임플레이 어빌리티의 상호작용 방식을 결정하는데 도움이 됨. 태그를 통한 어빌리티 실행여부를 판단함.

AbilityTags 
: 이 어빌리티가 가진 태그들(상호작용 대상이 될 태그)
CancelAbilitiesWithTag 
: 이 어빌리티가 실행되는 동안 이미 실행 중인 어빌리티의 태그가 제공된 목록과 일치하면 취소됨
BlockAbilitiesWithTag 
: 이 어빌리티가 실행되는 동안 일치하는 태그가 있는 다른 어빌리티의 실행을 방지함
ActivationOwnedTags 
: 이 어빌리티가 실행되는 동안 해당 어빌리티의 오너에 이 태그 세트가 부여됨. 이 태그는 AbilitySystemGlobals에서 ReplicateActivationOwnedTags가 활성화되어 있으면 복제됨
ActivationRequiredTags 
: 이 어빌리티는 활성 상태인 액터 또는 컴포넌트에 이러한 태그가 모두 있을 때만 활성화할 수 있음
ActivationBlockedTags 
: 이 어빌리티는 활성 상태인 액터 또는 컴포넌트에 이러한 태그가 하나도 없을 때만 활성화할 수 있음
TargetRequiredTags 
: 이 어빌리티는 타깃 액터 또는 컴포넌트에 이 태그가 모두 있을 때만 활성화할 수 있음
TargetBlockedTags 
: 이 어빌리티는 타깃 액터 또는 컴포넌트에 이 태그가 하나도 없을 때만 활성화할 수 있음

 

#Gameplay Event

; 일반 채널을 통하지 않고도 어떤 컨텍스트의 데이터 페이로드를 전송하여 어빌리티를 직접 트리거하도록 전달할 수 있는 데이터 구조체.

일반적인 방법은 액터에 게임플레이 이벤트 전송을 호출(SendGameplayEventToActor). 블루프린트 이벤트.

어빌리티 시스템 컴포넌트에서 게임플레이 이벤트 처리(HandleGameplayEvnet)를  바로 호출해도 됨.

// Blueprint
UFUNCTION(BlueprintCallable, Category = Ability, Meta = (Tooltip = "This function can be used to trigger an ability on the actor in question with useful payload data."))
static void SendGameplayEventToActor(AActor* Actor, FGameplayTag EventTag, FGameplayEventData Payload);

// Native
virtual int32 HandleGameplayEvent(FGameplayTag EventTag, const FGameplayEventData* Payload);

 

# 이외에도 리플리케이션, 인스턴싱 정책이 있음

-

## GameplayAttributes

게임플레이 어빌리티 시스템의 액터는 게임플레이 어트리뷰트를 어트리뷰트 세트(AttributeSet)에 저장.

어트리뷰트를 액터의 어빌리티 시스템 컴포넌트에 등록하고, 게임플레이 어트리뷰트오 시스템의 나머지 부분 간의 인터렉션을 관리하는데 도움이 됨.

..추후 정리..

-

## GameplayEffect(BP로 만들어서 사용 - GameplayEffect)

게임플레이 어빌리티 시스템에서 어트리뷰트를 변경하는 방식.

데이터 전용 블루프린트로 구현하여 어빌리티 시스템 컴포넌트와 상호작용하고 적절한 경우 활성 상태인 동안 저장될 수 있음.

 

DurationPolicy

    Instance : 실행 즉시 영구적으로 적용. Add&Remove 안됨.

    Infinite : 스스로 제거되지 않고 GameplayTag가 제거될때 제거됨. ability 나 수동으로 제거해야 함.

    Hue Duration : 지정된 시간이 지나면 제거되거나 특정 GameplayTag로 인해 제거될 수 있음. 수동 제거.

DurationMagnitude

    CalculationType - ScalableFloat : 초당 시간으로 설정 가능.

    ScalableFloatMagnitude : float으로 시간 설정.

Modifiers : 정의해둔 AttributeSet을 추가하고 값을 설정. (ex. 체력을 늘리고 깍는다)

Period : 초당 주기로 실행될 시간 설정.

...

Display

    RequireModifierSuccesstoTriggerCues : true=modifier가 성공하면 GC 실행.

    GameplayCue : 정의해둔 GC 설정(사운드, 파티클 이펙드 등)

Tags

    GrantedTags : 해당 GE에 부여할 태그.

    RemovalTagReauirements : 특정 태그가 있으면 해당 GE 제거할수 있음. Require, Ignore 구분 가능.

-

## GameplayCue(BP로 만들어서 사용 - GameplayCueNotifyActor)

기본적인 구성은 이벤트 그래프를 이용해서 만들어야 할듯.

코드로도 가능할 것인가?

 

 

 

#참고

https://docs.unrealengine.com/5.0/ko/gameplay-ability-system-for-unreal-engine/

 

게임플레이 어빌리티 시스템

게임플레이 어빌리티 시스템 개요

docs.unrealengine.com

https://github.com/tranek/GASDocumentation

 

GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer s

My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer sample project. - GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's Gamepl...

github.com

https://www.youtube.com/playlist?list=PLuS6-Pdt2hhYGZkME7K7ZDT2qf4vbY5c3 

 

[UE5] General Gameplay Ability System Tutorial

I found a surprising lack of content on Unreal Engine's Gameplay Ability System so I decided to learn how it works and create these videos to document my jou...

www.youtube.com

 

 

'::protected > 언리얼4&5' 카테고리의 다른 글

[Enhanced Input System]  (3) 2024.10.11
[Widget] HP Progress Bar with Material  (0) 2024.10.10
UI Optimization(ongoing)  (0) 2023.08.20
TimerManager  (0) 2023.07.06
Optimization  (0) 2023.07.05