Game Ability System

Clear·2024년 10월 11일

Unreal Engine

목록 보기
2/2

Game Ability System

Unreal Engine에서 제공하는 Frame work로 다음과 같은 기능을 구현할 수 있다.

  • Game 속 Character Action 이나 Passive Ability와 상태 이상
  • 규제를 위한 Cooldown 또는 Resource Cost
  • 각 Level 마다 Ability Level 효과 변경 및 활성화
  • 효율적 네트워크화

주요 구성 요소

  • GameAbilitySystemComponet
    Ability 부여, 해당 Ability 활성화, 알림 처리등의 기능 제공
    Character 가 GAS 에 참여할 때 추가해야 하는 요소
  • Attribute Set
    주어진 Object나 Character에 연관되는 Attibute Hp, Mp 등
  • Gameplay Ability
    특정 AbilitySkill, Attack등을 캡슐화 하는데 사용하는 Class
    해당 Ability는 능력 작업(Ability Task)이라고 하는 비동기 작업을 실행한다.
  • Ability Task
    비동기시 Code를 실행.
    작업을 실행할 시에 해당 작업이 수행되며 즉시 실행시키거나 일정 기간에 거쳐 실행하면서 다른 작업또한 수행할 수 있다.
  • Gameplay Effect
    Attribute Value을 변경하는데 사용
    Attibute의 직접 변경, 시간 지남에 따른 변경, 주기적 증가 감소등이 가능하며, 다양한 계산과 연관시킨다.
  • Gameplay Cue
    Particle System 및 Sound와 같은 외관 처리를 담당한다.

UAbilitySystemComponent

InitAbilityActorInfo

Ability System Component가 어떤 Actor에 대해 작동하는지 초기화하는 역할을 합니다. 즉, 이 함수를 호출하여 어빌리티 시스템이 어느 Owner와 Avator에 연결될지를 설정합니다.

void UAbilitySystemComponent::InitAbilityActorInfo(
AActor* InOwnerActor, 
AActor* InAvatarActor);

Parameter

  • InOwnerActor
    Ability System의 Owner를 나타내는 Actor입니다.
    Owner는 Gameplay 중 Ability를 제어하는 주체입니다. 보통, PlayerController나 AI Controller가 이 역할을 맡습니다.
    예를 들어, PlayerCharacter가 이 System의 Owner일 수 있습니다.
  • InAvatarActor
    Ability System의 Avatar를 나타내는 Actor입니다.
    Avator는 실제로 Game 내에서 Ability의 효과가 발생하는 Actor입니다. 대부분 Player의 CharacterMesh가 이에 해당하며, Ability의 Animation이나 Effect가 Avator에 적용됩니다.
    예를 들어, Player가 조종하는 Chararcter의 SkeletalMesh나 Vehicle과 같은 Object가 Avator 역할을 합니다.

TryActivateAbility

특정 Ability를 활성화하려 시도하는 함수입니다. 이 함수는 주어진 FGameplayAbilitySpecHandle에 해당하는 Ability를 활성화하고자 할 때 사용되며, 성공적으로 활성화될 경우 true를 반환하고, 실패하면 false를 반환합니다.

bool TryActivateAbility(
FGameplayAbilitySpecHandle AbilityToActivate,
bool bAllowRemoteActivation = true);

Paramter

  • AbilityToActivate
    활성화하려는 Ability의 Handle입니다. 이 Handle은 FGameplayAbilitySpec에 연결된 고 유한 Handle로, 특정 Ability를 참조합니다.
  • bAllowRemoteActivation
    원격 활성화를 허용할지 여부를 나타내는 Flag입니다.
    true로 설정할 경우, Sever 또는 Client가 아닌 다른 기기에서 Ability를 활성화할 수 있는지 여부를 허용합니다. 주로 Multiplayer 상황에서 원격으로 Ability를 실행하는 것을 제어할 때 사용됩니다.

ClearAbility

특정 Ability를 제거하는 함수입니다. 이 함수는 주어진 FGameplayAbilitySpecHandle을 참조하여 Ability System 내에서 해당 Ability를 삭제하는 역할을 합니다.

void ClearAbility(const FGameplayAbilitySpecHandle& Handle);

Parameter

  • Handle
    제거하고자 하는 특정 Ability에 대한 Handle을 나타냅니다. 이 Handle은 특정 Ability의 사양(FGameplayAbilitySpec)에 연결되어 있습니다.

GiveAbility

Gameplay Ability를 Character 또는 Actor에게 부여하는 함수입니다. 이 함수는 FGameplayAbilitySpec을 통해 어빌리티의 사양을 정의하고, 해당 Ability를 부여하며, 그 결과로 FGameplayAbilitySpecHandle을 반환합니다. 이 Handle은 부여된 Ability를 참조하는 고유한 식별자 역할을 합니다.

FGameplayAbilitySpecHandle GiveAbility(const FGameplayAbilitySpec& Spec);

