虚幻4

虚幻4蓝图编译剖析(三)

蓝咒 提交于 2020-02-06 23:16:47
编译 上面基本的术语已经介绍完了,下面我们进入来进入蓝图编译过程分析。蓝图的编译过程都在FKismetCompilerContext::Compile()函数中。它根据编译的类型不同(上文编译选项中提到的只编译Skeleton、只生成字节码、只生成cpp代码等等)会走不同的分支。我们这里以完全编译来讲解。此处为大概的流程,若想看详细的流程,请参照流程图以及代码。 清除类 类是就地编译的,这意味着同一个UBlueprintGeneratedClass在每次编译的时候都会被清理,并且会重复利用,这样指向这个类的指针就不用修复了。CleanAndSanitizeClass()把属性和函数放到临时包的一个垃圾(trash)类里面,然后清除类中的所有数据。 创建类的属性 CreateClassVariablesFromBlueprint()函数遍历蓝图的NewVariables数组,也包括构造脚本、Timeline等地方来找到该类需要的所有属性,然后创建UProperties。 创建函数列表 通过处理事件图表(Event graph)、常规的函数图表、代理、以及接口中来创建函数。 处理事件图表 CreateAndProcessUberGraph()函数用来处理事件图表。它把所有的事件图表拷贝到一个大的图中,这个时候节点有机会去做展开操作(expand,如果它需要的话)

虚幻4随笔6 Object和序列化

我怕爱的太早我们不能终老 提交于 2020-02-06 23:16:07
诚如之前所说,虚幻4主要的一些特性都是由UObject穿针引线在一起的,想把虚幻玩到比较深的程度,UObject是迟早要面对、回避不得的问题,所以,准备在其它主题之前,先把UObject好好弄一下。UObject主要完成了哪些工作呢?私以为: 反射系统 UObject体系构建了整个虚幻反射系统的核心,每个UObject都来自于一个UClass,这个Class可以是Unreal Header Tool(以后统一遵循官网命名:UHT)生成的,也可以是来自于Blueprint生成的(UBlueprintGeneratedClass)。反射可以说是现在主流引擎的构建基础,对国内多数人而言,可能更熟悉的是Unity透过Mono构建出来的反射,它的重要性不言而喻。 反射很大一坨的东西,具体就不说了,它最大的作用,相当于在运行时动态生成代码,可以省掉很多手写代码的工作量。否则像UE这样复杂的界面,全部Hardcode,100人是绝对不够的,改一次所需的时间也是无法接受的。有了反射之后,剩下的很多就是很好理解的一条路就顺下来了:属性编辑器自动生成、自动消息包收发、自动序列化、自动生成BP节点、BP和C++的自动接口交互、自动浅拷贝深拷贝、甚至按照设定规则来进行拷贝……不胜枚举。 共通性都是一样:Get Class,Get Property,或者Get Function

虚幻4随笔5 使用中的一些发现

旧街凉风 提交于 2020-02-06 23:15:07
行文匆匆,有些不太明白的地方评论里有补充,现在这里抱歉了! 半年多没有维护博客了,一方面是媳妇怀孕,另一方面是公司年中有一个版本…… 最近闲暇时间一直在研究虚幻,目前铺开了大概六七个原型在做,做的过程中学到了不少东西,有一些新的想法。 本来这些都是准备展开来说的,但是现在看来,每个话题展开都是需要大把的精力,所以还是先写到这里。有些已经有一些结论,有些还没有展开研究,就当是挖个坑吧,在后面几个月陆续填。 目前博主所用的版本是4.4,有些结论未必在未来还继续有效,如果发现有变化,后面会单起博客说明的。 总论: 仍在发展中,如果是准备用来做短期商业项目的,请合理评估风险。用来进行长期商业项目、或者觉得目前的功能已经可用、或者以研究为目的的,可以考虑介入。 优点是开发架构和框架体系成熟,国内策划不做脚本不做原型的开发模式可能确实相对不易适应。说程序用BP不习惯的恭喜您说出了一句正确的令人发指的废话,BP是设计给策划和关卡设计师用的,不是给你程序员用的——话说回来,也就在中国需要去把策划的想法翻译成代码的程(Fan一声)序(Yi四声)员(Gong一声)。 再次重申,如果您希望什么事儿都是程序给吃下来,或者您的项目被迫处于这种态势,而不是由策划负责脚本和内容的制作,那么请出门左转,找CE、Unity(大雾)或者其它引擎,虚幻这种跟欧美式开发方式深度绑定的引擎绝对不适合您。相信我

虚幻4随笔4 从project開始

为君一笑 提交于 2020-02-06 23:14:17
 前文说到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

虚幻4 虚拟漫游场景 制作过程

