언리얼 엔진 소스 코드 구조는 멀티 플랫폼 빌드를 지원하기 때문에 특정 프로그램의 구조를 따르지 않고 언리얼만의 규칙을 가짐
실제 빌드를 진행하는 주체는 Unreal Build Tool C# 프로그램
Soruce 폴더 구조
타겟 설정 파일 필요
전체 솔루션이 다룰 빌드 대상을 지정
{프로젝트이름}.Target.cs : 게임 빌드 설정
{프로젝트이름}Editor.Target.cs : 에디터 빌드 설정
모듈 폴더
모듈 설정 파일 : {모듈이름}.build.cs
보통은 프로젝트 이름으로 모듈 이름을 지정
모듈을 빌드하기 위한 C++ 프로젝트 설정 정보
외부 라이브러리에서 제공하는 헤더가 담긴 폴더 정보 및 함께 링크할 라이브러리 정보 지정
소스 코드 파일
모듈 이름으로 된 헤더와 소스 파일을 지정
모듈 뼈대를 매크로를 통해 제작
IMPLEMENT_MODULE : 유용한 기능을 제공해주는 c++ 코드 라이브러리
IMPLEMENT_GAME_MODULE : 게임 제작에 관련있는 모듈
IMPLEMENT_PRIMARY_GAME_MODULE : 전체적인 게임을 동작하는 데 사용하는 로직들을 모아둔 모듈, 일반적으로 게임이 만들어지기 위해서는 선언해야 함
uproject 파일 우클릭 후 generate visual studio project files 메뉴를 선택하면 언리얼 버전 셀렉터가 언리얼 빌드 툴을 가동해 intermediate 폴더에 관련된 프로젝트 파일을 자동으로 생성해 줌
C#을 사용하는 이유는 C#은 실행 중에 코드를 바로 컴파일하고 결과를 반영할 수 있음
// UnrealBuildSystmeEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
// 클래스 이름을 모듈이름EditorTarget으로 지정해야 함
public class UnrealBuildSystemEditorTarget : TargetRules
{
public UnrealBuildSystemEditorTarget(TargetInfo Target) : base(Target)
{
// 타입 정보를 에디터로 명시해야 함
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("UnrealBuildSystem");
}
}
// UnrealBuildSystem.Build.cs
using UnrealBuildTool;
// 모듈 이름을 클래스로 지정
public class UnrealBuildSystem : ModuleRules
{
public UnrealBuildSystem(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
// 언리얼 엔진이 제공하는 기본 모듈들, 필수
PublicDependencyModuleNames.AddRange(new string[]{ "Core", "CoreUObject", "Engine", "InputCore", "CommonUtility" });
PrivateDependencyModuleNames.AddRange(new string[]{ });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
// UnrealBuildSystem.cpp
#include "UnrealBuildSystem.h"
#include "Modules/ModuleManager.h"
// FDefaultGameModuleImpl는 언리얼이 제공하는 게임 모듈 기본 클래스
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, UnrealBuildSystem, "UnrealBuildSystem");
모듈 종속 관계
만든 모듈도 언리얼 엔진이 만든 모듈을 활용해야 함
언리얼 엔진이 제공하는 모듈 사이에 종속 관계가 있음
하나의 모듈에 너무 많은 코드가 들어가면 언리얼 엔진이 빌드 방식을 변경함
프로젝트가 커질수록 모듈을 나누어서 관리하는 것이 유리
모듈 내 소스를 필요한 만큼만 공개해야 모듈 간 의존성을 줄이고 컴파일 타임을 최소화
공개할 파일은 모두 public 폴더, 숨길 파일은 모두 private 폴더로
공개할 클래스나 함수에 모듈이름_API 매크로를 선언하여 다른 모듈에 노출할지 추가로 지정해야 함
build.cs에 서브 모듈 이름만 넣어주면 public 폴더의 include 디렉토리와 라이브러리를 링크할 수 있도록 언리얼 빌드 툴이 자동으로 설정
주 게임 모듈을 참조할 다른 모듈이 있는 것은 좋지 않으므로 주 게임 모듈 안에서 public / private 나눌 필요는 없음