- INI(Initialization)파일 포맷은 설정 파일에 대한 사실상 표준입니다. INI파일은 단순 구조의 텍스트 파일로 이루어져 있습니다. 보통 마이크로소프트 윈도우와 연결되어 있지만 다른 운영 체제에서도 사용할 수 있습니다. “INI 파일”이라는 이름은, “.INI”라는 파일 확장자가 따라오지만, “.GFG”, “.conf”, “.TXT”등의 다른 확장자를 사용하기도 합니다.
관련정보: , .INI , Plugins , Module , Gameplay module
모듈
모듈은 언리얼 엔진 소프트웨어 아키텍처의 기본 빌딩 블록입니다. 이는 특정 편집기 도구, 런타임 기능, 라이브러리 또는 기타 기능을 독립 실행형 코드 단위로 캡슐화 합니다. 모든 프로젝트와 플러그인에는 기본적으로 자체 기본 모듈이 있지만, 코드를 구성하기 위해 이러한 모듈 외부에 다른 모듈을 정의할 수 있습니다.
언리얼 엔진은 특정 플랫폼에 종속적이지 않은 바이너리 제작을 위해 언리얼 빌드 툴을 사용해 빌드합니다. 언리얼 엔진의 모든 소스는 모듈이라는 단위로 구성되어 있으며 이 중에서 필요한 모듈을 타겟으로 묶어서 최종 빌드를 만들어 냅니다.
언리얼 엔진의 C++ 개발 환경은 하나의 게임 프로젝트에 하나의 모듈을 사용하는 것이 일반적입니다. 언리얼 엔진에서는 게임 제작에 사용되는 로직을 담은 기본 모듈을 주 게임 모듈이라고 합니다.
하지만 게임 프로젝트에서는 주 게임 모듈외에도 개발자가 모듈을 추가할 수 있습니다. 언리얼 에디터에서는 모듈을 추가하는 메뉴를 제공하지 않지만, 언리얼 빌드 시스템을 이해한다면 커멘드라인으로 모듈을 제작할 수 있습니다.
Unreal engine에서 플러그인은 대체 접근 방식이라기 보다는 단순히 모듈보다 더 높은 수준의 캡슐화 단위입니다. 프로젝트와 마찬가지로 플러그인은 그 안에 여러 코드 모듈을 포함할 수 있습니다. 선택적으로 콘텐츠를 포함할 수도 있습니다.

