언리얼 개발/탐구(이론)

[UE_5] GAS란 무엇인가

WhNi 2024. 4. 24. 15:18

Game Ability  System의 약자로 멀티플레이 게임 제작에 있어서 뼈대가 되는 게임 제작 워크플로우다. 

 

멀티플레이에서는 서버와 클라이언트가 동기화가 되어야 하는데, 각각의 로직을 레플리케이션 한다면 서로 작용하는 코드들이 꼬이게 될 것인데, 

 

GAS는 각각의 액션에 대한 로직이 따로 구성되어 있으며, 게임플레이  태그라는 것에 의해 레플리케이션을 따로 설정할 수 있다. 

 

UAbitlitySystemComponent는 

GameAbility

Ability Task

Gameplay Tag

Gameplay Attributes

Gameplay Effects

Gameplay  Cue

Gameplay Events

 

라는 큰 틀로 구성되어 있다. 

UAbitlitySystemComponent

-원하는  액터 혹은 플레이어에 이 컴포넌트가 있어야 한다. 

로직은 두개의 cpp 파일에 나눠져서 구성되어 있는데, AbilitySystemComponent와 AbilitySystemComponent_Ability_cpp 파일이다.

추가적으로 global function이 있는데 여기에는

"GetAbilitySystemCompoentnFromActor" 라는 기능이 있는데, 이 기능이 많이 쓰일 예정이다.

액터와 컴포넌트의 상호작용이 많아서 자주 쓰인다고 한다. 

그리고 AbilitySystemBlueprintLibrary라는 곳에서 GetgAbilitySystemCompoenent는 블루프린트와의 연결과 용이하게 해준다고 한다. 

 

주석으로 Abilities, Effects, Attributes와 어떻게 상호작용하는지도 달려있다. 

 

Ability는 

GiveAbility ->를 통해서 FGameplayAbilitySpec 이라는 데이터형을 받아서 새로운 ability를 정의한다. 

*중요한점은 이 함수 내에서는 client에게 주는게 아니라 서버에게 준다는 것이다. 

어빌리티  시스템은 멀티쓰레딩을 지원해서 스코프 락을 다루는 코드이다. 

 

레플리케이션 컨테이너(=FGameplayAbilitySpecContainer)에 매개변수로 들어온 새로운 ability를 추가한다. 

여기 안에를 보면, 레플리케이션이 디폴트 세팅으로 되어있다. 

 

그리고 어빌리티에 대한 새로운 인스턴스를 생성하는데, 새로운 Object를 ability의 클래스에서 생성한다. 그리고 레플리케이션 세팅에 따라서 레플리케이션을 적용할지 말지 설정한다. 

 

(FGameplayAbilitySpecContainer 에 인스턴스도 다시  추가하는 부분이 있다. )

UPROPERTY에 있는 곳에서 데이터를 미리 설정해둔다. (레플리케이션 안적용할때)

 

 

ReplicateSubObjects는 새로운 오브젝트들을 for문으로 돌면서 레플리케이션 설정을 동적으로 할당한다. 

 

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/gameplay-ability-system-component-and-gameplay-attributes-in-unreal-engine?application_version=5.1

 

Gameplay Ability System Component And Gameplay Attributes in Unreal Engine

Using the Ability System Component with Gameplay Attributes and Attribute Sets

dev.epicgames.com

 

앞으로 Ability부터 차근차근 정리해서 Event까지 포스트 하고 이것저것 만들어 볼 예정이다