虚幻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出来:
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的流程,明天继续。
虚幻4随笔4 从project開始的更多相关文章
- Linux内核project导论——linux学习和职业曲线(刚開始学习的人,中级,高级都可參考)
Linux世界介绍 给自己定级 门外汉: 不会安装操作系统 不会用虚拟机(安装和使用) 入门级: 熟悉常见的发行版,甚至装过而且能用一些特殊发行版(比如kali)做过一些简单的图形界面的使用. 会一些 ...
- 从零開始写游戏引擎(一) - project创建以及文件夹设置还有版本号控制
一句话提要 好的開始等于成功了一半. 创建文件夹结构 project文件夹下最好分为以下几个文件夹 Docs - 开发文档,设计文档 Assets - 角色,动作,模型和音效等 Source - 代码 ...
- 開始折腾cocos2d-x,使用批处理来创建项目
開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...
- wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- 送给刚刚開始学cocos2d-x引擎 移植Android的同学
刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.cs ...
- iPhone开发【一】从HelloWorld開始
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhon ...
- 从零開始学习OpenCL开发(一)架构
多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我<从零開始做OpenCL开发>系列文章的 ...
- wxWidgets刚開始学习的人导引(1)——前言
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- Scala从零開始:使用Intellij IDEA写hello world
引言 在之前的文章中,我们介绍了怎样使用Scala IDE也就是eclipse中集成的Scala开发插件来进行Scala语言程序的开发,在使用了一段时间之后,发现eclipse对Scala的支持并非非 ...
随机推荐
- C#版二维码生成器附皮肤下载
原文 C#版二维码生成器附皮肤下载 前言 本文所使用的二维码生成代码是谷歌开源的条形码图像处理库完成的,c#版的代码可去https://code.google.com/p/zxing/download ...
- 设计模式(五)适配器模式Adapter(结构型)
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
- poj 1155 TELE (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...
- 关于UIText换行
话不多说,直接上代码 --代码是lua的,c++也一样 local text = ccui.Text:create("text can line wrap text can line wra ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- UVA 322 ships (POJ 1138)
题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- <转载>div+css布局教程之div+css常见布局结构定义
在使用div+css布局时,首先应该根据网页内容进行结构设计,仔细分析和规划你的页面结构,你可能得到类似这样的几块: 页面层容器.页面头部.标志和站点名称.站点导航(主菜单).主页面内容.子菜单.搜索 ...
- 微软C#版SQLHelper.cs类
转载自:http://blog.csdn.net/fengqingtao2008/article/details/17399247 using System; using System.Data; u ...
- java常用内存设置
Java虚拟机具有一个堆,是运行时的数据区域,所有类实例和数组内存均从此处分配.堆是在java虚拟机启动时创建的. 堆是留给开发人员用的内存区域.非堆就是JVM留给自己用的(方法区,JVM内部处理或优 ...
- 最长公共子序列python实现
最长公共子序列是动态规划基本题目,以下依照动态规划基本步骤解出来. 1.找出最优解的性质,并刻划其结构特征 序列a共同拥有m个元素,序列b共同拥有n个元素,假设a[m-1]==b[n-1],那么a[: ...