Unreal Engine 4.17 Released!
2017年8月7日

虚幻引擎 4.17 发布!

作者 Jeff Wilson

无论是借助游戏、线性媒体还是虚拟现实,虚幻引擎 4.17 都让您能够讲述自己的故事。新增工具、工作流程增强和性能优化,让您能够以预期的质量标准,根据性能用户的需要以最轻松简单的方式开发和交付项目。借助新平台支持和扩充的功能套件,虚幻引擎能够在任何平台上交付迷人的体验

新增的 Composure 合成系统和 Image Plate 插件提供了一种强大且灵活的方式,将实时渲染的内容与真人拍摄镜头结合起来。对 Sequencer 进行了多项改进,继续优化用于创建过场动画和线性媒体的工作流程。

使用新增的资产管理框架可以发现和加载任务、英雄或其他特定于游戏的内容。在运行时,使用资产注册表的新增蓝图存取器在蓝图中查询关于资产的信息。

作为平台改进的一部分,现在可以针对 Microsoft 的 Xbox One X 游戏机开发游戏。使用新增的 VR 观众屏幕支持为 VR 项目增添社交体验。在安卓上,我们针对高端设备进行了多方面改进,还将继续努力,进一步减少可执行文件的大小。

本版本包括由 GitHub 上非常了不起的虚幻引擎开发人员社区提交的 90 项改进!感谢以下每一位贡献者对虚幻引擎 4.17 的贡献:

0lento、Akihiro Kayama (kayama-shift)、Andrea Catania (AndreaCatania)、Andrew Armbruster (aarmbruster)、Andrew Gaubatz (e-agaubatz)、Andreas Schultes (andreasschultes)、Angel Angelov (DexterLB)、Artem V. Navrotskiy (bozaro)、Brent Scriver (FineRedMist)、Cengiz Terzibas (yaakuro)、Chris Grebeldinger (cgrebeld)、DaveC79、Dennis Wissel (dsine-de)、erniea、GBX-ABair、Gryphon Myers (gryphonmyers)、Igor Karatayev (yatagarasu25)、Ilya (ill)、irobot、Jared Hefty (jared-improbable)、Jason Calvert (jasoncalvert)、Jorge Martins (SNikon)、Kalle Hämäläinen (kallehamalainen)、Konstantin Nosov (gildor2)、Laurie (laurie-hedge)、Mario Zechner (badlogic)、Mathias Hübscher (user37337)、Matteo De Carlo (portaloffreedom)、Mattias Cibien (mattiascibien)、Max Shawabkeh (max99x)、Michael Auerswald (flipswitchingmonkey)、Michail Nikolaev (michail-nikolaev)、Nako Sung (nakosung)、Paul Eremeeff (PaulEremeeff)、Piotr BÄk (Pierdek)、poiyomi、projectgheist、rfenner、Robert Khalikov (nbjk667)、Roberto De Ioris (rdeioris)、Ron van Essen (ronve)、rooneym、Ryan Nielson (RyanNielson)、Sam Hocevar (samhocevar)、Satheesh (ryanjon2040)、Sébastien Rombauts (SRombauts)、Skylonxe、Stefan Zimecki (stefanzimecki)、StefanoProsperi、Stormtide Ltd (StormtideGames)、Timothee Besset (TTimo)、Trent Polack (trentpolack)、UpwindSpring01 和 wuyakuma

主要特性

新增特性:Sequencer 改进

image alt text

我们对 Sequencer 进行了大量的功能、稳定性和易用性改进,让使用者觉得用它创建自己的故事是一件很享受的事情,就像用户体验故事一样。

自动关键帧

自动关键帧已经简化为单一可切换状态,并改进了易用性,使用逻辑更加清晰。

image alt text

Sequencer 编辑与关卡编辑

现在完全不必担心,对一个属性的更改是否会影响单个镜头,或者在 Sequencer 中使用新切换时是否会传播到其他镜头,这样帮助用户细化了工作。启用仅允许 Sequencer 编辑时,对属性的任何更改都会自动创建轨道(如果不存在)和/或关键帧。这些更改会被隔离到当前正在处理的特定镜头,不会泄漏到其他镜头。启用仅允许关卡编辑,就会编辑对象的默认属性。如果想要执行会影响所有镜头的全局更改,在 Sequencer 中已经有轨道的属性在细节面板中会被禁用

image alt text

次要改进

  • 现在,在与 Actor 相连的音频部分中增加了衰减设置。
  • 可以在连接部分中指定连接和断开连接规则。
  • 我们在关卡序列播放器中添加了过场动画选项。
  • 我们在矢量、转换、颜色键属性编辑器中添加了键时间。
  • 现在提供了一些热键,可以跳到下一个/上一个镜头(Shift + 逗号和 Shift + 句点)。
  • 对齐滚动到键现在允许滚动到容差之外。
  • 现在,使用编辑器首选项中的设置切换到 Sequencer 时,可以激活实时视口。

错误修订

  • 大幅绑定改进
  • 修订 - 消失或重新产生时,可产生状态/属性未保存/恢复
  • 修订 - 过滤时,Sequencer 大纲添加了额外节点
  • 修订 - 异步加载关卡序列
  • 修订 - 在创建关键帧之前,自动键未保存属性值(正确复原所必需)

Sequencer 全局大纲集成

Sequencer 现在更紧密地与全局大纲集成。全局大纲显示 Actor 绑定到的关卡序列,并显示 Sequencer 产生的 Actor,这样用户可以从一个位置访问 Sequencer 绑定的所有 Actor。

image alt text

Sequencer 中的混合

现在可以将 Sequencer 中的各个部分混合起来轻松创建无缝过渡。绑定可以用于 Sequencer 中的多个数字属性(2D/3D 转换、矢量、颜色、浮点等)。

  • 现在,所有受支持的部分都可以自然地混合在一起,重叠时会产生应用于对象的单一值。
  • 同一行上重叠的部分现在会自动随着时间的推移互相插值。
  • 动画轨道现在也会自动插补
  • 许多内置的 Easing Function 都作为标准提供(线性、多项式、指数函数 ease in/out 等等)。此外,还可以指定曲线资产或使用 IMovieSceneEasingFunction 接口(在 BP 中也可用)实现自己的自定义混合函数。
  • 转换部分现在可以对任何通道组合进行操作,而不会影响转换的其余部分(即,仅定位和旋转)

我们还针对可混合的属性添加了新的混合模式,从而允许加权绝对、相对和递增混合。这对于相对起始值制作属性动画,或者向/从绝对或相对空间插值(即,在过场动画内外插值)尤其有用

新增特性:Composure 合成插件(测试功能)

在与 The Mill 和 General Motors 合作展示 The Human Race GDC 2017 演示之后,虚幻引擎 4.17 包含了全新的 Composure 引擎插件:这是一个 C++ 蓝图框架,用途是轻松地创建复杂的实时合成管道

在 Youtube 上,提供了 GDC 上发表的有关该演示的技术讲解,包括虚幻引擎 4 Composure 插件背后的技术的相关细节。

Composure 功能列表:

  • 玩家控制器和纹理渲染目标 2D 之间有绑定机制,将引擎的默认渲染管道替换为项目特定的 C++ 或蓝图实现的合成管道输出。
  • 背移设置和 Sequencer 导入程序。
  • 参数光学变形:根据 OpenCV 标准镜头校准模型为光学变形和非变形生成 UV 置换贴图。
  • UVMap 过程,通过自定义材质灵活性,根据 UV 置换贴图和 UV 指标使纹理变形。
  • 独立高光过程,重现合成效果,例如背景与前景边缘的融合效果。
  • 引擎色调贴图器独立过程。
  • 校色 C++、蓝图和材质 API。
  • 色差 C++、蓝图和材质 API。
  • 蓝图帮助程序,提供简单的合成用例。
  • 样本项目。

引擎功能列表:

  • 引擎后处理链中的试验性阿尔法通道支持:圆形景深、页框交错抗锯齿、运动模糊和高光。
  • 针对场景捕捉的基于运动模糊的投影矩阵支持,用于 Composure 中的背移运动模糊支持。
  • 蓝图画布绘图 API 中的材质后期处理域及其阿尔法通道输出支持。
  • 蓝图编辑器中关于场景捕捉的显示标记编辑。

新增特性:Image Plate Actor 和 Sequencer 轨道(试验阶段)

在连接到镜头时,新增的(试验阶段)Image Plate Actor 允许全屏显示帧度精确图像序列

Sequencer 中的相关轨道根据任何纹理属性(例如蓝图或 C++ 实现的合成管道输入)对此类图像进行流式处理,在编辑器中播放或创建燃烧效果时可以达到帧度精确性。Image Plate Actor 和 Sequencer 都是 Image Plate 插件的一部分。

新增特性:对插件的全局着色器支持

现在可以在插件和项目内部添加新的全局着色器了!利用对着色器编译器和着色器目录文件结构的更改,插件和项目可以提供自己的着色器。您可以查看 LensDistortion 插件,了解一个简单的示例 (Engine/Plugins/Compositing/LensDistortion)。

注:

  • 拥有全局着色器的插件和项目模块要求使用 PostConfigInit 加载阶段。
  • 插件和项目中的着色器支持也处在试验阶段。
  • 插件和项目可以随意在 Public 目录中包含其他插件的 USH 文件。由插件创建者负责准确处理插件之间的依赖关系。
  • USF 文件应该位于 Private 目录中。
  • 对 IMPLEMENT_SHADER_TYPE 的所有调用现在应该包含 USF 着色器文件的完整路径(例如“/Engine/Private/Foo.usf”或“/Plugin/FooBar/Private/MyComputeShader.usf”)。
  • C++ 生成的文件应该映射到 /Engine/Generated/ 虚拟目录中。
  • Shaders/ 目录至少需要一个 Private/ 或 Public/ 目录。不应该存在 Generated/ 目录。

着色器目录文件结构

着色器文件已经划分为 USF 和新的 USH 文件扩展名。USH 文件用于不包含着色器入口点、并且只能包含在其他着色器文件当中的着色器头文件,而 USF 文件是唯一不可包含的、拥有着色器入口点的文件。

此外,着色器文件已经拆分到 Public 和 Private 文件夹中。就像引擎的源代码一样,公共 API 应该放在 Public 文件夹中的文件里面,而实现放在 Private 文件夹中。

注:着色器 API 在引擎的主要版本中有一些突破性的改变。

新增特性:插件之间的依赖关系

插件现在可以声明对一些其他插件的依赖关系,引擎将会使用这些关系来自动启用和加载它们所依赖的其他插件。依赖关系可以列示在 .uplugin 中,使用的语法与 .uproject 文件相同。

新增特性:环境法线贴图和反射遮挡

环境法线是指计算环境光遮蔽时可能出现的一条额外信息。AO 是指在围绕着着色点的半球体范围内,没有撞到几何体的光线数量百分比。换言之,就是不会被遮挡的环境光数量。我们也可以找到不会被遮挡的环境光的平均方向。为获得最佳质量并符合 UE4 的假设,这两种贴图都应该使用所选程序包中的余弦分布进行计算。在使用环境法线输出节点时,对材质使用这种贴图。

有了这个信息,我们就可以采取很多操作来改善间接照明。结合使用环境法线和 AO 可以改善漫射间接照明,使其看起来更接近于 GI。环境法线代替法线,用于间接照明。我们还进行了一些额外的增强,让细节法线不会消失,但除此之外,概念并没有区别。最大的影响就是有可能减少漏光。

我们还通过一种强大但不太常规的方法在反射遮挡中使用了该信息。AO 是针对漫射间接照明的遮挡。反射遮挡是针对高光间接照明的遮挡。工作原理是让镜面和可见圆锥体相交,也就是作为圆锥轴的环境法线和作为圆锥角的 AO 量所形成的半球体未被遮挡部分的圆锥体。这样可以明显减少漏光,尤其是 SSR 数据不可用的时候。

最后,我们还添加了用于计算遮挡的多次反射近似值。我们使用多次反射结果的近似值,取代了遮蔽第一次反射的 AO 或反射遮蔽。明亮材质会变得不那么暗,有色材质的色彩会更加饱和。

image alt text

image alt text

AO

多次反射

新增特性:Xbox One X 支持

我们添加了针对 Xbox One X 开发游戏的初级支持!

image alt text

开发 Xbox One X 游戏不需要单独的构建平台 - Xbox One 编译足以满足需求,为 Xbox One 烘焙的数据在 Xbox One X 上同样有效。

新增特性:针对 Oculus、Vive 和 PSVR 推出 VR 观众屏幕支持

虚幻引擎 4.17 增加了观众屏幕支持,适用于 Oculus 和 HTC Vive,并改进了对 PSVR 的现有支持!

观众屏幕是与 VR 设备相连的“正常”输出设备,通常是 TV 或计算机显示器。一个玩家使用 HMD,其他人可以观察或参与体验。

取自 GhostPaint 的观众屏幕视图,显示的是正在工作的 VR 玩家。视频作者 Shane Caudle | GhostPaint.com

现在可以在观众屏幕上绘制任何纹理,包括渲染目标或 UI,可以作为 VR 显示视图的补充,也可以取而代之。蓝图可以处理简单的布局系统。大多数调试模式现在可以在所有平台上使用。

有关在项目中添加 VR 观众屏幕支持的更多信息,请参阅虚拟现实观众屏幕文档。

新增特性:ARKit 支持(试验阶段)

我们很高兴地宣布,虚幻引擎 4.17 为 iOS 提供了试验性版本的初级 ARKit 支持!该插件是 Wingnut 团队努力的结果,曾经在 Apple WWDC 新闻发布会的舞台上展示过。它使开发人员可以抢先使用新功能套件,Apple 今年晚些时候会在 iOS 11 中推出官方支持。

请注意,该支持仍在试验阶段,API 和接口会发生变化。

新增特性:资产管理框架生产就绪

资产管理器最初是作为测试功能在 4.16 中引入的,现在可以访问蓝图,并且可以在生产中使用了!资产管理器是一个全局对象,用于在编辑器中或在运行时发现、加载和审计地图以及特定于游戏的资产类型。它提供了一个框架,使用户能够更轻松地创建任务、武器或英雄之类的对象,并根据需要加载,而且在打包和发布游戏时,还可以用于设置烘焙和分块规则。项目设置中的资产管理器选项卡可以用于建立游戏的规则:

image alt text

在运行时,可以查询资产管理器扫描的主资产类型,然后再进行加载,之后就可以根据需要异步加载。要使用资产管理器,在本机 UAssetManager 类(可以针对游戏划分子类)上调用函数,或者在资产管理器类别(例如异步加载主要资产)中调用蓝图函数。

新增特性:蓝图中的资产注册表

资产注册表现在可以在蓝图中使用,便于快速查找关于资产的信息!

image alt text

新增特性:添加了对异步 PhysX 烘焙的支持

现在可以在工作线程上执行 PhysX 碰撞数据烘焙。如果是在运行时执行该操作,这非常有用。我们还更新了 ProceduralMeshComponent,现在可以选择性地利用此功能。这让我们可以在退出游戏线程的情况下,并行烘焙多个 ProceduralMeshComponent,避免发生运行时故障。

新增特性:具有移动支持的运行时 PhysX 烘焙插件

现在可以通过插件打开/关闭 Physx 碰撞数据的运行时烘焙,而不必在所有平台上执行引擎定义/重新编译。

新增特性:物理优化

PhysX 任务现在可以一起进行批处理,降低开销。p.BatchPhysXTasksSize 用于对此进行调整。较大批次可以降低每个任务的开销,代价是并行性降低。可以根据游戏执行的其他工作加以权衡。

新增特性:两个骨骼 IK 改进

新增的“允许扭曲”选项可以控制中间关节是否可以扭曲,借助该选项,现在可以更好地控制由两个骨骼 IK 控制的关节。这对于机械手臂设置尤其是有用。

 
image alt text image alt text

禁用允许扭曲

启用允许扭曲

我们还修复了“保持效果器相对旋转”选项,并添加了新的“启用调试绘图”选项,如下所示:

image alt text

新增特性:适用于动画蓝图的创建动态递增节点

动画蓝图中新增的“创建动态递增”节点,以基本和目标姿势作为输入,并在运行时创建递增姿势。此功能非常适用于处理实时表演、实时动作捕捉或者在运行时将动画数据传递到虚幻引擎的其他情况。还使您能够使用单一动画序列资产作为覆盖或递增方法,节省了磁盘内存,但代价是产生较小的运行时成本。

新增特性:实时编辑动画蓝图(试验阶段)

现在可以在播放器中进行编辑期间实时编辑和重新编译动画蓝图,大大加快了迭代时间。

在关卡中选择要调试的动画蓝图实例时,动画蓝图编辑器视口现在会“连接”到该实例,并显示该实例动画状态的镜像画面。

新增特性:布料工具(试验阶段/测试功能)

  • 布料描画工具框架进行了重构,形成了更具扩展性的编辑器。
  • 更改了用于引用的布料物理资产,取代了一次性提取,这样可以在创建后进行编辑,布料模拟能够正确地选取编辑。
  • 布料“遮罩”支持
    • 遮罩属于一个间接层次,不同于直接在布料顶点参数上直接描画。这允许在开发期间和测试不同的配置时定义和交换多个遮罩。
  • 重新加工了布料描画器的工具框架
    • 添加了平滑的布料描画工具
    • 添加了填充布料描画工具
    • 在布料选项卡上添加了布料配置编辑面板,避免与“资产细节”选项卡之间来回切换。

新增特性:删除骨骼后烘焙姿势

现在可以指定动画姿势,用于在删除了原始骨骼的骨架网络 LOD 中为顶点重塑皮肤,而不必进行加权计算来找到最接近的上级骨骼。

image alt text

新增特性:使用复制姿势预览“其他网格”

在动画工具中,用于预览模块化网格的“其他网格”功能现在使用“复制姿势”节点,而不是“主姿势”。这意味着可以支持没有共享骨架的网格,骨骼根据名称进行复制,为用户提供了更大的灵活性。

新增特性:动画资产浏览器中的文件夹过滤器

动画资产浏览器现在可以根据选择的若干文件夹来过滤视图。可用过滤器的数量由编辑器首选项中的一个设置来控制。

image alt text

新增特性:网格编辑器材质和部分面板改进

用于编辑材质和网格部分的界面已经合成,便于提高美工在编辑网格时的工作效率。这一更改影响静态网格编辑器和骨架网格编辑器。

 
image alt text image alt text

材质槽 4.17

材质槽 4.16

我们还将 LOD 控制合并到了同一个面板中,减少滚动,美工可以一次处理一个 LOD,然后将编辑后的 LOD 同步到视口 LOD 中。这让用户总是能够在视口中看到正在编辑的 LOD。

新增特性:材质烘焙改进(试验阶段)

我们添加了在静态网格实例上烘焙掉材质的支持。我们还添加了在静态网格或骨架网格资产上烘焙掉材质的支持,但目前仍属于试验性功能。

注:烘焙资产材质要求在编辑器首选项中启用资产材质烘焙设置(试验阶段)。

新增特性:编辑器 VR 模式下的摄像机画面预览

现在,在场景中选择一个摄像机,或者选择包含摄像机的 Actor(例如角色)后,在关卡画面内会显示该选中摄像机的预览画面,并可以将这个预览窗口固定在某个位置,就像非 VR 模式下的摄像机预览窗口一样,并可以在 VR 中对该预览面板随意拖放。

新增特性:跨平台统一立体层

所有 VR 平台现在都支持 UE4 现成的仿真实现立体层!

你现在可以在任何平台上毫无障碍地使用立体层,不必担心平台不同会产生基本功能性差异。将层作为 API 核心的制造商应该能够将该部分实现替换为使用相同接口的 API 特定实现。

层绘图顺序

为了在所有平台上提供相似的立体层排序行为,我们更改了面部锁定层,无论优先级如何,使其始终显示在其他层位置类型之上。面部锁定层通常用于游戏 UI,所以这通常是用户所需要的。对于不支持该功能的平台,可以将 vr.StereoLayers.bMixLayerPriorities 设置为 1 来恢复为旧行为。

新增特性:针对 Daydream 的直接多视图支持

现在可以在 Daydream 平台上使用直接多视图。直接多视图与 Daydream 合成器配合工作,删除全屏复制,从而改进性能,降低功能的内存开销。

新增特性:适用于 UE4 的 Google Tango 插件(试验阶段)

虚幻引擎 4.17 包含对安卓平台的 Google Tango 项目的初期试验性支持。该插件支持六轴运动跟踪、区域学习、环境重构和其他 Google Tango 功能。

注:该支持仍在试验阶段,在后续版本的引擎中,API 和接口可能会发生更改。

新增特性:UMG / Slate 剪裁 2.0

Slate 包含了一个新剪裁系统,通过任意变形能够很好地支持复杂分层剪裁四边形。此外,窗口小部件现在可以单独选择剪裁自己的子代,默认情况下大多数都不会这样操作。

