近期开始使用UE4,由于UE的资料相比Unity来说少一些,因此把自己遇到的一些坑记录下来,方便后续查看,也方便遇到同样问题的童鞋可以及时解决。
本文会不断补充新遇到的问题。
因为是刚开始接触UE,有说的不正确的地方请及时指正,感谢!
Windows包启动时找不到dll(UE4.24)
UE4生成的Windows包在启动时无法找到dll,如图所示:
该dll是在.Build.cs中通过RuntimeDependencies添加的,在生成的Windows包中,其相对路径如下:
问题原因:通过RuntimeDependencies添加的依赖项,在启动时会加载,但UE不会根据添加时指定的路径去加载dll,因此dll文件必须和exe位于同一目录下。
解决方案:我们有两种解决方法
- 可以将依赖的dll拷贝到exe所在文件夹,然后添加到RuntimeDependencies中,这样生成的Windows包dll文件和exe就会位于同一目录下。
- UE提供了PublicDelayLoadDLLs来指定延迟加载的dll,添加到PublicDelayLoadDLLs中的依赖项在启动时不会被加载。因此我们可以将dll添加到PublicDelayLoadDLLs中,然后在运行时自己根据dll所在的路径去加载dll。类似如下的代码:
在.uplugin中配置的BlacklistPlatforms没有作用(UE4.24)
我们可以通过BlacklistPlatforms和WhitelistPlatforms来设置模块的编译平台,如图所示:
当为模块设置BlacklistPlatforms时,就表明在目标平台下不要编译该模块。
今天在Linux下编译工程时,发现尽管配置了"BlacklistPlatforms": ["Linux"],但模块仍然会被编译。
问题原因:当模块被其他模块依赖时,如果依赖模块会在该平台被编译,则被依赖模块也会在该平台被编译(我们可以在.Build.cs中通过PrivateDependencyModuleNames或PublicDependencyModuleNames来设置模块的依赖项)。
尽管为B模块配置了"BlacklistPlatforms": ["Linux"],但由于A模块依赖于B模块,同时A模块会在Linux下被编译,因此B模块也会被编译。
解决方案:当依赖其他模块时,需要注意该模块的编译平台,以防出现错误。
编译AutomationTool时出现错误:The type or namespace name 'Management' does not exist in the namespace 'Windows'(UE4.24)
问题原因:默认情况下,UE会使用当前环境中最新的Windows SDK版本。我使用Visual Studio Installer 2017版本,可以安装的最高Windows SDK版本为17763,如图所示:
但该版本与UE4.24不兼容,在官网的文档中,说明需要安装Windows SDK 18362或更高的版本:
解决方案:可以通过微软官网下载适合版本的Windows SDK,安装后即可正确编译。
Windows 10 SDK - Windows app developmentdeveloper.microsoft.com无法加载DefaultAnimCurveCompressionSettings(UE4.24)
项目在真机上运行时会崩溃,崩溃时的堆栈记录如图所示:
通过查看源码,发现是无法加载DefaultAnimCurveCompressionSettings对象。回翻Cook日志,发现类似如下的错误:CookResults: Warning: Unable to find package for cooking /Engine/Animation/DefaultAnimCurveCompressionSettings
打开项目工程,发现其实该资源是存在的,如图所示:
解决方案:通过如下选项修正资源重定向:
然后删除工程目录下的Saved和Intermediate文件夹,重新Cook即可。