UE5

언리얼 내부 - 모듈 (Modules) 2

뽀또치즈맛 2024. 11. 25. 16:06

 

Modules - Overview ans Structure

 

언리얼 엔진의 모듈이란?

모듈은 언리얼 엔진

소프트웨어 아키텍처의 기본 구조적 빌딩 블록이다.

이는 독립적인 코드 단위이며 일반적으로 

모듈은 하나의 독립된 코드 묶음으로 처리되어 

컴파일러가 이를 별도로 빌드한다.

 

모듈? 라이브러리와 비슷한 거 아닌가요?
모듈과 라이브러리의 둘의 차이점

사용자는 각 모듈을 라이브러리로 생각할 수 있지만,

다음과 같은 차이점이 있다.

모듈은 엔진, 게임 또는 플러그인의 다른 모듈에 따라 달라질 수 있다.

추가 모듈에는 타사 라이브러리가 포함될 수 있으며,

모듈은 특정 빌드 유형(ex editor only)으로 제한할 수 있다.

사용 가능한 플랫폼을 제한하기 위해 화이트리스트 및 블랙리스트에 추가할 수도 있습니다.

 

모듈의 장점

언리얼에서 모듈을 사용하면 여러가지 이점이 있다.

우수한 코드 분리를 시행하고 관련 코드를 그룹화하는 메커니즘을 제공하여

해당 코드의 내부 부분을 숨기는 캡슐화를 제공합니다.

이 구조는 명확한 종속성 그래프가 있고

헤더 포함이 실제로 사용되는 코드로 제한되므로 컴파일 시간도 향상시킨다.

 

 

모듈의 파일 시스템 구조

모듈의 권장 파일 시스템 구조는 다음 이미지에 설명되어 있다.

모듈에는 항상 모듈 이름의

루트 디렉터리(예제 그림에서는 "ImageWrapper")가 포함되어 있다.

모듈 루트에는 .Build.cs라는 파일에

모듈의 빌드 시스템 구성이 포함되어 있어야 한다.

 

모듈이 일반 C++ 모듈인 경우 (ModuleType이 외부로 설정되지 않음)

모듈의 모든 코드는 Public 및 Private의 두 폴더에 포함되어야 한다.

 

이러한 폴더가 있는 경우 빌드 시스템은 공용 폴더를

현재 모듈에 대한 종속성을 지정하는

다른 모듈에 대한 포함 디렉터리로 노출한다.

 

Private 폴더는 다른 모듈에 노출되지 않으며,

모듈의 Private 부분에 정의된 심볼은 다른 모듈에 접근할 수 없습니다.

(= symbol defined in the private part of a moudule is not allowed to be accessed from other modules.)

( = 캡슐화 개념을 지닌다. 

외부 접근을 막아 코드 안전성을 부여한다.

이는 모듈의 독립성을 유지시켜준다.)

 

다른 모듈에서 사용하기 위해 모듈의 공개 부분에 있는

심볼(변수, 클래스, 함수)를 내보내려면

MODULENAME_API 매크로를 사용해야 한다.

 

이 매크로는 공용 라이브러리에 대한 연결을 정의하는

적절한 컴파일러 내장 함수 (EX. Windows의 __declspec(dllexport))로 확장된다.

 

AssetTags 모듈의 예시

 

이러한 매크로(UCLASS())가 지정되지 않으면

해당 플러그인 사용자는 링커에 의해 정의되지 않은 기호 오류를 경험하게 된다.

 

Caution :

모놀리식 빌드를 사용하는 경우 적절한 매크로 없이도

기호를 사용할 수 있다.

왜냐하면 모든 코드가 단일 실행 파일에 연결되고

매크로에 의해 생성된 DLL export문이 아무 효과도 없기 때문이다.

모듈이 패키지 게임에서만 사용되고

에디터 에서는 전혀 사용되지 않는 경우 특정 오류를 숨길 수 있다.

 

Module Configuration : Build Types, Loading Phases, Platforms

 

모듈은 두가지 방법으로 구성된다.

 

  • 게임 또는 프로젝트 관련 설정 :
    모듈 유형, LoadingPhase 및 플랫폼 지원과 같은 옵션은 일반적으로
    "상위" 프로젝트의 uproject 또는 uplugin 파일을 통해
    모듈 자체 외부에서 정의된다.
  • 모듈의 컴파일 환경 관련 설정 :
    ModuleName.Build.cs 파일은 모든 모듈에 존재하며
    모듈 및 포하된 코드 컴파일과 관련된 모든 구성 값을 정의한다.
    여기에는 종속성 설정, 컴파일러 옵션(정의, 포함 디렉터리, C++ 버전 등) 및
    링커 옵션 (모듈 종속성, 연결할 외부 라이브러리)이 포함된다.

엔진 모듈식 빌드와 모놀리식 빌드라는 두 가지 주요 방법으로 구축할 수 있다.

 

어느 것이 사용되는지는 편집기 또는 게임이 컴파일되었는지 여부와

.Target.cs 파일에 있는 수동 재정의에 따라 달라진다.

모듈식 빌드는 모든 모듈이

공유 라이브러리에(Windows의 경우 .dll, Linux의 경우 .os)로 컴파일되고

편집기 / 엔진 실행 파일이 시작 시 모든 라이브러리를 로드함을 의미한다.

이 설정은 더 유연하며 엔진을 다시 빌드하지 않고도

더 많은 라이브러리를 추가하거나 기존 라이브러리를 업데이트할 수 있다.

 

