언리얼 엔진의 게임플레이 어빌리티 시스템 | 언리얼 엔진 5.4 문서 | Epic Developer Community
게임플레이 어빌리티 시스템 개요
dev.epicgames.com
언리얼 엔진 게임플레이 어빌리티 시스템을 살펴봅니다. | 언리얼 엔진 5.4 문서 | Epic Developer Commu
게임플레이 어빌리티 시스템 및 각 컴포넌트 클래스가 어빌리티에 기여하는 방법을 살펴봅니다.
dev.epicgames.com
Gameplay Ability란?
- RPG나 MOBA의 Ability, Attribute 구축을 지원하는 고도로 유연한 Framework
- 다양한 인게임 Ability를 설계, 구현하고 효과적으로 연결할 수 있도록 기능을 지원
- Action의 결과로 다양한 Attribute를 조절하거나 Effect를 생성
- Timer나 자원 비용을 구현하여 Action의 빈도 조절
- Ability의 Level과 그에 따른 Effect 변경
- Particle 및 Sound Effect를 활성화
- 점프와 같은 단순한 Action 기능
- Gameplay Ability System과 상호작용하는 Actor에는 Ability System Component가 있어야 한다.
- Ability를 활성화
- Attribute 저장
- Effect Update
- Actor간 상호작용 처리
- Game Ability System을 생성하고 Ability System Component가 있는 Actor를 생성하면
Ability를 생성하고, Actor가 Ability에 어떻게 반응하는지 결정할 수 있다.
Gameplay Ability
- UGameplayAbility를 상속받은 Class나 BP들을 지칭
- 특정 Ability에서 어떤 역할을 하는지 정의
- 해당 Ability의 Replication과 Instancing Activity와 같은 요소가 어떻게 처리될지 정의
Ability Task
- Gameplay Ability에서 호출하는 일련의 비동기 구성 요소
- UAbilityTask Class를 상속 받음.
- C++로 작성된다.
- 작업이 끝날 때 cpp의 Delegate나 BP의 출력 실행 핀을 호출한다.
Gameplay Attribute
- FGameplayAttribute 구조체에 저장되는 float 값
- Game이나 Actor에 특정한 방식으로 영향을 미치는 값들
- 캐릭터의 health, power, jump height 등의 수치들이 이에 해당한다.
Gameplay Effects
- Gameplay Attribute를 변경하는 수단
- 즉시 변경할 수도 있고, 일정 시간동안만 변경할 수도 있다.
- 후자는 버프/디버프
Owner Tracking
- Ability와 Effect는 "Owner"라는 개념을 유지해야 한다.
- Effect가 계산을 수행할 때에는 Owner가 누구인지 알아야 Attribute를 사용할 수 있다.
- 이 때 Owner는 Network Replication의 것과 다르다.
State Tracking
- Ability는 다음과 같은 State 순환을 Tracking 할 수 있어야 한다.
- Ability가 활성화 된 시점
- Ability의 실행이 현재 진행중인 시점
- Ability가 완전히 완료되고 더 이상 활성화되지 않은 시점
실행 조정하기
- Ability는 실행 도중 특정 타이밍에 System과 다양한 Interaction을 할 수 있어야 한다.
- Animation Montage 활성화
- Character의 Movmenet를 일시적으로 제어
- Visual Effect Trigger
- Overlap 및 Collision Effect 수행
- 일시적 혹은 영구적으로 Attribute 변경
- 인게임 Resource 증감
- 다른 Ability 활성화 허용 또는 차단
- Ability 사용을 제한하기 위한 쿨다운 처리
- 인게임 Evnet에 의한 중단
- 진행 중인 다른 Ability 취소
- Character의 주요 State 변경사항 적용
- 새로운 MovementMode 활성화
- 다른 Interaction 도중 입력에 반응
- UI에 Ability의 인게임 상태 전달
시스템 구성
- Edit -> Plugin에서 Gameplay Abilities를 검색해 활성화, Editor 재시작
- [MyProjectName].Build.cs에 다음 항목 추가
- GameplayAbilities
- GameplayTags
- GameplayTasks
Various Components of Gameplay Ability System
Owner Tracking
- Gameplay Ability를 사용하기 위해서는 Ability System Component를 Actor에 Attach해야 한다.
- Ability System Component는 다음 기능을 제공한다.
- Actor에 Ability 추가/제거
- Actor가 소유한 Ability가 무엇인지 지속적으로 Tracking, 활성화
- Ability system의 Context에서 소유 Actor를 나타내는 주요 수단
- 다양한 요소를 Tracking하기 위한 System과 소유 Actor에 직접 Access하기 위한 Interface 제공
- Attribute
- 진행중인 Effect
- Gameplay Tag
- Gameplay Effect
- Multiplayer Game 환경에서 Ability System Component는 다음 기능또한 제공한다.
- Client 정보 Replicate
- Server에 Player Action 전달
- Client가 Ability System Component의 State를 변경 할 권한이 있는지 확인
- Ability System Component의 부모 Actor는 원격 활성화를 수행하기 위해 로컬에서 제어되는 Player가 소유해야 한다.
Ability 활성화 및 실행 처리
- Gameplay Ability는 Ability의 모든 Event를 실행하는 것을 담당하는 BP Object이다.
- Animatino 재생
- Effect Trigger
- Owner로부터 Attribute 가져오기
- Visual Effect 표시
Ability 활성화 제어
- Gameplay Ability를 활성화 할 경우 System은 Ability가 진행중인 것으로 인식
- 이후 활성화 Event에 Attach 된 Code를 실행해 완료 함수를 호출
- Ability의 실행이 완료됨을 알리기 전까지 각 함수와 Gameplay 작업을 거쳐 이동
- 정리 작업을 추가로 징행해야 하는 경우 완료 시 Event에 Code를 추가로 Attach 할 수 있다.
- Ability를 취소하여 실행을 중단할 수 있다.
- Gameplay Ability는 Gameplay Tag를 사용하여 실행하는 것을 제한한다.
- 모든 Ability는 활성화 될 때까지 2가지 Tag 목록을 가지고 있는다.
- 소유 Actor에 추가하는 Tag 목록
- 활성화를 차단하거나 Ability를 자동으로 취소하는 Tag 목록
- 모든 Ability는 활성화 될 때까지 2가지 Tag 목록을 가지고 있는다.
- 자체 Code로 Ability 실행을 수동을 취소/차단/허용 할 수 있다.
- Gameplay Ability는 다음 4가지 방법을 통해 활성화 할 수 있다.
- Gameplay Ability Handle
- BP나 C++에서 Ability를 명시적으로 활성화
- Ability가 부여될 때 Ability System Component에 의해 제공 됨
- Gameplay Event
- 일치하는 Ability Trigger로 모든 Ability를 실행
- Input/Define Machanism을 추상화해야 하는 경우에 유연성 극대화를 위해서는 이 방식을 적극 권장 함
- 일치하는 Tag와 함께 Gameplay Effect
- 일치하는 Ability Trigger로 모든 Ability 실행
- GamePlay Effect의 Trigger Ability를 끄려는 경우 선호 됨
- 비활성화 된 Animation을 재생하고 다른 Game Action을 차단하는 Ability를 Trigger하는 Sleep Deburf
- Input Code
- Ability system Component에 의해 추가 됨
- 호출 시 일치하는 모든 Ability Trigger
- Gameplay Event와 유사
- Gameplay Ability Handle
Ability 실행 제어
- Gameplay Ability는 일반적으로 사용되는 다양한 사용 사례와 기능을 제공
- Cooldown
- Resource 비용 할당
- Animation
- 기타 일반적인 Unreal Engine System을 처리하는 Preprocessed Gameplay Ability Working Library
- 표준 BP Function Node가 실행을 즉시 종료할 때 상태를 계속 Tracking 하며 도중에 다른 Event를 실행
- 부모 Gameplay Ability가 적절하게 취소되고 정리되었는지 Tracking 가능
- Game에서 Gameplay Ability 작업을 확장해 Custom Gameplay Logic 구현하는 것이 일반적인 용례이다.
- 소유 Actor에서 Gameplay Tag와 Event Data Struct를 수신하기 위해 대기하는 Gameplay Event에 응답 가능.
Attribute Set 및 Attribute
- Gameplay Attribute System은 Attribute로 구성된 Attribute Set를 통해 Actor와 Interact한다.
- Attribute Set은 계산에 사용되는 소수값으로, 보통 핵심 통계값을 Tracking 하는데 사용된다.
- 기본 변수 대비 Gameplay Attribute 사용을 했을 시 얻는 이점이 몇가지 있다.
- System을 Build할 수 있는 일관적이고 재사용 가능한 Attribute Group을 제공
- Reflection을 통해 Access 할 수 있어 BL Editor에서 간단한 계산과 Effect 생성 가능
- Default/Current/Max Value를 별도로 Tracking해 일시적인 수정 및 지속적인 Effect를 쉽게 생성
- 값을 Client에 Replicate해 UI 시각화에 안전함
- Actor에서 Gameplay Ability를 사용하려면 Ability System Component에 Attribute Set을 추가해야 한다.
- 그러면 Ability System Component는 Attribute Set에 할당된 Attribute에 Access할 수 있게 된다.
Gameplay Effect 처리
- Gameplay Ability System은 Gameplay Effect를 사용해 Target Actor에 변경사항을 적용한다.
- Damage 적용
- 지속되는 Effect를 적용하는 One-shot Effect
- 이 경우에 Gameplay Effect는 제거될 때까지 Target Actor에 자신을 Attach한다.
- 만료되거나 정리되기 전까지로 제한된 수명을 미리 설정 할 수 있다.
- 혹은 Target Actor의 Gameplay attribute에 적용된 변경사항을 실행 취소할 수도 있다.
- Gameplay Effect는 Attribute에 기반하여 계산을 한다.
- BP Editor에서 간단하게 계산을 직접 생성할 수도 있다.
- 하지만 복잡한 로직을 가지고 있고,
다수의 Attribute에 동시에 영향을 미치는 Custom Effect 계산은 C++로 작업하는 것이 적절하다.
- 보통 Gameplay Ability의 Owner Actor와 Target Actor 모두에서 정보를 처리할 수 있다.
- 그렇기에 일반적으로 계산을 재사용이 가능한 코드로 결합할 수 있다.
Cosmetic Effect 처리
- Gameplay Queue는 Visual Effect와 Sound Effect 실행을 담당하는 Actor 및 UObject이다.
- Multiplay Game에서는Cosmetic Feedback을 Replicate하는데 선호되는 Method이다.
- 생성할 때 Event Graph 내에서 재생할 Effect를 위한 Logic을 실행
- 일련의 Gameplay Tag와 연관될 수 있으며, 일치하는 Gameplay Effect를 자동으로 적용한다.
- Gameplay Queue는 신뢰할 수 있는 Replication을 사용하지 않는다.
- 때문에 일부 Client가 Queue를 수신하지 못하거나, Feedback을 표시하지 못하는 경우가 있다.
- Gameplay Code와 결합되어 있는 경우 이 때문에 동기화가 해제될 수 있다.
- 따라서 Gmaeplay Queue는 Cosmetic Effect에서만 사용되어야 한다.
- 모든 Client가 Replicate 되어야 하는 경우에는 Replication 처리를 위해 Ability 작업에 의존해야 한다.
- Montage 재생 Ability 작업이 이에 적합한 예시이다.
Network Multiplay
Ability System Component 및 Replication
- Ability System Component가 모든 Component에 전체 State를 Replicate하면 안된다.
- 대역폭 절약 및 부정행위 방지 목적
- 모든 Client에 Ability와 Gamplay Effect를 Replicate하면 안된다.
- 영향을 받는 Gameplay Attribute와 Tag만 Replicate 해야 한다.
Ability Replicate 및 Prediction 사용
- Network Game의 Ability 대부분은 Server에서 실행되고 Client로 Replicate되어야 한다.
- 이로 인해 Ability 활성화에 지연이 발생하는 것은 일반적인 현상이다.
- 만약 빠른 속도로 진행되어야 하는 Multiplay Game의 경우 Ability를 Local로 활성화 하고,
그 사실을 Server에 전달해 동기화 하는 방식을 사용한다. - Server가 Ability 활성화를 거부하는 경우 Local로 적용한 변경사항을 실행 취소해야 한다.
- 일부 Gameplay Effect의 경우 Server에 의해 거부된 경우에 대한 롤백 기능을 지원한다.
- 대부분의 즉각적이지 않은 Gameplay Effect가 포함된다.
- Damage나 즉각적인 기타 Attribute/Tag 변경사항은 제외된다.
Server가 소유한 Object와 Interact 하기 위한 Ability 사용
- Gameplay Ability는 Bot, NPC, Server 소유의 기타 Actor 및 Object와의 Interact를 처리할 수 있다.
- 이는 Local 소유의 Actor(Player/Pawn), Replicated Ability, 비 GAS Server RPC를 통해 수행되어야 한다.
- 위 호출은 Interaction을 Server에 Replicate한 다음 NPC와의 변경사항을 수행하는 권한을 가진다.
'UE5 > GAS' 카테고리의 다른 글
[GAS] Ability Task (0) | 2024.05.16 |
---|---|
[GAS] Gameplay Effect (0) | 2024.05.15 |
[GAS] Attribute Set (1) | 2024.05.14 |
[GAS] Gameplay Attribute (0) | 2024.05.13 |
[GAS] Ability System Component (0) | 2024.05.13 |