- 平台:Windows
- 版本:UE4.24
启动
双击Editor.exe后,调用栈大致如下:
- WinMain :Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp
- GuardedMain :Engine\Source\Runtime\Launch\Private\Launch.cpp:94
- EnginePreInit :Engine\Source\Runtime\Launch\Private\Launch.cpp:40
- GEngineLoop.PreInit :Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:3272
- PreInitPreStartupScreen
- FPlatformSplash::Show():显示Splash界面 :Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsPlatformSplash.cpp:837
- PreInitPreStartupScreen
- GEngineLoop.PreInit :Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:3272
- EditorInit :Engine\Source\Editor\UnrealEd\Private\UnrealEdGlobals.cpp:81
- MainFrameModule.CreateDefaultMainFrame():创建并显示MainFrame窗口
- Tick
- EnginePreInit :Engine\Source\Runtime\Launch\Private\Launch.cpp:40
- GuardedMain :Engine\Source\Runtime\Launch\Private\Launch.cpp:94
MainFrame窗口包括项目浏览器和Editor。
正常情况下,当Splash界面消失后,就会创建并显示项目浏览器。
当在项目浏览器中选择项目打开后,就会关闭项目浏览器然后再启动Editor,这时候Splash界面消失后,就会创建并显示Editor。
// 如果命令行中没有项目名称,那么创建的就是项目浏览器;如果有项目名称那么创建的就是Editor。
void FMainFrameModule::CreateDefaultMainFrame( const bool bStartImmersive, const bool bStartPIE ){
// ....
if ( ShouldShowProjectDialogAtStartup() )
{
MainFrameContent = FGameProjectGenerationModule::Get().CreateGameProjectDialog(/*bAllowProjectOpening=*/true, /*bAllowProjectCreate=*/true);
}
else{
// ....
MainFrameContent = FGlobalTabmanager::Get()->RestoreFrom(LoadedLayout, RootWindow, bEmbedTitleAreaContent, OutputCanBeNullptr);
// ....
}
// ....
}
打开项目
双击项目浏览器中的项目后,其调用栈大致如下:
-
OpenProject :Engine\Source\Editor\GameProjectGeneration\Private\GameProjectUtils.cpp:725
- SwitchProject :Engine\Source\Editor\UnrealEd\Private\UnrealEdMisc.cpp
- FUnrealEdMisc::SetPendingProjectName:在这里设置pending的项目名称
- GEngine->DeferredCommands.Add( TEXT(“CLOSE_SLATE_MAINFRAME”)):添加关闭Editor的命令
- SwitchProject :Engine\Source\Editor\UnrealEd\Private\UnrealEdMisc.cpp
-
FUnrealEdMisc::OnExit()
所以双击项目后就会关闭mainframe(即项目浏览器),在关闭时会调用OnExit方法
在OnExit方法中,会创建一个进程来重新启动Editor,此时使用的命令行参数会在原来的基础上加上项目名称。
void FUnrealEdMisc::OnExit()
{
// ....
if( PendingProjName.Len() > 0