모놀리식 빌드에서는 모든 모듈이 정적 라이브러리(.lib 또는 .a)로

컴파일되고 최종 실행 파일에 연결된다.

이는 실행 파일이 하나만 있고 모든 라이브러리가 링커에 의해

이 단일 파일에 저장된다는 것을 의미한다.

이 방식은 게임 target을 구축할 때 기본적으로 사용된다.

 

모듈 유형은 상위 게임 혹은 플러그인을 통해 지정된다.

"Modules": [
{
    "Name": "MyPluginModule",
    "Type": "Runtime",
    "LoadingPhase": "Default",
    "BlacklistPlatforms" :
    [
        "Android"
    ]
}
],

(Common module types are: Editor, Runtime, ClientOnly, ServerOnly.)

일반적인 모듈 유형은 Editor, Runtime, ClientOnly, ServerOnly이다.

(더 자세한 사항은 모듈 유형 문서 참고)

 

언리얼 모듈 유형

1. Editor 모듈

편집기가 시작될 때만 로드한다.

 

2. Runtime 모듈

프로그램을 제외한 모든 대상을 로드한다.

 

3. ClientOnly

전용 서버를 제외한 모든 대상에 로드된다.

 

4. ServerOnly

전용 클라이언트를 제외한 모든 대상에 로드한다.

 

가장 많이 사용되는 것은 Editor 및 Runtime 모듈이다.

 

에디터 모듈은

에디터 빌드(에디터 내,PIE 또는 독립 실행형 실행 애플리케이션)에서만

사용할 수(= 빌드)있는 반면,

 

런타임 모듈은 에디터와 패키지된 게임 모두에서 사용할 수 있다.

 

설명을 포함한 전체 목록은 여기 문서에서 찾을 수 있다.

이 두 옵션 모두 각 버전의 엔진 소스 " Engine/Source/Runtime/Projects/Public/ModuleDescriptor.h
에 정의되어 있습니다.

 

다른 모듈에 대한 외부 종속성

 

공개 종속성은 외부 모듈이 사용되고

종속 모듈의 공개 인터페이스에 노출될 때 사용된다.

이는 또한 공개 종속성이 일시적이라는 것을 의미한다.

즉, 모듈A가 모듈B에 대한 공개 종속성을 갖고 있고

모듈C가 모듈A에 의존하는 경우

모듈C는 모듈B에 간접적으로 의존한다는 의미이다.

 

언리얼의 빌드 시스템은 이러한 일시적 종속성을 자동으로 해결한다.

사용자에 대해서는 명시적으로 지정할 필요가 없다.

(즉, 모듈C는 모듈B가 아닌 모듈A만 종속성으로 나열한다.)

 

프라이빗 종속성은 모듈의 프라이빗 코드에서만 사용되는 종속성이다.

따리서 이는 일시적이지 않으며, 

모듈에 의존하는 모듈은 개인 종속성을 알거나 영향을 받지 않는다.

( = 외부 접근을 막아 코드 안전성을 부여한다.

이는 모듈의 독립성을 유지시켜준다.)

 

외부 모듈

사용자 정의 코드 없이 타사 라이브러리를 포함하는 데

사용되는 특수 모듈 유형이 하나 있다.

외부 모듈은 모듈 .Build.cs 파일에서 

"Type = ModuleType.External"을 설정하여 외부 모듈 유형을 지정해야 한다.

이렇게 하면 모듈에 사용자 정의 코드가 없지만

외부 라이브러리를 참조하는 추가 포함 디렉터리 및 라이브러리 종속성이

지정된다는 것을 빌드 시스템에 알릴 수 있다.

우리 문서에 타사 라이브러리를 포함하는 방법 에 대한 전체 연습이 있다.

 

모듈과 플러그인

 

언리얼 C++ 초보자에게는 모듈과 플러그인의 구분이 혼란스러울 수 있다.

모듈은 엄밀히 말하자면 코드 단위인 반면,

플러그인에는 하나 이상의 모듈과 선택적 콘텐츠 폴더가 포함되어 있다.

엔진/소스 및 프로젝트/소스 아래의 모듈은

항상 활성화되어 로드되는 반면,

플러그인(및 해당 모듈)은 필요에 따라 사용자가 비활성화하거나 활성화할 수 있다.

 

모듈과 플러그인 모두 해당 유형에 대한 종속성을 지정할 수 있다.

플러그인은 다른 플러그인에 대해서만 종속성을 나열할 수 있고,

모듈은 다른 모듈에만 종속성을 나열할 수 있다.

 

모듈이 속한 플러그인이나 

게임의 일부를 통해서만 정의되는 모듈에 대한 여러 구성 옵션이 있다.

.uproject 파일과 .uplugin 모두 게임이나 플러그인에 포함된 모듈을 나열하며

해당 모듈의 Type 및 LoadingPhase를 지정할 수 있다.

추가적으로 게임의 경우 게임의 일부인 모듈이 게임의 .Target.cs 파일에 나열된다.

 

 

참고 문헌

https://dev.epicgames.com/community/learning/knowledge-base/GDD9/unreal-engine-modules-overview-and-structure?locale=fr-fr

'UE5' 카테고리의 다른 글

Unreal Object Handling  (3) 2024.12.19
언리얼 내부 - 모듈 (Modules)  (0) 2024.11.25
점진적 가비지 컬렉션  (0) 2024.11.23
UE5 하마치를 이용한 서버 열기  (0) 2024.10.22
서버 시작하기  (2) 2024.10.14