UE4项目迁移笔记

UE4本身的版本升级比较频繁,这就会导致有时候手里的或是网上下载的项目需要进行版本迁移。

通常情况下,如果是在小的版本之间迁移,尤其是跟着官方的步伐进行更新的话,都不会遇到什么大问题。但是如果在现在版本是4.16的情况下,要对4.7版本的项目进行迁移的话,就会有很多问题。

这次遇到的问题就是从网上下载的示例项目版本太旧,需要进行大的版本迁移。原本以为不会有什么太多麻烦,不想却还是花了很多时间,因此在这里记录一下。

Build Rules

对项目进行编译,非常幸运,首先只遇到了几个Warning:

UE4最近的两次版本升级中对BuildRule进行了变更,所以在这里只要按照提示进行修改就可以了。只是官方的提示多少有些简略,实际操作是类似这样的。

*.build.cs

*.Target.cs

要留意的是,TargetRule有两个配置文件,一个是给Game的一个是给Editor的。

改了之后就没有提示了。

IWYU

既然升级了BuildRules,那就自然会要使用官方在4.15新推出的号称减少50%编译时间的IWYU了。

这个技术似乎是优化了预编译头的处理机制,但是使用起来需要自己进行定义和设置,并不是升到4.15以上就能全面享用的优势呢。

首先要做的是到*.build.cs中,在ModuleRules中添加一行,类似这样:

添加这行修改预编译头机制后,编译必然会遇到很多类似这样的错误:

新的PCH机制要求cpp文件必须首先包含自己的头文件,按照提示一个一个对源文件进行修改就好了。

此外还会遇到很多类型未定义以及由此引发的其他错误,如果有VA的话,可以对应着进行添加包含。要注意的是,连FString这样的基础类型都会有这个问题,所以还是颇为防不胜防。

官方推荐的是在项目的头文件中包含

当然必要的时候可能需要包含

如果项目中使用到了UEngine的话,可以选择包含

但是,实际上,如果对引擎比较深的地方的类进行了继承的话,最后还是得包含

要不然可能会被报错到引擎的源代码里面去。

进行包含调整之后,基本就编译通过了。

Load Module Error

原本以为编译通过了就万事大吉了,没想到在运行项目时却遇到了无法打开的问题……

使用VS进行调试运行,会看到这样的错误:

首先当然是怀疑dll文件不存在,但是实际上dll文件是存在的,那么问题出在哪里了呢?

求助万能的Google,终于找到了调试的方法。

这个时候需要使用微软官方的Debugging Tools for Windows,按照微软官方描述该工具被包含在WDK和Windows SDK中,因此直接install the Windows SDK,在安装的时候只勾选Debugging Tools for Windows就好了。

安装完成之后打开其中的一个名为Global Flags的工具,进行配置:

clip_image001

只要选择Show Loader Snaps就好了,保存选项,重启电脑。

然后重新在VS中调试运行项目,在上一次遇到错误的地方就可以看到:

错误原因原来是UE4Editor-GameplayAbilities.dll找不到了,但是这个是引擎提供的内容,为什么会找不到呢?

费了一阵脑筋之后才想起来,似乎从某个版本开始,GamePlayAbility由引擎的Module转变为了Plugin,目的是为了避免不需要这个系统的项目包含不必要的内容。

因此直接对项目文件进行编辑,将下面的内容:

改为:

重新编译,这样一来终于能够运行了。

不过Module的加载错误因项目而异,遇到这种错误还是必须使用GFlag进行调试才行。

最后,不要忘记在GFlag中把调试选项关掉,要不然调试运行速度会很感人的。

本博客所有内容遵循CC BY-NC-SA 3.0协议, 如有转载,请注明出处。
4 条评论

    博主好,

    更新了

    后,出现以下错误,请问如何解决呢?

     

     


    没有遇到过这个问题呢,看看你的modulerules里面是不是使用了什么已经变更了的属性?版本迁移的时候有时候会遇到modulerules的属性移动了位置、改变了名称之类的。


    博主好,我们也在用UE4做VR游戏项目,是否可以加个联系方式交流。微或Q


    你好,QQ已加,为了防止隐私泄露,已经将留言中的QQ删去

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">