The Unreal Engine Game Framework: From int main() to BeginPlay (youtube.com)

Launch 모듈

Launch.cpp - GuardedMain()

GEngineLoop.PreInit(CmdLine);

대부분의 모듈이 로드되는 곳. C++ 소스 코드가 포함된 게임 프로젝트나 플러그인을 만들 때 .uproject 또는 .uplugin 파일에 하나 이상의 소스 모듈을 정의하고 Loading Phase를 지정하여 해당 모듈이 로드되는 시점을 지정할 수 있다.

LoadCoreModules

CoreUObject

LoadPreInitModules

Engine

Renderer

AnimGraphRuntime

Renering APIs (e.g. D3D12RHI)

SlateRHIRenderer

Landscape

RenderCore


(Project & Plugin)

EarliestPossible

PostConfigInit

PostSplashScreen

PreEarlyLoadingScreen


LoadStartupCoreModules

Core

Networking

HeadMountedDisplay

XAudio2

Messaging

MRMesh

SlateCore

Slate

UMG

Overlay

MediaAssets

ClothingSystemRuntimeNv

PacketHandler

NetworkReplayStreaming


(Project & Plugin)

PreLoadingScreen

PreDefault

Default

PostDefault

엔진 루프가 PreInit 단계를 시작하면 일부 하위 수준 엔진 모듈을 로드하여 필수 시스템이 초기화되고 필수 유형이 정의된다. 그런 다음 프로젝트 또는 활성화된 플러그인에 이러한 초기 로드 단계에 있는 소스 모듈이 있는 경우 해당 모듈이 다음에 로드된다. 그 후에는 더 높은 수준의 엔진 모듈이 대부분 로드된다. 그런 다음 프로젝트와 플러그인 모듈이 로드되는 기본 지점에 도달한다. 이는 일반적으로 게임의 C++ 코드가 이전에 Unreal Engine의 일반 인스턴스였던 항목에 처음 삽입되는 지점이다. 게임 모듈은 모든 필수 엔진 기능이 로드되고 초기화된 시점에 생성되지만 실제 게임 상태가 생성되기 전이다.

그러면 모듈이 로드되면 어떻게 될까?

먼저, 엔진은 해당 모듈에 정의된 UObject 클래스를 등록한다. 이렇게 하면 리플렉션 시스템이 해당 클래스를 인식하고 각 클래스에 대해 CDO 또는 클래스 기본 객체도 구성한다. CDO는 기본 상태의 클래스 기록이며 추가 상속을 위한 프로토타입 역할을 한다. 따라서 사용자 정의 액터 유형이나 사용자 정의 게임 모드, 또는 그 앞에 UCLASS를 사용하여 선언한 모든 것을 정의했다면 엔진 루프는 해당 클래스의 기본 인스턴스를 할당한 다음 생성자를 실행하여 상위 클래스의 CDO를 템플릿으로 전달한다. 이것이 생성자에 게임 플레이 관련 코드가 포함되어서는 안되는 이유 중 하나이다. 이는 실제로 클래스의 특정 인스턴스를 수정하기 위한 것이 아니라 클래스의 보편적인 세부정보를 설정하기 위한 것이다. 모든 클래스가 등록되면 엔진은 ShutdownModule과 일치하는 모듈의 StartupModul 함수를 호출하여 모듈의 수명과 연결되어야 하는 모든 초기화를 처리할 수 있는 기회를 제공한다. 따라서 이 시점에서 엔진 루프는 필요한 모든 엔진, 프로젝트 및 플러그인 모듈을 로드하고 해당 모듈에서 클래스를 등록했으며 제자리에 있어야 하는 모든 하위 수준 시스템을 초기화했습니다.

이것으로 PreInit 단계가 완료되었으므로 Init 기능으로 넘어갈 수 있다.