모듈 사용의 이점
모듈에 대한 모범 사례를 준수하면 프로젝트의 코드를 모두 단일 모듈에 넣을 때보다 프로젝트 코드가 더 잘 구성되고 더 효율적으로 컴파일되며 재사용이 가능합니다.
- 캡슐화
모듈은 기능을 캡슐화하고 코드의 내부 부분을 숨길 수 있는 수단을 제공하여 좋은 코드 분리를 시행합니다. - 컴파일 시간 향상
모듈은 별도의 컴파일 단위로 컴파일됩니다. 즉, 변경된 모듈만 컴파일하면 되며 대규모 프로젝트의 빌드 시간이 훨씬 빨라집니다. - Include What You Use 표준에 따름
모듈은 종속성 그래프에서 함께 연결되며 IWYU(Include What You Use)표준에 따라 실제로 사용되는 코드에 대한 헤더 포함을 제한합니다. 즉, 프로젝트에서 사용되지 않는 모듈은 컴파일에서 안전하게 제외됩니다. - 모듈 로드, 언로드 제어
런타임에 특정 모듈이 로드 및 언로드되는 시기를 제어할 수 있습니다. 이는 사용 가능하고 활성화된 시스템을 관리하여 프로젝트 성능을 최적화하는 방법을 제공합니다. - 구성별 코드
사용자 정의 클래스 및 게임 시스템을 위한 편집기 확장 코드를 작성하려면 전용 편집기 모듈에 넣어야 합니다. 경우에 따라 전처리기 정의를 사용할 수 있지만, 편집기 관련 코드의 사소한 양은 편집기 모듈에 들어가야 합니다. 개발 전용 모듈을 생성하는 것도 가능하므로 예를 들어 shipping(배송이라 번역되네) 빌드에서 자동으로 컴파일되는 디버깅 코드를 가질 수 있습니다. 서버/클라이언트 전용 코드도 마찬가지 입니다. - 플랫폼별 코드
프로젝트가 컴파일되는 플랫폼과 같은 특정 조건에 따라 프로젝트에서 모듈을 포함하거나 제외할 수 있습니다. 각각 자체 모듈에서 플랫폼별 프로젝트 구성 요소 구현을 제공하고 대상을 기반으로 선택적으로 빌드 및 패키지할 수 있습니다. - 코드 재사용
모듈은 여러 프로젝트에서 재사용하기 위한 자연스러운 코드 단위입니다. 코드 수준에서 논리적으로 별개의 시스템을 분리하면 처음에는 원래 작성한 프로젝트 외부에서 유용할 것이라고 생각하지 않은 경우에도 무언가를 재사용하기가 더 쉽습니다. git을 사용하는 경우 한 가지 효과적인 접근 방식은 재사용 가능한 모듈 자체를 git 리포지토리에 넣은 다음 이를 git 하위 모듈로 모든 프로젝트 리포지토리에 통합하는 것 입니다.
고려사항
- 게임 DLL모듈성에 대한 철학적 선택
게임 DLL모듈성에 대해서는 철학적 선택이 있습니다. 게임을 다수의 DLL파일로 나누는 것은 그 이득보다 문제가 많을 수가 있지만, 이것은 각 팀의 요구와 원칙에 따라 결정해야 합니다. - 게임플레이속도 저하
다중 게임플레이 모듈을 사용하면 링크 시간이나 코드 반복처리 사긴이 빨라지겠지만, DLL익스포트 및/또는 인터페이스 클래스를 처리해야 하는 모듈 수가 늘어나게 됩니다. 이러한 상충 관계는 엔진이나 에디터 코드에 대해서는 올바른 것이나, 게임플레이에 대해서는 미심쩍은 것입니다. - 교차 의존하는 모듈
교차 의존하는 모듈(익스포트와 임포트 함수 양쪽, 그리고 그 서로에서의 데이터, 예로 Engine과 UnrealEd모듈) 생성을 지원은 하나, 컴파일 시간 측면에서 이상적이지는 않습니다. 변수의 정적인 초기화(init)에 가끔 문제를 일으킬 수 있습니다. 게임플레이 모듈을 교차 의존적이지 않게 디자인하고 유지하기란 어려운 일이지만, 코드는 더욱 깔끔해 질 것 입니다.
참고사항
- 언리얼 엔진 모듈은 C++20 모듈과 관련이 없습니다.
발생할 수 있는 에러에 대해
언리얼 복수의 모듈 이용시 DLL 링크 에러에 대해
외부 모듈(DLL)에서 사용하기 위해서는, MODULENAME_API 매크로를 필요로합니다.
윈도우 플랫폼을 기준으로, 해당 모듈에서 MODULENAME_API 매크로는 __declspec(dllexport)로 확장됩니다.
- extern이라는 것은 저장공간에 대한 선언에 사용되는 키워드로서, 여러개의 소스파일에 대해서 작업할 때 필요한 것입니다. 쉽게 말해서 다른 파일에 선언된 변수가 있다고 설명하는 것 입니다.
- c++ 번역공간을 알 필요가 있습니다.
- 마이크로 소프트의 extern을 보면
따라서 MODULENAME_API DECLARE_LOG_CATEGORY_EXTERN
매크로 선언은 __declspec(dllexport) extern struct
로 확장됩니다.
따라서 다른 모듈에서 사용할 수 있게 됩니다.
- DLL(Dynamic Link Library)란 소프트웨어 개발에서 자주 쓰고 기초적인 함수들을 중복 개발하는 것을 피하기 위해 표준화된 함수 및 데이터 타입을 만들어서 모아 놓은 것을 의미합니다.
- 라이브러리를 한번 구축해 놓기만 하면 다시 만들 필요없이 불러서 사용할 수 있으므로 개발 속도도 빨라지고 신뢰성도 확보할 수 있습니다.
- 이런 라이브러리는 언제 메인 프로그램에 연결하느냐에 따라서 Static Link와 Dynamic Link로 나뉘며, DLL은 후자를 의미합니다.
- 정적 링크와는 다르게 컴파일 시점에 실행 파일에 함수를 복사하지 않고, 함수의 위치정보만 갖고 그 함수를 호출할 수 있게 한다.