Unreal Engine/Lyra Starter Game 분석
[1] - Lyra Starter Game 분석
쿠n크
2024. 4. 1. 12:43
저번 글에서 Lyra Starter Game을 분석하는 이유와 프로젝트가 개괄적으로 어떻게 구성되어 있는지를 살펴봤었는데,
이번 글에서는 Source 코드가 어떻게 구성되어 있는지를 개괄적으로 살펴보고 몇 가지에 대해서는 조금 자세히 보겠습니다.
솔루션 탐색기
- LyraStarterGame 프로젝트에 대부분의 C++, C# 코드가 담겨 있음
- 플러그인까지 살펴볼 수 있을지는 모르겠지만 Plugins 파일이 있고, Config 파일에도 부가적으로 세팅한 정보들을 담기 위해 추가한 파일들이 많은 것으로 보임
- LyraClient.Target.cs, LyraServer.Target.cs 등 프로젝트 기본 생성 시 생기는 .cs 파일 외에도 클라이언트와 서버에서 어떻게 동작할지를 정의한 파일이 있음
- LyraEditor.Target.cs에서는 LyraEditor 서브 모듈을 사용하겠다는 코드가 있음
메인 게임 모듈
- 언리얼이 게임을 관리하는 방법은 모듈(.dll)을 이용하여 관리하게 되는데, 설계가 커지게 되면 메인 게임 모듈 (.dll)을 구동시키기 위해서 메인 게임 모듈은 다른 모듈들을 참조하는 경우가 많음. 그렇게 되면 메인 게임 모듈은 수많은 모듈들로부터 의존성을 가지게 됨 ( 의존성을 가지게 된 모듈이 문제가 없거나 문제가 있거나 하면 안됨 )
- 사진과 같이 메인 게임 모듈은 IMPLEMENT_PRIMARY_GAME_MOUDLE(,,) 을 cpp 파일에 정의해두어야 하고 메인 게임 모듈이 의존성을 가지고 부가적인 기능을 갖게 만드는 모듈의 경우 IMPLEMENT_MODULE(,) 을 cpp 파일에 적어야 함
- 메인 게임 모듈인 LyraStarterGame에서 각 모듈에 해당하는 클래스, 메서드 등을 사용하기 위해선 LyraGame.Build.cs 파일에 해당하는 모듈들에 의존성을 가짐을 알려주어야 함
- 참고로 위에서 언급한 LyraEditor의 경우 메인 게임 모듈 그 자체가 의존하는 것이 아닌 게임이 Editor로 실행됐을 때 LyraEditor를 사용할 수 있게 끔 LyraEditor.Target.cs에 추가해뒀음
- .uproject를 메모장으로 열게 되면 어떤 메인 게임 모듈을 사용하고 있는지를 확인해볼 수 있고, xx.Build.cs 파일에 적혀 있던 모듈 중에 플러그인으로 만들어 진 것이 있다면 .uproject 파일에도 적히게 됨. 플러그인의 경우 에디터를 통해 UI를 보고 플러그인을 추가하게 되면 .uproejct에 사진과 같이 문자가 적히게 됨.
로그 채널, 게임 플레이 태그
- 위 솔루션 탐색기 사진을 보게 되면 LyraGameplayTags.h, LyraLogChannels.h 는 폴더에 담겨있지 않고 모듈을 정의한 파일과 경로가 같은데, 이것이 의미하는 바는 프로젝트 내에서 빈번하게 사용되는 파일이라는 의미 정도 될 것임.
로그 채널
- 로그 카테고리에 대해 정의해 놓았고, 프로젝트 전반적으로 쓰일 LogLyra, AbilitySystem에 해당하는 로그의 경우 LogLyraAbilitySystem 등으로 구분해 놨음
- UObject가 서버용인지 클라이언트인지 구분해주는 함수도 있음. FString으로 반환하여 로깅에 주로 사용할 것으로 추측됨.
게임 플레이 태그
- GameplayTag는 GameplayAbilitySystem에서 핵심적인 역할을 맡게 되는데 문자열로서 객체의 상태를 의미하거나 태그를 부여함으로서 태그에 해당하는 의미를 부여하는 방식으로 동작하게 됨
- 에디터 -> Project Settings -> GameplayTags 탭에서 태그를 추가 혹은 제거할 수 있게 되며 이 때 추가된 태그들은 Config/DefaultGameplayTags.ini에 적히게 되고, Native(C++)에서만 사용할 태그들에 한해서는 LyraGameplayTags.cpp에 모아놓은 모습
- NativeGameplayTag가 어떻게 활용되는지는 리뷰를 하며 알아가야 할 듯
- 위 코드가 동작하는 방식 : UE_DEFINE_GAMEPLAY_TAG_COMMENT 라는 매크로를 통해 FNativeGameplayTag의 전역 객체를 만들게 되고 UE_DECLARE_GAMEPLAY_TAG_EXTERN을 통해 전역 객체의 extern 키워드를 통해 다른 파일에서도 같은 객체를 사용할 수 있게 만드는 것
- 에디터를 통해 추가한 태그들의 경우 위 사진과 같이 DefaultGameplayTags.ini에 적히게 됨.