이전 글에서 PreInit 과정까지 알아보았습니다. PreInit 과정까지는 세상을 만들 재료를 준비하는 과정이었다면, Init은 세상을 만드는 과정입니다. Init은 우리가 직접 사용하는 언리얼 엔진과 더 가까운 내용이 많기 때문에, PreInit보다는 자세히 알아보는 게 좋을 것 같습니다.
FEngineLoop::Init
언리얼 엔진의 Init 과정은 FEngineLoop::Init() 함수에서 처리합니다. FEngineLoop::Init함수의 내용을 요약해보았습니다.
int32 FEngineLoop::Init()
{
// Engine 객체 만들기
FString GameEngineClassName;
GConfig->GetString(TEXT("/Script/Engine.Engine"), TEXT("GameEngine"), GameEngineClassName, GEngineIni);
EngineClass = StaticLoadClass( UGameEngine::StaticClass(), nullptr, *GameEngineClassName);
GEngine = NewObject<UEngine>(GetTransientPackage(), EngineClass);
//Engine Init
GEngine->Init(this);
FCoreDelegates::OnPostEngineInit.Broadcast();
// Load all the post-engine init modules
IProjectManager::Get().LoadModulesForProject(ELoadingPhase::PostEngineInit);
IPluginManager::Get().LoadModulesForEnabledPlugins(ELoadingPhase::PostEngineInit));
FCoreDelegates::OnAllModuleLoadingPhasesComplete.Broadcast();
//Starg Game, LoadMap
GEngine->Start();
FCoreDelegates::OnFEngineLoopInitComplete.Broadcast();
}
큰 줄기만 요약했고, 그 외에도 ISessionServicesModule Start 등 다양한 작업을 합니다만, 여기엔 넣지 않았습니다.
- UEngine 객체 만들기
- Engine 객체 Init
- 늦게 로딩되는 프로젝트&모듈 로딩
- Engine Start
1. UEngine 객체 만들기
Init의 가장 처음에 하는 작업은 UEngine 객체를 만드는 작업입니다. UEngine은 UEditorEngine과 UGameEngine으로 분화됩니다. 따라서 ini 파일을 확인해서 어떤 Engine 클래스를 사용할지 정하고, UEngine 객체를 만들어 GEngine 이라는 글로벌 변수에 저장하는 작업입니다. 에디터에서 실행하면 UEditorEngine 형으로 만들고, 아니라면 UGameEngine형으로 만듭니다. 여기서는 UGameEngine 기준으로 살펴보겠습니다.
참고로 여기서 ini 파일은 '언리얼 설치 디렉토리 > Engine > Config > BaseEngine.ini 파일'입니다.
// Engine 객체 만들기
FString GameEngineClassName;
GConfig->GetString(TEXT("/Script/Engine.Engine"), TEXT("GameEngine"), GameEngineClassName, GEngineIni);
EngineClass = StaticLoadClass( UGameEngine::StaticClass(), nullptr, *GameEngineClassName);
GEngine = NewObject<UEngine>(GetTransientPackage(), EngineClass);
그렇다면 이 UEngine 클래스는 무슨 책임을 가지고 있을까요? 이름 그대로 엔진 그 자체를 나타냅니다. 입력, 렌더링, 사운드, 레벨, 게임 실행, 디버깅 등 언리얼 엔진의 모든 기능들을 담고있는 만큼 핵심적인 클래스 입니다.
하지만 그 중에서도 중요한 역할은 Browse & LoadMap 입니다.
2. UGameEngine::Init
UGameEngine 객체가 생성된 이후 Init 함수를 호출해 초기화시킵니다. 아래 코드는 UGameEngine::Init의 내용을 요약한 것입니다. 어떤 작업을 하는지 살펴보겠습니다.
void UGameEngine::Init(IEngineLoop* InEngineLoop)
{
// Call base.
UEngine::Init(InEngineLoop);
// Create game instance. For GameEngine, this should be the only GameInstance that ever gets created.
UClass* GameInstanceClass = (GameInstanceClassName.IsValid() ? LoadObject<UClass>(NULL, *GameInstanceClassName.ToString()) : UGameInstance::StaticClass());
GameInstance = NewObject<UGameInstance>(this, GameInstanceClass);
GameInstance->InitializeStandalone();
// Create & Initialize the viewport client.
ViewportClient = NewObject<UGameViewportClient>(this, GameViewportClientClass);
ViewportClient->Init(*GameInstance->GetWorldContext(), GameInstance);
GameViewport = ViewportClient;
GameInstance->GetWorldContext()->GameViewport = ViewportClient;
//Create LocalPlayer & associate with ViewportClient
ViewportClient->SetupInitialLocalPlayer(Error)
UGameViewportClient::OnViewportCreated().Broadcast();
}
우선 꼭 필요한 주요 오브젝트들을 생성합니다. 각 오브젝트들은 아래와 같으며, 이 오브젝트들은 U Engine 객체와 더불어 프로세스가 끝날 때까지 유지될 것입니다.
- UGameInstance : UEngine의 기능들 중 특정 프로젝트에 종속적인 기능들을 따로 떼어낸 클래스입니다.
- UGameViewportClient : 렌더링, 오디오, 사용자 입력 등 ULocalPlayer와 Engine 사이의 인터페이스 역할을 합니다.
- ULocalPlayer : Engine에서의 로컬 플레이어 그 자체를 나타냅니다. (원격 접속 플레이어를 나타내는 형제 클래스도 존재합니다.)
3. 늦게 로딩되는 프로젝트&모듈 로딩
그냥 필요한 모듈들을 또 로드하는 작업입니다. 자세히 파헤치지는 않겠습니다.
4. UGameEngine::Start ( LoadMap)
UGameEngine::Start의 가장 중요한 부분은 Map을 Load하는 것입니다. UGameEngine::Start의 흐름을 따라가다 보면 아래와 같은 호출 과정을 거쳐서 결국 UEngine::LoadMap을 호출하게 됩니다. ( 문법에 맞지는 않지만 대강의 흐름을 정리하기 위해 간략히 기술하였습니다.)
UGameEngine::Start()
{
UGameInstance::StartGameInstance()
{
UGameMapSettings::GetGameMapDefaultMap()
UEngine::Browse()
{
UEngine::LoadMap()
}
UGameInstanc::OnStart()
}
}
LoadMap 이후에는 세상을 구성하는 UWorld, ULevel, AActor, UActorComponent 등의 객체들과 게임 프레임워크의 코어를 담당하는 AGameMode, AGaemSession, AGameStateBasem, AGameNetworkManager, APlayerController, APlayerState, APawn 과 같은 객체들이 생성될 것입니다. 이 객체들은 익숙한 만큼 우리가 실제로 언리얼 엔진에서 주로 다루는 요소들입니다. 그만큼 LoadMap이 중요한 작업입니다. 이 다음 글에서는 LoadMap에 대해 알아보겠습니다.
참고자료 : https://www.youtube.com/watch?v=IaU2Hue-ApI&list=PLgIBMlWm501pi21I23ad4cwpJBGNuKi_h&index=6
'Unreal' 카테고리의 다른 글
Unreal Framework - PreInit (0) | 2023.12.05 |
---|---|
Unreal Framework (0) | 2023.12.05 |
애니메이션 블루프린트 초급 (0) | 2023.10.24 |