![748e763dab0f5f0fe28576b9cbdd9260.png](https://i-blog.csdnimg.cn/blog_migrate/8648ebe3d990b5db21e6bebce7e23030.png)
1 编译源码的缺点
要学习引擎源码,通过断点调试是一个好办法,一般这个时候都会想到去GitHub下载源码自己编译[1]。可是下载源码自己编译也有一些不方便的地方,比如:
- 因为网络问题,从GitHub上下载源码速度很慢
- 下完源码还要下载依赖项目,又是看网速的步骤
- 如果设备性能普通,编译全部引擎源码要消耗大量的时间
- 源码编译完会占用大量的磁盘空间,一个引擎至少要留100GB空间
- 使用过程如果误操作点了重新编译,又是一大块时间没了
总结一下就是:编译源码太费时间了!
如果只是想学习虚幻4的源码,并不想修改引擎源码,那有没有什么更快的办法呢?
2 编辑器模式调试源码
还好EpicGamesLauncher[2]里有提供引擎源码和调试符号下载
![ab5969b8ddd60a707103c1d1cb8cbbf3.png](https://i-blog.csdnimg.cn/blog_migrate/a98e6030e5ef22ca3abd7c9a8ab3afae.jpeg)
下载好引擎源码和调试符号以后,新建一个项目,创建一个C++类
![7b3477683482d2e464db2bcf52c918a5.png](https://i-blog.csdnimg.cn/blog_migrate/3ef75682a8534127567aa8bf484f62e1.jpeg)
把刚才创建的Actor拖拽到场景中,然后保存地图
![cffe3d155eab852d8cb3f4b91a04092a.png](https://i-blog.csdnimg.cn/blog_migrate/c1f1c88eaafbb5841fed12ba27369666.jpeg)
设置项目的启动地图
![7103ac0b0b299c6c7e6c20c534d79c2f.png](https://i-blog.csdnimg.cn/blog_migrate/5ca502bc89f803268d061d1b60966682.jpeg)
然后打开VS,加断点,启动项目
![c8a483615b680f1e547ee2ff521dcf54.png](https://i-blog.csdnimg.cn/blog_migrate/82708197d5c569af89fdc85c1f402c1d.jpeg)
启动编辑器后,点击按钮运行游戏,触发断点就能看到调用堆栈了
![7fc277764cfe6e2249285d3970d2b15d.png](https://i-blog.csdnimg.cn/blog_migrate/6d3480b3d5907ceada2169746067845b.jpeg)
从调用堆栈(Call Stack)中,可以看到编辑器模式的运行流程是
WinMain
-> GuardedMain
-> FEngineLoop::Tick
-> UUnrealEdEngine::Tick
-> ...
-> UEditorEngine::PlayInEditor
-> ...
-> UWorld::BeginPlay
-> AMyActor::BeginPlay
3 游戏模式调试源码
编辑器模式运行和游戏模式运行还是有点区别的,那要怎么调试游戏模式呢?
首先要烘焙资源[3](把引擎使用的资源格式,转换成特定平台的格式)
![10eb59370b15fa2cb810a527d62d9a7e.png](https://i-blog.csdnimg.cn/blog_migrate/47fdb9e720418e3fd52c535ef6db6f43.jpeg)
如果游戏运行后出现了下面这个提示窗口,原因就是没有烘焙资源
![b41fed975d91fd62432254d15f500fc9.png](https://i-blog.csdnimg.cn/blog_migrate/7bd429feba0cd2943697bd4b36ec633e.png)
资源烘焙完成后,关闭编辑器打开VS,在项目启动参数里增加" -game"(注意有空格)
"$(SolutionDir)$(ProjectName).uproject" -skipcompile -game
![bc473cff4cd86a0ae7aac6b24c1ec650.png](https://i-blog.csdnimg.cn/blog_migrate/07bfc1c50614678e519d438391a5e6f6.jpeg)
这样做的原因是launcher引擎的编译配置[4]里,DebugGame、Development、Shipping这三种模式只能调试自己写的代码,无法调试引擎源码
![fb98b7bb55b40c589ec2491379581888.png](https://i-blog.csdnimg.cn/blog_migrate/e0afb45ceb0c1fb44274a2fe21c86a83.jpeg)
加完 " -game"参数后,运行游戏触发断点
![4dd470d3534c0b0eebab96bb9ca6e800.png](https://i-blog.csdnimg.cn/blog_migrate/e17f0141d901d546519754e1f5575a06.jpeg)
游戏模式和编辑器模式的启动流程是不一样的,可以看到游戏模式的运行流程是
WinMain
-> GuardedMain
-> FEngineLoop::Init
-> UGameInstance::StartGameInstance
-> UEngine::Browse
-> UEngine::LoadMap
-> UWorld::BeginPlay
-> ...
-> AMyActor::BeginPlay
参考
- ^下载虚幻引擎源代码 https://docs.unrealengine.com/zh-CN/GettingStarted/DownloadingUnrealEngine/index.html
- ^安装虚幻引擎 https://docs.unrealengine.com/zh-CN/GettingStarted/Installation/index.html
- ^内容烘焙 https://docs.unrealengine.com/zh-CN/Engine/Deployment/Cooking/index.html
- ^ 编译配置参考 https://docs.unrealengine.com/zh-CN/Programming/Development/BuildConfigurations/index.html