UBT编译记录

UE4 的功能被分成了很多的模块,在API文档里每个类都有 Module 这个属性(值为模块名)
每个模块使用其他模块要在Build.cs里导入,像vs里的引入库。
在构建时 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });//引入模块
或:PrivateDependencyModuleNames.AddRange(new string[] { "Sockets"});

UnrealBuildTool

使用C#写成,在源码工程里有这个,UE4使用这个项目配合Build.cs编译UE4。
UE4项目编译时会先调用构建工具,再跟据平台调用相应的编译器,以及添加自己的一些特殊定义。
例如VS编译器,VisualStudio在编译CPP代码时项目属性页,要配置编译的代码路径,库路径,输出路径,条件编译(#if #define),最后拼成一个长字符串跟传给编译器。而UBT就代替了这个属性页的配置,使多平台配置都是一套方法。
GENERATED_UCLASS_BODY() 在这个宏里会替换一些代码以适应编辑器,平台。

Build.cs 杂项API

一个Build.cs 对应一个模块

  • 获取目录
    using System.IO;
    ModuleDirectory //模块目录
    RulesCompiler.GetModuleFilename(this.GetType().Name) //模块名
    string path = Path.GetFullPath(Path.Combine(ModuleDirectory, "../../Test/"));//模块目录 插件常用
  • 引入外部库
    PublicIncludePaths.Add(Path);//外部库头文件目录
    PublicLibraryPaths.Add(Path); //.lib目录
    PublicAdditionalLibraries.Add("SixAxisSlave_x64.lib");//要链接的.lib文件
  • 动态DLL的加载
    PublicDelayLoadDLLs.Add("opencv_world320.dll");//运行时要加载的DLL
    RuntimeDependencies.Add(new RuntimeDependency(dllPath+ "opencv_world320.dll"));//打包时要拷贝的DLL 要注意使用的路径就是拷贝后路径

模块开发相关

一、模块继承 IModuleInterface 实现自己的 IMyModule 接口
二、实现自己IMyModule接口
三、IMPLEMENT_MODULE <-有dllexport 关键字 导出模块接口,说起来IMPLEMENT_PRIMARY_GAME_MODULE 游戏项目内也有 游戏也属模块
四、UBT根据起始目录构建 Editor Runtime Developer ThirdParty
五、未使用的模块不会编译
六、模块内的类会加上 模块名_API 这个宏,在生成VS项目,编译时都会用到,如果没加编译时会忽略文件。

运行

以 UE引擎下 Binaries\Win64 为运行目录
分2进程:
进程一、UE源 启动编辑器创建页,
进程二、编辑器创建页 创建新的项目,项目使用UE源。

插件

注意 .uplugin配置 Modules下的Type 如果是Develop 在打包运行时不会加载

使用UBT创建VS项目

"C:/UnrealBuildTool.exe" -projectfiles -project="C:/A1.uproject" -game -engine -progress -2017

其他

在C++类使用了插件模块的时候Build.cs要引入插件模块名
要拷贝dll文件到Binaries\Win64下 在使用插件提示dll找不到 要拷贝 opencv-ue4editor.dll 之类的

posted @ 2019-07-04 15:54  晨祷  阅读(760)  评论(1编辑  收藏  举报