2025. 5. 21. 15:13ㆍ원티드_언리얼RPG 2기/언리얼
참고자료 : https://youtu.be/Jd8KjxNe4EU?si=QKWRq6pW8SmL0iaz
https://github.com/tranek/GASDocumentation?tab=readme-ov-file#table-of-contents
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
GAS 란?
GAS는 복잡한 기술, 행동, 버프 등을 효율적으로 관리할 수 있게 해주는 프레임워크이다. 캐릭터 클래스에서 직접 모든 전투 액션을 처리하면 코드가 복잡해지고 유지보수가 어렵다. GAS를 사용하면 이러한 로직을 모듈화하여 관리하기 쉽게 만들 수 있다.
GAS의 핵심 구성요소
Ability System Component(ASC)
- GAS의 가장 중심이 되는 컴포넌트
- 액터(캐릭터 등)에 부착되어 Ability, Attribute, Effect등을 관리하고 GAS 시스템과의 모든 상호작용을 처리
Ability, Attribute, Effect, Tag, Cue
- Ability
- 플레이어의 행동 및 동작
- 코스트, 쿨다운, 실행조건을 가질 수 있음
- Tag로 활성화/차단 가능 (공격중 대쉬 스킬 사용 -> 공격을 중지하고 대쉬)
- 향상된 입력 시스템을 추가해서 액션 바인딩 가능
- Attribute
- Attribute 혹은 AttributeSet
- 구조체에 의해 정의되는 값 (Hp, Str, 공격속도 ...)
- 액터의 수치적 속성 (예: 체력, 마나, 공격력, 방어력)을 정의하고 관리
- Effect
- 단일 게임플레이 효과를 정의하는 데이터 전용 클래스
- 피해나 치유같은 즉각적인 변화를 일으키거나 버프/디버프를 적용
- Tag(상태) / Attribute(값) 을 변경
// Effect의 종류
Instant: 즉시 적용되고 사라지는 효과 (데미지, 힐링)
Duration: 일정 시간 동안 지속되는 효과 (버프, 디버프)
Infinite: 명시적으로 제거될 때까지 지속되는 효과 (상태 변경)
Periodic: 일정 주기로 반복 적용되는 효과 (도트 데미지, HOT)
- Tag
- 게임플레이 태그 (언리얼 범용태그)
- 상태, 유형, 속성 등을 식별하고 분류
- FName 기반
- Tag Container 존재
- FTag Container의 내부함수인 Tag 비교함수로 상태확인 (Tag 쿼리 사용)
- HasTag (부분적 포함)
- "Insect.Ant" <- HasTag("Insect") : True
- "Insect.Mammal" <- HasTag("Insect.Ant) : False
- HasTag Exact (단일 Tag 명시적 포함 유무)
- 하위 태그 까지 명시해줘야 함
- "Insect.Ant" <- HasTagExact("Insect") : False
- "Insect.Ant" <- HasTagExact("Insect.Ant"): True
- Has All ( 지정된 모든 태그를 (계층 구조를 포함하여) 가지고 있는지 확인)
- 소유한 태그 목록에 해당 태그 또는 하위 태그 모두 만족 해야함
- "Creature.Mammal.Dog", "Attribute.IsPoison" <- HasAll( "Creature.Mammal", "Attribute" ) : True
- "Creature.Insect.Ant" <- HasAll( "Creature.Insect", "Attribute.CanFly" ) : False
- Has All Exact (지정된 모든 태그를 (정확히 일치하는 형태로) 가지고 있는지 확인)
- "Creature.Insect.Ant", "Attribute.IsPoison" <- HasAllExact( "Creature.Insect.Ant", "Attribute.IsPoison" ) : True
- "Creature.Insect.Ant", "Attribute.IsPoison" <- HasAllExact("Creature.Insect", "Attribute.IsPoison" :False - 첫번째 태그 조건 불충족
- HasTag (부분적 포함)
- 어빌리티 태그 (GAS 전용)
- 어빌리티가 활성화될때 나타나는 태그
- 공격 도중 대쉬: 공격 취소 후 대쉬
- 스턴 상태: 스턴상태면 공격 불가
- 속성 공격: "언데드" 태그에만 효과가 있는 "힐"
- 어빌리티가 활성화될때 나타나는 태그
- 게임플레이 태그 (언리얼 범용태그)
- GamePlay Cue
- Gameplay Cue는 이펙트, 사운드, 카메라 셰이크 등 시각적/청각적 효과를 처리
- Effect나 Ability에서 트리거될 수 있으며, 네트워크 최적화가 되어 있음
- 순수하게 시각/청각적 표현을 위한 것으로 게임플레이 로직에는 영향을 주지 않음
OnHit 같은 간단한 피격로직을 GAS로 구현하는이유
- 확장성과 일관성:
- 단순 데미지 처리를 넘어 상태 이상, 저항, 면역 등 복잡한 효과를 일관된 방식으로 관리
- 새로운 효과나 능력을 추가할 때 기존 코드 수정 없이 확장 가능
- 데이터 주도 설계:
- 효과, 능력, 속성 등을 데이터로 정의하여 프로그래머가 아닌 기획자도 수정 가능
- 블루프린트로 많은 부분 구현 가능하여 프로토타이핑과 이터레이션 속도 향상
- 네트워크 최적화:
- GAS는 네트워크 복제를 효율적으로 처리하도록 설계됨
- 예측, 롤백 등의 네트워크 동기화 메커니즘 내장
- 상태 관리 용이:
- Tag 시스템을 통해 캐릭터의 다양한 상태를 쉽게 관리
- "스턴 중에는 공격 불가", "넉백 중에는 이동 불가" 등의 복잡한 상태 규칙을 태그로 간단히 처리
- 복잡한 상호작용 처리:
- 데미지 감소, 반사, 면역 등 다양한 방어 매커니즘 구현
- 효과 스택킹, 중첩, 대체 등의 복잡한 룰 관리
- 모듈화 및 재사용성:
- 한 번 구현한 능력이나 효과를 다양한 캐릭터에 쉽게 적용 가능
- 테스트와 디버깅이 용이한 분리된 컴포넌트 구조
//간단한 피격로직
void AMyCharacter::TakeDamage(float Damage)
{
Health -= Damage;
if(Health <= 0)
Die();
}
게임이 복잡해진다면 고려해야할 사항들
- 방어력에 따른 데미지 감소
- 속성(불, 물, 전기 등)에 따른 데미지 변화
- 방어력 관통, 치명타 등의 특수 효과
- 특정 상태일 때 데미지 면역/감소/증가
- 피격 시 발동되는 패시브 스킬
- 피격 애니메이션과 이펙트 동기화
- 네트워크 상에서의 동기화
이런 복잡한 요소들을 모두 고려하면 단순한 OnHit/GetHit 함수는 금방 복잡해지고 유지보수가 어려짐.
GAS는 이러한 복잡성을 체계적으로 관리할 수 있는 구조를 제공함
작은 규모의 게임이나 프로토타입에서는 OnHit/GetHit으로 충분할 수 있지만, 규모가 큰 게임이나 복잡한 전투 시스템을 가진 게임에서는 GAS의 사용이 장기적으로 더 효율적이다.
'원티드_언리얼RPG 2기 > 언리얼' 카테고리의 다른 글
데이터 테이블 VS 데이터 에셋 (2) | 2025.06.06 |
---|---|
GAS(GameplayAbilitySystem) - 2편 (0) | 2025.05.21 |
데이터 테이블 관리하기 (0) | 2025.05.20 |
언리얼 엔진 리플렉션 시스템의 기본 개념 (0) | 2025.05.14 |
언리얼 5 향상된 입력 시스템(Enhanced Input System) (1) | 2025.05.07 |