此改进也导致了一些必要的行为更改,可以阅读该该论坛帖子进一步了解。

新增特性:蓝图编译管理器

实现了全新的蓝图编译管理器,使蓝图编译的加载时间降低了 40-50%!某些存在已久的编译错误也已经解决,例如,蓝图将节点投射到子类型时可能显示的不正确警告。

注:如果导致现有项目发生问题,可以在项目设置中禁用新的编译管理器。

新增特性:蓝图属性存取器

本地成员变量现在可以利用要通过 Ufunction 存取器公开给蓝图的 Uproperty 标记,即使该属性之前已经使用 BlueprintReadOnly 或 BlueprintReadWrite 标记进行了公开也是如此。

image alt text

新增特性:孤立引脚

添加了新的孤立引脚功能,帮助避免由于删除引脚而导致的难以理解的内容损坏。

image alt text

每当从节点删除正在使用的引脚时,该引脚不是静悄悄地消失不见,而是中断了所有连接,现在该引脚将会保留为孤立引脚,并发出错误(如果已连接)或警告(如果这是具有非默认值的输入引脚)。

新增特性:Sobol 蓝图和材质节点

我们添加了多个节点,用于使用 Sobol 准随机序列生成点位置。

Sobol 序列可以使用大量独立维度生成点。随机 Sobol 浮点蓝图节点为单个维度提供值。它们可以组合起来形成 2D 或 3D 分布。

image alt text

随机 Sobol 单元格 2D 蓝图节点在 2D 网格单元格中放置 2D Sobol 点。这样就可以通过在每个单元格中放置不同数量的点来控制密度。Sobol 材质节点提供与随机 Sobol 2D 蓝图节点相同的 2D 点位置,采用固定的单元格网格 256x256。该示例在每个单元格中放置了不同数量的树,地面上的材质显示了单元格,并在每个单元格中放置的第一棵树下绘制一个点。

随机 Sobol 单元格 3D 蓝图节点在 3D 网格中对 3D 点也采用同样的处理。该示例在金字塔的每个单元格中放置四个球体。

image alt text

时间 Sobol 材质节点在每个像素上使用不同的 2D Sobol 序列,在每一帧的一组不同点中循环。这对于设计为在时间抗锯齿的多个帧中混合的效果很有用。

 
image_32.png image_33.png image_34.png

1 个样本/像素,无 TAA

4 个样本/像素,无 TAA

4 个样本/像素,有 TAA

新增特性:基于纹理的重要采样蓝图节点

重要采样根据给定密度函数放置点。我们添加了蓝图节点,允许使用纹理驱动放置,实现灵活的 2D 放置。创建重要纹理蓝图节点处理要使用的纹理,重要样本蓝图节点提供按所提供密度决定的点位置。

以下四个示例根据四种不同纹理的亮度放置球体。第一个示例从中间密集分布逐渐变化到周围的稀疏分布。第二个示例均匀地分布在中间,边缘的区域较为稀疏。第三个示例所有点均匀地分布在六边形中。第四个示例白色环形中的点较为密集,红色环形较为稀疏。

image alt text

下面是根据红白目标纹理放置的八个光源。光源大小和颜色与局部密度成正比。

image alt text

新增特性:安卓工具链和 SDK 更新

作为试验性功能,安卓工具链现在支持 NDK 14b 与 NDK 15。Google Play 服务在本版本中已经升级到 9.8.0,包含必要的安卓支持库。

从本版本开始,支持 Gradle 作为试验性构建选项。在安卓项目设置中,选中“启用 Gradle 代替 Ant [试验阶段]”复选框可以为单个项目启用该功能。以下论坛帖子中提供了更多信息:https://forums.unrealengine.com/showthread.php?150315-Gradle-support-in-UE-4-17

如果在本版本中遇到有关 Gradle 的任何问题,请及时告知我们;由于 Google 不再支持 Ant,我们计划删除 Ant 支持。

新增特性:iOS 和安卓上的移动可执行文件的大小减小

对于安卓,我们为安卓交付构建内容启用了 -ICF 标志。这节省了引擎大约 5 MB 的大小,从大约 80 MB 更改为大约 75 MB。这是未经压缩的大小;压缩到 .apk 文件之后,差别是 24.8 MB 与 23.6 MB。

对于 iOS,我们现在默认禁用 ObjectiveC 例外,将可执行文件的大小减少了大约 6.5 MB。优化交付构建内容从 52 MB 更改为 46 MB。

我们还添了一个选项,用于为 iOS 构建内容禁用强制代码内嵌。当结合大小优化使用时效果最佳,可以再节省大约 2.5 MB,意味着优化大小后的交付构建内容从 45 MB 更改为 37 MB。

在 4.18 中,移动可执行文件将会进一步缩小。

新增特性:移动独立半透明

标记为“移动独立半透明”的半透明对象将在高光和视野深度之后单独渲染。该选项位于材质编辑器的半透明部分中。

独立半透明要求启用 MobileHDR 选项,禁用 MSAA,否则将会渲染为正常半透明。

image alt text

新增功能:高端安卓设备上的 sRGB

使用 OpenGL ES3.1 或 Vulkan 构建的安卓应用现在使用本机 sRGB 采样,取代仿真。现在,设备上的纹理应该具有更好的感知色彩分辨率。

新增特性:安卓超宽屏宽高比支持

image alt text

虚幻引擎 4.17 添加了对超宽屏宽高比的支持,用于支持 Samsung Galaxy S8 等宽屏设备。

默认支持的最大屏幕宽高比是 2.1(宽度/高度)。安卓设备将自动使用更合适的宽高比应用宽屏播放模式。默认宽高比可以在项目设置的安卓部分中更改。

新增特性:PVS-Studio 静态分析

UE4 现在包含对 PVS-Studio 静态分析程序的支持(单独提供)。要启用 PVS-Studio 静态分析,将 -StaticAnalyzer=PVSStudio 追加到 UnrealBuildTool 命令行。

有关 PVS-Studio 的更多信息,请参阅该博客帖子

新增特性:在多个新平台上增加了虚幻音频支持(测试功能)

新的虚幻音频系统现在包含对安卓的支持,包含了一些改进性能和故障修复。我们还添加了对 PlayStation 4、Xbox One、iOS 和 Mac OS 的支持。请记住,虚幻音频仍在测试阶段,因此可能包含一些错误,在将来的版本中会进行一些更改。

新增特性:音频串流播放不再是试验性功能

虚幻引擎中的音频串流播放支持不再是“试验性功能”,本版本中包含若干修订。

Release Notes(译者:以下详细更新说明不做中文化更新)

AI

  • Fix an error on shutdown when the CDO of UAIPerceptionComponent tries to clean up (as it was never registered in the first place)
  • Fixed UCrowdFollowingComponent::UpdateCachedDirections crashing when CharacterMovement is not set
  • Fixed missing decorator deactivation notifies: placed on parallel task or during StopTree call.
  • Changed UBTFunctionLibrary exposed functions to log a runtime error instead of check/ensure if passed a null world context object
  • Improved BT editor's robustness against changes to user-created enum classes.
  • Fixed a bug in EQS query running that caused EQS Manager to always use up the whole time budget for the frame if all performed queries happened to finish.
  • Fixed gameplay task: TimeLimitedExecution being removed during garbage collection.
  • Added continuous goal tracking mode to AI Move gameplay task.
  • Added a way to override default crowd manager class.
  • Fixed: Issues with "ModifiersOnly" NavMesh streaming
  • Fixed newly created navigation areas not having any effect in navigation modifiers until editor restart.
  • Fixed navlink component's local transform not being used in exported navigation data.
  • Fixed navmesh tile connectivity for polys with more than 4 neighbors.
  • Fixed navigation area modifiers created from shape components: sphere and capsule.
  • Fixed navigation data's flag: bForceRebuildOnLoad being ignored when navmesh auto rebuilds were disabled.
  • Fixed AI getting stuck during path following when path is constantly invalidated by very frequent navmesh updates.
  • Changed hardcoded debug flags of crowd manager to console variables: ai.crowd.*
  • Fixed memory leak in navmesh generators: monotone region partitioning code.
  • Fixed navmesh generator ignoring low area modifiers on subsequent rebuilds.
  • Made NavigationSystem's AbstractNavData instance never serialize again. The change will also clear out all the existing instances on load.
  • Fixed a bug causing changes done to StaticMesh's navigation properties serialize in an unpredictable fashion.
  • Fixed NavModifierVolume not responding to editor-time changes to its properties.
  • Added a spiced up, community-suggested, working solution to patching up dynamic navmesh after world offset.

Animation

  • FCSPose::ConvertToLocalPoses Allow root bone to be modified. Minor optimization: Take out root bone check from loop.
  • Added new BlendBoneByChannel AnimNode to blend two poses, per bone, per channel. For example blend only translation from Pelvis but leave rotation untouched.
  • Delay clearing of MontageInstances and triggering 'OnAllMontageInstancesEnded' until all Montage Events have been dispatched.
  • Morphtarget tolerance weight can be configurable
    • r.MorphTarget.WeightThreshold
  • Prevent creating invalid 'VBCompactPoseData', resulting in crashes in Animation Modifiers. (Fix for licensee crash).
  • Minor optimization to FAnimationRuntime::CreateMaskWeights. Since Parents are before Children, use that to speed up Mask Weight creation.
  • Batch Animation Compression fixes. - Fixed incorrect 'MemorySavingsFromPrevious' resulting in picking suboptimal compressors. - Fixed uncompressed size calculation not taking into account scale component. - Fixed animations with 'bDoNotOverrideCompression' causing crashes because they were not recompressed. - Animation with 'bDoNotOverrideCompression' that use the automatic compressions are not skipped by the automatic batch compression. - Added 'CompressCommandletVersion' to DDC key, so we can force recompression on all animations easily.
  • Bug Fix:
    • Fixed additive pose blending on pose asset
    • Fixed on crash with pose asset retargeting
  • Fix various crashes when calling methods in USkeletalMeshSocket with no component specified
  • Added mesh space additive support to Blendspace1D
  • Added ability to set montage section time directly via right click menu.
  • Added an event in USkeletalMeshComponent when the animation instance is initialized
  • UAnimMontages now get one slot by default on construction.
  • Removed UID from smart name serialization to help with non-deterministic animation cooking
  • Fixes for deterministic cooking of animations
    • Make sure curve names have been validated before building compressed data
    • Remove "Sort by UID" code.
  • Fixed pose watched bones not drawing when the anim Blueprint debug object != the preview instance.
  • Fixed an issue related to Blend-spaces using individual sample rates causing issues with Marker Syncing
  • Fixed compression ratio for baked additive animations by storing the size of the raw data that was compressed in DDC.
  • Constraint AnimNode
    • Animation Blueprints can now be live edited & recompiled while running on a PIE/SIE instance.
    • When choosing an Animation Blueprint to debug in the level, the viewport is now 'connected' to that instance & displays a mirror of the instance's animation state.
  • Add MakeDynamicAdditive node to anim Blueprints. Takes a base and target pose as inputs and creates the additive pose during evaluation.
  • Added source direction to aim offset lookat node instead of assuming X-Axis as lookat direction.
  • Created FBoneSocketTarget that support bone and socket
    • The future plan is this will have UI with only one tree users can pick whether bone or socket
    • Internally it cached related bone, relative transform, and calculate correct target transform
    • LookAt node uses this, and IK nodes will use this in the future release
  • AnimBlueprint supports BeginPlay event
    • Before Initialize was called during Registration, which can be too early. Use BeginPlay for any ingame initialization.
  • Allow curve to be disabled when evaluating animations by calling SetDisableAnimCurves
  • Added TransitionFollower as a sync group role. Same blend in behaviour as TransitionLeader but makes node a follower once fully blended in.
  • Added hooks in AnimBlueprintCompiler to perform Post Compile Validation in an AnimInstance subclass. Also added virtual function to opt in for warnings when nodes are not using Fast Path.
  • If an AnimBP has warnings or errors, force opening Compiler Results Window, and recompile to display results.
  • Two Bone IK
    • Added bAllowTwist option on Two Bone IK for mid or low joints to optionally not twist : useful for mechanical arm. Default is bAllowTwist on.
    • Fixed bMaintainEffectorRelRot was hidden unless you select bone as effect target
    • bEnableDebugDraw : You can enable debug draw
  • Added root motion support for animation sub-instances
  • Fixed AnimBlueprint function graphs marked as 'const' to treat 'self' as read-only when compiling.
  • Fixed bug where "object" to "weak object" copies would fail to properly copy the object using the animation Blueprint fast path.
  • Nodes can now be edited using multi-selection in Animation Blueprints
  • Fixed crash loading anim BPs with split pins where we incorrectly assumed the outer graph's type
  • Moved USkeleton.ReferenceSkeleton building from PostLoad to Serialize to fix missing virtual bone warning when opening anim Blueprints.
  • Modify bone node now disallows editing of pin values in the viewport if the pin is linked
  • Prevented propagation of crossfade settings to non-shared animation state machine transitions
  • Allowed blend by int and enum to appear in the context menu when dragging off a pose pin in animation Blueprints
  • Prevented connection of wildcard & pose links in animation Blueprints (except in the case of reroute nodes)
  • Fix 'error' icon when dragging anim assets over the animation graph
  • Fixed an issue where Marker Syncing was not working correctly when a Blendspace Player was given a Start Position input value inside of an AnimBP
  • Fixed subinstance bridge parameters appearing in the variable list in an anim Blueprint using subinstances with expose pins
  • Fixed bugs with PoseDriver not supporting manually-added targets.
  • Fixed post process anim graphs producing broken poses when LODs had removed bones.
  • Fixed bug where montages did not indicate they cannot be placed in animation graphs.
  • Fix crash when deleting a transition rule while it's graph is open in an orphan window.
  • Added in-game bone rendering feature. Use 'Show Bones' in the console or the Show -> Developer menu to display the bones of all skeletal meshes.
  • Added getters to alpha blend for remaining blend time and begin value, and made Update return any overshoot if applicable.
  • Moved Epic internal project's animation caching system into the engine. This helps with implementing natively-optimized animation state machines.
  • Fixed crash getting a skinned vertex position when using a master pose component
  • Fixed Update not being called on post process animation instances when the main anim instance does not do a parallel update.
  • Bug Fix:
    • AnimNode API now specifies _AnyThread postfix on functions that run on non-game threads
    • Changed FAnimNode_Base::RootInitialize to FAnimNode_Base::OnInitializeAnimInstance, supplying the anim instance as well as the proxy.
  • UAnimNotifyState-based Blueprints now start off with a ReceivedNotify_Tick function
  • Exposed some blend space parameters to code that were already available to Blueprints.
  • Fixed transition getters not working with negative playrates
  • Moved AnimationInput and AnimationOutput metadata into the ControlRig plugin
  • Fixed characters not animating on servers when their movement component was set to not replicate movement
  • Fixed crash when spawning a skeletal mesh-containing actor from an existing template actor.
  • Added support for importing multiple Texture coordinate sets from Alembic files
  • Default skeleton to something useful when importing FBX. We default to the first skeleton we find in the target directory
  • Fixed an issue which prevented re-importing Animation Sequences imported from an Alembic file
  • Pull request: Allow to hide the Alembic import wizard via the bShowOption property
  • Sound waves now appear in the content browser after import using the facial anim bulk importer
  • When reimporting animations, we now properly update existing animations in the scene
  • Fixed undeletable folders when importing facial animation audio
  • We don't import any empty morphtarget anymore. Those empty morphtargets will be also removed on loading.
  • Fixed order of default values in FAnimUpdateRateParameters.BaseVisibileDistanceFactorThesholds
  • Prevent FRenderStateRecreator from recreating render state when component is unregistered.
  • Fixed Crash with Morphtarget valid indices mismatching with render resource data
  • Fix ensures caused by FSkeletalMeshMerge not properly merging UVChannelData.
  • New:
    • Additional Mesh now uses Copy Pose instead of Master Pose Component
    • This change also allows to create custom asset that defines the preview
    • You can create class that implement UInterface and derive from DataAsset
    • This asset can be created in editor when needed
    • You can pick these assets in the "Additional Mesh Section" to preview multiple meshes together.
    • Example is to create customization options in that asset, and returns the list of meshes together, it will use copy pose to follow the base preview mesh.
    • You still need preview mesh which is animate based on the system, but these ADDITIONAL MESHES will follow the preview mesh transform
  • Add anim list to details panel for BlendSpace
  • Improved Bake Pose feature to also function without Simplygon
  • Added folder filters to anim asset browser
  • Made animation notify tracks renamable.
  • Moved "New Sync Marker" menu entry out of new notify sub menu and into the main notify track context menu
  • Fixed an issue where previewing blend spaces did not work if the grid was not focused
  • Updated the SkeletalMesh editor to support focusing on individual sections of a mesh when the focus key is pressed.
  • Added vertex color show menu option for skeletal meshes
  • This is an elaborated preview customization option
    • If you have DataAsset that implements IPreviewCollectionInterface, with a function, *virtual void GetPreviewSkeletalMeshes(TArray& OutList) const *, it will allow you to pick those assets in the Additional Mesh section
    • Make sure to turn on bAllowPreviewMeshCollectionsToSelectFromDifferentSkeletons
    • This creates each component and allow them to copy pose from base mesh
    • This additional meshes don't have to share same skeleton
  • Improved the details customization of alpha scale bias.
  • Audio attenuation is now applied in animation editors.
  • When changing the preview mesh in an animation asset, the change is now temporary and needs to be committed if it needs to be saved
  • Selection of 'current' asset now opens that asset in the animation asset shortcut bar (top-right toolbar).
  • Fixed crash right-clicking multiple asset types that include control rig sequences
  • We now clamp cloth paint values appropriately, disallowing negative paint values
  • Bug Fix:
    • Added inline editors for time and frame index to montage section/notify menu
    • Expanded montage section struct in details panel so it doesn't appear collapsed first time
  • Fixed montage segment play rate not affecting the preview viewport. Fixed preview viewport not obeying start/end times of segment if the scrub bar UI is offscreen.
  • Fixed clothing section combo boxes in skeletal mesh editor not correctly updating when using section selection to create new clothing assets.
  • Fixed issue where undoing a curve renames in the Anim Curves tab would cause duplicate of the specific curve in the list
  • Fixed issue where undoing rename of a curve in the Animation Editor would cause all curves to disappear
  • Fixed 'reset to default' button not showing up in customized properties.
  • Fixed a crash caused by reloading a referenced Skeleton asset while having the Animation Editor open
  • Fixed crash when creating a new animation from ref pose on a skeleton that has virtual bones
  • Fixed editor crash when performing drag operations in the animation notify track window
  • Fixed invalid check when creating an animation from current pose in the animation editor.
  • Fixed dangling references to animation preview scene, avoiding crash when undoing when skeletal mesh is re-opened
  • Fixed stretched icon in preview scene settings