Paramter

  • Spec
    Ability의 Level, 강도, Ability Class 및 기타 속성을 정의합니다.
    이 구조체는 부여하고자 하는 Ability의 모든 정보(예: Ability의 Instance 여부, Level, Input Binding 등)를 담고 있습니다.
  • Return Value
    FGameplayAbilitySpecHandle:
    부여된 Ability를 참조하는 고유한 Handle을 반환합니다. 이 Hanlde은 나중에 Ability를 활성화하거나, 삭제하거나, 해당 Ability와 관련된 작업을 수행할 때 사용됩니다.
    만약 Ability가 정상적으로 부여되지 않으면 무효한 Handle을 반환할 수 있습니다.

UAttributeSet

UGameplayAbility

ActivateAbility

Ability가 활성화될 때 호출되는 함수입니다. 이 함수는 Gameplay 중 특정 Ability을 사용할 때 trigger되며, 주로 Ability의 실제 실행 로직을 정의하는 데 사용됩니다.
Ability이 활성화되는 순간에 해야 할 다양한 작업을 처리하며, Ability 사용 시 어떤 일이 일어날지 구체적으로 설정할 수 있습니다. 예를 들어, Player가 Skill을 사용하면 관련된 Animation을 재생하거나, Damage 처리를 하거나, 상태 변화를 적용하는 등의 행동을 수행합니다.

virtual void ActivateAbility(
    const FGameplayAbilitySpecHandle Handle,
    const FGameplayAbilityActorInfo* ActorInfo,
    const FGameplayAbilityActivationInfo ActivationInfo,
    const FGameplayEventData* TriggerEventData);

Paramter

  • Handle
    활성화된 Ability의 고유 Handle을 나타냅니다. 이 Handle을 통해 현재 실행 중인 Ability Instance에 접근할 수 있습니다.
  • ActorInfo
    Ability를 사용하는 Actor에 대한 정보를 담고 있습니다. 여기에는 OwnerActor, AvatarActor, PlayerController 등의 정보가 포함됩니다.
  • ActivationInfo
    Ability가 어떻게 활성화되었는지에 대한 정보입니다. 이는 Ability가 어떤 방식으로(예: Auto, Input, Event 등) 발동되었는지에 대한 정보를 담고 있습니다.
  • TriggerEventData
    Event 기반으로 Ability가 발동될 때 제공되는 추가 Data입니다. 이 Value은 선택적이며, 특정 Event가 Ability의 발동을 Trigger할 때 유용하게 사용됩니다.

EndAbility

Ability를 종료할 때 호출되는 함수입니다. 어빌리티가 완료되었거나, 취소되었을 때 상태를 정리하고 시스템에 알리는 역할을 합니다. 어빌리티가 성공적으로 실행된 경우뿐만 아니라, 강제로 취소되거나 실패한 경우에도 이 함수를 사용하여 어빌리티를 종료할 수 있습니다.

virtual void EndAbility(
    const FGameplayAbilitySpecHandle Handle,
    const FGameplayAbilityActorInfo* ActorInfo,
    const FGameplayAbilityActivationInfo ActivationInfo,
    bool bReplicateEndAbility,
    bool bWasCancelled);

Parameter

  • Handle
    Ability의 고유 Handle입니다. 실행된 Ability Instance를 식별하는 데 사용됩니다.
  • ActorInfo
    Ability가 실행된 Actor(Character)와 관련된 정보를 담고 있습니다. 여기에는 Ability를 소유한 Character, Avator, PlayerController 등의 정보가 포함됩니다.
  • ActivationInfo
    Ability가 어떻게 활성화되었는지에 대한 정보입니다. 이는 Ability가 Input, Evnet, 자동 실행 등 어떤 방식으로 활성화되었는지에 대한 정보입니다.
  • bReplicateEndAbility
    Ability의 종료 상태가 Network 상에서 동기화될지 여부를 결정합니다. MultiPlayerGame 에서는 이 Value을 true로 설정하여 종료 상태가 Server와 Client 간에 일치하도록 해야 합니다.
  • bWasCancelled
    Ability가 Cancel된 것인지 여부를 나타냅니다. Ability가 정상적으로 완료된 경우에는 false로, 도중에 취소되거나 중단된 경우에는 true로 설정합니다.

OnGiveAbility

Ability가 Character(or Actor)에게 부여될 때 호출되는 Callback Function입니다. 이 함수는 주로 Ability가 주어졌을 때 특정 초기화 작업을 수행하는 데 사용됩니다.

void OnGiveAbility(
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilitySpec& Spec);

Paramter

  • ActorInfo
    Ability가 부여된 Actor(Character) 관련 정보를 담고 있습니다. 여기에는 Character 의 Avator, Owner, PlayerController 등 관련된 모든 정보가 포함됩니다.
  • Spec
    Ability의 구체적인 Spec을 나타내는 Struct입니다. Ability의 Level, Input Key, 추가적인 Data 등을 포함하고 있습니다.

GetAvatarActorFromActorInfo

Avator Actor를 반환하는 함수입니다. Avator Actor는 Ability를 실제로 수행하는 Actor를 의미합니다.

AActor* GetAvatarActorFromActorInfo() const;

Return Value

  • AActor*
    Ability를 수행하는 Avator Actor를 반환한다.
    만약 ActorInfo가 유효하지 않거나, Avator Actor가 설정되지 않은 경우 nullptr을 반환할 수 있습니다.

