오구의코딩모험

[GAS] 프로젝트 설정 및 캐릭터 구성하기 본문

Game/GAS

[GAS] 프로젝트 설정 및 캐릭터 구성하기

오구.cpp 2025. 5. 11. 18:09
반응형

 

 

 

프로젝트 설정

 

 

GAS는 언리얼 엔진에서 플러그인으로 제공하고 있다.

따라서 사용하고자 할 때, 플러그인 추가와 프로젝트 설정이 필요합니다.

 

 

1) 에디터에서 GameplayAbilitySystem 플러그인 활성화

 

 

2) [YourProjectName].Build.cs 파일의 PuplicDependencyModuleNames에 "GameplayAbilities", "GameplayTags","GameplayTasks"을 추가

 

 

3) Visual Studio 프로젝트 파일 새로 고침/재생성.

 

4) UE 4.24 ~ 5.2 버전은 UAbilitySystemGlobals::Get().InitGlobalData()를 호출하여 TargetData를 사용합니다. 샘플 프로젝트는 이 작업을 UAssetManager::StartInitialLoading()을 수행합니다.

 

 

4번까지의 작업이 끝났다면 이제 Character 혹은 PlayerState에 ASC와 AttributeSet을 추가하고

GameplayAbilities 및 GameplayEffects를 만들기 시작하면 됩니다.

 


 

 

여기서 ASCAbility System Component 를 의미합니다.

 

 

  • ASC란?
    *Gameplay Ability System(GAS)*의 핵심 UActorComponent로, 능력(Abilities), 속성(Attributes), 효과(Effects) 등을 관리, 처리, 리플리케이트합니다.
  • 필수 조건
    GAS 기능(Ability, Attribute, Effect 등)을 사용하려는 모든 액터는 ASC를 반드시 하나씩 가져야 합니다.
    ASC는 서브클래싱 권장하지만 필수는 아니다.
  • OwnerActor & AvatarActor
    • OwnerActor: ASC를 소유한 주체 (ex. PlayerState)
    • AvatarActor: 물리적으로 표현되는 액터 (ex. Character)
    • 둘이 다를 경우, 모두 IAbilitySystemInterface를 구현하고 GetAbilitySystemComponent()를 오버라이드해야 합니다.
  • PlayerState에 ASC를 둘 경우
    • 액터의 스폰과 리스폰 사이에 Attributes 또는 GameplayEffects의 지속성을 유지할 수 있습니다.
    • NetUpdateFrequency를 기본보다 높게 설정 또는 Adaptive Network Update Frequency를 활성화해야
      속성 및 태그의 동기화 지연 문제를 방지할 수 있습니다.
  • ASC 내부 구조
    • FActiveGameplayEffectsContainer ActiveGameplayEffects
      → 현재 적용 중인 GameplayEffect 저장합니다.
    • FGameplayAbilitySpecContainer ActivatableAbilities
      → 보유 중인 Gameplay Abilities 저장합니다.
      → 반복 처리 시 ABILITYLIST_SCOPE_LOCK();을 반드시 사용 (Ability 리스트 변경 중 충돌 방지 목적)

 

 

ABILITYLIST_SCOPE_LOCK()은 RAII (Resource Acquisition Is Initialization) 패턴입니다.

= “리소스의 획득과 해제를 객체의 생성자와 소멸자에서 책임진다"

 

void UMyAbilitySystemComponent::RemoveSpecificAbilities()
{
    // 목록 순회 중이므로 락을 건다
    ABILITYLIST_SCOPE_LOCK(); // AbilityScopeLockCount++

    for (const FGameplayAbilitySpec& Spec : ActivatableAbilities.Items)
    {
        if (Spec.Ability->GetName().Contains(TEXT("Fire")))
        {
            // 여기서 직접 제거하면 안 됨! 
            // RemoveActiveGameplayAbility는 내부적으로 ScopeLock을 체크하여 즉시 제거를 막고 지연시킴
            ClearAbility(Spec.Handle);
        }
    }

    // 스코프가 끝나면 AbilityScopeLockCount--
    // 만약 위에서 제거 예약한 게 있다면 이 시점에서 처리됨
}

 

 

 