Audio

  • Removing audio streaming as an experimental feature in the engine.
  • New:
    • Fixed packaging compilation errors.
    • Consolidated baking into a single window. Users can select multiple sources to bake at once.
    • Added support for transmission.
    • Phonon Probe Volumes are set to NoCollide collision profile by default.
    • Phonon Probe Volumes may be arbitrarily rotated, scaled, and translated.
    • Added Phonon Scene actor for scene export - this removes need for external .phononscene file and simplifies packaging.
    • Added support for multichannel
    • Fixed buffer size related crashes. Added support for Win32.
  • Audio mixer improvements for android.
  • Updates and improvements to Steam Audio.
  • Adding ability to modify Low Pass Filter frequency with audio components.
  • Deleting unused velocity variable in OpenAL implementation.
  • Added SoundClassObject to the asset registry searchable data for sound assets, to make it easier to track down volume/muting bugs when assets have the wrong sound class set (Note: Assets will need to be resaved before this data will show up for unloaded assets (loaded assets should work immediately))
  • No longer forcing pending decodes to ensure completed on shutdown in audio mixer.
  • Changed to using tasks from task manager vs using Async.h futures in audio mixer decodes.
  • Added new, combined macOS/iOS/tvOS back-end for new audio engine.
  • Hiding streaming options (and import options while i'm at it) from media sound waves.
  • Fix for streaming sound wave in audio mixer during shutdown.
  • Fixed packaging a project for Windows with the Steam Audio plugin enabled (Contributed by projectgheist via Github pull request)
  • Fixed crash that could occur while shutting down a streaming SoundSource
  • Fix for a number of threading issue in audio streaming manager.
  • Fix crash when duplicating a sound wave asset in content browser due to thumbnail rendering.
  • Fixed crash that occured when trying to launch the engine with the new Unreal Audio engine while the current audio playback device is disabled on Windows.
  • Fix for a crash in parallel source processing in audio mixer.
  • Several optimizations to source manager in audio mixer.
  • No longer loading XAudio2 module in server builds.
  • Properly deleting AudioClockVoice in XAudio2 backend.
  • Crash fix for audio on android.
  • Fix for crash when an audio streaming sound wave doesn't have serialized stream chunks.
  • Crash fix for when a map attempts to cook a streaming sound file while targeting Linux.

Automation

  • Automation - Forcing textures to load before taking screenshot, so that the scene gets another opportunity to render before we render with Slate.
  • Automation - Fixing a bug with the screenshot comparison tool not replacing (removing) the old screenshot data.
  • PR #3650: Changed TestNull to accept const pointers. (Contributed by e-agaubatz)
  • Automation - The system now waits for the asset registry to finish loading assets before running tests.
  • Automation - Fixing some delay screenshot code in the Screenshot Functional Test Actor that was preventing the delay from having any effect.

Blueprints

  • Native member variables can now make use of uproperty markup to be exposed to Blueprints via ufunction accessors even if the property had been previously exposed directly using BlueprintReadOnly or BlueprintReadWrite markup.
  • Added "Importance Texture" Blueprint nodes to place objects according to a density texture.
  • To help avoid mysterious content breakage as the result of pin removals a new Orphan Pin feature has been added. Any time a pin that is in use has been removed from a node, instead of that pin quietly vanishing, breaking all connections, the pin will now be retained as an Orphan, and an error (if it is connected) or a warning (if it is an input pin with a non-default value) will be emitted.
  • Added new "Sobol" Blueprint nodes for placing objects in 2D or 3D according to the Sobol distribution.
  • Find References can now be used which right clicking on components in the component tree.
  • The Resolve Asset ID node is now called Resolve Soft Reference and can now also be used to convert from normal hard references to Soft References.Add == and IsValid for Soft Reference and Soft Class Reference
  • Blueprints: Allow non-readonly variables from the My Blueprints panel to be dropped onto exec pins, which creates a variable set node for them
  • Added support for drag-dropping a function from My Blueprints directly onto a pin, which performs the same action as if they had been picked from the menu after dragging off of that pin
  • Added support for drag-dropping from the palette onto a pin, which behaves the same as if you'd dragged off of the pin and picked the palette entry from the context menu (wiring the two nodes together if possible)
  • Added a search bar to the components tree in Blueprints.
  • Changing default values for functions/macros will correctly update any existing calls, if the parameters were still set to their initial default value. If an instance had already been broken by a resave, it can be fixed by using the new "Reset to default value" option when right clicking a pin
  • Change Blueprint function/macro inputs to use the Pin Default Value UI instead of a default text field. This allows setting Enum default values correctly. Types that do not have Pin UI will not be available to modify, previously you could set them but they would not work properly.
  • Improved Input BP library node display names
  • The intermediate plugin generated by Blueprint nativization is now easily included in your Visual Studio project - making it easier to debug.
  • Graph pin container type now represented by an enumeration (EPinContainerType) rather than 3 "independent" booleans.
  • Improved exposure of input settings and binding to Blueprint.
  • Exposed static mesh material accessors to Blueprints
  • Expose FVector2D / FVector2D to Blueprints
  • Native properties that are not exposed to Blueprints will now emit a warning when used as a Get in a Blueprint. In a future release this will be upgraded to an error.Properties defined in a Blueprint but marked private will now provide a warning when used in an invalid context. In a future release this will be upgraded to an error.
  • Renamed UEdGraph::CreateBlankNode to CreateIntermediateNode Added bIsIntermediate flag to UEdGraphNode which is set via CreateIntermediateNode
  • When setting the type of an Object variable in Blueprints, renamed AssetID to SoftObjectReference and AssetClassId to SoftClassReference. The native names are still AssetPtr and AssetSubClassOf but they will change in 4.18 to better match the Blueprint names
  • Non-Blueprint type structs can no longer be made/broken Non-Blueprint visible properties in structs will no longer have pins created for them
  • Added "sine" as a search keyword to the DegSin and DegAsin UFunctions, for consistency with their radian-based counterparts Sin and Asin.
  • Added comments to AppendTags and AppendMatchingTags so it's easier to find the functions if you're looking for functions based on set theory (Union, Intersection, etc.).
  • Improved the details panel customization for optional pin nodes like Struct Member Get/Set
    • The category, raw name, and tooltip of the property are searchable / filterable
    • The tooltip of the underlying property is now displayed when hovering over the property name
  • Added new config options for execution wire thickness when not debugging (DefaultExecutionWireThickness) and data wire thicknesses (DefaultDataWireThickness) to the Graph Editor Settings page
  • Display instead of nothing for Pins with blank display name in the Blueprint compiler log.
  • During Blueprint compilation messages can now be stored off in the compiler log during early parts of validation and then committed to the log later (for example once pruning is completed).
  • FKismetCompilerContext now has OnPreCompile and OnPostCompile delegates to allow external systems to get notified and react.
  • Propagates scene capture engine showflag changes fromBlueprint editor to the Blueprint instances.
  • Move UAnimGraphNode_Base::PreloadRequiredAssets up to K2Node, make sure nodes get a chance to preload data before compilation manager compiles newly loaded Blueprints
  • Add a K2Node_AddPinInterface to generalize the interface that K2Nodes implement to interact with SGraphNodeK2Sequence so it can be more generally used
  • Fixed loss of default values in a Blueprint's subobjects when the parent Blueprint was also being regenerated
  • Assets that are only referenced by pins inside active Blueprints will now correctly be garbage collected. This means that if you use LoadAsset to load something and do not store it for future usage, it will no longer stay in memory forever until the loading Blueprint is destroyed.
  • Fix several issues where Blueprint Local Variable values were being reset to default incorrectly. They should now only reset when the type is changed.
  • LoadAssetClass nodes in macros now cook deterministically
  • Fix several issues with Select Blueprint nodes not properly updating when changing pin connections or defaults
  • Moved Blueprint-nativized User-Defined Struct implementations into its own generated .cpp file in order to avoid circular header file dependencies at C++ compile time.
  • Client only Blueprint data is correctly loaded when running the editor with the -server flag
  • Soft Reference Blueprint pins (previously Asset ID/Class ID) now correctly store their references as soft pointers internally. This prevents editor builds from needing to hard load assets that are only softly referenced.
  • Fix several issues with Animation pin default values. This stops "phantom" references to old default values existing when pins are connected to runtime variables
  • Nativizing a Blueprint class with a nativized Data-Only Blueprint class dependency will no longer lead to a C++ compile error at cook/nativization time.
  • Nativizing a Blueprint class with a non-nativized Blueprint class subobject dependency will no longer lead to a crash at load time.
  • Fix many bugs with Blueprint pin default values, and add "Reset to Default Value" option to pin context menu
  • When dragging multiple assets into the components tab create them as sibling components, not nested in a child/parent relationship.
  • Fix Blueprint string-to-text functions to properly be culturally invariant, if you want translated text you should be using Text variables directly. Also updated the transform-to-text output to match the comment
  • Maps and set pins created by splitting a struct pin now display correctly.
  • Suppress array "Get" node fixup notifications on load when the Blueprint Compilation Manager is enabled.
  • Collapsed graphs containing a local variable node will no longer cause a Blueprint compile error when the parent graph is renamed.
  • Search box is now correctly focused when expanding the map value type.
  • Subobjects of components in Blueprint classes now consistently get PostLoad called on them.
  • Fixed a bug with nativized Blueprints that could produce a compiler error when overriding an interface function in the Blueprint.
  • The Blueprint Diff tool now properly reports component type changes.
  • Fixed failed validation of Bitmask Enum types when serializing Make Bitmask Literal nodes.
  • Fix invalid custom type selections on member fields in the User-Defined Structure Editor after a reload.
  • Fixed a crash that could occur when using the CookOnTheFly server with Blueprints that share struct dependencies.
  • Fixed a bug that could cause stale Blueprint script to be ran for instances in hidden sub-levels.
  • Fixed a bug that caused a Blueprint compile error when using enum literals with maps or sets.
  • Fixed a crash that could occur when a level Blueprint was auto-saved.
  • Fixed a bug that prevented you from having local Blueprint struct variables that contained a map or set.
  • Fixed minor log spam when compiling a Blueprint function with a local TSet/TMap variable.
  • Fixed broken pin wires after an Expand Node operation.
  • Blueprint Diffing: Pushed some node diffing code down from UAIGraphNode into UEdGraphNode so nodes with details panel properties will diff correctly (e.g., various animation nodes and BP switch nodes)
  • Fix a bug where a Blueprint struct could lose its defaults after restarting the editor.
  • Blueprints loaded as the result of a 'Diff' operation are now properly compiled on load - just as if they were loaded via the content browser
  • Fixed a blocking error that could occur when building a project with Blueprint nativization. If no Blueprints were nativized, we don't try to build the generated plugin.
  • Fixed a bug that allowed Blueprint users to mark Object variables as config properties (could later cause an error in Blueprint nativization).
  • Fixed a bug that could cause a nativization compiler error when using a class array in Blueprints that was originally defined as an array of TSubclassOf pointers.
  • Fix it so the Load Asset node can be correctly used with the pin drop down instead of forcing you to connect a pin. It also now has a pass through execution pin like other async tasks that can take a long time
  • Fix it so Local Blueprint Variables correctly handle when referenced assets are renamed
  • Fixed source of occasional editor crashes that could occur in the Blueprint editor while rebuilding the context menu from the action registry.
  • Fixed a C++ compilation failure during packaging that would result when nativizing a Blueprint that overrides a native function with a 'TSubclassOf' parameter or return value.
  • LatentGameplayTask nodes can now have default values for complex types (e.g. LinearColor)
  • Fixed read-only context-menu palette items showing up as grayed out
  • Blueprint compiler log now correctly appears on Blueprint editor startup when the log contains warnings or errors. There is no need to recompile to see errors any more.
  • Fixed potential data loss on load for circularly dependent Blueprints with more than two levels of inheritance (e.g. values would revert to a Blueprint's Parent's Parent values, instead of matching the Blueprint's immediate Parent)
  • Fixed an Event-Driven Loader assertion on load in a nativized build with one or more Actor subobjects instanced via the EditInlineNew UI in the Blueprint class defaults property editor.
  • Changed the warning for calling editor-only UFunction to an error during Blueprint compilation
  • Removed an unnecessary ensure() after pasting an Event node.
  • Fixing name of pins for AimOffset nodes set by pin.
  • Checks connected pin that AimOffsets use in Blueprints for their name and value.
  • Fixed a crash UKismetRenderingLibrary::DrawMaterialToRenderTarget caused by passing a local FName to a lambda by reference instead of by value. Lambda was executed after the local variable was deleted causing a crash.
  • The 'const' function flag will now propagate from an Interface Blueprint to all implementing Blueprint classes.
  • Fix it so modifying the Game Mode Blueprint from project settings will now work properly even without manually compiling or restarting the editor
  • Don't show default value or pass by reference for exec pins in macro input properties.
  • After undo/redo reference pins correctly visualize with diamond pin shape instead of circle.
  • Fixed crashes caused by undo/redo of member removal in a user defined struct when a Blueprint node has that struct pin split.
  • Fix potential crash with the String Mid Blueprint function
  • Fixed some bugs where a newly added item would fail show up in the "My Blueprints" tree if there was a filter active (e.g., when promoting a variable)
    • Centralized the logic for clearing the filter so it happens when we try and fail to select the item, rather than ad hoc in various other places
    • Made it only clear the filter if necessary, rather than (almost) always clearing it when adding an item
  • Fixed a regression where the duration of compilation message was not being printed to the output log
  • Fixed crash that could occur when changing a structure used in a Blueprint Map variable (e.g. as a Key or Value)
  • Fixed bug where child Blueprint with inherited child actor component could end up with child actor class being null but child actor template being non-null.
  • Fixed a bug where error messages would compound when a node was reconstructedFixed a bug where signature checking in event nodes didn't handle split pins correctly, causing a bogus message if any pins were split Fixed a bug where UK2Node_Event::IsFunctionEntryCompatible wasn't consistently looking at the delegate pin name
  • Fix rare crash in RefreshStandAloneDefaultsEditor when the Blueprint Editor is opened while Blueprint had errors in it
  • Prevent issues with renaming event dispatchers to contain periods where they could no longer be renamed or deleted (note: periods will not be allowed in new names in the future)
  • Fixed a reported crash when pasting nodes between unrelated Blueprint graphs.
  • Fixed a crash when launching a packaged build that includes a nativized Blueprint instance with a ChildActorComponent instanced via an AddComponent node.
  • Fixed crash when multi-editing actor Blueprints.
  • Expansion of a MakeArray node will no longer add spurious AddInputPin transactions to the undo buffer.Fix inability to undo/redo pin additions to sequence node
  • Added validation when renaming variables, functions, components, multicast delegates, etc... to prevent names from containing some unacceptable characters
    • This validation only kicks in when trying to rename an item, so bad names in existing content are 'grandfathered in'
    • These bad names can cause bugs when working with content that contains these characters (e.g., names that contain a period cannot be found via FindObject
    • Currently only . is banned, but eventually we may expand it to include all of INVALID_OBJECTNAME_CHARACTERS
  • Fix crash undoing copy of Blueprint nodes in a level script containing a literal actor reference to an actor in another map.
  • Fixed undo for "Index" pin type changes on Blueprint graph nodes.
  • Blueprint calls to Timespan From functions will no longer crash when passed very large values.
  • Fix crash when using gameplay tag as key for a Blueprint map variable.
  • Fix crash when undoing a default subobject class change in a Blueprint
  • Fix Blueprint nodes loaded after a change to a user defined enum not updating to reflect undo/redo of those changes.
  • We now prevent "Construct Object From Class" Blueprint nodes from compiling if the selected class does not include 'BlueprintType' in its inheritance hierarchy. This was the originally-intended behavior.
  • Fixed a potential crash when changing a ChildActor component's 'ChildActorClass' default value on a Blueprint that also sets 'ChildActorClass' via a "Set Child Actor Class" function call node in the Construction Script.
  • Fix crash when calling Blueprint functions that have UStruct parameters with WITH_EDITORONLY_DATA members
  • Fixed issue where the asset drag-drop tooltip always showed a no/invalid icon when dragging over the graph.
  • Fixed a Blueprint nativization issue in which project packaging would fail to build the staged EXE with a nativized Blueprint class containing a UInterfaceProperty.
  • Undo of Copy Signature action for event dispatchers now works correctly.
  • Connecting a set or map to an expose on spawn pin no longer results in a compile error.
  • Fix crash when changing the Value type of a Map property
  • Fixed crash calling OnRemoveExecutionPin on an invalid pin.
  • Fixed infinite loop/stack crash that would occur if a series of reroute nodes were formed in to a loop.
  • No longer able to remove a member of a struct's split pin on Make Array or Commutative Binary Operator Nodes.
  • Fix issues where removing the wrong pin from a Switch Blueprint node could corrupt data
  • Switch node default pin once again correctly appears as an exec output.
  • Switch string nodes are now validated that all cases are unique.
  • Fix Switch On Gameplay Tag Container node to work properly

Core

  • Delete FixupRedirects commandlet, replace with -FixupRedirects/FixupRedirectors option on the ResavePackages commandlet. This new method is much faster than the old commandlet as it uses the asset registry vs loading all packages.
  • AssetPtr and AssetSubclassOf can now be used with config Properties
  • Fix several issues with cooking StringAssetReferences and TAssetPtrs. FStringAssetReferenceSerializationScope can be used to override rather those references should be cooked or are editor only.
  • Changed UClass::ClassFlags to be of type EClassFlags for improved type safety
  • Marked TNumericLimits as constexpr so they can be used in static asserts
  • Several improvements to FAssetData and AssetRegistry memory usage, memory should be reduced by several MB in large cooked games:
    • FAssetData::TagsAndValues was converted to use the more memory efficient TSortedMap structure, and will not be created if there are no tags
    • Added bFilterAssetDataWithNoTags option to the [AssetRegistry] ini section, if set it will reduce cooked memory usage by not saving AssetData that has no tags defined
    • Asset Registry memory usage is now included in the MemReport output
  • Add Algo::BinarySearch, LowerBound, and UpperBound. These are setup to allow binary searching a presorted array, and allow for specifying projection and sort predicates. Add TSortedMap, which is a map data structure that has the same API as TMap, but is backed by a sorted array. It uses half the memory but will be slow for large maps and it has no UProperty support Add FName::CompareIndexes so a SortedMap with FNames can be used without doing very slow string compares, and FNameSortIndexes predicate to sort by it
  • Added both a black and whitelist to plugin descriptor files that lets you exclude a plugin from certain targets (client, server, etc.).
  • Added a feature where plugins included in a project through the .uproject's 'AdditionalPluginDirectories' list automatically get included in the generated code project (for Visual Studio, etc.).
  • Specifying properties as BlueprintReadWrite or BlueprintReadOnly in a non-BlueprintType is now an Unreal Header Tool error.
  • Unreal Header Tool will now report multiple less critical errors in a single compile rather than aborting on the first error.
  • Removing PPF_Localized as it's an old UE3-ism that's no longer tested anywhere.
  • PR #3226 - Updated some code comments to better describe the usage of the log category definition macros
  • PR #3197: Improved log message formatting (Contributed by projectgheist)
  • Add AES and RSA encryption keys to the list of config fields that get stripped from ini files when staging When creating a pak file, do a filtered copy of all ini files to a temp directory so that all confidential fields can be stripped. Equivalent behaviour to staging a loose file distribution
  • Added C++14 operator delete overloads with size.
  • Rewrote ARRAY_COUNT to allow it to work with zero-sized arrays in Clang.
  • Made UFunction flags viewable in the debugger.
  • Changed .generated.cpp files to .gen.cpp files to give shorter file paths.
  • When verbose cluster logging is enabled and new object is added to an already existing cluster, the entire cluster will be dumped to log.
  • Include project name in the UBT error message which appears when a plugin is missing
  • Added ranged-based for loop support to TChunkedArray, which is more optimal than indexed iteration.
  • Add prestream capability to allow us to preload always loaded sublevels. Only turned on for Shootergame.
  • Added helper functions to Garbage Collector API to dissolve specific GC clusters
  • Fixed Algo::Sort() for C arrays. Deprecated size+count versions of Algo::IsSorted(). Added Algo::IsSortedBy(). Added Algo::FindBy().
  • Updated apple platform atomics with a new clang version which is intended to be shared among all clang platforms.
  • Simplified and reworked lock free lists and the task graph bringing all platforms under the same scheme.
  • Changed UnrealHeaderTool to generate code per-header instead of per-module, in order to better take advantage of IWYU.
  • Optimized TBitArray::RemoveAt() in the case when all removed bits are at the end of the array. Optimized TBitArray::RemoveAtSwap(). Added a check for negative counts passed to TBitArray::RemoveAt() and TBitArray::RemoveAtSwap().
  • Moved InitPropertiesFromCustomList to UBlueprintGeneratedClass and made it thread safe
  • PR #2252: Increase linker reporting for failed imports (Contributed by FineRedMist)
  • Added more descriptive error text to DetachLinker error check (Pull Request @3167 by rooneym)
  • Removed unused AGRESSIVE_ARRAY_FORCEINLINE macro.
  • Removed unused CLASS_PointersDefaultToAutoWeak CLASS_PointersDefaultToWeak class flags.
  • Added comments to DestructItem and DestructItems to clarify that they do not perform dynamic dispatch.
  • Simple threaded CSV Profiler To capture a CSV: - On the commandline, add -csvCaptureFrames=N to capture N frames from startup - On the console, use csvprofile start, csvprofile stop or csvprofile frames=N to capture a fixed number of frames - Instrument with CSV_SCOPED_STAT(statname), CSV_CUSTOM_STAT(statname,value). CSV capture is enabled in all builds except shipping. This change does not include any instrumentation of code, although basic unit stats are output.
  • Implements FDebug::DumpStackTraceToLog() printf debugging utility.
  • Iterative cooking (enabled via passing -iterate to cook commandlet or enabling "Iterative cooking for builds launched from the editor") now uses the Asset Registry and should be significantly faster than before. The old timestamp and file hash method have been removed. Expose bIgnoreIniSettingsOutOfDateForIteration and bIgnoreScriptPackagesOutOfDateForIteration in cooker settings, affects rather to listen to ini/script changes when doing iterative cooking
  • UnrealHeaderTool: Improved the warning generated when missing Category= on a function or property declared in an engine module, and centralized the logic that determines if the module is engine or game
  • Modules - The module manager no longer returns sharedptrs to IModuleInterfaces, this was the source of rare hard to track down crashes due to a shared ptr reference leak when GetModule was called on non-main threads. We now store a TUniquePtr internally, and only lease out raw pointers.
  • PR #3622: Log category code cleanup (Contributed by projectgheist)
  • Removed AsyncIOBandwidthLimit as it was no longer being used by anything.
  • Added controller pairing changed delegate to core delegates
  • Added "AddReferencedObjects" to FScriptInterface, much like FSlateBrush has, in order to make it possible to use this type outside of a property (via FGCObject).
  • More named events for profiling
    • FAnalyticsEventAttribute now uses Lex::ToString() to convert the key name.
    • Added AppendAnalyticsEventAttributeArray() to efficiently append to an existing array.
    • Implemented Lex::ToSanitizedString for double.
    • Made Lex::ToSanitizedString an overload instead of a specialization.
    • Added comments to specify that Lex::ToString just needs to return something implicitly convertible to FString.
    • Added new API FPlatformMisc::GetOSVersion() that returns a string representing the raw OS version info.
    • Added FGenericPlatformHttp::GetDefaultUserAgent() and tweaked all HTTP implementations to use a consistent User-Agent string.
  • Added IFileHandle::Flush() support
  • UnrealBuildTool: Improved the wording in the error message printed when a file in an include-what-you-use module has the wrong header as the first include
  • Core - Adding a frame cached value struct TFrameValue that keeps a value as valid for one GFrameCounter, which is incremented once an engine tick.
  • Removed private_subobject macro which was a temporary measure to make all subobjects private without breaking game code.
  • Added malloc proxy that allows capture and replay malloc/free callstream with a different malloc for comparison.
  • Removed FPackageFileSummary's AdditionalPackagesToCook array as it was not used by anything. This should reduce the package header size considerably for levels with many streaming sublevels.
  • Optimized FStatMessagesArray iteration.
    • Added a new sorting algorithm called Algo::IntroSort that performs an introspective sort. It starts with quick sort and switches to heap sort when the iteration depth is too big. It improves the sorting speed in some scenarios where quick sort is in its worst case.
    • Added TReversePredicate to invoke Predicate(B, A) when calling algorithms with a predicate.
  • Added support for linking with a module-definition (.def) file in Unreal Build Tool.
  • Improved the print-out of FFrame::GetStackTrace() / FFrame::GetScriptCallstack() when there is no script stack (e.g., when FFrame::KismetExecutionMessage is called by native code with no BP above in the call stack)
  • Made the max package file header size configurable via ini file ([/Script/Engine.StreamingSettings] s.MaxPackageSummarySize=65536) so that in rare cases (hundreds of streaming sub-levels) the user can easily make their levels load in the editor without crashing
  • Fixed debug config problems with new low level windows async IO layer.
  • Change pending delete data structure for editor, and more specifically the cooker. Render resources can accumulate for hours in the cooker.
  • Fixed: -iterativedeploy option is no longer ignored by UAT
  • Fixed ability to specify incompatible properties as the parameter to the OnRep function as long as the base property type was the same (i.e. UObjectProperty, UArrayProperty, etc.) OnRep verification errors are now "warnings" and will all be reported rather than a single one being fatal.OnRep verification warnings now correctly identify the line they occur on.
  • Fix issue where SerializingProperty on FArchive was not correctly updated when serializing Arrays and other containers.
  • Fix issue where assets loaded by StreamableManager would take 2 full GC cycles to free if there were no longer any references to them, it will now take 1 cycle in most cases
  • Fix issue where FStreamableManager would never try to load an asset once it had failed once. This would cause problems with mounting pak files after initial startup
  • Fix issues where the cooked AssetRegistry Tag white/blacklist was not working properly with Blueprint classes
  • Several fixes to command line processing for the run part of the BuildCookRun UAT script, and -ClientCmdLine can now be used to explicitly set the client command line instead of implying 127.0.0.1 as the URL to launch
  • Instanced nested subobjects no longer get reset to default when edited in the components detail panel.
  • Made GMalloc creation thread safe (fixes rare crashes on Mac).
  • Fixed overlapping ranges being passed to memcpy().
  • Fixed a bug where a trailing quote without a newline at the end of a CSV file would be added to the parsed text rather than converted to a terminator
  • Make UHT generate WITH_EDITOR guards around UFunctions generated in a WITH_EDITOR C++ block. This prevents these functions from being generated in non-editor builds
  • Fixed a crash when using an invalid regex pattern
  • Fixed FastXML not loading XML files with attributes delimited by single quote characters
  • Fixed FPaths::ChangeExtension and FPaths::SetExtension stomping over the path part of a filename if the name part of the had no extension but the path contained a dot, eg) C:/First.Last/file
  • Fixed a crash in UnrealHeaderTool when you have a space between the UCLASS or UINTERFACE macro and the opening parenthesis.
  • Fixed some duplicate log categories.
  • Make FWindowsPlatformProcess::ApplicationSettingsDir() consistent with other path functions so that it only returns "/" path separators rather than a mix of "/" and "\".
  • Fixed linker warning formatting that was throwing warnings when cooking.
  • Non-ASCII characters in console command HTML help are no longer converted to "?".
  • Added more lock free links to support huge cooks.
  • Fixed a recurring stats crash.
  • Fixed attempts to load compiled in packages, which produces warnings and is slow.
  • Critical fix; stats were non functional.
  • Fixed array-based MakeUnique to value-initialize the elements.
  • Repaired botched merge of BroadcastSlow_OnlyUseForSpecialPurposes.
  • UE4 - Fixed super hazardous bug with FTaskGraphInterface::BroadcastSlow_OnlyUseForSpecialPurposes.
  • Fixed PRAGMA_ENABLE_OPTIMIZATION and PRAGMA_DISABLE_OPTIMIZATION on iOS for certain Clang versions.
  • Fixed UnrealHeaderTool parsing UObject* const fields as CPF_ConstParm.
  • Made TIsTriviallyDestructible<> work with forward-declared enums.
  • Fixed bug in the pak precacher that would result in blocks being discarded too soon, which, in turn, resulted in redundant reads.
  • Made changes so that servers, programs and non-engine executables do not create background or high priority threads.
  • Critical fix: Propoerly disambiguate imports with the same name and the same outer name. This fixes an assert: LocalExportIndex.IsNull.
  • Improved the error message when UnrealHeaderTool encounters incompatible functions pulled together by multiple inheritance.
  • Fixed UnrealHeaderTool's failure to parse pointer properties marked as const.
  • Fixed backwards ifdef for buffered files.
  • Replaced LogTemp with the appropriate logging categories in GC debug code.
  • When adding objects to clusters after these clusters have been created it's possible to come across objects that are already in the cluster we're adding the object to so instead of crashing, allow it.
  • UObject can be added to GC cluster only if all of its Outers can also be added to it. This fixes asserts caused by components that are added to GC clusters even if their owner actors that can't be in GC clusters.
  • The editor will now collect garbage after a map is loaded to make sure any stale components or other objects that are no longer needed are destroyed. This is to make sure that these components are not resurrected by other editor operations like duplication.
  • Fixed null dereference of LineBatcher when using DrawDebugSphere and DrawDebugAltCone
  • Fixed a potential deadlock caused by a race condition when using FMallocVerifyProxy with FMallocBinned
  • Fixed parameter parsing so that arguments are not parsed if not preceded by a whitespace (for example "-Log" was parsed in "TM-Log")
  • PR #2096: Fix argument parsing in DiffAssets Comandlet (Contributed by cgrebeld)
  • PR #2407: Fix LoadLibrary error with Microsoft Group Policy CWDIllegalinDllSearch mode 1 or 2 (Contributed by bozaro)
  • Long package names are now corrected to match the case of a file on disk when loading. Fixes deterministic cooking issues where case changes due to load order.
  • Async loading code will no longer crash when the requested package could not be created.
  • Fixed stale module suffixes which were causing hot reload failures.
  • Fixed compile error in TPromise's move assignment operator.
  • Fixed bad code generation for TMap and TSet when they're used as BlueprintCallable UFUNCTION parameters.
  • Fix streaming visibility logic bug reported on UDN
  • Remove non-actionable warnings in ObjectTools.ForceReplaceReferences
  • Fixed async loading from pak files < 64k.
  • Bug Fix:
    • Fix issue wherein a UPROPERTY that was converted from a hard UObject-based reference to a TAssetSubclassOf would not properly expose its referenced content to be cooked
  • Moved parsing of LogCategory verbosity slightly sooner to occur before plugins are loaded - fixes plugins not printing proper log levels if initialized too early
  • Fixed out of bounds access to iChild warning in UModel (clang didn't like a union trick)
  • Fixed various crashes when using UObject::CallFunctionByNameWithArguments with non-trivial argument types by properly initializing and destructing the allocated parameters
  • Fixed FMalloc functions missing from poison proxy.
  • Increased the maximum package summary size to handle levels with multiple streaming sublevels.
  • Fix for CDO pointer replacement in non-UObject properties during hot reload.
  • Fixed TSetElement's generic constructor to prevent it from ever being a copy constructor.
  • Fixed TSparseArray::operator= corrupting non-POD elements.
  • Changed FRuntimeAssetCacheFilesystemBackend::ClearCache(NAME_None) to not try to clear all cache directories (there is a separate no-args method for that)
  • Downgrade various checks() to ensures() in the runtime asset cache functions exposed to Blueprints so they don't take down the editor when given bad parameters
  • Fix issue where AssetRegistry GetAncestorClassNames/GetDerivedClassNames were not working properly in cooked builds for classes not in memory
  • The recursion guard in async loading code will only be used when the Event Driven Loader is enabled. This fixes some of the startup crashes.
  • Converted T(Shared)Future to use default move and copy constructors where applicable
  • Fix it so Blueprint subclasses of StaticMeshActor are not added to GC clusters by default as this is unlikely to be safe
  • Made sure subobjects recycled in construction code have the pending kill flag cleared so that they don't get garbage collected after creation.
  • Fixed crash if the UEnum used by an Enum Property no longer exists
  • Fixed issue with Incredibuild failing with Visual Studio 2015 Update 3 when some helpers have non-US character sets
  • Fixed crash when using FString::Find end if start position is beyond the end of the string.
  • Fixed an issue where the level streamer would not stream in a level until it finished streaming out another one.
  • Fixed a crash during tagged serialization if an enum no longer exists.

Editor and Tools

  • Added new Blueprint-exposed functions for procedurally editing Materials, MaterialFunctions and MaterialInstanceConstants in the editor.
  • Material baking improvements
  • Added the ability for any component (not only camera components) to have a preview viewport in the editor.
  • Disallow map building while in PIE, or PIE while buildling lighting to avoid a conflict on accessing BuildData.
  • Polish the speed tree import dialog
  • Highest LOD is now forced highres screenshots
  • PR #3565: add -quality option to buildlighing commandlet (Contributed by kayama-shift)
  • PR #3556: Git Plugin: fix new option "init Git LFS" that make assets read-only (master/UE4.17) (Contributed by SRombauts)
  • Color asset editor tabs according to asset type (Contributed by projectgheist). The highlight color is around the icon and matches the content browser color and style.
  • Exposed EditorLevelUtils to editor scripts. This allows creation of streaming levels, setting the current level and moving actors between levels
  • Expose editor visibility methods on Actor to Blueprint/script (editor only)
  • Added a file helpers API to script.
  • Deprecated actor grouping methods on UUnrealEdEngine and moved their functionality into their own class( UActorGroupingUtils). There is a new editor config setting to set which grouping utils class is used and defaults to the base class. The new utility methods are exposed to script.
  • Exposed source control helpers methods to script
  • AssetTools has been converted to a UObject interface and its methods have been exposed to to script.
  • Added a world accessor to blutilties so they can operate on the editor world (spawn,destroy actors etc)
  • Fixed plugin browser auto-resizing when scrolling.
  • Added a way to enable or disable the component transform units display in the editor preferences. Units display is now disabled by default.
    • Improved the import speed for morph targets by only recomputing the affected vertices.
    • Fixed an issue when importing morph targets where some import settings where ignored and could result in incorrect deltas.
  • UGS: You can now configure UnrealGameSync to filter out arbitrary changelists based on their description. The default filters (see Engine/Programs/UnrealGameSync/UnrealGameSync.ini) exclude changelists which modify collections.
  • UGS: Now only polls for updated versions every 5 minutes, and newly submitted changes every 60 seconds, to reduce the load on the Perforce server.
  • UnrealGameSync: Added support for notifying users if CIS steps fail for content changes. Badges which test content should be listed in the [Notifications] section of the project-specific INI file, as +ContentBadges=BadgeName.
  • Exposed new methods of adding a struct to a details panel and have it work properly with customizations.
  • Property Editor: Added objects to FPropertyAndParent.
  • MemoryProfiler2 - Add mprof filename into title bar after opening
  • Added basic material hookup to USD. Similar to FBX it will find materials based on rules specified by the user in the import settings
  • PR #2341: Optional Middle Mouse Button panning in Graph Editor (Contributed by flipswitchingmonkey)
  • Improved layout of Mesh Paint panel to fit better within default layout, and changed styling of action buttons
  • Make curve tables create temporary CSV files to use during diffs. This matches the current behaviour of data tables.
  • Changed FEnvDirection Text to display "From: {LineFrom} To: {LineTo}" instead of "{LineFrom} - {LineTo}", because the latter was confusing since a direction is normally defined (in vector math) as To - From.
  • Click a Hyperlinked Asset in a log window will now attempt to open the editor for it.
  • UnrealGameSync: Changes related to managing collections are now filtered out by default.
  • Add "Reset Material Slot" fbx option when doing a re-import with the import dialog option. There is now an editor preference option to show the fbx import dialog when doing a re-import to allow the user to use the new "Reset Material Slot" option.
  • Moved editor performance settings out of per-project settings so they can be shared across projects
  • Exposed the asset registry to Blueprints and script. Works in editor scripts and runtime scripts
  • UnrealGameSync: Added support for multiple tabs. Each tab can monitor changes in a separate workspace, and scheduled syncs will run for all open tabs.
  • Rewrote SlateFileDlgWindow's file filtering to allow for extensionless file selection and to remove the O(n^2) file filtering
  • Fixed incorrect filtering of abstract/deprecated UDeveloperSettings and UContentBrowserFrontEndFilterExtension classes caused by a typo (HasAnyCastFlags versus HasAnyClassFlags)
  • Fixed a bug where duplicating an actor in the level could produce the wrong object, if there's another asset with the same name.
  • Fbx scene importer: Do not remove existing attribute reference from the Blueprint if the reimport of the associate mesh attribute is not tick.
  • fbx scene importer: Make sure we set INVALID_UNIQUE_ID to node that has no attribute.
  • PR #3595: Fixed wrong colour for level status (Contributed by ronve)
  • PR #3558: UE-44862: Always update SColorPicker color on OK button (Contributed by projectgheist)
  • Improve asset import data display in static and skeletal meshes
  • PR #3463: Get bounds for all triangles, not just the first one. WedgeIndex was . (Contributed by DaveC79)
  • Fix degenerated bounds calculation for skeletal mesh when the skeleton is remove from a re-import
  • Meshes editors materials and sections panel are now supporting undo and redo.
  • Fix crash when GC happens while the vr editor radial menu is open.
  • Make sure re-import skeletal mesh follow the "import morph targets" option
  • PR #3553: Crashfix for static array properties (Contributed by Pierdek)
  • Fix lighting becoming unbuilt when mesh painting
  • Fix a bug when importing USD files that caused internal references to other USD files not being found by relative path
  • Fix an editor crash when repeatedly spamming ctrl+s and ctrl+shift+s to save.
  • Slate: Fixed enter edit mode and return handled if not read only.
  • Fix a crash when importing an animation with a skeleton that do not match the skeleton contain in the fbx file.
  • Slate - Changing the order that the tabs draw in so that the draw front to back, instead of back to front.
  • Fixed stats not being possible to enable when in simulate
  • Mesh painting no longer paints on invisible components. Toggling visibility refreshes the selected set.
  • Collection Parameters no longer rename their parameters when duplicated.
  • PR #3453: UE-43004: YesNo MessageDialog instead of YesNoCancel (Contributed by projectgheist)
  • Stop unrealpak from crashing if generating a patch with more pak files then the original game.
  • UGS: Fixed editor receipts being deleted when running a custom tool without compiling first.
  • Fixed ensure when deleting a map that contains build data which also happens to be the currently loaded map.
  • PR #3607: Improved InputKeySelector functionality (Contributed by projectgheist)
  • PR #3615: More detailed log messages for debugging warnings/errors (Contributed by projectgheist)
  • Fix transactions getting stuck in the color grading controls.
  • Fix issue where StreamableManager and other utility objects were not ticking in the editor if viewports were not set to real time
  • More accurate messaging for unresponsive target manager interface.
  • Fixed issue where HLOD cluster preview wireframe would not be removed when the cluster is deleted
  • Unified the way vertex colors are shown while in Mesh Paint mode, only selected Static/Skeletal-meshes now display their vertex colors
  • Fixed issue where per-instance shadow and or collision flags were lost when using the Merge Actor functionality
  • PR #2844: UE-36936: Don't stretch container for Plugin Image (Contributed by projectgheist)
  • Fixed cheat search in command console
  • Fix typo in KismetDebugUtilities that was showing up in log output.
  • Fixed Environment Query System Test details to correctly hide all filter/score properties when scoring/filtering only (respectively).
  • EQSNormalizationType tooltips will now show up correctly based on which type is chosen in a drop-down. (Previously the tooltip for "Absolute" was erroneosly showing up for "RelativeToScores", while a general description was showing up for "Absolute".)
  • Object and Struct properties marked as AssetRegistrySearchable will no longer be visible in the Content Browser
  • Fixing morph target smooth group support. This also has improve the morph target import time.
  • Fix crash Crash when Selecting Actor in the World Outliner That is Using ColorGradingMode
  • Editor crash when opening a project that includes a plugin with more than two custom volume classes.
  • PR #3656: Make References/Referencers List copyable (Contributed by user37337)
  • Fixed an issue where physics geometry of Spline Meshes was not correctly used by the Merge Actor functionality
  • Fixed issue where physics geometry was not correctly scaled when using the Merge Actor functionality
  • Fixed issue where using Per Property Manually Overridden Texture Sizes when merging materials did not work
  • Fixed an issue where the resulting Static Mesh from using the Merge Actor tool would be culled by a Distance Culling volume
  • Fixed a USD import crash when importing a mesh with no material
  • Prevent a crash in UEditorTutorial::OpenAsset when passed a nullptr Asset
  • Prevented a crash in UMaterialEditingLibrary::RecompileMaterial when passed a nullptr material
  • Fixed: Player can't move through level by holding one grip button in Editor VR Mode (partially broken in 4.16).
  • Fixed a crash when the tutorial browser is open during a garbage collect
  • FSplineComponentVisualizer::CanResetToDefault now returns false rather than crashing if SplineComp is not found
  • Fixed a crash when reloading a curve asset that was open in an embedded curve editor
  • Fixed crash when removing the first element from a TMap or TSet property in the editor when it's not the final element
  • Fix crash when a re-import of a static mesh has failed.
  • Fixed an editor crash when loading a map with actors named "none". Naming an actor none is no longer allowed
  • Fix crash in the Editor when multiple instances of the same Blueprint are selected in the level and the Reset to Default button next to a component of the Blueprint is clicked in the Details panel
  • Improved the leading underscore name sanitization to only prevent names that resolve to 'None'
  • Asset reloading now defers re-opening asset editors until post-GC phase
  • Fix crash when modifying array elements in a Blueprint if an instance of that object exists in the level which has modified the array on the instance.
  • Fix crash changing the from columns view while the view options menu is open in the editor.
  • Fixed incorrect UVs being used when generating HLOD meshes with multiple actors that contain differing LODs
  • Fixed crash when doing editor 'Force Delete' on a static mesh whose distance field is still being built.
  • Fixed typo that forced merged meshes with no backing raw mesh to incorrectly generate non-square merged atlases
  • Implemented support for hiding empty folders in the Content Browser
    • "Empty" in this case is defined as folders that recursively don't contain assets or classes. Folders that were created or have contained content at any point during the current editing session are always shown.
    • This also fixes some places where the content filters would miss certain folders, and allows asset and path views to be synced to folder selections (as well as asset selections), which improves the experience when renaming folders, and navigating the Content Browser history.
  • Re-organized some of the "View Options" settings into better groups, and fixed some places where items would still be shown in the asset view when some certain content filter options were disabled.
  • Improved the display of asset tags in the Content Browser
    • Numeric tags are now displayed pretty printed.
    • Numeric tags can now be displayed as a memory value (the numeric value should be in bytes).
    • Dimensional tags are now split and each part pretty printed.
    • Date/Time tags are now stored as a timestamp (which has the side effect of sorting correctly) and displayed as a localized date/time.
    • The column view now shows the same display values as the tooltips do.
    • The tooltip now uses the tag meta-data display name (if set).
    • The tag meta-data display name can now be used as an alias in the Content Browser search.
  • Assets and folders can now be drag-dropped at the same time in the Content Browser.
  • Content Browser search now takes the display names of properties into account
  • Fixed a crash that could occur due to bad data in the asset registry
  • Creating a folder in the Content Browser now creates the folder on disk, and cancelling a folder naming now removes the temporary folder
  • Fixed some cases where folders wouldn't be removed from the Content Browser when deleting them
  • Fixed moving a folder containing a level not moving the level
  • Fixed thumbnails getting much darker with forward shading enabled
  • Fix engine hang when editing an instanced property that may reference BP classes.
  • Cooker output lines containing the strings "Error:" or "Warning:" are now highlighted as red and yellow in the output log.
  • ResavePackages commandlet can now buildtexturestreaming while rebuildlightmaps
  • The instance buffer is now updating partially instead of being recreate every time there was a change, this was done to improve performance with a lot of painted foliage instances.
  • Fixed: Avoid creating unnecessary FUniqueObjectGuid in foliage (prevents package dirty on actor deletion)
  • When selecting a foliage actor and moving it to another level, all instances will be moved properly
  • Prevent foliage from marking actors dirty as HigherarchicalInstancedStaticMesh components are added and removed from the scene.
  • Fix automatically dirtying levels just by copying actors if the level contains a foliage actor.
  • Fixed: Issues with foliage occlusion culling after world origin was rebased
  • Occlusion result is now kept per view, so a multi local player game will now work properly.
  • Fixed possible crash when performing drag &drop operation of Target Layers
  • When updating Phyx region take into account simple collision mip.
  • Landscape info map transactional state is based on its world's transactional state
  • Fixed a lighting crash when working with non square landscape
  • Reset arrows now only display for non-default values in the Material Instance editor. Reset to default arrows now are placed in the correct location for SObjectPropertyEntryBox and SPropertyEditorAsset.
  • Material parameter group dropdown now sorts alphabetically.
  • You can now set sort priorities to Material Parameters and Parameter Groups. If sort priorities are equal, it falls back to alphabetical sort. Default sort priority is 0, and other priorities can be set on the parameter in the base material. Parameters are still sorted within groups.Group sort priority is set on the main material preferences.
  • Fixed a pivot painter 2 NAN error.
  • Adding "texcoord" keyword to UMaterialExpressionTextureCoordinate so you can search for the name that is displayed on the node in the graph.
  • Fixed an issue where the material editor stats and error animations would stop updating.
  • Sequencer: Show sequencer spawnables in the world outliner and add the icon overlay for spawnables.
  • Sequencer: Auto key refactor. Auto key now creates a key only when the property changes and there's an existing track with at least one keyframe.
  • Sequencer: Added outliner column to show the level sequences that an actor is bound to.
  • It is now possible to blend between values for numeric types (int, float, transform etc), and add entry/exit easing to sections
    • New Absolute/Relative/Additive section types allow specific control of object values (such as relative actor transforms, or blending between relative and absolute space)
    • This has particular application for UMG widgets, or blending in and out of cutscenes.
  • Sequencer: Added hotkeys (shift , and shift .) to step to next/previous shot.
  • Fixed deterministic cooking issues with movie scene data
  • Sequencer: Set movie scene capture frames only when not using custom frames. This allows the user entered frame numbers to persist in config, rather than overwriting them when doing a "Render Shot".
  • Sequencer: Added setting to activate realtime viewports when in sequencer.
  • Sequencer: Added setting for limit scrubbing to playback range.
  • Sequencer: Added OnCameraCut() event that fires when there is a camera cut.
  • Sequencer: Added time to transform, color and vector key structs so that key times are editable from the key editors.
  • Sequencer: Added OnFinished() event when a level sequence completes playback.
  • Sequencer: Show camera shake/anim track menus even if there aren't any assets.
  • Sequencer: Added JumpToPosition() function which updates to a position in a scrubbing state.
  • Changed level sequence object references to always use a package and object path based lookup
    • Newly created binding references now consist of a package name and an inner object path for actors, and just an inner object path for components. The package name is fixed up dynamically for PIE, which means it can work correctly for multiplayer PIE, and when levels are streamed in during PIE (functionality previously unavailable to lazy object ptrs)
    • Added a way of rebinding all possessable objects in the current sequence (Rebind Possessable References)
    • Multiple bindings are now supported in the API layer of level sequence references, although this is not yet exposed to the sequencer UI.
  • Sequencer: Added Scrub() function to movie scene player.
  • Sequencer: Load level sequence asynchronously.
  • Sequencer: Added cinematic options to level sequence player.
  • Sequencer: Added GoToEndAndStop() function to the movie scene player.
  • Sequencer: Added attach/detach rules for attach section.
  • Sequencer: Added attenuation settings for attached audio components.
  • Sequencer: Added OnMovieSceneBindingsChanged() delegate.
  • Sequencer: Fixed spawnables not getting removed when deleting a shot or subscene.
  • Sequencer: Added OnBeginScrubbing() and OnEndScrubbing() event delegates.
  • Sequencer: Added Level Sequence Actor as an output for CreateLevelSequencePlayer().
  • Added new experimental plugin that provides a camera aligned image plate, and associated sequencer track
    • This plugin is a stop-gap solution until fully fledged support is introduced with 'Media Framework 3.0'
    • Sequencer track can stream image sequences from disk onto UTexture properties that are exposed to cinematics
  • Sequencer: Fixed crash on export if there's no shot data.
  • Sequencer: Fixed bindings not immediately displaying as unbound.
  • Sequencer: Fixed sequencer spawnables not always appearing by spawning them consistently in the persistent level.
  • Sequencer: Fixed offsets when moving multiple sections.
  • Sequencer: Fixed components not getting reassigned to the new actor when assigning a bound actor.
  • Sequencer: Fixed fov not getting reset when done playing.
  • Sequencer: Fixed components not getting deselected from the sequencer tree view when they get deselected in the viewport/outliner.
  • Sequencer: Fixed filtering in the sequencer tree so that it includes parent nodes only and doesn't recurse through to add their children.
  • Sequencer: Fixed transport controls not appearing in newly created viewports.
  • Sequencer: Fixed spawnables marking the level as dirtied.
  • Sequencer: Fixed sequences not evaluating to the end when setting the playback position to the end of a sequence while playing.
  • Sequencer: Set component velocity for attached objects.
  • Sequencer: Fixed crash on selecting keyframes in the viewport.
  • Sequencer: Fixed a bug where the default state of a spawnable doesn't get saved after editing.
  • Sequencer: Changed OnEditStructChildContentsChanged to use FObjectWriter instead of FMemoryWriter which supports serializing UObjects. This fixes a crash when adding actor array elements to a user defined event struct.
  • Sequencer: Snap play time to keys now allows scrubbing between keys and snaps to key times within a certain screenspace tolerance.
  • Sequencer: Fixed audio not stopping and restarting when playback is looped.
  • Sequencer: Fixed scene component visibility so that it operates with the visibility track for actors.
  • Sequencer: Fixed crash when deactivating a section in sequencer.
  • Changed evaluation groups to always flush implicitly
    • This fixes an issue where events set in the PostEvaluation stage were executed before blended token actuation
  • Sequencer: Fixed max tick rate not getting reset when finished playing.
  • UMG: Fixed a crash when calling stop during evaluation by delaying stop and pause actions.
  • Sequence Recorder: Fixed recording component visibility to use the same visibility tracks for actors.
  • Git Plugin: disable "Keep Files Checked Out" checkbox on Submit to Source Control Window
  • PR #2457: Add .gitdeps.xml-files for plugins support (Contributed by bozaro)
  • Fixed an ensure firing when checking in via SVN
  • Better highlighting of selected UV edges in the static mesh editor
  • Selecting a camera or other preview actor in VR Mode now creates a floating in-world viewport that enables you to see the camera's perspective. You can pin this just like the preview in the desktop mode viewport.
  • Add generic VR Mode debug command "VREd.ToggleDebugMode"
  • Keyboard shortcut for entering/leaving VR Mode is now Alt+V
  • creating a plugin in a C++ project does not open a second instance of Visual Studio.
  • Use correct assets for end and begin of motion controller spline meshes.
  • Entering and exiting VR Mode disables gizmo in desktop editor viewport.
  • Scale and rotation snap while dragging with two motion controllers.
  • Crash when adding a camera to the world in VR Mode the second time.
  • Crash when quitting the editor with VR Mode enabled.
  • Log spam when adding a CineCameraActor to the world.
  • Scene Outliner: Added the ability to set default columns in a scene outliner.

Gameplay Framework

  • The Asset Management Framework introduced in 4.16 is now ready for production use. Many bugs were fixed and features were added, and there is a suite of Blueprint functions available in the Asset Manager category.
  • Added the ability for components to be hidden from specific players through their PlayerController.
  • Optimized CharacterMovementComponent::GetPredictionData_Client_Character() and GetPredictionData_Server_Character() to remove virtual calls.
  • Exposed Distributions to Game Projects and Plugins
  • Prevent SetupAttachmenet from setting up a situation where the component will attempt to attach to itself or in a cyclic fashion.
  • Added MinAnalogWalkSpeed to CharacterMovementComponent, which specifies the speed that the character will accelerate up to when a gamepad analog stick is tilted just past its inner deadzone
  • Added ForceFeedbackScale config var to PlayerController, to allow for per-platform scaling of force feedback curves
  • Added UWorld::GetGameInstance and UWorld::GetGameInstanceChecked wrappers to get a typed subclass of UGameInstance
  • Engine - Adding an OnStart to UGameInstance that is called for both StartPIEGameInstance and StartGameInstance.
  • Added the ability to suppress warnings when using on-screen log warning/error display (DurationOfErrorsAndWarningsOnHUD > 0) by setting Engine.SupressWarningsInOnScreenDisplay to 1
  • Added GAMEPLAYABILITIES_API to all Ability Tasks
  • Add DLL export to ALevelStreamingVolume methods
  • Marked ULevelStreaming::GetWorldAssetPackageFName as BlueprintCallable so instanced levels can be unloaded
  • Paper2D: Allowed specifying additional textures on tile sets that can be used by materials in the same way as regular Paper2D sprites
  • Introduced a new version of UEngine::GetWorldFromContextObject which takes an enum specifying the behavior on failures and updated all existing uses. The new version intentionally does not have a default value for ErrorMode, callers need to think about which variant of behavior they want:
    • ReturnNull: Silently returns nullptr, the calling code is expected to handle this gracefully
    • LogAndReturnNull: Raises a runtime error but still returns nullptr, the calling code is expected to handle this gracefully
    • Assert: Asserts, the calling code is not expecting to handle a failure gracefully
    • Deprecated UEngine::GetWorldFromContextObject(object, boolean) and changed the default behavior for the deprecated instances to do LogAndReturnNull rather than Assert, based on the real-world call patterns
    • Introduced GetWorldFromContextObjectChecked(object) as a shorthand for passing in EGetWorldErrorMode::Assert
    • Made UObject::GetWorldChecked() actually assert if it would return nullptr (under some cases the old function could silently return nullptr while reporting bSupported = true, so it neither ensured nor checked)
    • Fixed a race condition in the 'is implemented' bookkeeping logic in GetWorld()/GetWorldChecked() by confining it to the game thread and added a check() to ImplementsGetWorld() to make it clear that it only works on the game thread
    • The typical recommended call pattern is to use something like the following, which will gracefully handle the failure case but requests a log message (with BP call stack printed out) if it failed:
      • if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { ... Do something with World }
  • Removed the requirement for a local player in UCheatManager::CheatScript, so it can be be started from the server side (doesn't change the availability of the cheat manager, just allows things like the redundant "cheat cheatscript scriptname" to work)
  • Optimized Physics PreFilter to avoid call to virtual getSimulationFilterData() to only use it when needed if we actually have items in the IgnoreComponents list (which is rare).
  • After copying and pasting a child actor component the child actor template is no longer uneditable.
  • USceneComponent ComponentToWorld has been fully encapsulated to ensure access of the transform does not occur prior to the population of the world transform from the relative transforms and parent transforms.
  • Calling SetClass on a ChildActorComponent at runtime no longer fails and results in no child actor.
  • TickableGameObjects that return IsTickableInEditor false no longer in editor worlds.
  • Actors that were initialized and then removed by hiding a streaming level before the world has begun play, now correctly get uninitialized.
  • Fixed SpringArmComponent not restoring relative transform when bUsePawnControlRotation is turned off.
    • Fixes the editor interaction ignoring transform of the component in the viewport after bUsePawnControlRotation is toggled on then off, since by then the world transform had been overwritten (from tick in editor) and nothing would drive transform changes from the editable value.
    • Toggling bUsePawnControlRotation off at runtime now restores the rotation to the initial relative rotation, not stomping it with the current pawn rotation, allowing toggling between the editable/desired base rotation and the control rotation.
  • Fixed code to detect cycles in parallel tick sorting.
  • Fix InterpToMovementComponent not setting velocity on the object it moves. Fix movement rate when substepping enabled.
  • Changed AActor::FindComponentByClass (and AActor::GetComponentByClass by extension) to return nullptr when passed a nullptr class, rather than crashing
  • DeltaTime for a tick function with a tick interval is now correct after disabling and then reenabling the tick function.
  • FLocalPlayerContext::IsValid now also checks that the player controller has a player set.
  • Added virtual OnClientCorrectionReceived() to CharacterMovement. Base implementation contains previous debug visualization and logging code that was contained in the client function.
  • Removed unused function FPhysicsFilterBuilder::SetExtraFiltering(). It was also incorrect.
  • Cleaned up collision FMaskFilter usage to be able to cleanly change the number of bits it uses.
  • Prevent fighting between GEngine->SetMaxFPS and UGameUserSettings::SetFrameRateLimitCVar that caused log spam by preserving the 'last set' reason when changing the value
  • InterpToMovementComponent improvements:
    • Fix velocity not zeroed when interpolation stops.
    • Various fixes when calculating velocity and time when sub-stepping is enabled.
    • Improve accuracy of interpolation when looping and there is time remaining after the loop event is hit. Consume the remainder of the time after the event back in the loop (similar to handling a blocking impact).
  • Made UPrimitiveComponent::GetCenterOfMass and UPrimitiveComponent::GetCollisionProfileName pure.
  • Always reset the input array in AActor::GetComponents(), but do so without affecting allocated size. Fixes possible regression from CL 3359561 that removed the Reset(...) entirely for performance reasons.
  • Fixed a crash when loading a Blueprint with a parent class of ALevelBounds caused by trying to register the class default object with a non-existent level
  • Fixed a bug in FStreamLevelAction::MakeSafeLevelName to avoid appending the PIE prefix multiple times (allows functions like Unload Streaming Level to work correctly when passed a full package name from an instanced streaming level)
  • Fixed the USpringArmComponent location lagging behind after a world origin shift when using interpolation
  • Fixed crashes caused by undo/redo of user defined struct changes
  • UGameEngine now performs its shutdown before shutting down UEngine
  • Prevent various asserts when USplineComponent methods are called on a spline with no points
  • Fix memory corruption when player controllers were disconnected from pawns in certain networked situations

Localization

  • The culture/language/locale console commands are now available in all build configs
  • Updated localized asset group caching so that it works in non-cooked builds
  • Exposed some missing Internationalization functions to Blueprints.
    • You can now get and set the current language/locale/culture for your game (including saving the setting to the users config file) via Blueprints.
  • The package localization ID is no longer used at all at runtime, and is now truly editor-only
  • Added code to sanitize some known strings before passing them to ICU
  • No longer attempt to use the game culture override in the editor
  • Fixed potential underflow when using negative digit ranges with FastDecimalFormat
  • Fixed not being able to set pure whitespace values on FText properties
  • Fixed FNumberFormattingOptions::MaximumIntegralDigits incorrectly including group separators in its count
  • Some improvements to avoid loading the native .locres files twice when we don't need to
  • Data-only Blueprints containing inherited text properties now gather their values correctly
  • The CamelCase break iterator now treats digits around character tokens as part of the identifier
  • Fixed a regression where we would incorrectly gather text from nested UMG widgets
  • Building lighting no longer causes a world to lose its package localization ID

Networking

  • Perf counter module gets more logging to improve error reporting
  • Fixed a memory leak in the network driver.
  • Fixed an issue that could cause rendering artifacts while viewing a paused network replay.
  • Removed some log spam that could occur if voice chat is enabled but it takes a while for the voice handshake to complete.
  • Fixed hardcoded controller id in RejoinCheck
  • ClientTravelToSession controller index was passed into wrong function for retrieving a player controller, making it possible to fail to travel on consoles when controller indices were greater than zero.
  • Fixed a crash that would occur if the "netprofile" command is executed while the Steam Online Subsystem (OSS) is active.

Online

  • OnlineSubsystemGoogle for Windows. Basic implementation of Google Sign-In for user authentication. Separate from GooglePlay in that it is cross platform and doesn't include any of the Google Game Services.
  • OnlineSubsystemFacebook for PC - login flow implemented using web based LoginFlow module - implemented ShowLoginUI for external UI interface - added Login function with existing access token - fixed GetAuthType function - added reference to main online subsystem to Friend/Identity interfaces
  • Move libwebsockets servicing to its own thread. Fixes hitches in getaddrinfo like functions from impacting the game thread.
  • Add Twitch Online Subsystem. Allows requesting the user to log in to Twitch and obtain an auth token to use in Twitch API calls.
  • XMPP module's libstrophe backend now supports responding to XMPP Pings.
  • Enable additional logging in libwebsockets
  • OnlineSubsystemFacebook changes to get Windows/iOS platforms up to date - Facebook user data structure gets information from proper URL request with valid public fields, stores consistently on both platforms -- store values in generic key value pairs - RequestElevatedPermissions feature that goes through external ui to grant more permissions (Windows)
  • Upgraded Facebook iOS to SDK v4.18
  • XMPP now supports a platform user id in the resource - added ParseMucResource to split the data into and - Resources that tried to parse into ParseResource were failing if passed from MUC, making appid,platform,etc blank
  • Fix XMPP module's libstrophe backend not calling our logout delegates in some cases
  • Fixed XMPP module's libstrophe backend incorrectly handling XMPP ping messages
  • Fix crash in libwebsockets
  • Online Subsystem (OSS) consistency cleanup - all OSS classes use the instance name passed into the CreateFactory function - nothing uses the default constructor - OnlineSubsystemImpl requires two params now (OSS name, Instance name) - added GetSubsystemName to return OSS name from OnlineSubsystemNames.h

Paper2D

  • Prevented a crash when calling UPaperTileMapComponent::GetLayerColor with no TileMap asset set
  • Fix crash when clicking Edit Map if there is no tile map specified.

Physics

  • Enabled physx GPU hooks in PhysX libs
  • Fixed physx memory leak when a commandlet loads many assets without ticking the scene
  • Improved the cost of UpdateKinematicBodies - added the ability to defer non simulating bodies.
  • Added public getter for constraints broken status
  • Added functions for setting physics constraints breakable properties
  • Added the ability to set enhanced physx determinism directly in the editor
  • Remove the need for calling constructors for physx PxRaycastHit in the dynamic hit result buffer. Saves 30% of the cost of doing small raycasts that only hit a few objects
  • Added icon for Collision Analyzer menu option in editor.
  • Added the ability to sweep vehicle wheels against simple or complex or both.
  • Changed clothing simulation context to use actor rather than world delta time to take custom time dilation into account.
  • Exposed the physx tree rebuild rate as a project setting. See PhysX docs for more info
  • Added the ability to pass stats into scene queries. Use stat collisiontags to see them.
  • Added a total scene query stat and the ability to trace all scene queries
  • Added 'ShouldRemainVertical' to encapsulate when DesiredRotation should be restricted to Yaw only in PhysicsRotation.
  • Updated contact offset tuning to give better stability. This will affect existing simulated physics content and is potentially more expensive. However, it greatly improves jitter and stacking. Feel free to change the contact offset values back to the previous defaults (multiplier = 0.01, min = 0.0001, max = 1)
  • Added 'section index' output to GetMaterialFromCollisionFaceIndex function, in addition to material reference.
  • Changed it so that soft constraints with both stiffness and damping set to 0 are considered free.Fixed tuning for linear soft constraints to use more reasonable numbers.
  • Support merging ShapeComponent in addition to StaticMeshComponents
  • Fix double-declared physx cooking stat
  • Fix memory leak in UDestructibleComponent::SetSkeletalMesh
  • Fix welded shapes with different Complexity from its parent not being respected.
  • Fixed a case where bodies that are welded to an already simulated body do not unweld when their simulation is turned on.
  • Fix typo in FPhysScene::EndFrame
  • Fix Replicated physics state not synchronized for sleeping bodies (contributed by lightspeedlucas).
  • Fixed SkeletalMeshComponent's TeleportDistanceThreshold and TeleportRotationThreshold UProperties not properly updating at runtime.
  • Fixed FPhysXVehicleManager.h not being in Public folder and exported.
  • Fixed warning from Constraint Component when no bodies are specified.
  • Made clothing simulation suspension unsafe in construction script (there's no simulation to suspend in editor)
  • Fixed incorrect delta time for fixed framerate when the target framerate is slower than the real framerate
  • Fixed clothing LODs seeming to get a large amount of energy on transitions.
  • Fixed crash calling SetSkeletalMesh when switching to a mesh with more clothing elements.
  • Fixed a crash that could occur when reading or writing collision analyzer recordings.
  • Fix for duplicated sections on export when clothing is applied to the mesh being exported
  • Fixed clothing bounds miscalculation when an animation is playing with suspended clothing simulations.
  • Fixed issue where non-uniform scaled Sphyl physics geometry was inconsistent with the PhysX representation
  • Increase search radius for MostOpposingNormal. Fixes case where character movement cannot walk up steps of certain ramps.
  • Added scene query, contacts, and constraints to PVD information.
  • Fixed PhAT to properly remove scale when creating constraints, should fix Skeletal Meshes with scales when simulating physics.
  • Fixed a crash when UInstancedStaticMeshComponent::GetInstancesOverlappingSphere or UInstancedStaticMeshComponent::GetInstancesOverlappingBox is called on a component with no static mesh set
  • Fixed a crash in USkeletalMeshComponent::SnapshotPose when called on a component with no skeletal mesh set
  • Fixed a crash when setting the clothing simulation factory in a skeletal mesh component to an abstract factory class
  • Fixed overlap test incorrectly returning early when multiple shapes are used and no MTD is requested.
  • Fixed constraints & bodies not rendering correctly in PhAT with seperate translucency disabled
  • Include contact offset calcs for destructible chunks, preventing jitter at lower framerates
  • Fixed bounds calculation crash when a skeletal mesh component with clothing is bound to a master pose component with no skeletal mesh set.

Platforms

  • Removed Twitch broadcasting support and Game Live Streaming API
  • The editor now has a one-click option for including Windows prerequisites without using an installer in packaged games.
  • Upgraded java toolchain changes for OnlineSubsystemGoogle - update google auth to 9.8.0 - update required sdk to 25
  • Fix bug introduced in 4.16 where assigning assets to multiple chunks at once did not work properly
  • Improved the warning message slightly when there is no local notification service
  • Fix for slate postprocess resource transition bug.
  • Fixed: Crash in MobilePatchingLibrary OnInstallComplete when installation fails
  • Added experimental support for Gradle build system
  • Updated Clang version checks and handle Clang 3.9 (NDK14b support)
  • Update handling of device and advertiser IDs for Android - remove GetUniqueDeviceId() - deprecated - add GetLoginId() - uses GUID approach - remove fallback from GetUnqiueAdvertisingId()
  • Added support for changing of the Android game thread and render thread CPU affinity masks from the console at runtime.
    • eg "android.DefaultThreadAffinity GT 0x1 RT 0x2" will set the game thread to use only CPU core 0 and the render thread to use only core 1.
    • The values should bitmasks in hex, to specify which core(s) run on. 0 implies all cores.
    • Which core indices correspond to "big" or "little" depends on the device.
  • Added ue4.displaymetrics.dpi metadata to query device DPI for Android
  • Added detection of Houdini (running on Intel Android CPU emulating ARM)
    • use the new UsingHoudini source type in device profile (compare to "true" or "false")
  • Support for NDK14b and start of NDK15 support (Clang 5.0)
  • Removed the Android_All cook flavor as it's deprecated in favor of Android_Multi
  • Updated to Google Play Services 9.8.0
  • Changed FGenericPlatformMemoryConstants and FGenericPlatformMemoryStats to use uint64 instead of SIZE_T to handle >4GB Android devices running 32-bit code
  • Fixed: LaunchOn from Editor on Android device should not re-build APK if only content is changed.
  • Allow mediaplayer audio to be disable on Android by setting audio track to INDEX_NONE (-1)
  • Better Android web browser closing
  • Better behavior for Android LaunchURL
  • Platform - Adding the degree symbol to the log statement for android's temperature update, and noting that it's celsius.
  • Fixed permissions on gradlew on Mac and Linux
  • Removed unneeded > in AndroidManifest.xml #ue4 #android
  • Fixed a crash in UAndroidPermissionFunctionLibrary::AcquirePermissions when called with an empty array on non-Android platforms
  • Use FMath::log2 instead of log2 to fix Android linking issue
  • Fixed AAR version checks (wasn't handling zeros properly)
  • Fixed Android builds always recompiling android_native_app_glue.c and UELinkerfixups even when no other source had changed
  • Removed "android list targets" dependency
  • Protected against null window during shutdown
  • Fixed: Android crash on app launch if AdditionalPluginDirectories contains wildcards in path
  • Create rungradle.bat with subst for long paths on Windows
  • Fixed a rare crash when shutting down the editor after launching on an Android device
  • Show Android SDK license agreement when Gradle enabled if license not accepted earlier
  • Use optimal sample rate and buffer size for Android mixer
  • The Media Player and startup movies now function correctly on when running in Vulkan mode on an Android device
  • HTML5 : re-enable IndexedDB storage usage patches from jukka to properly handle error conditions with IndexedDB
  • HTML5 - disable using IndexedDB (until browsers allows storage to DB with large data sizes)
  • HTML5 - stub back in deprecated audio Doppler functions until they are removed from ActiveSound.cpp
  • HTML5 - fix viewport after returning from fullscreen PR: https://github.com/Mozilla-Games/UnrealEngine/commit/113b9ea1045270a688405dc2d630059f56170f5b
  • HTML5 memory/executable size pass these fixes contains: + build shipping asmjs compressed files + phsyx updated emscripten toolchain cmake config override (i.e. removed EPIC_BUILD_FLAGS match) + retired "/Script/BuildSettings.BuildSettings" config code + added better verbose feedback to print optimization levels during packaging
  • HTML5 - refraction shader note: this CL also contains fixes to webgl2 [float4 vs half2] and a [% vs Mod()] material custom function changes to some TM-ShaderModels shaders specifically: fixes to and similar with: DitherTemporalAA
  • WebSocketNetDriver - add missing "initial packet sequence" data
    • tested with Win64 client and server (as well as HTML5 browsers)
  • Fixed an issue where you could not install an iOS certificate via the editor or iPhonePackager tool if the certificate required a password
  • UBT will use all cores during a native Linux build on machines with at least 16GB RAM.
  • Native builds on Linux are now faster due to parallelized relinking instead of a single FixDeps step.
  • Added pretty printers for gdb so Unreal types can be accessed more easily during debugging.
  • Added OpenEXR libs for Linux.
  • Gracefully exit with a message box instead of crashing on poor hw/drivers.
  • Added USD support on Linux.
    • Fixed RPATH when linking to dynamic libraries in plugins.
  • Reduced number of distinct VMAs used on Linux.
  • Fixed selection logic for the UE4_LINUX_USE_LIBCXX environment variable.
    • Pull request #3576 contributed by jared-improbable.
  • Fixed inconsistent font on the Linux splash screen.
  • Fixed FSocket::Recv() blocking when there's no data even if Peek was passed.
  • Serialize allocations from the memory pool.
  • Fixed crashes when interoperating with third party dynamic libraries that use STL due to hidden new/delete signatures.
  • Fixed game window drifting down when dragging it.
  • Removed obsolete PhysX deoptimization for Linux (debugging code).
  • Fixed code projects not working in the Linux installed build.
  • Fixed directory iteration code not handling symlinked directories.
  • Fixed UAT compilation on the newest mono.
  • Removed long-unused LinuxNativeDialogs (superseded by SlateDialogs).
  • Fixed CEF crashing on systems without gconf installed.
  • Eliminated SCW logspam on Linux.
  • Added VolumetricFogVoxelization implementation. Requires Metal 1.2.
  • Fixed address sanitizer support in MacToolChain and added support for thread sanitizer
  • Fixed Steam dylib not being included in app bundle for editor builds.
  • Changed the order of operations in FMetalStateCache::SetRenderState to work around an issue with some Intel drivers where they would not recalculate the raster state in some edge cases.
  • Fixed a problem with window position not being restored correctly on startup if the Windows taskbar was on the left or the top of the screen on editor quit.
  • Solved the issue with dsymutil failing with an error saying the input file did not exist
  • PR #3461: Mac doesn't return the correct exit code (Contributed by projectgheist)
  • In Metal RHI report texture streaming as immediately successful as on D3D to avoid a race-condition leading to deadlock between the Main, Game, Render & RHI threads.
  • Added handling of directory symlinks to FApplePlatformFile::IterateDirectory
  • Solved a problem with Mac FMallocTBB::Malloc() returning nullptr for 0 bytes allocations, which is inconsistent with other platforms. On Mac we always scalable_aligned_malloc, which behaves differently than scalable_malloc, so for 0 bytes requests we allocate sizeof(size_t), which is exactly what scalable_malloc does internally in such case.
  • Fixed in-game console copy/paste shortcuts on Mac
  • Fixed a crash in Metal when drawing with ParticleSimulationShader in simplified forward shading mode
  • Fixed a crash caused by using TSharedPtr/Ref of the same window on main and game threads simultaneously.
  • Fixes a crash at exit on Mac in TMetalBaseShader destructor
  • Fixed crashes caused by data races in FCoreAudioSoundSource
  • Fixed crash at startup on Mac caused by an attempt to use a NULL uniform buffer.
  • Fixed audio streaming on Mac
  • Fixed double-printing of log entries for console apps (eg. cooking).
  • Fixed main menu bar closing when clicking on submenus.
  • Fixed a problem with the green titlebar button changing functionality from toggle fullscreen to zoom after switching from fullscreen to windowed mode.
  • After retrieving the friends list, session IDs of any sessions that friends are in are now added to their corresponding presence information.
  • Added visualization support the CMask using the vis command in the console. (This also adds support for all other UINT8 textures)
  • Fix crash in RHIUpdateTexture3D when updating textures with more than 8MB of data.
    • The graphics temporary allocator can only handle up to 8MB.
    • If more than 8MB is passed, RHIUpdateTexture3D will fall back to the standard FMemBlock allocator.
  • Fix crash when running games on dev/test kits in release-check mode.
    • Failure to create a dev directory on the kit emits a warning UE_LOG, which causes a stack overflow attempting to create the directory again.
    • Switched that log message to a low-level printf instead.
  • Fixed DBuffer-Normal Decals so that they are drawn correctly.
  • Fixed Dualshock 4 and Move disconnection issues.
  • Fixed DBuffer decals when "r.ScreenPercentage" is bigger than 100.
  • Fixed DBuffer decals optimization is on PSVR.
  • Mesh particle systems now bind the previous transform of the particles.
  • Fixed an ensure which fires when the -norhithread flag is used.
  • The supported NEX version has been upgraded to 4.1.1.
  • Support custom LOD for shadow map generation only (r.ForceLODShadow) Added #define to expose forceLOD and forceLODShadow also in Test/Ship builds. #define EXPOSE_FORCE_LOD 1 in RenderCore.cpp to enable.
  • NVN queue flush threshold can now be adjusted (via ini file) to avoid mid-frame submits.
  • Added stats for some GPU counter metrics: "stat NVNRender" and "stat NVNShaderInvocation"
    • Shader info dump for NVN-GD profiling / debugging feature. Enable with r.DumpShaderDebugInfo=1.
  • Add support for 3.0.0 SDK. Maintain compatibility with 1.3.0 SDK.
  • Copy over default engine Icons if they don't exist for project. Required for successful packaging with SDK v3.4.0
  • Don't tear down audio if it's already been done.
  • Consume decoded audio buffers even if no audio sink is available to keep playback from stalling. Fixes stalling of videos rendered as textures.
  • Ensure NN_SDK_BUILD_xxx definition matches the libraries linked against.
  • Fix for startup crash where LLM tracker tries to use new to allocate TLS buffer.
  • Fix for failed IsSafeToUseRHIThreadResources() check.
  • Fixed a bug with the windows async IO stuff related to an unsafe pointer cast to LPDWORD from int64*.
  • Use the proper controller index redirect on Windows controllers
  • Fixed a problem on Windows where the cursor would get locked to a part of the screen after switching from fullscreen to windowed while the cursor is unlocked.
  • Fix for incorrect mouse position in fullscreen mode when Windows task bar is placed on the top or on the left of the monitor.
  • Initial Scorpio Support (requires the June Preview XDK)
  • UE4.17 is built against the March 2017 QFE1 XDK.
  • Support for XMA2 hardware audio decompression has been added. This replaces the previous OggVorbis software audio decompression system. This saves both CPU time and memory.
  • Simplified achievements are now supported.
  • Add commandline option for enabling break on D3D errors
  • Fixed chunk events sometimes being skipped due to initialization order.Fixed an issue where chunks could be mounted twice.Fixed the chunk status that would be returned for non-existent chunks.Added support for registering chunk updated due to a content update while the game is running.Added support for suspend/resume to the Streaming Install system.
  • Add some additional pixel formats in ComputeBytesPerPixel (DXGI_FORMAT_R32_TYPELESS and DXGI_FORMAT_R32_FLOAT)
  • The symbol cache is now generated by default.
  • Disable wavesim iteration shader compiler flag. Recent profiles show no performance benefit and it significantly slows builds, and can cause graphical corruption in some cases.
  • Fixed a rare crash that could occur when the connection has been lost to the subscriptions service if multiple sessions were active.
  • Fixed an issue where the game exe would be placed in streaming install chunk 2, instead of chunk 1 where it is intended to be.Fixed the direction of slashes in the generated packaging layout file.
  • Fixed a potential crash caused by settings and logs attempting to write to developer scratch space in retail games.
  • Fixed an issue that would cause the default stack size options to be deleted when the editor updated the target settings in DefaultEngine.ini.
  • Fixed an issue where some runtime files were saved to the game directory in Shipping builds.
  • DX12: Fix memory leak with CBV descriptor heaps
  • Workaround for PIX memory trace misreporting (issue with overlapping VirtualAlloc commits). Virtualallocs with MEM_COMMIT from texture streaming are now non-overlapping. This may also improve allocation performance during texture streaming
  • Fixed a bug that caused audio and video playback from the MfMedia plugin to start desynchronized.
  • Fixed crash dump and call stack generation when a crash happens on a non-gamethread.
  • Fix for PSO disk cache initialization bug with static root signature (root sig was not getting initialized when the disk cache was enabled)
  • Fixed validation failures against the latest Submission Validator from Microsoft.
  • Fixed a typo in the AppXManifest generator.
  • Fixed an issue in the DX11.x RHI where skinned meshes would render incorrectly in some circumstances.

Programming

  • Added support for running PVS-Studio through UnrealBuildTool. To use, pass -StaticAnalyzer=PVSStudio to the build command line (similarly, the Visual C++ analyzer can now be invoked using -StaticAnalyzer=VisualCpp). A log file will be written to the Engine/Saved/PVS-Studio or /Saved/PVS-Studio directory containing diagnostics, which can be opened using the "unparsed output" filter in the PVS-Studio standalone application. High priority warnings are printed to stdout.
  • Visual Studio 2015 Update 3 is now required to compile UE4 on Windows.
  • Added FRWMutex and FRWScopeLock.Use RWLocks instead of a mutex for PSO async creation
  • Enabled ICF (Identical Code Folding) linker option in android tool chain.
  • UnrealHeaderTool now excludes headers in folders named after platforms other than the active target platform.
  • UnrealBuildTool now defines UE_4_X_OR_LATER macros for every UE4 version greater or equal to 4.17 when compiling .build.cs files (eg. UE_4_17_OR_LATER, etc...).
  • BuildGraph: Compile tasks can be forced to run without using ParallelExecutor by setting the AllowParallelExecutor attribute to "false".
  • Compiler warnings for classes with virtual functions but no virtual destructor are now enabled by default.
  • Documentation files can now be excluded from generated project files by specifying false in the XML configuration file.
  • Added option to BuildCookRun to generate a map file when compiling (-mapfile).
  • Added a setting to allow modules to opt-out of having all public header folders added as public include paths for dependent modules. Set bAddDefaultIncludePaths = false to enable.
  • Added an AutomationTool script for syncing DDC stores from one location to another, filtering by modified timestamps and only copying deltas, and also ensuring the size of the combined cache does not exceed a specifed limit. Run AutomationTool with the arguments "SyncDDC -Help" for more information.
  • Plugins can now specify explicit dependencies on other plugins, using the same syntax for enabling and disabling plugins in the .uproject file. The plugin browser reflects these dependencies, and will not allow you to disable a plugin without disabling other plugins that depend on it.
  • Modules with RTTI enabled now correctly generate a separate precompiled header to modules with it disabled.
  • The /permissive- option is now enabled by default for Visual Studio 2017, for stricter C++ standards complicance. The /Zc:strictStrings option is disabled due to violations in Windows headers; all UE4 violations have been fixed.
  • UnrealVS: Fixed massive slowdown on startup caused by searching the directory tree under the solution for .uproject files (including intermediate folders, etc...). Now reads .uprojectdirs files and only checks the listed directories within. Measured it taking > 30s to run before, now takes < 0.1s.
  • BuildGraph: Add a parameter to the task which allows forcing XGE to be disabled for a compile (AllowXGE="false")
  • Added IsPlayingReplay() function to UWorld
  • Added support for the -ini command line config override to C# tools to match the support in C++ tools.
  • Disabled UHT error when using "config" on TAssetPtr properties.
  • Change the log level of gameplay cue manager cleanup logging to reduce log spam.
  • The game executable is now rebuilt if a default plugin is disabled, since dormant code can still create dependencies on content.
  • Add android versions of PRAGMA_DISABLE_OPTIMIZATION and PRAGMA_ENABLE_OPTIMIZATION are now honored.
  • AutomationTool will no longer be compiled when packaging through the editor with the debugger attached, to prevent access violations on PDBs.
  • UnrealBuildTool will now error if a plugin lists a non-plugin module in the .uplugin file.
  • Force delayed RPCs to attempt to run once on the frame they when they were received.
  • Fixed INI settings for default stack size not correctly being propagated to the linker.

Rendering

  • Moves all engine shader files into Public and Private directory, and introduce the .ush extensions for header file that do not contains entry points.
  • Added a -CSV option to ListTextures command.
  • Exposes scene capture 2d's FOV to Blueprints
  • Support for running the preprocessor when using ShaderCompileWorker's direct mode with -mcpp
  • Fixed bug with auto UVs and small UV charts not packing.
  • DR - add cmdline to select a GPU vendor when multiple GPUs from differnt Vendors are installed into the same Machine
  • Mesh decals can now be sorted between each other.
  • Allows Motion Blur and Temporal Anti-Aliasing in scene capture 2d.
  • Gives the possibility to configure scene capture's showflags in Blueprint editor usefull for Blueprint encapsulated compositing pipeline.
  • Scene captures and player camera rendering now have a mode to only execute post processing passes, useful for compositing capabilities, and still reuse in-engine provided implementation such as Bloom, or tone-mapping.
  • Added a feature that lets scene render components specify a view owner. Useful so that a component's bOnlyOwnerSee field can be used for scene renders.
  • Implements LensDistortion engine plugin. This CL import a polished version of The Human Race's lens distortion and undistortion from OpenCV parameters: - It is implemented as the first engine plugin with its own shaders and render thread commands; - Has feature tests in EngineTest with gold images directly extracted from OpenCV itself (GenerateLensDistortionUndistortReferences.py)
  • Added Blueprint-exposed SetFadeScreenSize function to DecalComponent.
  • Added (Blueprint-exposed) SetReceivesDecals function to PrimitiveComponent.
  • When running with -vulkan, the feature level will now be SM5 by default.
  • Changed packaging support from SM4 to SM5 for Vulkan. Additionally running with -vulkan on desktop platforms will automatically launch on SM5 mode.
  • Major Vulkan refactoring, brings stability and correctness to SM5 and Editor .
  • Adds support for opacity output alpha for post process material when doing a draw material to render target.
  • Integrate 3267269: Implements SceneCaptureComponent2D::bCameraCutThisFrame
  • Expanded r.Vulkan.EnableValidation to have levels of information (1 thru 4)
  • Implement support for "Share Material Shader Code" & "Shared Material Native Libraries" project settings when cooking Mac/iOS project on Windows or Linux using a remote Mac for shader compilation.
  • Always store the Metal shader text for Mac, but not iOS, to make the shader compiler errors more debuggable. The shader text is stored in a compressed format and only decompressed when required for error reporting.
  • Added low impact reporting of rendering-debug groups within Metal so that we get some information about what the GPU was processing when it fails. This is enabled by default to aid the debugging of crashes reported in Metal.
  • Extend support for generating native Metal shader libraries to Windows Editor using a remote Mac for shader compilation.
  • Fixed StreamingDistanceMultiplier not being applied to SkinnedMeshComponents
  • Use the right DLL functions when compiling D3D11 shaders for reflection and compilation; also fixes using the correct fxc.exe path to match the D3D compiler DLL we distribute.
  • Fixed fog artifact. Better handle divide by zero.
  • Fixed: Wrong memreport for STAT_TextureMemoryCube, STAT_PrecomputedLightVolumeMemory, STAT_ReflectionCaptureMemory
  • Fixed deterministic cooking issue caused by lightmap LODGroup only being initialized in the CDO if it's serialized, causing inconsistent delta serialization for instances.
  • Fix RHITransitionResources crash with more than 16 textures.
    • Old command had a fixed sized array of 16 textures that would overflow.
    • New command allocates an array of texture pointers inline in the command list, so any number is supported.
  • Fixed an issue with on the canvas triangle renderer where vertex colors had a different ordering than vertex positions
  • Updated IsParticleCollisionModeSupported() to disable depth buffer particle collision mode for simple forward shading
  • Z Fighting fix for depth-equal rendering with a full prepass - don't merge verts with an epsilon when creating depth-only indexbuffers
  • Fixed a bug where UCanvas::K2_DrawMaterial did not respect the currently active canvas draw color
  • Replace the previous fallback implementation of reversebits for Metal to avoid an Nvidia Metal compiler bug.
  • Destroyes scene capture's view states on the UnRegister, to avoid large memory usage cause by the ViewState's render targets when moving Blueprints arround.
  • Fixed: Scene capture component was applying only default ShowFlags in game
  • Fixes a bug where scene capture WorldToView matrix would get scale != 1 when scaling the scene capture actor in the world.
  • Compile Metal shaders to use the native Vector*Matrix intrinsic to prevent inconsistencies between the depth pre-pass and base-pass caused by the Metal compiler reordering instructions differently between shaders.
  • Fixed asserts in various UKismetRenderingLibrary methods if passed a nullptr for the WorldContextObject Fixed flipped warnings in the failure cases for EndDrawCanvasToRenderTarget
  • Added a workaround for a rare editor crash updating parameters for an outdated shader map.
  • Stability fixes for Vulkan
  • Prevented a crash in UStaticMeshComponent::GetMaterialSlotNames when called on a component with no StaticMesh set
  • Prevented a crash in USkinnedMeshComponent::GetMaterialIndex or USkinnedMeshComponent::GetMaterialSlotNames when called on a component with no SkeletalMesh set
  • Prevented a crash in UParticleSystemComponent::GetNamedMaterial or UParticleSystemComponent::GetNamedMaterialIndex when called on a component with no template set
  • Fixed a bug in RHITransitionResources which would cause a crash when more than 16 UAVs are passed.
    • New command allocates an array of UAV pointers inline in the command list, so any number is supported.
  • Temporarily disable GPU morph targets on Mac because they require implicit Buffer<> format conversion which isn't available in Metal.
  • Fixed a crash when enabling debug visualisation on Metal caused by an incorrect colour output format in one of the shaders.
  • Disable Fast Fourier Transform Bloom for Metal v1.0 & 1.1 as the shaders don't compile correctly on Mac OS X 10.11.6. When used there is an error reported in the Output Log that instructs users to explicitly opt-in to Metal v1.2 in the project-settings to support this feature, which raises the minimum supported version of macOS to 10.12.5.
  • Workaround a bug in the Intel GPU shader compiler for macOS 10.12.6 by using a static helper function to access vector components by array index.
  • Fixed several cases where a scissor rect could be incorrectly left set across general rendering and Slate.
  • Fixed a rare crash when compiling shadowing default materials.
  • Fixed a threading crash when closing a viewport using debug drawing.
  • Fixed a crash in quadric reduction caused by bad tangents in source mesh.
  • Fixed incorrect fast-ram texture setup for LPV textures.
  • Fixed up a crash when running a cooked build without cooked shaders.
  • Fixed a rare crash bug in GPU particles. Particle emitter resources were being deleted before being used by the simulation.
  • Static light source shapes drawn into reflection captures handle SourceLength via scaled sphere
  • Improved contact shadows.Fixed some issues hampering it from being very usable. If you've tried using this before and had issues I recommend trying again.
  • Volumetric fog now supersamples lighting when the history is not available, reducing noise on areas that just came on-screen or after a camera cut. The number of samples is controlled by r.VolumetricFog.HistoryMissSupersampleCount, defaults to 4, cinematic scalability uses 16 Under fast camera movement, volumetric fog cost went from 1.79ms -> 1.97ms with 4 samples, on a 970GTX
  • ShadowResolutionScale affects the static shadow depth map used by volumetric fog
  • Stationary point light static shadow depth maps are higher resolution to match spotlight resolution
  • Optimizations to shading model math. PR #3340: Bug fixes related to shader TODOs (Contributed by vgfx)
  • Add the LightComponent property bForceCachedShadowsForMovablePrimitives. This allows us to enable shadows for selected lights for movable objects when r.shadow.cachedshadowscastfrommovableprimitives is 0.
  • Fixed particle lights in forward shading, they were not setting the lighting channel mask properly
  • Fixed DBuffer decal default normal (used when DBuffer decals enabled, but not decals rendered) not reconstructing zero properly, adding -.008 to WorldNormal which then caused artifacts with forward lighting specular on materials with roughness near 0.
  • Fixed static shadowing of volumetric fog and translucency causing shadowing past the lightmass importance volume.
  • Fixed a possible crash happening after a lighting build.
  • Fixed Indirect Lighting Cache updates caused by capsule indirect shadows forcing point samples, breaking primitives using ILCQ_Volume
  • Fixed lights from hidden levels affecting the lighting build.
  • Fixed a rare bug where HLODs could incorrectly draw their children in shadow maps.
  • Fixed precomputed lighting being discarded on map load for some Blueprints.
  • Fixed shadow color not getting updated after light build when a texture is changed and reimported
  • Fixed dynamic shadows and raytraced distance field shadows of directional lights not appearing in planar reflection
  • Fixed direct capsule shadows with point lights also projecting shadow on opposite side and direction
  • Bent normal map support. Multibounce AO approximation.. Spherical Gaussian based specular occlusion.
  • Added new material nodes for quasi-random Sobol points, with a distribution matching the new Sobol Blueprint nodes.
  • Dither opacity mask now stacks properly for non parallel polys. Dither is randomized by triangle normal.
  • Captions for Noise and VectorNoise material nodes now show which noise function is active
  • Added RenderTargetFormat to UTextureRenderTarget2D, with choices of 8 bit, 16fp, 32fp and 1, 2 or 4 channels.
  • Added Log10 material graph node.
  • Optimizing the blend angle corrected normals function per caner_ozdemir's suggestion.
  • Fixed various material parameters not working with mesh decals, e.g. World Position.
  • Fixed possible texture streaming issues on static meshes and skeletal meshes.
  • Fixed material shared texture sampler usage with mip-biasing.
  • If you had a reroute node between a Material Function texture input and its usage, the parent material would fail to resolve the reroute node.
  • float4 PseudoVolumeTexture: Fixed frame layout being a float instead of float2. Now works correctly with non-square frame layouts. Only called in custom nodes and calling with a float still functions properly so no old content will break.
  • Fix a crash when UMaterialInstanceDynamic::CopyParameterOverrides is passed a nullptr
  • Fixed an issue where textures would have low resolutions after a memory usage spike.
  • Android applications built with OpenGL ES3.1 or Vulkan will now use native sRGB sampling instead of emulating it. You can expect better perceptual color resolution for textures on devices.
  • Translucent objects marked as "Mobile Separate Translucency" will be rendered separately after Bloom and Depth Of Field. This option can be found in Translucency section of Material Editor.
  • Added project option to limit GPU skinning to 2 bones per vertex. In case project skeletal meshes was authored with 2 bones influence, enabling this option will reduce vertex shader cost for skeletal mesh rendering. Option can be found in Rendering Settings -> Optimizations -> Limit GPU skinning to 2 bones influence.
  • Enabled vertex texture reads with ES3.1 feature level.
  • Fixed: Rendering artifacts related to sampling CustomDepth in translucent materials
  • Fixed: Deferred decals rendering artifacts in HTML5
  • Fixed: HighRes screenshot with 'Use CustomDepth as mask' in feature level ES2 preview leads to Editor crash
  • Fixed: Game view is letter-boxed on LG G6, Samsung Galaxy S8
  • Fixed problem with an inverted y-axis for the opacity when using Inverse Opacity Scene Captures and MobileHDR disabled
  • Disabled frame buffer fetch on Android GLES 3.1 to fix black screen and other issues
  • Fixed color fringing offsets when using a sub-rectangle of render target.Changed mobile color fringing to be a closer match to the desktop renderer.
  • Fixed: Galaxy S8 Mali device detects as Android_Mid device profile
  • Fixed: Redundant render target clears in mobile rendering
  • Fixed: DOF rendering artifacts on Redmi Note 3
  • Allowed the possibility of running the RHI "thread" on task threads instead and cleaned up and unified the conditionals involved. By default we still have a dedicated RHI thread because it tested slightly faster.
  • Cone vs tile bounding sphere intersection tests for Light Grid culling of spotlights, which provides much tighter culling than just View space tile AABB vs light bounding sphere. Forward shading BasePass 3.7ms -> 2.4ms in a scene with 24 spotlights on 970GTX Volumetric fog 2.87ms -> 2.09ms in the same scene
  • Skip recapturing reflection captures when PropagateLightingScenarioChange is being called for a level unload. This leaves stale results in reflection captures around when hiding a level in the editor, but avoids the double recapture that happens when swapping lighting scenarios in game, and the unnecessary reflection capture update when exiting PIE.
  • Deferred uniform expression caching. Setting multiple parameters on a material only causes its uniform expressions to be recached once.
  • Occlusion queries are now always done before the base pass if a nearly full prepass is being used(DDM_AllOccluders or DDM_AllOpaque). Removed r.OcclusionQueryLocation.
  • Global distance field composite shader has a version for each flattened axis, which improves efficiency when updating a slab which is what camera movement typically causes
  • Added the possibility to downsample standard translucency for improved performances.
  • Optimized texture loading by multithreading the DDC loading.
  • Improvements for Skin Cache, performance and memory optimizations
  • Implements Composure plugin to make compositing in UE4 easier.
  • Change labels on bloom boost from x,y,z to min, max, mult. This applies to the convolution bloom option. A PropertyRedirect in BaseEngine.ini allows this to work with older version.
  • Exposes r.PostProcessing.PropagateAlpha to the renderer settings.
  • Fixed pixel inspector values for scene color being clamped to 1.
  • Fixed a bug with the compute version of the SSAO pass that could cause some AO artifacts with non-standard viewport sizes. Most people won't have seen these problem since the pixel shader (not the compute) version is the default code path.

UI

  • Fixed some crashes/artifacts with bidirectional text It was possible for a line to compute an incorrect range, which could cause crashes or other highlighting issues. The highlighting logic has also been updated as the old code didn't handle all bidirectional cases correctly.
  • Added preset Unicode block range selection to the font editor UI
  • UMG - Adding GetMousePositionOnPlatform and GetMousePositionOnViewport as other replacements that people can use rather than GetMousePositionScaledByDPI.
  • UMG - Added a button to the Widget Designer to summon the Slate Widget Reflector.
  • UMG - Adding an option in the widget designer to control respecting the locked mode.
  • PR #3450: UMG "Lock" Feature, allows widget locking in the designer. (Contributed by GBX-ABair).
  • Automation - Introducing a way for people to provide Ground Truth for their tests.
  • UMG - Progress Bar Widget - Exposing Border Padding Option.
  • Exposing GoTo/ScrollTo to single-line editable text for API parity with multi-line editable text
  • UMG - Render Focus Rule now defaults to never.
  • Added the ability to set the sides to pad on the USafeZone.
  • Allow selecting invisible items in UMG CommonTreeView and Slate STreeView.
  • Added subtitle priority to USoundCues. It defaults to the default subtitle priority (10000) so no behavior changes by default, but you can now specify SoundCue priorities properly for the subtitle system.
  • UMG - Introducing more options for how items are sized in a table view. The two new modes are Evenly Sized and Evenly Wide. Evenly (Size) - Items are distributed evenly along the row (any extra space is used to scale up the size of the item proportionally.) Evenly (Wide) - Items are distributed evenly along the row, any extra space is used to scale up width of the items proportionally.)
  • UMG - Improving the navigation options on the ScrollBox. You can now set the NavigationScrollPadding on the scrollbox to configure an amount of padding that's added to the scrollbox when navigating, so that extra space is put between the item and the edge of the view.
  • UMG - Introducing a way to inform the widgets more information about the designer. There's now a DesignerChanged event sent to all design time widgets letting them know things like the current screen size and DPI scale. UMG - The SafeZone widget will now show the correct safe zone amount if you use the safezone command line options in the designer, which are now documented in the comment for the USafeZone class.
  • UMG - SafeZone widget now has comments, and useful tips. Using the debugging console commands now trigger the broadcast that will cause controls like the SSafeZone widget to resample the display metrics to learn the new safezone ratio.
  • Add option to hide action button prompts if the button isn't interactable. +Add SetHidden method to CommonActionWidget +Add bDisplayInputActionWhenNotInteractable setting to CommonButton
  • CommonButtonGroup - add support for button clicked and button doubleclicked events.
  • Add OnHoveredButtonChanged event to the CommonButtonGroup. This allows for doing things like displaying an item inspect view when hovering over items in the button group.
  • UMG - Adding a way to config the default option for how Scaleboxes should perform layout, single or double. Double is more precise, but has a larger layout cost. Single works 90% of the time so long as you don't have layout loops. Double has been the way it always worked, and is the default, but converting your project to use single can save a lot of time.
  • UMG - Adding a way to access the absolute size of widget Geometry in Blueprints.
  • Slate - You can now visualize batching by doing Slate.ShowBatching 1.
  • Slate - You can now show overdraw in slate by doing Slate.ShowOverdraw 1, or 0 to disable.
  • UMG - Exposing a way to dynamically set the touch/click method on buttons.
  • Editor - Adding PPI/DPI to the unit conversion tables.
  • Added a compilation warning for UMG child Blueprints that define a widget hierarchy if the parent also has one (in this case only the children widgets will be created, the parent ones are ignored)
  • Adding the console command Slate.ShowDebugTextLayout to help debug layout issues in Slate.
  • UMG/Android - Making several improvements to the way mobile scrolling is handled in UMG/Slate. Introducing a way to get the Physical Screen Density on Android and iOS. On iOS it's a hardcoded set of densities, for android they're loaded from the AndroidEngine.ini. If we can't find a match to the model phone you're on, we rely on the OS to report a reasonable screen density. With physical screen dimension knowledge, we can make much better decisions about deadzones around the finger before things like Drags are triggered. This change also introduces a gesture detector to Slate so that Slate can simulate gestures that may not be provided by the OS. The first and only gesture we currently support is the new Long Press gesture that has been added. The innertial scrolling logic has been rewriten on the ScrollBox, and the inertial scroll manager now has a better default experience.
  • Choice Card sequence while opening Pinatas has been improved:
    • Now displays the text of the item you are choosing
    • Fixed up rarity colors so Mythic cards appear gold and legendary appear orange.
    • The choice microchips now display rarity on them
    • When you get a choice between a Legendary, or Mythic set of micro cards, the rarity border animates and it is fancy.
    • Reduce the size of the icon that appears on the card slightly so there was room to fit text
    • When choosing between two defenders, display the icon that has the weapon type included
  • PR #2699: GameViewportClient - Added a method to allow setting the viewport cursor. (Contributed by rfenner)
  • UMG - Adding a way for games to opt-out of the slow widget path, to completely prevent them from being cooked. UMG - The movie data is no longer cloned for each new instance that inhabits. It now keeps a reference to the now publically accessible movie scene data on the class instead.
  • Slate - The stencil buffer is created on demand if you start using complex clipping, otherwise it doesn't allocate one.
  • Fix bogus error message about the number of usable texture coordinates on ES2 when compiling a UI domain material
  • UMG - Fixing the WIC to properly simulate cursor delta so that scrollbars work now work in 3D.
  • Fixed constant font measure flushing if a widget had no font set
  • Fixed constant font cache flushing if a widget had no font set
  • Fix extra slate uv coords not functioning on ES2
  • Text containing surrogate pairs now runs through HarfBuzz when shaping in Auto mode
  • Fixed incorrect handling of some left-to-right scripts that require complex text shaping
  • Fixed crash when trying to swap UMG widgets bound in an animation track with a widget from a different widget Blueprint.
  • Fixed a null SComboBox item selection preventing the combo from opening
  • Fixed font outline changes not automatically updating the text layout used by a text block
  • Slate - Removing long ago deprecated api for 'aspect ratio' locking box cells.
  • UMG - Deprecating GetMousePositionScaledByDPI, this function has too many issues, and I don't want to break buggy backwards compatability, so just going to deprecate it instead. For replacement, you can now access an FGeometry representing the viewport (after DPI scale has been added to the transform stack), and also the FGeometry for a Player's Screen widget host, which might be constrained for splitscreen, or camera aspect.
  • UMG - Deprecating OPTIONAL_BINDING, moving to PROPERTY_BINDING in place and you'll need to define a PROPERTY_BINDING_IMPLEMENTATION. Will make bindings safer to call from Blueprints.
  • UMG - The WidgetComponent now marks more fields as read-only in the details view depending upon other settings so that user are less confused about what settings actually have an impact under the current mode.
  • Fix issue where slate menu placement options like ComboBoxRight did not work properly for UI popups that create their own window, such as combo boxes in the editor.
  • Slate - Loading Screen - Adding some additional checks to the the loading code to ensure we're on the main thread. Additionally adding a fix that prevents deadlocks in the rare case a user hits Alt+Tab in a fullscreen game while in a hard loading screen.
  • We now handle scaling the glyph advance, as FreeType scaling didn't work correctly for all fonts
  • UMG - Fixing the designer showing multiple material brush options for sequencer.
  • UMG - Improving the display of the +Track menu in sequencer for UMG. Renamed it from +Add, which is repetitve to +Track. Additionally, the dropdown now shows the currently selected widgets, as well as a submenu containing all the 'important' widgets, so we no longer populate that list with a ton of irrelevant widgets that are just Buton_1 - N, which is pointless in showing people, they'll never guess which is the right button.
  • Slate - We now version focus per user, that way during focus events, we can safely abort focus events and state transitions if someone interrupts the active focus event with something new transitioning focus, while transitioning focus.
  • Slate - The GetRenderer() call on SlateApplication no longer returns a SharedPtr, rather than convert it to a thread safe ptr, going to just make accessing it a raw ptr return, so it can be safely referenced on the game thread while being used on the slate loading thread.
  • UMG - User Widgets now have an easy way to know if they're part of (OnAddedToFocusPath) or have been removed (OnRemovedFromFocusPath) from the focused widget path, which is handy for doing effects.
  • Slate - The GetRenderer() call on SlateApplication no longer returns a SharedPtr, rather than convert it to a thread safe ptr, going to just make accessing it a raw ptr return, so it can be safely referenced on the game thread while being used on the slate loading thread.
  • PR #3250: Return correct VirtualUserIndex (Contributed by projectgheist)
  • Fixed "NativeGameLanguage" not being used correctly during localization initialization
  • Fixed a bug which caused subtitles to sometimes delay displaying for a long period of time or even never to display at all.
  • Fixed JIRA FORT-40180: Subtitles do not display when volume is set to zero.
  • Fixed a problem with editor tooltips not disappearing when the cursor is moved over the other application's window placed on top of the editor window.
  • Fixes for CommonTextBlock +Fix for not rebuilding the underlying slate resources or refreshing after the slate resources are destroyed, as happens when the CommonTextBlock is on an activatable panel that gets popped and then push back on later. +Don't crash the editor if TextScrollStyle is reset.
  • Fix bug with input not working when popping widgets off the CommonWidgetStack.
  • Slate - Fixing the size of Paper2D sprites when used as box brushes in Slate.
  • UMG - Making a few calls more efficent for mobile, by caching values for a frame that end up getting called a lot if you have several widget components.
  • UMG - Don't layout components if they're not marked as visible in the world widget screen layer for widget componets.
  • Slate - We now have a scope counter for text layout now, to let people determine when their text is a massive performance drain usually due to scaleboxes, that are in double layout mode instead of single.
  • Windows - Adding code to catch remote desktop cases where no mouse was detected, but it's a remote session, which sometimes doesn't list a mouse, which affects how the engine handles input.
  • Slate - Locking down the exposure of ComputeDesiredSize, this function was never intended to be public on widgets, so trying to prevent that.
  • Slate - Disabled widgets now render correctly on mobile. Previously they were being transformed as if they were in linear space, on mobile the textures and fonts are already in gamma space, so the transform for luminance needs to also be done in gamma space.
  • UMG - Making a pass on invalidation. The ability to store invalidated elements in local space locations and apply transforms in the GPU had rotted, restoring that functionality.
  • PR #3668: UE-45908: Cache debug line locations when performing a LineTraceMulti in the Widget Interaction Component (WIC) (Contributed by projectgheist)
  • UMG - Fixing a bug with the drag handle not working correctly in HDPI mode.
  • Fix drop shadows inheriting the outline color of the font. The outline should still appear but not have a different outline color from fill color
  • UMG - Fixing an offset with the grab handles in HDPI mode.
  • PR #3645: UE-45464: Handle SSlider mouse interaction more accurately (Contributed by projectgheist)
  • PR #3478: Fix possible UComboBoxString crash (Contributed by nakosung)
  • Slate - The Slate RHI Renderer now caches the TextureLODGroups so that it can properly lookup the filtering of different texture groups that are set to Default, instead of a particular filter override on a texture. Engine/Rendering - Simplifying some of the setup logic in TextureLODSettings so that code is shared for setting them up properly after loading from a config file.
  • PR #2642: Changed private to protected in SVirtualJoystick.h (Contributed by Skylonxe)
  • Slate - Fixing some HDPI calculations for fitting new windows on screen, it was using the unscaled size of the widgets for fitting, when it needed to scale them up, this was affecting the placement of popup windows the most.
  • Slate - Moving the STableViewBase over to the FOverscroll class, rather than it's own clone.
  • PR #2281: Scrollbar missing features and SScrollbar fixes (Contributed by SNikon)
  • Editor - Removed the Super Search bar also removed the User Feedback button.
  • Fixed a crash that could occur when a font asset was unloaded
  • Slate Standalone Renderers - Making the shaders more resistant to changes in the draw effect enums by interpreting the flags on the CPU, and setting the states as constants, instead of mirroring the enums in the shader code. Additionally fixing some places where we were not reseting the scissor rastering state in D3D and OGL, that was causing clipping artifacts because the standalone renderers make assumptions about render state when a new frame is drawn.
  • Slate - Properly adding and removing entries from the PointerIndexLastPositionMap so that new touch events don't inherit the movement of a previous touch event.
  • UMG - Adding some fixes to solve widgets not properly displaying/loading if the EventDrivenLoader (EDL) is disabled.
  • Fix crash when attempting to maximize standalone window while a startup movie is playing
  • Fix crash in slate if the drag and drop requestor is destroyed before the drag and drop completes
  • Fixed crash when undoing changes in Widget Blueprints
  • Fix issue where Widget Blueprints could fail to cook properly and mistakenly get marked as editor only

VR

  • Spectator Screen Support Improved The Spectator Screen is the 'normal' output device connected to a VR device usually a TV or a Computer Monitor. While one player uses the HMD other people can observe or interact with the experience.At the time of this writing Oculus Rift, HTC Vive, and PlayStation VR support a Spectator Screen. It is expected that PC and Console like platforms, which always have a Screen attached, are likely to support this while mobile-like platforms are not.
    • Cross platform api to control the spectator screen on Oculus Rift, SteamVR, and PSVR.
    • HeadMountedDisplayFunctionLibrary gets new Blueprint functions.
    • All platforms now support these modes: SingleEyeLetterboxed, Undistorted, SingleEyeCroppedToFit, SingleEye, Texture, EyePlusTexture.
    • OculusRift and SteamVR support disabling spectator screen output.
    • On PSVR SingleEyeCroppedToFit uses the hardware supported mirror output. All other options will cost frametime.
    • OculusRift additionally has an additional mode, Distorted, which displays the image as processed the Oculus API for display in the HMD (so you can see chromatic abberation correction, etc).
    • The default mode is SingleEyeCroppedToFit on all platforms. Any unsupported mode falls back to this.
    • If one fails to specify a texture for a mode that uses a project defined texture black will be displayed instead.
  • Adding early experimental support for Apple's ARKit augmented reality system. This is based on the code by Wingnut, which was shown on-stage at WWDC earlier this year.
  • In order to reduce platform differences, Face-Locked StereoLayers are now by default always rendered on top of other layer types regardless of priority on all platforms. Platforms that support mixing the layer types can revert to the old behavior by setting the vr.StereoLayers.MixLayerPriorities console variable to 1.
  • When using unsupported Stereo Layers features on a given platform, the implementation will issue a warning.
  • The default emulated StereoLayers implementation now supports the NoAlpha flag to enable ignoring the alpha channel in the texture to be rendered.
  • SteamVR now supports World-locked StereoLayers.
  • Inline reference documentation for IStereoLayers enum and struct members has been moved so they appear in the right place in the extracted documentation.
  • Added support for the Vive Tracker. The trackers can be used with the Special 1 through 9 hand designations.
  • Added option to Play-in-Editor settings to not minimize editor when doing VR Preview. This allows for easier debugging of Blueprints in VR mode.
  • Oculus Unified Plugin. OculusHMD plugin now supports both the Rift and the GearVR in one plugin. Minor supporting engine modifications are included, but no end-user updates should be needed outside of making sure the new OculusVR plugin is enabled in your project
  • Added a Blueprint function, SetTouchDPadMapping, that lets users remap the SteamVR controller's d-pad buttons.
  • Added support for Valve's Knuckle's controllers. New input axes for capacitive hand sensors were added, and can be found under "Knuckles" in the input handlers
  • Hooked up HMDWorn VRNotificationComponent delegates for Oculus and SteamVR. Added Blueprint accessor for GetHMDWornState. Note: Steam is slower to decide the hmd has been removed. It has to be motionless for a few seconds.
  • Skipping recording of analytics if there is no device connected on startup, to prevent false reports when Oculus / SteamVR runtimes are installed on the user's machine, but no HMDs are plugged in.
  • Fixed a bug on SteamVR Stereo Layers where it behaved as if LAYER_FLAG_QUAD_PRESERVE_TEX_RATIO flag was always set.
  • Fixed a bug with Stereo Layer splash layers where they were always shown as 8 by 4.5 meters regardless of texture size. Now, the layer height will be calculated based on the texture pixel dimensions.
  • Fixed: PSVR not applying WorldToMeters for position accessor
  • Fixed: Duplicate .so files in GoogleVR.
  • Fixed: Crashes when multiple controller plugins are active and certain motion controller related Blueprint functions are used.
  • Fixed: PSVR camera thread runs too slow if the game is hung or missing frame rate -Changed the code that tries to synchronize the camera thread to the game thread so that it only waits 1ms for the sync, rather than 18ms. This means that the thread will always run at 60fps, but if framerate is hit it will over time move itself into phase with the game.
  • Bug Fix:
    • Fixed a bug in sensor visualization when vr.Debug.VisualizeTrackingSensors in relation to active camera components.
    • Tracking sensor visualization now no longer needs to be toggled off and on again after loading a different level in the editor.
  • Fixed PSVR Spectator Screen one pixel wide edge artifact in separate mode-Changed sampler wrap mode to clamptoborder.
  • Fixed quaternion Ensure triggering in debug when using the Oculus Rift through the SteamVR plugin.
  • Fixed a crash in the Oculus plugin that could occur if users were setting the splash screen during BeginPlay or earlier.
  • Fixed a crash that could occur if the user uninstalled the Oculus runtime (and Blueprints were left calling Oculus specific code).
  • PSVR tracking broken by suspend/resume. Re-acquiring each tracked device on resume.
  • Fixed a bug in how loading splash screens were configured for GearVR causing the texture assets not being included in the cooked game.
  • UE-47113 PSVR tracking broken by suspend/resume.-The reprojection prediction time code could get into a bad state when the game was halted, for example by suspending, would cause a very long prediction time, this would make the tracking data fetch call fail, which would again cause a long prediction time.
  • Fixed OpenVR initialization problem (VulkarRHI needs to enable necessary layer extensions).
    • Inspired by the pull request #3636 by TTimo.
  • UE-46862 PSVR using previous reprojection data -Fixed use of previous frame's data, adding unnecessary latency, replaced with synchronization on gpu frame completion
  • Changed the Oculus GetRawSensorData function so users can query different devices, not just the HMD.
  • Changed the GearVR touchpad button mapping to now trigger MotionController-Thumbstick events instead.

UPGRADE NOTES

Animation

  • If you have empty morphtargets, they will go away with this change.

Blueprints

  • Exposes scene capture showflags to Blueprint editor UI
  • Due to a previous bug, some assets that were referenced by Blueprint pins at runtime where not correctly garbage collecting if only pins were referencing them. If your Blueprints depended on those objects staying loaded across frames you should assign them to a variable.
  • Periods (".") may no longer be used as part of Blueprint variable names, function names, component names, etc..., though existing names containing these are 'grandfathered in' and will not be automatically renamed.
  • If, after upgrading, your Blueprint class has a "Cannot construct objects of type..." Blueprint node error after loading, you'll need to change the class type on the affected "Construct Object From Class" node to one that includes 'BlueprintType' (and not paired with 'DontUseGenericSpawnObject') somewhere in its inheritance hierarchy.

Core

  • Projects should no longer use the private_subobject macro. Instead, all subobject properties should be made private and be accessible through accessor functions.

Editor and Tools

  • A few methods were deprecated and renamed to enforce a consistent UI. Now all asset tools methods that expose a dialog have "WithDialog" in their name to differentiate them from methods that do not open dialogs and could be used by scripts for automation. C++ users may still access IAssetTools but should not ever need to use the UAssetTools interface class
  • Refactored the API for adding rows to details panels to make it more consistentAddChildCustomBuilder->AddCustomBuilderAddChildGroup->AddGroupAddChildContent->AddCustomRowAddChildPropert->AddPropertyAddChildStructure->AddExternalStructurePropertyAddStructure->AddAllExternalStructurePropertiesAddExternalProperty->AddExternalObjectProperty or AddExternalStructureProperty

Gameplay Framework

  • UEngine::GetWorldFromContextObject(Object, optional Boolean) has been deprecated and replaced with a new version which takes a non-optional enum specifying the behavior on failures. The behavior of the existing UEngine::GetWorldFromContextObject(Object, true) case has changed slightly to log an error (with BP callstack) and return nullptr, rather than the previous inconsistent behavior where it might:
    • Fail an assert (if passed null)
    • Fail an ensure (if passed a non-null object with no implementation of GetWorld()
    • Silently return nullptr (if passed an object that implements GetWorld() but has no route to a world for one reason or another)
  • This behavior change matches the expectations of the vast majority of use cases that expected it could fail and handled a null return value. Most game-specific usages should pass in EGetWorldErrorMode::LogAndReturnNull and handle the return value being null gracefully. For the few cases that need to assert that it will always return a valid world, use the new GetWorldFromContextObjectChecked method.

Physics

  • Changed tuning for linear soft constraints to use more reasonable numbers. Existing data should be fine, but runtime values (set by code or Blueprints) will need to be updated. You can go back to the old tuning by modifying p.ConstraintLinearDampingScale and p.ConstraintLinearStiffnessScale back to the same as the angular stiffness values. Also any custom value of p.ConstraintStiffnessScale should be renamed to p.ConstraintAngularStiffnessScale
  • Physics assets created prior to this release may need to be recreated. This should only be the case if enabling Simulate Physics for the Skeletal Mesh component causes the Mesh to explode. This only happened in cases where Skeletons or Skeletal Meshes used as Previews in PhAT had baked in non-identity scale.

Platforms

  • The Twitch implementation was never completed, and the SDK is no longer publicly available from Twitch. We have no plans to support in-engine broadcasting at this time.
  • If your automation systems depend on Android_All, you will need to replace that with Android_Multi and select the texture formats you wish to support.
  • See the Major features doc

Rendering

  • Shaders in plugins.
  • Windows 10 has very good support for multiple GPUs in one machine. QA and programmers can now use -preferAMD or -preferNivida cmdline to select a GPU Vendor without having to physically swap the GPU everytime.
  • Mesh decals sort order is now controlled through the component TranslucencySortPriority.
  • Implements first Engine plugin with its own Shaders/ directory for dynamic lens distortion UV displacement map generation from parametric camera model.
  • Vulkan pipeline cache will need to be resaved.
  • Post process material with "output opacity as alpha" ON can now be used with DrawMaterialToRenderTarget Blueprint call to draw alpha channel without any blending.
  • Exposes camera cuts to scene capture 2d components.
  • Fixed a bug where UCanvas::K2_DrawMaterial did not respect the currently active canvas draw colorUpgrade Notes: This does change the behavior, so K2_DrawMaterial calls with a non-white color set will now be affected by the color if they use a vertex color node. Impact is expected to be minimal because most of the materials people used with it were unlikely to include the vertex color node.
  • Fixes a bug where the game thread's garbage collecting latency for scene captures could lead to huge GPU memory wastage.
  • Fixes a bug where scene capture WorldToView matrix would get scale != 1 when scaling the scene capture actor in the world, causing various artifacts such as decals not showing up.
    • SeparateTranslucency is now renamed to AfterDOF translucency
    • Projects can now configure r.AllowDownsampledStandardTranslucency to control whether standard translucency should be rendered in downsampled resolution like AfterDOF translucency.
    • The default value is 0 will downsample translucency unless there are some blend modulate materials.
  • Exposes project settings to enable experimental alpha channel in post processing.

VR

  • New:
    • The experimental PSVR social screen Blueprint functions will be mapped forward, but the Test and SoftwareMirror modes have been mapped to Undistorted (both eye debug view), because there is no exact equivalent.
    • The vr.MirrorMode CVar controlling this feature was removed in favor of the console command vr.SpectatorScreenMode. vr.MirrorMode is aliased as a console command to the new command. Some older platform specific mirror mode commands and settings that have been deprecated for several versions were removed.
  • With the new unified Oculus plugin, a handful of items have been reorganized and deprecated:
    • The OculusInput, OculusLibrary, OculusRift, & GearVR modules have all been merged into one "OculusHMD" module -- code projects which list these as dependencies in their Build.cs file will have to switch over to use the new module.
    • All GearVRFunctionLibrary and GearVRControllerFunctionLibrary methods (with the exception of SetCPUAndGPULevels) have been deprecated and will notify Blueprint users accordingly.
    • The GearVRController component should be replaced with self-managed MotionController and StaticMesh components (the mesh asset can be found here: /OculusVR/Meshes/GearVRController)
    • The EGearVRControllerHandedness enum has been deprecated and will be removed in a future version.
    • Config settings, under the [GearVR.Settings] heading have been deprecated in favor of those under the unified [Oculus.Settings] label.
    • A number of GearVR specific config settings have been removed (CpuLevel, GpuLevel, MinimumVsyncs, HeadModelScale, bOverrideFOV, HFOV, VFOV)
    • The "VR.Oculus.Debug.Property" console command has been removed, as it is no longer supported.
  • Since the splash screen layers on Oculus are no longer forced to 8 by 4.5 meters, if your project has been relying on that feature to stretch your image, you will need to resize the image manually to a 16:9 aspect ratio.
  • The loading splash screens are now configured within the editor instead of manually having to edit DefaultEngine.ini. After upgrading, you'll have to open up Edit/Project Settings.../Plugins/OculusVR and reenter the information.
  • GearVR control mappings have been altered to align more with the Oculus touch controllers. User might have to manually upgrade their Blueprints to handle the new input events.
    • The touchpad is now mapped to MotionController-Thumbstick events (for click, axis, and virtual left/right/top/down buttons)
    • The back button is mapped to MotionController-FaceButton1 (triggered on a quick press - on a long-press, Oculus will prompt the user to go back to home)
    • The trigger is still mapped to MotionController-Trigger
    • All other buttons are reserved for Oculus use only (not exposed to developers)

PROGRAMMING UPGRADE NOTES

AI

  • Instead of simply instantiating UCrowdManager NavigationSystem will now create an instance of a class indicated by UNavigationSystem::CrowdManagerClass. Given class needs to extend the newly added UCrowdManagerBase class.

Animation

  • Custom code that is creating montages or montage slots may have to be updated to take into account montages have a slot by default.
  • Only affects GPU Morph Targets which need to be enabled in the Project Settings
  • FAnimNode_Base API has changed. Please change Evaluate to Evaluate_AnyThread, Update to Update_AnyThread, Initialize to Initialize_AnyThread, CacheBones to CacheBones_AnyThread and RootInitialize to OnInitializeAnimInstance. Your code will continue to compile but deprecation warnings will be emitted.
  • Old transition getters in UAnimInstance have been deprecated since 4.9, they have now been removed.
  • This requires native asset that derives from DataAsset and IPreviewCollectionInterface. class UMyPreviewMeshCollection : public UDataAsset, public IPreviewCollectionInterface Once you create this, you can extend this in BP if you want to. And can preview those assets in Animation Editor.

Blueprints

  • FEdGraphPinType constructor, UEdGraphNode::CreatePin, and FKismetCompilerContext::SpawnInternalVariable that took 3 booleans deprecated and replaced with a version that takes EPinContainerType.UEdGraphNode::CreatePin parameters reorganized so that PinName is before ContainerType and bIsReference, which default to None and false respectively
  • Uses of UEdGraph::CreateBlankNode must be changed to call CreateIntermediateNode instead.
  • Deprecate and rename SetPinDefaultValue because it actually sets the Autogenerated default. This was being called in bad places and destroying the stored autogenerated defaults

Core

  • Deprecated FPackageName::ConvertRootPathToContentPath and PackageFromPath as they were confusingly named and not used much. Also cleaned up header in general
  • Any scripts or batch files using FixupRedirects should be switched to use ResavePackages with the -FixupRedirects command line option
  • UEngine::OnPostEngineInit was deprecated, you should bind to FCoreDelegates instead. It's also now called for Commandlets like Cook
  • Code directly accessing FAssetData::TagsAndValues may be broken because it was switched to a more efficient Map format. Code using the GetTagValue accessors should still be fine. In other changes to save memory GroupNames has also been removed from FAssetData, and tags with completely empty values are now stripped at load time.
  • To make use of this feature, add a "WhitelistTargets" or "BlacklistTargets" array to you .uplugin file.
  • Use BlueprintInternalUseOnly on base classes/structs that wish to expose properties but not be exposed as a BlueprintType themselves.
  • PPF_Localized has been removed as nothing was using it.
  • The ptr+size overload of Algo::IsSorted() has been deprecated and should be passed a TArrayView instead, so Algo::IsSorted(Ptr, Size[, Predicate]) will become Algo::IsSorted(MakeArrayView(Ptr, Size)[, Predicate]).
  • The default User-Agent in all HTTP requests have been consolidated on all platforms. The format is now: game=, engine=UE4, version=, platform=, osver=

Editor and Tools

  • To use this feature, simple override USceneComponent's GetEditorPreviewInfo() method.
  • Add UPhysicsAsset API function to know if a Skinned Mesh Component is able to calculate a valid bounding box. ENGINE_API bool CanCalculateValidAABB(const class USkinnedMeshComponent* MeshComponent, const FTransform& LocalToWorld) const;
  • FAssetPathDragDropOp has been removed. Use FAssetDragDropOp instead.
  • SResetToDefaultPropertyEditor now takes a property handle in the constructor, instead of an FPropertyEditor.

Gameplay Framework

  • Several Asset Manager functions have been renamed, and the feature is now out of early access and ready for production.
  • To take advantage of this feature, simply add the component to the new HiddenComponents list in APlayerController.
  • These functions now only call the virtual GetPredictionData_Client() and GetPredictionData_Server() functions if the ClientPredictionData or ServerPredictionData members are null.
  • Directly accessing USceneComponent::ComponentToWorld has been deprecated. Use GetComponentTransform() instead.USceneComponent::bWorldToComponentUpdated has been made private instead of protected.

Physics

  • Upgraded SkeletalMeshComponent's TeleportDistanceThreshold and TeleportRotationThreshold UProperties to use the brand new BlueprintGetter and BlueprintSetter attributes.

Rendering

  • USH are shader files meant to be #include by other. Only USF should have shader entry points. Plugins including shaders from Private directory of Engine or other parent plugin are on their own for backward compatibility.
    • SeparateTranslucency is now renamed to AfterDOF translucency

VR

  • New:
    • The previous experimental PSVR SocialScreen implementation has been refactored and extended into this cross platform SpectatorScreen implementation.
    • I also moved HeadMountedDisplayFunctionLibrary into the HeadMountedDisplay module, and moved some types from it into HeadMountedDisplayTypes.h to reduce dependencies.
    • There are large opportunities for optimization by running the Spectator Screen at a lower framerate than the HMD.
  • Updated SetUnrealControllerIdAndHandToDeviceMap function signature in the Steam VR plugin header file. Previously it took a hard coded array of 2 device id's, the array has been updated to use the max tracked device count const variable instead.