GetOwningComponentFromActorInfo

Ability를 소유한 Actor의 SkeletalMeshComponent 를 Return합니다.

USkeletalMeshComponent* GetOwningComponentFromActorInfo() const;

Return Value

  • USkeletalMeshComponent*
    Ability를 수행하는 Actor의 SkeletalMeshComponent를 Return합니다. 만약 ActorInfo에서 유효한 Component를 찾지 못하면 nullptr을 반환할 수 있습니다.

UGameplayEffect

UGameplayCue

Structs

FGameplayAbilitySpecHandle

특정 Gameplay Ability를 식별하는 고유한 Handle입니다. Ability Spec은 Ability의 설정 및 정보를 담고 있으며, 이 핸들은 해당 Ability를 참조하는 식별자 역할을 합니다. 이를 통해 Ability를 활성화하거나 수정, 삭제하는 등의 작업을 효율적으로 수행할 수 있습니다.

Field

int32 Handle

Ability를 식별하는 고유 ID입니다.

Method

  • IsValid()
    Handle이 유효한지 여부를 확인하는 함수입니다.

FGameplayAbilitySpec

Gameplay Ability에 대한 특정 Instance를 정의하는 구조체입니다. 이 구조체는 Ablity의 Level, Input 방식, Replicate 여부 등과 같은 설정을 포함하여, Gameplay Ability가 어떻게 동작할지를 구체적으로 정의합니다. 이를 통해 Character나 Actor가 Ability를 사용할 수 있도록 System에 전달됩니다.

Field

TObjectPtr<UGameplayAbility> Ability

어빌리티의 클래스를 정의합니다.
Ablity를 정의하는 UGameplayAbility Class를 상속받은 Class의 참조를 저장합니다.

int32	Level

Ability의 Level을 정의합니다.
Level에 따라 Ability의 효과나 능력이 달라질 수 있습니다.

int32	InputID

Ability가 발동되기 위해 필요한 Input Key 또는 Button을 정의합니다.
이를 통해 Player가 특정 Key를 눌렀을 때 Ability가 활성화되도록 설정할 수 있습니다.

TWeakObjectPtr<UObject> SourceObject

Ability의 출처 또는 추가 Data를 저장하는 Object입니다.
주로 Ability를 부여한 Item이나 Weapon 같은 출처를 추적하는 데 사용됩니다.

uint8 InputPressed:1

Ablility의 Input이 눌린 상태인지를 저장하는 Flag입니다.
이를 통해 특정 Input이 눌렸을 때 Ability가 활성화되는지 관리할 수 있습니다.

uint8 ActiveCount

현재 Ability가 얼마나 많이 활성화되었는지를 추적합니다.

FGameplayAbilityActorInfo

Ablity가 실행되는 동안 중요한 정보를 담고 있는 구조체입니다. 주로 Ablity를 실행하는 Actor(Character 또는 NPC), Controller, Animation System 및 Ablity System Component에 대한 정보를 저장합니다. 이를 통해 Ability가 다양한 Context에서 어떻게 동작할지를 결정할 수 있습니다.
Field

TWeakObjectPtr<AActor>	OwnerActor

Ability를 소유하는 Actor입니다. 이는 일반적으로 Ability를 가진 Character나 NPC를 조종하는 Controller를 나타냅니다.

TWeakObjectPtr<AActor>	AvatarActor

Abliity가 적용되는 Avator입니다. 이는 Character의 외형, 즉 SkeletalMesh 또는 다른 비주얼 표현이 있는 Actor입니다.

TWeakObjectPtr<APlayerController>	PlayerController

Ability가 PlayerController에 의해 실행되는 경우, 그 Controller에 대한 참조입니다

TWeakObjectPtr<UAbilitySystemComponent>	AbilitySystemComponent

Ability가 실행될 때 사용되는 Ability System Component에 대한 참조입니다.

TWeakObjectPtr<USkeletalMeshComponent>	SkeletalMeshComponent

Ability가 적용되는 SkeletalMeshComponent에 대한 참조입니다.

TWeakObjectPtr<UAnimInstance>	AnimInstance

Ability가 적용되는 SkeletalMeshComponent의 AnimInstance에 대한 참조입니다.

TWeakObjectPtr<UMovementComponent>	MovementComponent

Ability가 실행될 때 해당 Actor 의 MovementComponent 에 대한 참조입니다.

FGameplayAbilityActivationInfo

Gameplay Ability가 어떻게 활성화되었는지에 대한 정보를 담고 있는 구조체입니다. 이 구조체는 Ability의 활성화 과정과 관련된 다양한 상태 정보를 저장하고, Ability가 어떤 방식으로, 어떤 상황에서, 누가 Trigger했는지를 결정하는 데 중요한 역할을 합니다.

FGameplayEventData

Game 내 Event를 나타내는 구조체입니다. 이 구조체는 Event가 발생했을 때 그 Event와 관련된 정보를 담고 있으며, Event 기반 시스템에서 다양한 처리를 가능하게 합니다.

profile
Programmer

0개의 댓글