캐릭터 구성

 

언리얼 엔진의 GAS (Gameplay Ability System) 플러그인 자체에는

공격, 이동, 점프 같은 구체적인 기능은 포함되어 있지 않습니다.

 

 

GAS는 아래와 같은 프레임 워크를 제공하고 있습니다.

 

  • Gameplay Ability: 특정 행동(예: 공격, 점프 등)을 정의하는 클래스
  • Gameplay Effect: 스탯 변화(예: 데미지, 버프/디버프 등)를 처리
  • Attribute System: 체력, 마나, 스태미너 등 수치 관리
  • Tag & Cooldown 시스템: 행동 제어, 조건 설정 등

 

 

 

따라서 공격이나 점프 같은 기능은 'Gameplay Ability'상속받아 직접 구현해야 합니다.

 

ex)

  • UGameplayAbility_Attack 클래스를 만들어 공격 애니메이션과 히트 판정, 데미지 효과를 처리
  • UGameplayAbility_Jump를 만들어 점프 입력을 처리

 

<점프 기능 흐름 요약>

클라이언트:
[Input] → [Enhanced Input] → [TryActivateAbilityByClass()] → [LocalPredicted Jump()]

서버:
[PossessedBy()] → [ASC Init + GiveAbility] → [TryActivate 승인] → [Jump()] → [Replicate Movement]

 

 

1. 캐릭터가 생성되고 입력을 받기 위한 기본 구조

  • BeginPlay()에서 Enhanced Input 시스템의 Input Mapping Context를 등록하여 입력을 받을 준비를 합니다.
  • InputAction을 실제 함수와 연결해 입력을 감지합니다.

2. 점프 입력 발생 → GAS 실행

  • 플레이어가 특정 키를 누르면 PlayerState에서 ASC를 얻어 TryActivateAbilityByClass()로 점프 Ability 실행을 시도합니다.

3. GAS Ability 실행 조건과 흐름

  • Ability는 사전에 ASC에 등록되어 있어야 실행 가능합니다.
    (GiveAbility()는 서버에서 실행, PossessedBy() 내부에서 수행)
  • ASC는 서버와 클라이언트 모두 OwnerActor 및 AvatarActor를 사용하여 초기화해야 합니다.
    (InitAbilityActorInfo()를 통해 PS와 AvatarActor 연결)
    이 작업은 서버에서는 PossessedBy(), 클라이언트에서는 OnRep_PlayerState()에서 수행하였습니다.
  • (ASC가 Pawn에 있는 경우 서버에서 Pawn의 PossessedBy(), 클라이언트에서는 AcknowledgePossession() 에서 초기화)

4. 점프 Ability의 실행

  • Ability의 ActivateAbility() 함수가 호출되면 Jump 함수를 실행해 실제 점프 동작을 수행합니다.
  • GAS 설정을 NetExecutionPolicy = LocalPredicted로 해두면 클라이언트도 먼저 실행해서 빠른 반응이 가능합니다.
    → 서버는 나중에 이를 승인 또는 거부함

 


 

캐릭터 기본 구성 코드

https://github.com/Kyungbaee/Forever-Planet/commit/5781e56b637053100da33b4f9a57ce347c0f9987#diff-d0ace3373633f020a8ea24f4f32772acf1297dd75a2eae9238cf782a6080acf4

 

Update c++ code · Kyungbaee/Forever-Planet@5781e56

+ Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);

github.com

 

점프 코드

https://github.com/Kyungbaee/Forever-Planet/commit/5781e56b637053100da33b4f9a57ce347c0f9987#diff-6ea682b9dd8a1ce590a51441b97ae0b088369549c441dc2a1bb2f0e7f0850bb4

 

Update c++ code · Kyungbaee/Forever-Planet@5781e56

+ Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);

github.com

 

반응형

'Game > GAS' 카테고리의 다른 글

[GAS] Gamplay Tags를 활용한 이벤트 구현  (0) 2025.05.16
Comments