일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- two characters
- c++
- boj 6443
- pcce 기출문제 풀이
- DirectX12
- count triplets
- special string again
- 프로그래밍공부
- 브루트포스
- lock based stack
- dp
- ice cream parlor
- the longest increasing subsequence
- 2025 프로그래머스 코딩챌린지 1차예선
- gas
- making anagrams
- DirectX
- lock based queue
- find the town judge
- LCS
- string construction
- pccp 기출문제 풀이
- boj 11657
- PCCE
- the maximum subarray
- 지게차와 크레인
- lock free stack
- find the running median
- boj 1074
- boj 1717
- Today
- Total
오구의코딩모험
[GAS] 프로젝트 설정 및 캐릭터 구성하기 본문
프로젝트 설정
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를 만들기 시작하면 됩니다.
여기서 ASC는 Ability 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 리스트 변경 중 충돌 방지 목적)
- FActiveGameplayEffectsContainer ActiveGameplayEffects
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로 해두면 클라이언트도 먼저 실행해서 빠른 반응이 가능합니다.
→ 서버는 나중에 이를 승인 또는 거부함
캐릭터 기본 구성 코드
Update c++ code · Kyungbaee/Forever-Planet@5781e56
+ Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
github.com
점프 코드
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 |
---|