UE4问题记录

原创
2018/03/21 15:41
阅读数 3K
  • 以UE4.12建立蓝图工程,通过在编辑器里添加C++类转为C++工程。然后switch到高版本UE时,不报错,但是generate就不给你生成更新的project文件。(直接用Launcher生成指定版本的C++工程就ok了)

  • UE4.11的工程要用vs2013来编译。之后的可以用vs2015及更高版本vs来编译。

  • UE4.18之前编译的插件,发布时,可以删除Source目录下的所有Private目录,以及Binaries目录下的所有.pdb和.modules文件。但是在UE4.18版本上编译的插件,在发布时,.modules文件绝对不能删掉,否则插件无法被他人使用。

  • UE4.11左右版本的编辑器,经常出现下拉菜单无法显示的问题,其实这个时候下拉菜单是存在的,能够用鼠标点击相关项。

  • AsyncTask提交到GameThread的Task里不要有死循环,否则会将UE堵死在那儿。

  • 改动Build.cs文件后,用vs打开时,最好先clean一下,这个不是必须的,但有时候不clean就是编译不过去。

  • Build.cs文件经常碰到兼容性问题。其中一个最常见的就是ReadOnlyTargetRules,这个玩意是从4.16开始引入的,到4.19在ModuleRules里就彻底不兼容原先的TargetInfo了。用下面这个玩意可以解决这个问题:

    #if WITH_FORWARDED_MODULE_RULES_CTOR
        public Linter(ReadOnlyTargetRules Target) : base(Target)
    #else
        public Linter(TargetInfo Target)
    #endif

    这个宏在4.16里引入的。

  • 接上一条。也可以如下解决:

    namespace Module_Name
    {
    #if WITH_FORWARDED_MODULE_RULES_CTOR
        using zTargetInfo = ReadOnlyTargetRules;
    #else
        using zTargetInfo = TargetInfo;
    #endif
    
    public Module_Name(zTargetInfo Target)
    #if WITH_FORWARDED_MODULE_RULES_CTOR
        : base(Target)
    #endif
    
    ​}
  •  接上条。plugins里面的兼容性如上解决之后,wrapper工程自身Source目录下自动生成的cs文件也需要调整如下(UE4.19及以上):
  • 插件升级到UE4.20时,又碰到无数条error报告,无法编译通过。大致这么几条:将windows.h的包含改为Windows/MinWindows.h,这一条就该能去掉99%的error。当DebugGame版编译报告noexcept用法不对时,在工程和插件的Build.cs文件中,把bEnableExceptions=true这个属性设置添加到构造函数中。

    SetupLateUpdate函数会比之前的UE4版本多出一个参数,这个参数不明白啥意思,我填的false。还有一个API_VERSION_NUMBER问题,过于特殊,我直接在cpp最开头检测该宏的存在性,若不存在,则定义一下该宏。基本上这几条搞定后,就兼容UE4.20了。
  • 接上条。在我的插件中只要是Runtime版的配置都编译不过去,提示noexcept用法有问题。经过分析确认是由于插件里使用了STL的<future>库导致的,所以上一条对noexcept问题的修复处理不合理。我最新采用的方式是将std::promise以及std::future还有std::unique_ptr均替换为UE4官方版本TPromise/TFuture/TUniquePtr,然后删除掉对<future>头文件的引用。同时,将原先在Build.cs文件中添加的bEnableExceptions=true移除。这样就比较好的解决掉了这个问题。
  • 在UE4.20中,有一个很大的变化,就是Build.cs文件中PublicIncludePaths、PrivateIncludePaths要求的每个字符串必须用Path.Combine(ModuleDirectory, "Public")的方式组织起来,尤其是包含有ThirdParty DLL插件的插件,更是必须如此。否则编译出来的插件版本在移除源代码后无法被UE4.20的工程使用。
  • 在UE4.20中还有一个新的问题:工程里引用了第三方Plugins的UE工程,在发布时,似乎不能像以前一样,把Binaries和Build、Intermediate、Saved等目录都删除后再发布,因为这些东西在客户的机器上能够重新生成。这个现在行不通了:Binaries目录不能删除,如果删除了,那么发布的工程在客户电脑上打开会打开失败,rebuild也不行。不过我试了另一个变通的方式似乎可行,不知是否百分百能成功:就是还像原来一样,把刚才说的那些目录都删除,但是也把Plugins目录里的插件重新覆盖一遍(这是为了补救打包失败时插件的部分.lib文件可能会被意外删除的问题)保证插件自身的完整性,然后把uproject文件中对应插件的Enabled属性改为false。这样整个工程就可以压缩zip发布了,客户打开工程文件时可以rebuild成功可执行文件,但是可能会报错,因为插件处于禁用状态,现在再把uproject文件中对应插件的Enabled属性改为true,重新打开工程,就没有问题了。
  • UE4.20(包含4.20)以上版本的引擎,以二进制方式发布的插件,应该在module的*.build.cs文件中添加bUsePrecompiled = true; 这样插件就可以直接放置在工程Plugins目录下使用了,打包也没问题。
  • .uplugin文件里的WhitelistPlatforms和BlacklistPlatforms字段可以控制编译的目标平台,其值在[Engine/Source/Programs/UnrealBuildTool/Configuration/UEBuildTarget.cs]中定义,可取:Win32,Win64,Mac,XboxOne,PS4,IOS,Android,HTML5,Linux,AllDesktop,TVOS,Switch等。
  • UE4中用DEPRECATED(UE版本号,“描述字符串”)标记的函数或变量,意思是从括号里的UE版本号开始就已经采用了新机制,即如果用引擎版本宏来做兼容性控制的话,应该用下面的代码块:
    #if (ENGINE_MAJOR_VERSION >= 4) && (ENGINE_MINOR_VERSION < UE版本号) 
        <<老机制的代码>> 
    #else 
        <<新机制的代码>>
    #endif
  • *.build.cs文件中的PublicIncludePaths是指本Module想暴露给第三方程序的目录,PrivateIncludePaths是指本Module需要引用但不想暴露给第三方的Include目录。
  • (-∞, UE4.16]中对Vive Tracker的枚举类型归类为Invalid,即GetTrackedDeviceIds用Invalid作为索引参数时,才会查询到Tracker设备。从UE4.17开始,对Vive Tracker的枚举归为Other。这个是由SteamVRHMD.cpp文件里的GetTrackedDeviceType造成的。
  • 一个傻B到爆的问题:有时候使用UFUNCTION时总是报错,这个时候需要包含"UObject/ScriptMacros.h"
  • 引擎目录UE4.xx\Engine\Source\Runtime下有很多文件夹,基本上这些子文件里都会有一个和文件夹同名的build.cs文件。根据官方文档的描述“Modules are declared through C# source files with a .build.cs extension, and are stored under your project's Source directory.”,这些文件夹的名字都可以作为module在其他build.cs文件中引用。
  • 引擎目录UE4.xx\Engine\Source\ThirdParty以及其他类似目录下的情况与上一条一样,都可以直接在自己的build.cs文件中引用这些module名字。
  • 使用了IWYU方式编译插件时,偶尔会碰到【Compiling er : All source files in module "<<ModuleName">> must include the same precompiled header first】的错误,删掉Plugins里的Intermediate目录都解决不了,这时需要把整个工程的Intermediate和Saved目录都删除,再重新生成工程文件并编译。
  • 打包插件时,如果有UE_LOG会输出Error的代码,打包会失败,在允许时,可以将Error改为Warning。同时C++中少用range-based for循环,这个在UE4中打包时有可能造成打包失败。
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部