관리 메뉴

기억을 위한 기록들

[Game Ability System] #2. 어떤게 있고, 어떻게 사용 할지? 본문

UnrealEngine/Game Ability System (GAS)

[Game Ability System] #2. 어떤게 있고, 어떻게 사용 할지?

에드윈H 2024. 1. 18. 18:29

 

Game Ability System 플러그인을 활성화 한다면 사용 할 수 있는 클래스들이 어떤것이 있고 주로 어떻게 사용할까에 대해 써보려고 한다.

 

 

Ability System Component (ASC)

- 액터에 추가 할 수 있는 컴포넌트

- 액터에 붙임으로 인해 GAS 프레임워크랑 상호작용 할수 있게 해준다.

- GAS와 상호 작용하기를 원하는 액터는 자체 ASC 또는 다른 Actor가 소유한 ASC에 액세스해야 합니다.

- 능력 부여, 해당 능력 활성화, 알림처리 등 게임플레이 Ability 시스템

 

AttributesAttribute Set

- 특정 캐릭터나 오브젝트와 연관되는 다양한 속성들 모음. (ex 체력, 마나 등등)

- 모든 값들은 float다 (스마트하다)

- 현재 값과 기본값이 있다.

- 게임플레이 attribute 데이터 구조 안에 존재한다.

- 모든 속성은 속성 셋(Attribute Set)에 저장되며 속성들을 관리한다.

- 값들이 변경되는 시점을 파악하고 원하는 기능으로 이에 대응 할 수 있다.

- 속성 값을 코드에서 직접 설정 할 수도 있지만, 변경하는 제일 좋은 방법으로는 GamePlayEffect이다.

 

Gameplay Ability (GA)

- 캐릭터나 오브젝트가 게임에서 할 수 있는 일종의 기능을 캡슐화하는 데 사용하는 클래스입니다.

- 게임플레이 메카닉을 위한 자체 로직이다.

- 문자 그대로 캐릭터의 능력(Ability)만 포함된건 아니다.( 전형적인 게임에서 마법을쓰거나, 공격하거나 말고도 기본적인 달리거나, 걷거나, 반응적은 행동 등)

-  Ability Task 라는 클래스를 통해 비동기 작업을 실행합니다. (실제 작업자와 같다)

 

-Lyra 프로젝트 캐릭터 초기화 데이터 중 GA 관련 데이터 참고

 

Gameplay Effect (GE)

- 속성(Attribute)의 값을 변경하는 데 사용되는 방식이고, 속성 (Attribute) 과 관련된 여러 가지 다양한 것이 가능하다. 값을 직접 변경하고, 시간에 따라 변경하고, 주기적으로 증가 또는 감소하며, 이러한 속성 (Attribute) 변경을 다른 매개 변수 및 속성 (Attribute) 을 고려한 다양한 계산과 연관시킨다. ( Modifiers와 Executions을 통해서)

- Modifiers는 속성이 변경되는 시점에 대한 보다 복잡한 사용자 정의 계산을 포함하며 다양한 종류가 있다.

- Add
- Multiply
- Divide
- Override

 

이렇게 사용되는 값들은 아래 종류별에 따라 산정된다.

Magnitude Calculation Type(크기 계산 유형)
- Scalable Float
- Attribute Based
- Custom Calculation Class(MMC)
- Set By Caller

 

더 다양하게 수정하는 방법은 커스텀 Executions을 통해서이다.

-Gameplay
-Effect
-Execution
-Calculation

 

- Duration Policy로는 Instant, Has Duration, Infinite가 있다.

- 효과가 중첩될수도 있다.(Stacking)

- GA에 영향을 주고 Gameplay Tag 또 한 추가 및 변경 할 수 있다.

- 쉽고 자유롭게 적용할 수 있는, 블루프린트 데이터 오브젝트 (Data Object) 이다. 

- UGamePlayEffect 클래스 기반

 

Gameplay Cue

- 이펙트 시스템 및 사운드와 같은 꾸며주는 효과를 처리하는 역할을 한다. (FX의 래퍼(warpper이다))

- 비주얼 이펙트와 사운드 이펙트를 GA나 이펙트의 로직에서 분리하기에 좋은 방법이다.

 

 

Gameplay Tag

- GAS 시스템에 고유한 기능은 아니지만 필수적으로 사용되고 있고, GAS 시스템 외부에 존재함으로써 별도로 사용 할 수 도 있다.

- 기본적으로 이름으로 되어 있다.

- GamePlayTagManager에 의해 관리 된다.

- 필수는 아니지만, 3단계 계층구조로 가능하다. (ex Abilites.Fire.Impact 혹은 Abilites.BaseAttack )

- GameAbilitySystem은 거의 모든 클래스에서 게임플레이 태그를 사용 하도록 설계되어 있다.

- Ability System Component에 고유 태그를 부여해준다.

결과적으로 GAS 프레임워크 외부에 존재하는 시스템으로서 별도의 글로 작성했다. 

그외 : 

https://hyo-ue4study.tistory.com/604

 

[Game Ability System] #3. GamePlayTag에 관해

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/Tags/ 게임플레이 태그 게임플레이 태그는 오브젝트 식별, 분류, 일치, 필터링에 사용 가능합니다. docs.unrealengine.com 사용자 정의 이름을 붙인 개념적

hyo-ue4study.tistory.com

 

 

이런 클래스 및 개념들이 존재하는데, 주로 사용하는것은 Ability System Component  컴포넌트이다. 해당 컴포넌트에 필요한 AttributeSet 데이터 클래스를 소유해야한다.

 

 

그러면 Ability System Component를 소유하고 있는 액터가 필요하고 해당 데이터를 적용할 대상 액터가 필요하다.

 

일반 캐릭터 클래스에 Ability System Component(줄여서 ASC 라고 부르자.) ASC를 붙여도 되긴하지만, 혹시나 플레이어가 사망하게 될 경우에 ASC를 다시 붙여서 다시 데이터를 가져오는 등에 대한 작업이 필요해진다.

 

그래서 언리얼프레임워크에 존재하는 PlayerState 클래스에 붙여주는게 낫다 그렇게 된다면 캐릭터 클래스를 다시 스폰하게 되더라도 PlayerState 클래스에서 가져올수 있을뿐만 아니라 멀티 플레이 게임에서도 다른 캐릭터의 정보를 PlayerState를 통해 알수 있기 때문이다.

 

Lyra 프로젝트를 살펴보면, LyraPlayerState 클래스에서 ULyraAbilitySystempComponent와  ULyraAttributeSet를 상속받는 HealthSet과 CombatSet을 멤버 변수로 소유 하고 있는걸 볼 수 있다.

 

 

 

 

 

 

 

 

어트리뷰트의 데이터는는 FGameplayAttributeData 라는 구조체의 객체이며 AttributeSet에 저장됩니다.

속성은 기준값현재값이라는 두가지 값으로 구성됩니다. 기본 값은 속성의 영구 값이고, 현재 값은 GameplayEffect로 인한 수정사항을 더한 값입니다. 그 외에 버프나 디버프가 있다면 값을 더하거나 빼는 효과가 있을수도 있다.

 

* 기준값이 최대값이라는 건 아니다. 최대값이라는 건 또한 별도의 속성으로 있어야한다.

ULyraHealthSet 클래스의 경우