虚幻4随笔4 从工程开始

前文说到UE3开始,虚幻就使用了UnrealBuildTool(如下简称UBT)来编译和生成代码。html

为何这么作而不是使用VS是很好理解的:由于VS跨平台会比较麻烦。像虚幻这样体量的工程,单为工程作一次VS配置就基本是一天的时间编辑器

并且UE4还不像UE3那样就十几个工程,把全部uproject都看作工程的话,得几十了。依赖关系复杂度几何增加,用VS的工具去维护……并且要维护各个平台和配置……再加上维护完后Mac、Linux还得维护一遍……分布式

可是为何不使用成熟的CMAKE呢,私觉得多是由于UBT里有一系列错综复杂的规则,用CMAKE制做出来,即使可读性OK,调试也比较麻烦。并且CMAKE对引擎使用者提出了必定的要求,而UBT则相对简单——只要你不纠结它如何实现。工具

官网的这篇文章详细解释了为何要作一个Build Tool出来:ui

https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/ProjectFileGenerator/index.htmlspa

What are the advantages of generating project files?命令行

 

能够先看看UBT的基本规则:调试

https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/index.htmlhtm

 

目前说来,虚幻的全部代码集中在下面几个文件夹里:blog

<Root>的Source,这个文件夹里主要是引擎代码。

其中:

Source/Runtime里主要是引擎的核心代码。

Source/Developer里彷佛主要是一些工具工程。

Source/Editor里是编辑器相关代码。

Source/Programs里是引擎使用中须要用到的工具。好比UBT、UnrealHeaderTool、Swarm(分布式光照计算系统)等等。

Source/ThirdParty里是各类第三方库。

<Root>的Plugin,这个文件夹里有各式各样的Plugin实现。特殊的是Plugin的组织中须要多一个uplugin,多是Plugin下可能会有一些资源什么的吧。咱们后面再来看uplugin。

<工程项目>的Source,若是是代码工程的话。

UBT目前只认这几个文件夹,也就是说,若是你要为引擎扩展功能,您只能在这些文件夹里建立本身的工程。这一点是在UBT里写死的,有代码的能够关注一下UBT工程的FindAllRulesSourceFiles这个方法。

 

在这些文件夹里,您能够搜索到大量的*.Build.cs文件,这些Build.cs就是虚幻的工程组织核心,基本上,每一个Build文件均可以被视为一个工程文件,而Build文件所在的文件夹能够被视为此工程的根目录。接下来,咱们不妨称这些拥有Build.cs的文件夹为工程。UBT一开始会先去找全部的Build.cs,把它们放在一块儿生成一个临时的dll。而后基于它们逐个进行一系列的代码分析工做,最后调用命令行进行编译和链接过程。

对于每一个工程而言,代码通常都散落在下面几个文件夹:

Classes:若是你在工程根目录下写了个Classes,就至关于告诉UBT这些文件是要用UnrealHeaderTool来生成运行时反射信息的。因此,这个文件夹里头文件的写法必须符合可反射类的写法规范。

还记得虚幻的哪些类是可反射的吗?对了,全部UObject的派生类包括AActor的派生类。具体是否有所验证还没看,不过最好是按照这个节奏来。

规范上无非主要就是USTRUCT、UCLASS这些宏,抄几个就能找到感受,或者用编辑器的类生成功能也可。

看起来,虚幻引擎发布时(不是经过编译生成,而是经过Launcher下载的那种),这些Classes文件是随引擎发布的,方便不具有全代码的Mod爱好者和BluePrint开发者们来制做游戏。

Public:公共头文件,跟Classes同样随着引擎发布而发布,因此这里通常都是些比较开放的接口,好比模块入口、功能核心接口什么的。基本上这些接口没有废话,很清晰,跟实现相关的细节隐藏得很是好。与Classes相同,若是你的文件夹里有Public,那么里面的.h就会被看成Public来。

Private:这个文件夹彷佛不是虚幻定死的,也就是彷佛能够不用Private的名字,或者多来几个文件夹什么的。除了UHT中有一段代码与之有必定关联以外,UBT里是彻底没有跟这个有关的东西。它里面基本上就是各类实现代码,以及要在实现间共享的头文件。你也能够建立其余相似的文件夹,只须要Build.cs里写上相应的文件夹名便可:

 

此外还有须要注意的地方是Source根目录下的Target.cs文件,Target的最终目标通常都是可执行文件,能够说,Target是整个生成期的入口,生成会首先从找到Target开始,若是没有Target或者找不到,就会直接失败。

此外,须要注意的是,Target.cs里面写的类的类名,必须是Target.cs的文件名加Target,例如:Sample.Target.cs,其类名必须是SampleTarget。UBT的GetTargetTypeAndRulesInstance方法里印证了这一点。

UBT里面仍是有很多限定用法的,Target就是其中之一,虚幻是一个比较强调命名的引擎,更名有不少麻烦,最好是可以一步到位。

今天抽空看了看文档,大概跟了跟UBT的流程,明天继续。

相关文章
相关标签/搜索