有时候我们需要在 UE4 关闭游戏的时候,处理一些事情,那么可以重写 UGameInstance::ShutDown()
但是有时候在游戏关闭的时候,这个函数并未调用,于是我有必要探究一番他的调用链
这里仅讨论 Engine 而不讨论 EditorEngine
调用栈
- UGameInstance::ShutDown()
- UGameEngine::PreExit()
- FEngineLoop::Exit()
- 调用 EngineExit 或者平台调用退出
- EngineExit 被放在了 GuardedMain 函数中定义的一个结构体中
1 | // make sure GEngineLoop::Exit() is always called. |
也就是说游戏 Main 函数结束执行的时候,一定会执行 ShutDown
那么为什么我测试的时候日志中没有出现 ShutDown 相关内容呢
检查发现我们调用关闭游戏的时候用的是
1 | FPlatformMisc::RequestExit(true); |
1 | void FWindowsPlatformMisc::RequestExit( bool Force ) |
可见传入 true 为参数的时候,直接把进程杀了,导致未执行 UGameInstance::ShutDown()