UE5的運行邏輯可以分為引擎啟動流程和游戲運行流程兩個部分。
引擎啟動流程
一、平臺入口&引擎主流程初始化
1、系統入口
不同的平臺會有不同的入口。在Windows平臺,入口是Launch模塊下的\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp文件中的WinMain()函數。
2、FEngineLoop初始化
FEngineLoop是整個引擎運行控制器,生命周期管理器。
FEngineLoop::PreInit()
作用:用于早期設置,引擎模塊初始化。
- 解析命令行
- 加載config文件(DefaultEngine.ini等)
- 初始化日志系統(GLog)
- 創建GIsEditor或GIsGameAgnosticExe標志
- 加載平臺相關信息(平臺模塊)
FEngineLoop::Init()
作用:用于引擎的主要子系統初始化。
- 加載各個模塊(ModuleManager)
- 創建并初始化UGameEngine或UEditorEngine
- 初始化RHI(渲染硬件接口)和Rendering System
- 加載默認地圖或啟動器地圖
- 創建GameInstance,啟動游戲或進入編輯器
二、模塊加載系統:FModuleManager
UE使用FMoudleManager統一控制管理動態模塊加載,常見模塊有:
- Core
- CoreUObject
- Engine
- InputCore
- RenderCore
- RHI
- Renderer
- Slate
- UMG
- MyGameModule(用戶創建的項目模塊)
FModuleManager::Get().LoadModuleChecked<ISlateRHIRendererModule>("SlateRHIRenderer");
FModuleManager::Get().LoadModule(TEXT("Renderer"));
三、創建&初始化UGameEngine
在游戲模式下,會構造UGameEngine,并調用其Init():
//\Engine\Source\Runtime\Launch\PrivateLaunchEngineLoop.cppGEngine = NewObject<UEngine>(GetTransientPackage(), EngineClass);
check(GEngine);GEngine->ParseCommandline();UE_LOG(LogInit, Log, TEXT("Initializing Game Engine..."));
GEngine->Init(this);
UE_LOG(LogInit, Log, TEXT("Initializing Game Engine Completed"));
內部做了:
- 加載GameViewportClient
- 創建UWorld,并加載初始地圖
- 初始化Audio、Physics、Navigation、Streaming、Scene、AI、Input等子系統。
四、世界和地圖加載:UWorld創建
UEngine::LoadMap()中會:
- 創建UWorld(每個地圖一個世界)
- 創建GameModeBase,GameState,PlayerController
- 加載Level、Actors、components等內容
- 初始化Navigation、Lightmaps、Landscape、AI、Streaming等系統
五、初始化關鍵對象
- UGameInstance:游戲生命周期管理器(全局)
- AGameModeBase:地圖規則控制器(服務器端)
- AGameStateBase:同步游戲狀態(客戶端可見)
- APlayerController:玩家輸入管理器
- APawn/ACharacter:玩家可操控角色
六、Editor與Game的分支流程
類型 | 對應Engine類 | 初始化地圖 | 特殊流程 |
編輯器運行 | UEditorEngine | 啟動編輯器地圖 | 創建FEditorViewportClient,運行SlateEditor |
游戲運行 | UGameEngine | 加載默認地圖 | 創建GameInstance,運行主循環 |
七、Tick啟動,進入主循環
FEngineLoop::Tick();
啟動主循環,每幀調用:
- 輸入處理
- Tick世界(UWorld)
- AI、動畫、物理等更新
- 提交渲染數據,開啟RenderThread
- Slate/UMG UI更新
游戲運行流程
未完待續