天涯浪子 提交于 2020-01-06 04:48:39
先看看渲染效果。 虚幻场景中的物品其实也需要全部由3Dmax制作好导入 虚幻由于有一部分是动态光影,还需要预渲染,所以模型的面数要尽可能降低。 原来3000多个面降到41个面。 3Dmax自身渲染的话,用自带的UV剪裁即可,但是用在虚幻中渲染光影,这种自动裁剪的UV会使得光影渲染效果不佳。 模型UV的裁剪应该模仿沙发贴皮的方式,尽可能完整一块。 沿着边线用Unfold3D,裁剪好UV贴皮 沿着边线用Unfold3D,裁剪好UV贴皮 3Dmax中导出模型 如果使用自动生成的UV贴图生成光影效果很可能就会变成黑斑 虚幻的光影效果是优先通过预渲染得到的,会预先把阴影烘焙到地面 可以看到UV贴皮的裁剪缝隙 实际生产虚拟漫游前,场景已经在3Dmax中搭建完毕了 首先需要在3Dmax中进行减面,减模型,导出 在虚幻中导入场景 由于在3dmax中很多模型都是单面材质,在光影烘焙中会透光,所以需要遮罩或者设置双面材质 其余材质分批导入进来 其余材质分批导入进来 设置户外布景板,由于虚幻更多是场景的漫游,所以考虑不同视角是否会穿帮也挺重要的 导入3Dmax数据的时候,我们采用了减模型。因为虚幻对多模型可以采用类似3DMAX 复制instance的方式,减少运算量 如图就复制了一张椅子 完成物品的布置 为了解决之前漏光的问题,我们可以通过BSP建墙或者模型双面的形式 室内光影效果要唯美

虚幻4属性系统(反射)翻译

泄露秘密 提交于 2019-12-17 12:30:55
反射是程序在运行时进行自检的一种能力。它非常有用且在虚幻引擎中基础技术,支撑了诸如 编辑器中的细节面板、序列化、垃圾回收、网络复制、以及蓝图与C++交互等功能。然而,C++原生并不支持任意形式的反射,因此 虚幻引擎有它自己的系统用来 利用、查询以及操作关于C++类、结构体、函数 、成员变量以及枚举的信息。我们特意把反射叫做属性系统,因为反射也是一个图形术语。 反射系统是可以选择加入的。你需要给暴露给反射系统的类型或属性添加注解,这样Unreal Header Tool (UHT)就会在编译工程的时候利用那些信息生成特定的代码。 标记 为了标记一个头文件包含反射类型,需要在文件顶部添加一个特殊的include文件。这让UHT知道它需要考虑这个文件,并且在反射系统的实现里也是需要的。 #include "FileName.generated.h" 你现在可以使用UENUM()、UCLASS()、USTRUCT()、UFUNCTION()、以及UPROPERTY()来在头文件中注解不同的类型以及成员变量。每一个宏都会出现在类型或者成员变量的前面,并且可以包含额外的修饰符关键字。让我们来看一个真实的例子(从StrategyGame截取一部分): /////////////////////////////////////////////////////////////////////////

虚幻4 UE4 蓝图之关卡蓝图实现自动开关门

与世无争的帅哥 提交于 2019-12-05 01:18:09
新建项目 往关卡中放置一个门 在内容浏览器中找到 门 的静态网格体 拖放到关卡中 此时门默认没有碰撞,人物可以直接穿过 给门添加碰撞 双击内容管理器中的 SM_Door,打开编辑窗口 选择菜单“碰撞”-“添加盒体简化碰撞”,给门添加碰撞框架 门周围的绿边框即是碰撞区域 通过缩放调整碰撞区域使其与门基本匹配 添加碰撞后保存,进入关卡可以发现人物已经无法穿过门 添加触发器 将盒体触发器拖入关卡中 调整触发器大小及位置 将门设置为可移动 选中门,在细节面板中“变换”-“移动性”-切换为“可移动” 编辑关卡蓝图 操作快捷菜单“蓝图”-“打开关卡蓝图” 添加触发器事件 从世界大纲视图中选中触发器对象“TriggerBox” 在空白处右键,添加 Begin Overlap 和 End Overlap 两个事件 添加Rotation设置蓝图 从世界大纲中将门的对象 SM_Door 拖进关卡蓝图 从 SM_Door 拖出节点 SetActorRotation 添加时间轴蓝图 在空白处右键,搜索timeline,添加时间轴 双击打开时间轴,选择“添加浮点型轨迹” 右键-添加关键帧,或按Shift+左键直接添加,添加两个关键帧 选中关键帧,直接设定相应的值,这里我设置第一个关键帧 0s,值0;第二个关键帧2s,值85 觉得变化太生硬可以同时选中两个关键帧,右键,关键帧插值-勾上“自动”即可

虚幻4教程2-创建游戏模式及角色

空扰寡人 提交于 2019-11-29 11:22:34
这次教程2将要教会大家将第三人称转变为第一人称 那么,开始吧 ////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////// 首先,打开虚幻4项目浏览器: 就是它↑ 没有也没关系,打开虚幻引擎,点击 启动 打开后会弹出个“框框” 打开后是这样的: 就只需要选择 Third Person 再选择一个文件夹 ( 切记:不要用中文的文件夹! ) 再改个名(把 我的项目 改一个自己喜欢的 英文名 ) 然后点击右下角的 创建项目 会有这个画面: AND这个画面: 注意中间的小窗口 ////////////////////////////////////////////////////分割线//////////////////////////////////////////////////// ////////////////////////////////////////////////////分割线//////////////////////////////////////////////////// ////////////////////////////////////////////////