• 虚幻4随笔4 从project開始


    

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

    为什么这么做而不是使用VS是非常好理解的:由于VS跨平台会比較麻烦。像虚幻这样体量的project,单为project做一次VS配置就基本是一天的时间

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

    可是为什么不使用成熟的CMAKE呢。私以为可能是由于UBT里有一系列错综复杂的规则,用CMAKE制作出来,即便可读性OK,调试也比較麻烦。并且CMAKE对引擎使用者提出了一定的要求,而UBT则相对简单——仅仅要你不纠结它怎样实现。


    官网的这篇文章详解了为什么要做一个Build Tool出来:

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

    What are the advantages of generating project files?

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

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

    眼下说来,虚幻的全部代码集中在以下几个目录里:

    <Root>的Source,这个目录里主要是引擎代码。

    当中:

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

    Source/Developer里似乎主要是一些工具project。

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

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

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

    <Root>的Plugin,这个目录里有各式各样的Plugin实现。特殊的是Plugin的组织中须要多一个uplugin。可能是Plugin下可能会有一些资源什么的吧。

    我们后面再来看uplugin。

    <project项目>的Source。假设是代码project的话。

    UBT眼下仅仅认这几个目录。也就是说,假设你要为引擎扩展功能,您仅仅能在这些目录里创建自己的project。这一点是在UBT里写死的,有代码的能够关注一下UBTproject的FindAllRulesSourceFiles这种方法。

    在这些目录里,您能够搜索到大量的*.Build.cs文件,这些Build.cs就是虚幻的project组织核心,基本上,每一个Build文件都能够被视为一个project文件,而Build文件所在的目录能够被视为此project的根目录。接下来,我们最好还是称这些拥有Build.cs的目录为project。

    UBT一開始会先去找全部的Build.cs。把它们放在一起生成一个暂时的dll。

    然后基于它们逐个进行一系列的代码分析工作,最后调用命令行进行编译和连接过程。

    对于每一个project而言,代码一般都散落在以下几个目录:

    Classes:假设你在project根文件夹下写了个Classes,就相当于告诉UBT这些文件是要用UnrealHeaderTool来生成执行时反射信息的。

    所以。这个文件夹里头文件的写法必须符合可反射类的写法规范。

    还记得虚幻的哪些类是可反射的吗?对了。全部UObject的派生类包含AActor的派生类。

    详细是否有所验证还没看,只是最好是依照这个节奏来。

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

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


    Public:公共头文件,跟Classes一样随着引擎公布而公布,所以这里一般都是些比較开放的接口。比方模块入口、功能核心接口什么的。

    基本上这些接口没有废话,非常清晰。跟实现相关的细节隐藏得非常好。与Classes同样。假设你的project里有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的流程,明天继续。

  • 相关阅读:
    【机器学习】:Xgboost和GBDT的不同与比较
    golang pprof
    终于解决了AMD RYZEN 3970X的散热问题
    2022,你好
    二叉树的遍历 → 不用递归,还能遍历吗
    异或运算的巧用 → 不用额外的变量,如何交换两个变量的值?
    关于 RocketMQ 事务消息的正确打开方式 → 你学废了吗
    单向链表的花式玩法 → 还在玩反转?
    二叉树的简单实战 → 一起温故下二叉树的遍历
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5116786.html
Copyright © 2020-2023  润新知