Gameplay Ability System(GAS)의 학습을 하려고 했을 때
https://github.com/tranek/GASDocumentation?tab=readme-ov-file#setup
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. - tranek/GASDocumentation
github.com
ReadMe를 읽어보며 Lyra의 기본 프로젝트를 비교해가며 구조와 이론을 이해하려고 했음
먼저 ReadMe를 읽어보면서 GAS의 전반적인 구조를 이해하기 위해
쳇 GPT에게 Core Concepts 요약을 부탁
1. Ability System Component (ASC)
- GAS의 중심 컴포넌트로, 캐릭터나 액터에 부착되어 능력, 속성, 효과를 관리합니다.
- 능력 부여, 활성화, 복제, 속성 변경 감지 등의 기능을 제공합니다.
2. Gameplay Tags
- 계층 구조를 가진 문자열 태그로, 능력이나 효과의 조건부 실행, 상태 추적 등에 사용됩니다.
- 예: State.Stunned, Ability.Fireball 등.
3. Attributes
- 캐릭터의 체력, 마나, 스태미너 등 수치형 속성을 나타냅니다.
- 각 속성은 BaseValue와 CurrentValue를 가지며, 버프/디버프 등의 효과에 따라 변경됩니다.
4. Attribute Sets
- 속성들을 그룹화한 클래스로, ASC에 부착되어 속성 관리를 담당합니다.
- 여러 개의 Attribute Set을 사용할 수 있으며, 런타임에 추가/제거가 가능합니다.
5. Gameplay Effects
- 능력의 결과로 적용되는 효과로, 데미지, 회복, 버프, 디버프 등을 처리합니다.
- 즉시 적용(Instant), 일정 시간 지속(Duration), 무한 지속(Infinite) 등의 유형이 있습니다.
6. Gameplay Abilities
- 캐릭터가 수행할 수 있는 행동이나 스킬을 정의합니다.
- 능력은 ASC를 통해 부여되며, 입력이나 이벤트에 의해 활성화됩니다.
7. Gameplay Cues
- 이펙트, 사운드, UI 연출 등을 처리하는 시스템으로, 능력이나 효과의 시각적/청각적 표현을 담당합니다.
8. Ability Tasks
- 능력 실행 중 비동기 작업을 처리하는 구성 요소로, 입력 대기, 타겟팅 등 다양한 기능을 제공합니다.
9. Prediction & Replication
- 멀티플레이어 환경에서 클라이언트 예측과 서버 권한 처리를 통해 부드러운 게임플레이를 지원합니다.
- Prediction Key를 사용하여 클라이언트와 서버 간의 동기화를 관리합니다.
여기까지 봤을 때 원했던 구조가 아니라 이론적으로 이런식으로 나누어서 구현한다라는 느낌을 받음
그래서 시각화를 부탁
[캐릭터 or 액터]
│
▼
[Ability System Component]
├── Attribute Sets
│ └── Attributes (HP, MP 등)
├── Granted Abilities
│ └── Gameplay Ability
│ ├── Ability Tasks
│ ├── Trigger Gameplay Effect
│ └── Trigger Gameplay Cues
└── Handles Prediction & Replication
이것만 봐서는 바로 이해하기가 어려워 Ability System Component(ASC)부터 시작
Unreal 엔진의 GAS에서 **캐릭터(또는 액터)**에 부착되는 능력/속성/효과/이벤트 관리 전용 컴포넌트로
모든 능력과 효과는 ASC를 중심으로 작동
역할
| 능력 부여 | 어떤 Ability를 사용할 수 있을지 ASC가 저장 |
| 능력 실행 | 키 입력 또는 조건 충족 시 ASC가 Ability를 실행 |
| 속성 관리 | 체력, 마나 등의 Attribute 값을 추적하고 변경 감지 |
| 효과 적용 | GameplayEffect를 통해 데미지, 힐, 버프 등을 처리 |
| 태그 처리 | GameplayTag를 통해 상태 추적 및 조건 제어 |
| 예측 & 복제 | 멀티플레이에서 서버/클라이언트 상태를 일치시킴 |
| 이벤트 브로드캐스트 | Attribute 변화, 태그 변경 등을 UI나 로직에 전달 |
흐름 (제가 이해한 내용을 토대로 흐름을 문서화?)
1. 먼저 캐릭터를 생성할 때 ASC를 부여

2. ASC를 이용해 사용할 능력 부여

3. 입력처리 -> 특정 키 입력시 어빌리티 호출
* 이 부분에서 태그를 저장한 변수를 가지고 호출할 수 있을 것 같음
* 인스턴스 같은 곳의 태그 변수를 가지고 다음 레벨로 넘어가서 ASC를 초기화가 되어도 사용할 수 있지 않을까?
-> Lyra도 ULyraInputConfig에서 InputTag를 변수화하여 관리하고 있다고 함(구현을 하게될 시 참고가 될 것 같음)

4. 어빌리티가 호출되었을 때 어빌리티에 맞는 애니메이션 등 실행
* 타격에 대한 어빌리티를 호출
-> 공격 어빌리티에서 타격판정을 한 번에 처리
-> 타격 어빌리티를 따로 만들어 관리해도 무관

5. 공격 어빌리티에서 호출된 타격 어빌리티로 타격시 상대방의 ASC 값을 가져와 적용

6. 타격 판정이 되어 상대방의 ASC를 가져왔을 때 상대방 ASC의 어빌리티 호출
* 내가 맞았을 때가 아닌 때렸을 때 호출하는 것이라
다른 오브젝트, AI에서 타격시 ASC를 가져오기만 하면 되는 조금 더 단순해지는 느낌을 받음

7. 변경된 스텟을 가지고 UI 업데이트

** Lyra는 이걸 더 세분화해서 WeaponData, AbilitySet, InputTag 시스템으로 분리
이것을 토대로 캐릭터나 AI와 같은 상태에 따라 가져야될 어빌리트를 가지지 않은
단순한 오브젝트의 경우 어떤 식으로 구현하게 될까를 고민
-> 밟으면 피가 깍이는 함정을 예시로 밟는 판정까지는 GAS를 생각하지 않고 구현
피가 깍이는 부분을 상대방의 ASC의 스텟 어빌리티를 가져와 적용
이론상으로는 이런 식으로 정리를 해보았지만 정확한지는 판단되지는 않음
유데미 멀티 강의를 통해 구현에 대한 경험과 멀티에 대한 지식을 쌓고자 합니다
'C++' 카테고리의 다른 글
| 클린코드 (0) | 2025.03.27 |
|---|---|
| 디자인 패턴 (0) | 2025.02.20 |
| Overlap 매개변수 (0) | 2025.02.12 |
| STL 반복자(연산) (0) | 2025.01.27 |
| 포인터와 참조 / 스마트 포인터 (0) | 2025.01.20 |