新内容
虚幻引擎5.7版本将继续完善UE5工具集。 此版本优化了多个方面,包括渲染、角色与动画、世界构建和程序化内容生成(PCG)等。
此版本包含我们的虚幻引擎开发者社区在GitHub上提交的改进。 感谢虚幻引擎5.7的每一位贡献者:
AlexanderVeselov-arm, AlexBlackfrost, Almax27, andreibazi, az6667, Bit-Rot, Brian-PD, brpendle-ti, bturner, chrysos8201, ckendal3, ColinGulliver, CookiePLMonster, Darcy3000s, dasherman-ea, davidbaack, dmergele, DoubleDeez, DrewWeth, DTG-Will-Marshall, dyanikoglu, erebel55, Eric2-Praxinos, Erlandys, faisa-believer, foobit, gamethread, geordiemhall, glecko, GreenLightning, guansdu, H3mul, IngSubstance, iniside, jamesfAnet, jamespark-unreal, JasonCoombs, jdamdami, jerobarraco, jeysym, Jiboo, JohnJFarrow, Jordonbc, jorge-axiomvfx, jorgenpt, jpritchard1010, KaosSpectrum, KarimLUCCIN, KeithRare, kimkun07-k, kissSimple, klukule, KXOC, laurencei, lclara-BARB, LHG-JonAnderJimenez, ligazetom, LightKL, lsandersljungberg, LucaFranzo98, Maigo, MarcusSvensson92, Mario-Azcona, MartinWickhamFB, Mattiwatti, melku, michael-buschbeck-ms, Minus4-44, moumee, nickdarnell, phochstrasser, PICO-XR, QRare, r457-Ao2, rdunnington, reduf, redxdev, RiotJDebern, rohyunsang, sareali, serhanio, SilverWinter0511, slonopotamus, SoulSharer, sportbikerr1, ssutherland-riot, SukenderDontNod, Sythenz, teddemunnik, tioez326, tokyocplusplus, Tt-Wes, tustanivsky, Vaei, vladbelousoff, vogoltsov, WangKan, Wizzard033, wmiller, x157, yangskyboxlabs, yoonbigbear, zachlute-arenanet, ZeroEightSix, ZeroErrors, zhou-
渲染
MegaLights(测试版)
MegaLights现处于测试阶段,在降噪和整体性能方面均有改进。 目前它还支持以下功能:
定向光源
Niagara粒子光源
半透明度
毛发束
Niagara异类体积
异类体积现已进入测试阶段。 此次更新主要通过以下新功能改进阴影投射:
定向光源级联阴影。
Beer阴影贴图支持极高品质的可扩展性,可提供:
大幅缩短阴影创建时间。
常量时间阴影查询。
阴影遮罩预处理,可消除延光源中增加的VGPR压力。
启用阴影投射不再需要重启编辑器和着色器编译。
Substrate
Substrate材质现已可用于生产,将在UE5.7中默认启用。它是一种模块化、以物理为基础的材质框架,该框架取代了固定的阴影模型,采用了专为表现力控制、可扩展性能和长期灵活度而设计的系统。
它还支持两种渲染路径:
自适应GBuffer,可在现代硬件上实现逐像素拓扑和分层闭合等高级功能。
可混合GBuffer是一种简化的后备方案,可确保广泛的平台兼容性。
Nanite植被与蒙皮(实验性)
Nanite植被是业界领先的渲染路径,其核心由三个完整的系统组成:
Nanite组装,可将植被部件实例统合成一个整合的单元。
Nanite蒙皮,可以决定植被在各种系统(例如风)下的动态行为。
Nanite体素是一种像素大小的体素,能够根据与摄像机的距离来保留细节、动画和材质特性,并且只会占用原开销的一小部分。
将这些功能结合起来,就能打造出更加丰富的场景,呈现栩栩如生的动画植被,并且在当前世代硬件条件下达到60FPS。
新功能:
Nanite组装,用于使用实例部件构建植被资产,以保持较小的资产大小。
构建Nanite组装的蓝图API
我们还有编辑器内工具,方便根据你的选择来创建Nanite组装。
USD导入支持。 公开USD模式,以便你在DCC工具中使用,从而标记场景并作为组装导入。
骨骼网格体驱动的动态风;树木为骨骼网格体,新的Dynamic Wind插件还可以使程序风影响树木的骨骼。
Nanite体素,用于高效渲染远处的植被几何体。
TSR薄几何体检测能够更好地处理植被。
SMAA(实验性)
移动和桌面端渲染器现已支持子像素形态抗锯齿(SMAA)。 你可以使用CVarr.Mobile.AntiAliasing=5在移动渲染器中启用该功能,而桌面端渲染器则使用CVar
r.AntiAliasingMethod=5。
该功能通过提供高质量的边缘平滑来提高视觉保真度,同时将性能影响降至最低,是针对移动端游戏的高效方法。
所有平台均可使用SMAA抗锯齿功能。
使用
r.SMAA.Quality调整质量设置使用
r.SMAA.EdgeMode在颜色或亮度之间调整边缘检测改进边缘平滑度,且无需高昂的GPU成本。
当前为实验性功能。 质量设置可以用来实现性能或视觉保真度之间的平衡。
角色和动画
运动匹配选择器集成(实验性)
在UE 5.7中,我们带来了运动匹配集成到选择器的首次迭代! 这样可以让用户控制哪些资产在运动匹配中是有效的,而在以前的版本中,这只能在数据库层级实现,而不能在单个资产层级做到。
现在你就可以搜索最合适的姿势,还能通过选择器根据游戏逻辑等额外条件过滤每个资产的结果。
选择器中新增的姿势搜索(Pose Search)字段可以管理复杂的情况,并且运动匹配的调试功能也已集成到选择器中。
此功能为实验性功能。
混合形状和雕刻工具
虚幻引擎也获得了行业标准级的雕刻工作流程的灵活性。 我们更新了骨骼编辑器工具,现在你可以无缝创建和编辑变形形状、骨骼和蒙皮权重。
现在可以在骨骼网格体上即时移动骨骼、绘制权重和雕刻混合形状。
新变形目标查看器。
形状可适应网格体拓扑的变化。
为动画师配备富有表现力的工具,助力打造影视级动画表演。
控制绑定物理效果的世界碰撞
将关卡碰撞引入控制绑定物理效果模拟。 使用现有的世界几何体和物理对象来创建更真实的接触、推动和交互。
世界碰撞支持控制绑定物理效果的单向交互。
将关卡网格体和物理对象作为碰撞物。
在模拟和回放过程中,驱动与道具、地面和环境的接触。
控制绑定依赖性查看器
你可以通过专门的依赖性查看器来了解绑定元素的连接情况,并能随时间更新。 将控制、骨骼和模块之间的关系可视化,让调试更简单直观。
查看父子项和元数据关系,一目了然。
调试绑定和模块,更清晰地了解数据流。
熟悉的依赖结构可视化。
FBIK和重定向性能
我们对全身IK和IK重定向器做了性能改进,并添加了控制功能。 这为你提供了在运行时执行重定向的方法。
利用FBIK改进姿势,并且不需要付出高昂的性能代价(速度提高约20%)。
使用IK绑定中的伸展肢体解算器,实现高效的运行时重定向。
使用FK旋转模式的复制本地(Copy Local)可以加快每个条链的旋转传输速度。
在重定向堆栈上启用性能分析。
为每个重定向运算符添加LOD阈值。
改进的脚部接触和比例重定向
我们改进了IK重定器,从而更好地处理地面接触和庞大比例的角色。
这样就能更好地在各种角色之间传输动画,从而更快地完成美术设计。 现在可以执行以下所有操作:
确定胯部高度,防止骨盆坠地并保持垂直运动。
为双脚添加地板约束,以便在靠近地板时保持垂直位置。
使用FK平移模式朝向和缩放来传输骨骼平移数据。
添加拉伸链运算符,匹配或缩放源重定向链。
使用伸展肢体解算器来控制肢体的挤压和伸展。
将源缩放的枢轴点更改为不同的骨骼,从而进行动作捕捉或配合游戏玩法。
添加过滤骨骼运算符,以便在对较大的角色进行重定向时去除高频噪点。
空间感知重定向(实验性)
空间感知重定向为美术师提供了在不同角色之间传输动画的方法,并且无需担心自碰撞的问题。
这样也可以减少重定向后清理动画的繁杂工作。
我们添加了形体交互运算符,利用物理原理将IK目标推出,以防止自碰撞。
我们添加了相对IK运算符,从而根据从信号源到目标的接触长度来移动IK目标。
序列验证器(实验性)
序列验证器为影片创作者提供了可以在序列中检查是否存在内容错误的方法。 这样能够减少在Sequencer中工作时可能发生的潜在问题。
用它你可以做到:
对多个序列及其序列层级进行排序,发现潜在问题。
检查序列中分段是否偏离了摄像机切换或回放范围。
检查各分段是否有未分配的绑定或资产。
检查分段的起始和结束是否在完整帧上。
查看结果并直接导航到每个序列中的问题所在。
缓动曲线(测试版)和UX改进
现在你可以在Sequencer中使用动态设计(Motion Design )中的缓动曲线(Ease Curve)工具。 你可以使用Ease Curve插件来启用它
此外,此次更新还带来了更统一的行为,旨在提高可用性,让你可以更快地进行迭代。
在Sequencer、曲线编辑器和UMG中使用缓动曲线工具来应用和保存不同的缓动曲线预设。
还可以使用缩放锁定功能调整缩放,类似于Sequencer序列树中的细节面板。
改进了序列层级的时间轴显示,从而同时显示当前序列和父序列的时间。
扩展蓝图和Python功能,访问轨道状态(单独、静音、停用、锁定和引脚)。
改进了变换烘焙,使其包括时间扭曲功能。
在导航工具中添加了新的绑定ID(Binding ID)和序列ID(Sequence ID)列。
缓动曲线工具目前还处于测试阶段。
无数据可变(实验性)
使用无数据的可自定义对象,加快迭代速度并简化工作流程。 参数输入会在运行时处理而不是编译时,因此编译速度更快,加密效果更好,包体也更小。
将可自定义对象转换为无数据对象。
通过运行时处理参数,获得更快的编译时间。
像使用其它UE资产一样使用加密和打包。
选择集
动画师需要在整个制作过程中快速访问多个选择。 这可能是一个绑定中的多个控制,也可能是不同资产中的多个控制和/或变换。 目前动画师需要依赖Gui Pickers等自定义工具来实现这一功能,因此我们希望开发一个更原生的版本,类似于其他工具中好用的插件。
动画模式UX和QOL改进
我们对动画模式做出了改进。
约束(Constraints)、空间切换(Space Switching)和吸附工具(Snapper)工具现在合并为一个新的约束(Constraint)窗口。
同样是关于这个约束,我们给创建流程添加了一些新的选项。
当前帧:这是以前的标准功能。 它会在当前帧上创建一个ON帧,并向前补偿所有帧。
从开头(新)(From Start (new)):获取当前帧的偏移量,并将其作为镜头的第一帧,而不是当前帧。
无限(新)(Infinite (new)):不添加关键帧。 相反,它会将当前帧的偏移量应用于整个序列。
现在姿势库(Pose Library)、补间工具、约束、选择集(新)和动画图层可根据图标状态打开或关闭相应窗口。 它们在布局中的位置和大小也会被保存。
你可以将切换这些窗口的操作分配给相应的快捷键。
MetaHuman
MetaHuman Creator
虚幻引擎中的MetaHuman Creator现已支持Linux和macOS平台,将强大的集成数字人类创作工具带到你所偏好的平台。 如果你尚未从MetaHuman Creator网页应用迁移,请遵循我们的迁移指南,了解如何将现有MetaHuman角色导入虚幻引擎以继续创作!
我们增强了身体网格体的拟合流程,新增了对多种姿势的支持,并引入了拟合模板与模型网格体之间的UV空间的顶点对应关系,让你更轻松地获得更精准的结果。 参数化身体控制如今也更直观,让你能更轻松地保持人体比例的范围,同时提升精度与控制力。
此版本支持使用Python或蓝图对MetaHuman角色资产的几乎所有编辑与组装操作进行自动化和批处理。 首次通过API将MetaHuman Creator深度集成至你的管线与创作流程,该API支持雕刻、拟合、服装、绑定和纹理功能,简化完整的角色组装流程。可在MetaHuman Creator中实时预览编辑效果,在虚幻编辑器中实现交互式运行,或通过计算农场进行离线处理。
虚幻引擎中的MetaHuman
虚幻引擎Groom插件现通过基于关节的工作流程,实现了对发束造型与动画的更精细控制。 现在你可以混合模拟与各种美术风格下的运动,充分利用骨骼网格体动画工作流,并通过增强的选择集和绘制工具来获得更大的美术创作自由度。 该工具集与最初在Houdini中创建的MetaHuman Groom完全兼容。
MetaHuman Animator
现在可通过蓝图接口获取来自MetaHuman Live Link源的实时动画,我们的文档中提供了示例图表。
棋盘格镜头生成的校准数据工作流程(使用立体摄像机设备组捕获)已得到改进,提供更优的自动帧选择功能、辅助手动帧选择的可视化工具,以及跨镜头的可重复配置。
结合全新的MetaHuman Animator Calibration Diagnostics(实验性),可对照表演素材验证校准效果,更轻松地判断校准方案是否最优。
MetaHuman捕获
我们通过扩展支持摄像机的范围,增强了Live Link Face iOS与Android应用中的实时动画选项。
通过Live Link Face,你可以使用外接摄像机在支持的Android设备或iPad上生成实时面部动画(注:苹果的iOS目前不支持外接摄像机)。仅可在iPad上通过外接摄像机录制视频。
你也可在iOS和Android设备上,通过Live Link Face选择设备任意内置摄像机来实时生成动画。仅可在iOS上通过内置摄像机录制视频。
MetaHuman for Houdini
最新的MetaHuman for Houdini更新带来了参数化毛发工具,这种指引驱动型的工作流程可以通过预创作数据来打造发型。 该工具集包含毛囊生成器,可处理发际线周围的毛发密度与定位,并根据走向、长度和体积参数生成引导线,同时提供发束插值与高级细节(如簇状感)等造型功能。这也是快速构建并迭代新发型的便捷途径。
此外,为帮助大家学习创建更复杂的发型,我们在Fab平台发布了新版Houdini版MetaHuman Groom高级套件作为额外的学习资源。
MetaHuman for Houdini现已适用Linux。
MetaHuman for Maya
MetaHuman for Maya的最新更新可在Linux上使用,并引入了对Maya 2026的支持。
世界构建
自定义HLOD
在使用自动HLOD生成方法时,输出的结果可能并不总能满足项目的要求,而且会受到网格体组件的约束。
自定义HLOD支持为单个Actor或组提供自定义HLOD表示,从而解决了这一限制。
你可以通过两种方式来使用新的世界分区自定义HLOD Actor类:
直接注入自定义表示:你可以将自定义表示完整地注入HLOD运行时分区,并将其用作父HLOD层的输入。
仅提供自定义源:你可以将自定义表示作为HLOD生成流程的输入,而无需将其添加到世界本身。
HLOD配置UX改进
我们重新设计了世界场景设置(World Settings) > 世界分区(World Partition)的HLOD层配置和HLOD层资产,以提高创建或编辑配置时的可用性。
程序化内容生成(PCG)
PCG框架已可用于生产
程序化内容生成(PCG)框架在5.7版本也可以用于生产了。
虽然该框架仍在持续开发和改进中,但我们依然致力于支持稳定的开发环境,使所有生产都能在运行时和编辑器内使用,建立并依赖快速可迭代的程序化内容生成工具集。
PCG编辑器模式
虚幻引擎现已新增PCG专用编辑器工具模式。 它提供了利用PCG框架的可自定义工具库,如绘制样条线、绘制或创建体积,每项工具都有相关的PCG图表及其参数,可供实时编辑。
你可以按原样使用提供的工具专用PCG图表,或以其为范例根据自身需求创建和扩展资源库。
如果你曾使用UE 5.7预览版,你的PCG编辑器模式设置可能未采用默认配置。 如果PCG编辑器模式窗口无法打开并显示错误信息,请在编辑器偏好设置中打开插件-PCG编辑器模式设置,随后点击右上角的重设为默认。
程序化植被编辑器
程序化植被编辑器是一项新的实验性插件,让你可以直接在虚幻引擎中创建和编辑植被网格体,并且支持Nanite植被。
在此初始版本中,你创建的程序化植被资产将通过植被编辑器(基于PCG的节点图表编辑器)进行编辑。 使用插件内容文件夹中提供的导入器节点和骨骼预设,你可以:
通过重力、雕刻和缩放运算符修改树木形状。
调整树叶和树枝的分布。
分配不同的树叶模型。
导出至骨骼网格体或静态网格体,包括对Nanite植被组装的支持。
通过单个节点图表或多个节点图表创建多种变体,以便为项目构建独特的植被网格体资产库。
资产工作流
现在你可以将PCG图表作为独立图表执行,无需世界上下文也无需通过PCG组件生成图表。
更新后支持:
支持资产创建工作流,例如仅需运行独立PCG图表即可通过几何体运算创建网格体、通过GPU运算生成纹理,甚至创建PCG数据资产(如属性集表格)。
基于PCG框架核心构建的资产创建工具和插件(如新版程序化植被编辑器)可充分利用其完整功能体系,并且未来会持续更新。
要启用此功能,可在图表设置中勾选新增的Is Standalone Graph选项。 启用后,可通过右键菜单使用生成独立图表(Generate Standalone Graph)功能,并可在图表编辑器中使用独立图表的调试对象进行生成、检查及调试操作。
自定义数据类型
在初始版本中,PCG框架内置的数据类型列表采用硬编码方式,导致在扩展框架或与外部插件建立互操作性时难以新增数据类型。
UE 5.7版本现已支持在类型层次结构中添加任意自定义数据类型,从而扩展框架功能,或基于框架核心与功能集构建专属工具。
我们同时升级了类型选择器,从而更清晰地展示类型关系并支持多选操作。
Polygon2D数据类型与运算符
PCG框架的数据类型列表新增了Polygon2D数据类型。
该数据类型通过闭合形状表示区域范围,并且可转换为曲面或样条线数据,适用于采样或特定运算场景。
为支持此数据类型,我们新增了一组运算符:
创建Polygon2D(Create Polygon 2D):获取输入的点数据或样条线数据,并转换为2D多边形。
多边形运算(Polygon Operations):支持多边形间的运算 (如交集/并集/差集)。 此外,可以使用 样条线路径对2D多边形进行切割,实现形状分割与隔离。 例如 在城市生成图表中,通过网格状样条数据切割大范围区域, 生成独立的城市街区。
裁剪路径(Clip Paths):支持将样条线与2D多边形进行交集或差集运算。
偏移多边形(Offset Polygon):对2D多边形进行偏移放大或缩小,同时正确处理重叠区域。
从Polygon2D创建曲面:将2D多边形转换为可采样的曲面,通过曲面采样节点在其区域内生成分布点。
GPU快速几何体互操作
PCG GPU现采用快速几何体组件,在使用框架生成并放置高密度静态网格体(如地面散布物和草地)时,可进一步提升游戏线程性能。 该功能无需使用分区执行体,并支持动态创建本地PCG组件。
要启用此优化,请在项目中激活PCG FastGeo Interop插件,并将CVARpcg.RuntimeGeneration.ISM.ComponentlessPrimitives设为1。
GPU运算符和改进
PCG Framework GPU计算功能集将迎来以下新增功能:
场景捕捉(Scene Capture):一个新节点,用于从组件原点执行场景捕捉,获取场景颜色或深度样本并进行散射。
纹理保存到资产(Save Texture to Asset):一个新节点,用于将PCGTextureData烘焙成UTexture2D资产。
支持重载(Support for Overrides):GPU节点现已支持参数重载,包括自定义HLSL节点的元素总数(Num Elements)。
升级现有的本地运算符,支持GPU计算:
剔除Actor边界之外的点(Cull Points Outside Actor Bounds)
变换点(Transform Points)
UX改进
UX又迎来了一系列的改进,方便你在处理PCG节点图表时使用,这些改进包括:
参数和重载类型着色与验证:现在参数、重载引脚、常量输出引脚及其边缘都会根据其类型显示不同的颜色,从而与蓝图类型颜色的可视化语言相匹配。 当输入可以是任何类型或未定义时,引脚和边缘会使用白色作为显示颜色。
参数最小值、最大值和单位值:现在你可以通过最小/最大值和显示单位来配置图表参数。
数据视口控制:我们添加了更多图形编辑器内的数据视口控制和选项,帮助你在具体上下文中预览数据。
节点和运算符
虚幻引擎5.7引入了多个本地PCG元素和新选项,包括:
样条相交(Spline Intersection):在3D中查找相交的样条曲线,并在相交处添加控制点或返回相交点。
分割样条(Split Splines):根据alpha、距离、关键点或控制点谓词将样条线分割成多个样条线。
获取片段(Get Segment):从点、样条线或多边形2D返回线段索引点或样条线。
生成样条线网格体组件重载(Spawn Spline Mesh Component Overrides):现在生成样条线网格体时 已正确遵循组件类,并支持在生成样条线网格体节点中 重载组件属性。
新PCG蓝图元素类(New PCG Blueprint Element Classes):新增多项PCG元素类, 包含基于范围的可重载函数,以支持5.6版本原生节点中 引入的数组结构格式变更。 采用新元素 可避免额外数据转换,从而在处理蓝图PCG元素时 提升运行效率。
获取执行上下文(Get Execution Context):已更新为支持Is Listen Server、Has Authority和Is Builder上下文。
提取属性(Extract Attribute)检索给定索引处的特定属性,并将其输出为新的属性集。
导出选定属性(Export Selected Attributes):将数据导出为二进制或JSON格式,用于ML应用程序等外部用例。
属性重映射(Attribute Remap):现在可由曲线驱动。
按位运算符(Bitwise Operators):添加了左移和右移。
布尔运算符(Boolean Operators):已添加NAND、NOR、XNOR、IMPLY、NIMPLY以及从按位运算自动转换为布尔运算。
数学运算符:新增Add Modulo运算,可用于偏移和使用指数重新排序。
网格体边界和网格体点:添加了对骨骼网格体的支持。
Python互操作插件
我们添加了新的PCG插件,提供了一个新的Execute Python Script(执行Python脚本)节点,让你可以在执行图形的同时运行Python脚本。 你可以直接将Python脚本作为输入,也可以通过磁盘上的文件来运行,还可以通过重载软对象路径的属性或参数来动态设置文件路径。
开发者迭代
增量烘焙(实验性)
增量烘焙在UE 5.7中已经进入测试阶段。
增量烘焙通过缩短整体烘焙时间,让你能更快地在目标设备上迭代。 烘焙流程会根据Zen服务器中存储的输出自动分析资产变化,并只对项目资产进行新的更新。 这适用于所有的原生引擎资产,包括蓝图和世界分区图块。
CPP工具 - MSVC 14.44支持
在虚幻引擎5.7中,我们将默认的Microsoft Visual C++编译器更新为MSVC 14.44。
构建健康跟踪和可视化(实验性)
作为Horde分析工具的一部分,我们推出了新的构建健康面板(Build Health dashboard)实验功能,为团队提供了新的方法,用来监控和检查项目变更列表中的BuildGraph步骤是否按预期完成和/或报告错误。
功能目前还正在开发之中,我们旨在于Horde中提供相应的内置功能,帮助团队更好地了解最常见的构建失败原因、监控代理池的压力,以及其他有用的构建性能指标,帮助你加快迭代。
音频
Audio Insights(测试版)
Audio insights是我们用于分析和调试音频的主要工具。 它适合在虚幻引擎中使用音频的所有用户。 在此版本中,除了稳定应用程序接口和架构外,我们还推出了Audio insights的测试版。 它包括以下额外的核心功能:
监测
在不向磁盘写入数据的情况下启动会话实时检测。
声音设计师可以长时间观察项目的运行情况,无论是在单机版还是在编辑器会话中,都无需担心磁盘空间。
编辑器支持
除PIE外,将Audio Insights用于编辑器内用例。
Audio Insights现在可以对编辑器中的任何音频交互做出反应。
快照和尾部录制
可按需将最后一次实时会话数据写入磁盘,最大容量为32MB。
Audio Insights可以检测实时会话是否已经启动,从而连接到会话
实时响度计(UX设计)
在单机版中提供音频计量功能,特别适用于响度合规性检测。
可滚动事件历史
可视化按时间顺序排列的音频事件文本列表,如带有时间戳的声音开始和停止。
选择特定事件可以将绘图和其他可视化效果移动到数据中相同的时间戳上。
MetaSound节点配置
MetaSound节点配置为MetaSound带来了新的表达形式,使节点可以改变其输入和输出。 节点配置利用MetaSound编辑器的细节面板,为节点接口的修改和辅助数据(这些数据可在节点渲染音频时使用)的序列化提供了途径。
除了为声音设计师和开发人员提供创建更细致入微的交互式节点外,我们对节点配置UX也做出了改进。 例如,清理节点控制板、减少很多MetaSound中常见的设计任务的步骤并降低重新布线的复杂性。
音频字幕插件
音频字幕对许多无障碍功能而言都是必须的,比如对话系统、隐藏式字幕和语音聊天等。 在虚幻引擎5.7中,我们通过以下新增功能进一步改进了字幕插件:
除了原本的SoundWave和5.6中的独立定时支持功能外,字幕现在还可以由其他SoundBase类型驱动。现在字幕可以根据SoundCues或MetaSound的顶层来确定时间。
默认设置下,附加到
USoundWave资产用户数据的字幕会根据音频开始和停止的时间自动播放和停止。不过也有使用字幕持续时间属性的情况。 我们添加了一个枚举,让用户可以选择使用哪种持续时间。用户数据资产现在支持多个字幕。现在你可以将所有字幕集中在一个资产中,而无需为与特定SFX相关的多个字幕使用多个资产。
现在可以使用
UEngine::bSubtitlesEnabled全局启用或禁用字幕。
音频波形编辑器
音效设计师在处理音频资产时常常需要在虚幻引擎和外部工具中来回切换。 为优化音效设计师在虚幻引擎5.7中的工作流程,我们添加了将已导入声音文件导入音频波形编辑器时显示标记和循环区域的功能。
这还包括其他编辑流程优化,以充分扩展波形编辑器的功能,从而让音效设计师可以在UE中完成常见的音频编辑任务。
格式 / 不限声道类型(CAT)
音效设计师经常需要在不同格式/声道数量的MetaSound节点之间发送和接收音频数据。 在虚幻引擎5.7中,音频程序员可以使用不限声道类型(Channel Agnostic Type,简称CAT)对包含输入和输出引用的自定义节点编码:
新的音频速率数据类型让音频缓冲区可以通过一个引脚类型支持多个声道。
现在节点可以支持不同音频声道格式的多种配置。
降低Metasound图表中的杂乱度和复杂性。
技术音频工具采样
技术音频(Tech Audio)在编辑器工具方面的体验和应用能为游戏音频社区带来极大的裨益。 这一举措旨在帮助新手开发者熟悉虚幻引擎的音频系统,降低大规模工作的难度,并提供一个起点,让开发者可以编译自己项目专用的工具。
一套蓝图脚本编写实用程序、工具和图表,用于帮助用户运用虚幻音频技术。
技术音频(Tech Audio)希望打造一套编辑器工具和工作流程的范例集,以助力内部使用和对外展示。
平台
Android平台支持
我们改进了开发人员在Android设备上构建、打包和部署虚幻引擎项目的工作流程。
现支持部署至Android 15系统并兼容16kb分页
在macOS系统上无需手动调整SDK配置。
bDontBundleLibrariesInAPK设置现已默认启用,确保库保持在外部,以改善软件包的大小和部署的灵活性。
移动渲染器
虚幻引擎5.7为移动渲染器带来了改进和新功能。
现在你可以使用多通道延迟渲染模式,该模式可启用接触式阴影和嵌入式阴影。
此外SSAO、SSR和DFAO现在已成为可扩展性选项,可以在运行时切换,而不再需要设置为项目选项和重新打包。
立体图层
现在当X轴指向摄像机时,可以看到立体图层组件。 要启用传统模式(X指向远离摄像机的位置时可见),请使用控制台变量 XR``.StereoLayers.UseLegacyFacing true。
模拟立体图层现在支持深度,并在渲染方式上与OpenXR兼容。 你可以使用控制台变量关闭新的渲染方式:XR``.StereoLayers.RenderEmulatedLayerDepth false。
OpenXR应用SpaceWarp
应用SpaceWarp是Meta开发人员驱动的优化技术,可为相应的内容释放额外的算力。 在UE 5.7中,我们不仅为Meta的XR_FB_space_warp扩展提供了支持,还为支持OpenXR运行时的
XR_EXT_frame_synthesis
。 此技术会强制应用程序以一半的帧率进行渲染,并每隔一帧合成一个更新的头部方向,从而大大降低了GPU的负载。
帧合成和SpaceWarp由xr.OpenXRFrameSynthesis控制。 你可以在运行时启用它,但需要r.Velocity.DirectlyRenderOpenXRMotionVectors=1。
OpenXR用户状态
对于支持OpenXR扩展XR_EXT_user_presence的OpenXR运行时功能,现在可以在佩戴或脱下头戴式显示器时返回事件。 虽然过去我们可以通过VRNotificationsComponent实现,但新的方法会更加准确,而且在不同运行时的表现相同。
动态设计
动态设计可用于生产
随着用户开始在核心工作流程中使用动态设计(Motion Design),团队将继续调研用户反馈,并重点关注工具集进一步优化性能的机会。
要使动态设计达到可用于生产的状态,需要做到以下几点:
强化打包支持。
重构Text3D以支持富文本和遮罩功能。
提高过渡逻辑稳定性,让使用和配置更加方便。
通过添加界面管理工具和重构一般UX来加快配置时间,从而增强远程控制功能。
根据客户端反馈升级场景状态。
在场景状态和过渡逻辑之间建立通信。
确保材质设计器的可靠性。
Text3D — 富文本
通过预配置或动态自定义文本,为文本布局增添活力。 使用我们新的专用资产创建Text3D样式集,你可以在这里创建一致的配置,也可以在整个项目中的任何Text3D Actor上使用。
之前这种布局需要多个Text3D Actor和一个自动跟随修改器。 在虚幻5.7版本中,这些内容都可以在线编辑,从而减少了Actor数量,甚至还提供了远程控制单个文本分段的方法。
支持指定的字体、颜色和大小。
灵活的样式工具可以适应各种美术风格。
适用于具有动态UI的设计。
将文本行的每个部分公开给远程控制,方便进一步自定义。
比如你想把“全新丰富文本”这段内容拆分到三个独立的控制器中,同时保留每个字的风格时,这个功能就非常有用。
过渡逻辑流程优化
过渡逻辑(Transition Logic)对广播工作流程至关重要,根据用户的反馈,我们重新评估了创建关卡和设置过渡逻辑所需的步骤。 现在你可以创建一个新关卡,并确保创建过渡逻辑默认场景(Create Transition Logic Default Scene)选项已启用(如左上角所示),从而完成上图中的所有步骤。
以下是启用创建过渡逻辑默认场景后,过渡逻辑自动执行的设置步骤:
创建预标记的输入和输出序列。
创建预标记的层级更改序列。
你可以在Sequencer选项面板中添加新条目,从而添加额外的(和预先指定的)层级更改序列。
在这些序列上预设序列设置以立即兼容。
创建一个默认层级,这样就可以立即开始工作并测试设计。
在动态设计大纲中将过渡逻辑子层级修改器添加到空Actor中,并将其预先分配给生成的输入和输出序列。
这样你实际就只需使用生成的输入、输出和更改序列将内容制作成动画即可。
远程控制UX
我们增加或改进了多项功能,为你节省了绑定设计的时间。
新控制器
类别
添加类别,从而将控制器分门别类。
单选或多选控制器,然后将它们拖入类别中。
字符串列表
添加了命名的下拉列表,这样就可以将其链接到相应的条件行为,增强最终用户体验。
之前解决这个问题需要输入整数,其中"1 = 蓝色,2= 红色,3= 黄色,";现在可以将下拉条目直接命名为红色、蓝色和黄色。
事件
创建可播放动态设计序列、触发修改时(On Modify)属性或触发广播事件的按钮。
路径行为
之前每个路径行为条目只能针对一个Actor。 现在在动作(Action)面板下会出现一个列表,你可以在其中添加任意数量的Actor,从而减少对多个路径行为的需求,并更容易排除配置错误。
以前无法对路径列表重新排序,现在可以使用左侧的拖动柄来根据需要重新排序。
现在路径预览会以绿色复选标记告知你路由的路径是否有效。
UI增强
我们在左侧属性面板中添加了一个链接图标,从而显示暴露的属性是否分配给了控制器。
场景状态
UE 5.7中的场景状态新增了多项功能,并对UX进行了改进,大大提高了用户的掌控能力。
状态机组织
通过拖放对状态机进行重新排序。
添加类别。
已添加Setter任务作为属性引用的一部分。
数据类型包括布尔、浮点、整数、字符串、文本。
每种数据类型都有独特的功能。
属性函数
串联字符串
文本到字符串
名称到字符串
整数到字符串
浮点到字符串
生成Actor到计时器。
数据链接
数据链接获得了两项备受期待的更新:
推送功能,提供持续检测馈送值变化来触发更新的方法。
与场景状态互动,为滚动字幕和其他激活元素提供工作方法。
制片渲染管线
材质参数集合修改器
材质参数集(Material parameter collection)是非常强大的资产,可同时驱动多种材质的多种属性。 场景中的创意外观和效果通常由材质参数集动态驱动。
材质参数集修改器(Material Parameter Collection Modifier)提供在影片渲染图表(Movie Render Graph)中按渲染层设置和重载参数值的方法。 使用相同的关卡和关卡序列,你可以在每个渲染图层上以不同的参数值渲染镜头。 你还可以将参数设置为图表变量,并在快速渲染和影片渲染队列窗口中将其作为重载项公开。
按输出类型烧入
能够在同一任务中渲染多种输出类型,意味着影片渲染图表可以同时提供最终和审阅媒体。 通常情况下,烧入只适用于某些输出类型,而不是所有类型。 为此,现在影片渲染图表不再使用分支中的单独节点,而是按输出类型烧入。 这样就能更简单地进行干净的EXR渲染,但在MP4会包含烧入。
文件命名控制
在所有行业中,牢靠的渲染输出命名规范是高效管线的基础之一。 因此,影片渲染图表提供了更强大的文件命名控制功能,可更好地支持工作室特定的本地命名要求,而无需额外的管线脚本。 关键优化包括:
所有名称字段都支持在过场动画组装工具中定义的自定义命名标记(Custom Naming Token)。
你可以自定义{renderer_name}(例如,“延迟(Deferred)”)和{renderer_sub_name}(例如,"精美(beauty)"),冲突是按分支而不是整个图表来解决的,从而提供了更大的灵活性。
在未合成的情况下,烧入功能不再强制{renderer_name}精美渲染。
如果需要,后期处理材质通道可以使用与精美渲染不同的命名规范。
逐渲染图层EXR元数据
EXR元数据现在会遵循一种规则,可在每个渲染层基础上可靠地分离键/值对,并避免命名冲突。 基于此规范,虚幻引擎渲染中的元数据可以直接在Nuke等后期合成应用程序中进行查询,而无需额外的管线工具。
内容管线
使用交换功能自定义USD资产的导入(试验性)
USD是一种用途广泛的场景描述文件格式,在3D行业的采用率日益增长。
在虚幻引擎5.5中,我们将USD添加到了交换框架支持的文件格式列表中。 内容创建者现在可以对导入过程进行更多控制,可以为USD文件的资产导入添加自定义的处理步骤,类似于FBX等其他格式已有的交换功能。
交换功能对USD的支持仍处于实验阶段,且仅限于资产的导入。 UE 5.7版添加了对下列内容的支持:
Groom
穹顶光源(非DomeLight_1模式)
音频(UsdMediaSpatialAudio)
点实例
使用交换功能导入FBX关卡
为了在将不同格式的文件导入到引擎中时拥有一致的UI/UX,通过交换框架提供FBX关卡导入流程。 现在这也是将FBX导入关卡的默认路径。 你仍可使用CVar回退到旧版行为。
主要的变化在于,现在使用的导入对话框与通过Content文件夹进行导入所用的对话框一致。 旧版功能(如从导入中移除资产或Actor),或使用不同的选项集进行导入等,都可以通过自定义的交换管线来执行。
编辑器和UI系统
AI助手(实验性)
AI助手让你能够不离开虚幻引擎的情况下更快地获得想要的答案。 通过滑出编辑器中的专用面板,你可以提出问题、生成代码或按照逐步指导进行操作,而无需切换到浏览器。
这样可以节省时间,保持工作流畅。 你无需花费精力上网搜索,可以直接在编辑器中获得即时的帮助、示例和故障排除的技巧。
你能做什么:
为任务提供逐步指导。
直接在情景中获取指引和提示。
在AI的帮助下解决开发问题。
生成代码示例,加快工作流程。
通过聊天历史记录参考过去的交流。
将答案复制并粘贴到项目中。
AI助手由UEFN和开发者社区中已有的、专门训练的AI来提供支持,可专门用于理解虚幻引擎并帮助你更快地完成任务。
主页
主页提供了一个很好的起点,可帮助你熟悉虚幻引擎。 它重点介绍了教程、文档和论坛等重要资源。
你将获得更轻松、更有方向性的入门体验。 你将不再面对一个空洞的编辑器,而是可以清晰地导航到学习资源、新闻动态和支持,所有这些都集中在一个地方,帮助你有信心、有方向感地开始项目。
你能做什么:
获取最新消息和更新。
直接导航至入门资源。
打开教程和文档。
访问论坛和查看版本说明。
在Chrome浏览器中从外部启动链接。
如果不想每次都看到主页,请将其关闭。
主页可作为一站式入门中心,让你首次启动虚幻引擎就能更快上手。
正交剪切互动
正交视口现在可以提供更可靠、更灵活的控制。 在早期版本中,裁剪平面通常无法使用,因此很难调整场景中可见的内容。
现在你可以精确控制在正交视图中看到的内容,从而能够专注于几何体。
你能做什么:
更精确地调整近端和远端裁剪平面。
直接在视口中使用新的可视化控件。
自定义正交视图中的可见性,配合工作流程。
UE 5.7中又做出了改进,使正交试图的工作流程更加实用和稳定。
改进后的保存和删除对话框
我们改进了虚幻引擎中的保存和删除对话框,使资产管理更加顺畅。 现在常用操作都能按预期运行,减少了不必要的点击和对工作流程的干扰。
你不再需要花费大量的时间处理重复的提示,从而有更多的时间专注于项目。
你能做什么:
可以在资产删除弹出窗口中使用回车键(以前不可用)。
可以删除多个资产,无需用鼠标反复点击接受。
依靠更一致、更直观的对话框交互。
UE 5.7中的这些改进解决了长期存在的痛点,简化了日常工作流程。
改进窗口拖动交互
现在编辑器内拖动窗口会更加直观,干扰也更少。 在以前的版本中,单击并拖动任何标题栏都会将整个关卡编辑器从全屏中解锁,这经常会发生意外。
你可以避免那些令人沮丧的错误点击,并保持工作空间稳定,从而专注于构建。
你能做什么:
拖动窗口和面板,无需取消停靠全部关卡编辑器。
防止全屏工作流程意外中断。
享受更稳定、更方便的用户窗口交互。
UE 5.7又做了进一步改进,解决了一个常见的问题,使窗口管理更加可靠。
改进蓝图编辑器的复制交互
现在蓝图编辑器中复制项目会更流畅,干扰更少。 在以前的版本中,复制会清除你的选择,导致你要在树状图中手动重新选择项目。
你可以在编辑时保持节奏,避免复制元素时的意外点击和返工。
你能做什么:
可以在蓝图编辑器中复制项目而不会丢失选择。
在树状图中工作时,保持激活选择。
减少复制多个项目时的重复步骤。
UE 5.7中更进一步,使蓝图编辑更为高效轻松。
几何体检查视口模式
虚幻引擎中新的模型检查视口模式提供了简化的非写实可视化选项。 这些模式会优先考虑几何体的表达,而不是逼真度,在检查机制或复杂3D模型时可消除光照和阴影:
粘土
斑马线
正/反面
随机颜色
用户资产标签
用户资产标签系统提供了为资产添加任意标签的方法。 它支持本地收藏夹和整个项目的标签,你还可以对其进行扩展,以推荐更多标签。 这些标签是其他系统的基础,如Niagara中使用的标签资产浏览器。 你可以选择要添加标签的资产,然后使用Ctrl+T或在上下文菜单中选择管理标签。
标记资产浏览器(Niagara)
Niagara资产浏览器的更新版本。 现在它更加通用,为计划采用相同浏览器的资产工厂打好了基础。 你可以通过创建新的标记资产浏览器配置资产、定义相应的分段以及列出的标记,从而实现扩展。 这样你的项目就可以拥有自己的分段和标记,也可以在Niagara编辑器下的项目设置中完全更换主要的配置资产。
要了解如何升级现有Niagara系统和发射器以使用新的标记资产浏览器配置资产,请参考升级Niagara标签。
框架
状态树:倒回调试器
我们为状态树引入了一个新的倒回调试器轨道,它为倒回调试器带来了增强的、面向所有者和实例的调试方法。 这样的整合让行为逻辑的时间和方式能够更加契合上下文,同时与游戏和动画时间轴保持一致。
新轨道包括一个专门的细节面板,采用紧凑的树状图设计,使复杂逻辑设置(包括嵌套子树和链接资产)的可视化和导航更加容易。 这样能方便你更好地处理较大的或模块化的状态树。
虽然这种整合标志着向更统一的调试工作流程的转变,但原本的状态树调试器仍可使用。 如果你在某些情况下更喜欢传统界面,也可以继续使用。
状态树运行时
本次更新带来了一系列运行时的增强功能,提高了基于状态树逻辑的校正和性能。
实时属性绑定:现在节点可以在执行过程中使用输出属性(Output Properties)向绑定的输出动态推送更新值,从而解决了tick工作流中过时或静态数据的问题。
执行运行时数据:现在节点可以声明可选的长期数据,这些数据在状态树实例的整个生命周期内都会持续存在,这对于在跨转换或跨时间点时保持执行状态非常有用,并且无需依赖静态全局数据。
静态绑定的内存优化:现在委托调度器、监听器和属性引用会存储在实例数据之外,从而减少了每个节点的内存开销。
我们实现了以下功能,但默认情况下并未启用,旨在避免干扰现有数据和默认行为。 不过如果需要,你也可以选择使用它们。
重新进入状态行为(Re-Enter State Behavior):添加了对重新进入相同状态和重启任务的支持,提供了更轻松地实现重启逻辑的方法。
实例数据重构(Instance Data Refactor):现在条件和转换会使用范围实例数据,可防止会话间的数据泄漏,并使临时和持久使用模式成为可能。
批量调试器
我们引入了强大的新实体搜索系统,并直接集成到批量调试器中。我们为开发人员提供了一个新的UI,用于创建和执行MassEntity查询。 该界面与Mass的C++查询API完全一致,并允许使用与硬编码查询相同的标准和要求对实体进行精确过滤。
现在你可以创建、保存、加载和共享自定义查询,并立即在实体选项卡中查看结果。 这样可以提高开发人员在运行时检查和验证海量状态的速度和效率。
此外,我们还大幅升级了断点系统,为调试海量处理器和片段写入提供了更多控制性和可见性。
自动生产寻路链接多种跳转配置
我们扩展了自动导航链接生成功能,使每次寻路网格体生成都能支持多种跳跃配置。 以前,你只能使用单一的跳跃配置,这往往需要过大的容差来处理不同的链接类型(例如 跳上、跳下和跨越)。 这也意味着所有生成的链接都共享相同的区域类和链接代理类,所以会限制灵活性。
有了这次更新,现在你可以定义多个不同的配置,每个配置都会在自己的验证通道中处理。 这样就能进行更有针对性和更有意义的控制。 例如,你可以分别生成跳下和跳上,每种跳下和跳上都有不同的距离阈值、区域类型或代理行为。 这样能打造更细微的动作设置,同时减少了过度生成或意外重叠。
为确保向后兼容性,我们会将任何现有的单跳转配置迁移为新的多配置设置中的第一个条目setup.pState Tree Usability
我们会优化状态树编辑器的使用体验,并进行了多项编辑流程升级,以提高清晰度和可用性。
现在你可以在状态之间复制和粘贴任务、条件和转换,甚至可以在不同的状态树资产之间进行复制和粘贴。 这样能更轻松地实现重用逻辑以及在大型行为中保持一致。
我们还增加了复制和粘贴单个属性绑定的功能。 智能处理绑定和非绑定属性:
如果兼容,绑定属性会替换其绑定属性。
如果粘贴了值,那未绑定属性会继承值;如果粘贴了兼容绑定,那未绑定属性会继承绑定。
无法将值粘贴到绑定属性上。
如果粘贴的类型不兼容,或者源数据无法访问,则会触发验证错误。
你可以根据模式隐藏节点和实例数据中的属性,从而减少视觉干扰,提高专注度。
海量运行时
此次更新包括对Mass框架的一系列底层优化和架构改进,旨在提高实时场景下的整体性能、内存效率和系统稳定性。
最显著的新增功能是处理器时间分段,这意味着长时间运行的处理器可以被分割到多个帧中。 这有助于降低性能峰值,更好地分配繁重的工作负载,尤其适用于大规模或模拟任务繁重的环境。
Iris(测试版)
随着Iris从实验阶段转入测试阶段,我们将重点放在巩固关键应用程序接口以及改进整个网络堆栈的可用性、可维护性和性能上。 该版本包括若干内部设计更改和功能改进,适用于直接使用Iris复制系统的开发人员。
代理工厂重载:代理现在可以使用
StartReplicationParams指定自定义NetActorFactory实现,从而在运行时为复制行为提供更好的灵活性。 这使得高级复制设置无需依赖全局重载。更清晰的API边界:我们删除了Iris的
UReplicationBridge基类,以减少虚拟调用开销并简化代码导航。 大多数Iris系统已经直接依赖UObjectReplicationBridge,因此这次更新简化了继承模型,避免了不必要的间接问题。改进了复制生命周期命名:我们明确了
BeginReplicationAPI:现在的非虚拟函数是
StartActorReplication,可以清楚地表明其目的是作为启动复制的进入点。我们将虚拟回调重命名为
OnBeginReplication,将生命周期行为与系统调用分离开来。
在Iris和传统网络中实现更好的一致性:现在无论是否启用Iris,
OnBeginReplication和EndReplication的调用都是一致的,从而确保了行为的一致性,并使网络系统之间的过渡更加无缝。无缝切换支持:现在Iris支持虚幻引擎的无缝切换功能,确保在世界转换过程中能正确处理复制的Actor和状态。 如果你发布的游戏功能要依赖持续玩家数据或大型流送世界之间的转换,那这个要求就至关重要。
媒体
媒体查看器(测试版)
动画师常常需要根据现有的参考画面来调整动画。 在5.6中,我们添加了将媒体(图像、媒体纹理、视频文件、实时视口)停靠在动画工作位置旁边的功能。 采用水平或垂直配置的两种AB库能帮助用户对比两组资产。 缩放和平移功能按钮可用于进一步对齐放置的内容。 在UE 5.7中,Media Viewer插件现已进入测试阶段,其中包括以下工作流程和可用性改进:
增强的控制功能,如使用ALT+鼠标右键进行旋转和缩放控制。
可通过快捷键添加书签并快速调用资产配置。
现在在双播放器模式下,锁定按钮还能反映播放控制和时间轴。
模拟和视觉特效处理
Chaos破坏系统
Chaos破坏系统是一套工具集,可用于实现电影级画质的实时破坏效果。 除了出色的视觉效果之外,该系统还优化了性能,采用直观的非线性工作流程,让美术师和设计师能够更好地控制内容创建过程和破坏过程。
UE 5.7更新包括:
重置状态:现在你可以使用C++、蓝图或模拟时在编辑器中实时重置几何体集合组件的状态。
导出到骨骼网格体:现在可以将几何体集合资产导出为骨骼网格体资产。
叶片子追踪:现在根据几何体集合进行追踪后,你可以线条追踪中获得精确的叶锥。 当未断开时,针对组件的原始线条轨迹会返回根骨骼。 有了这个新功能,你就可以准确地获得追踪器命中的骨骼。 这样就可以在正确的骨骼上设置贴花,甚至在运行时锚定单个部件。
Chaos数据流编辑器
数据流图表让用户能够在基于节点的环境中以程序化方式生成资产。 图表的实现方案采用了基于拉取的求值方法,即图表中的节点根据其输入求值生成缓存输出状态。 数据流资产则被用于协助模拟系统的程序化编写和设置。
Chaos布料、破坏系统、肉体和毛发都使用了统一的基于数据流节点的工具集。
UE 5.7更新包括:
新时间轴和模拟控制。
新工具栏。
经过重新设计的绘制权重贴图工具(以匹配骨骼网格体编辑器)。
新的蒙皮权重编辑工具(以匹配骨骼网格体编辑器)。
新的编辑骨架骨骼工具。
大量功能优化。
Chaos可视调试器
Chaos可视调试器(CVD)是一款多功能工具,可用于记录和播放游戏进程中的物理模拟状态。 它支持对所有运行中的刚体和RBAN解算器进行记录,包括粒子状态和碰撞数据。 CVD可作为虚幻引擎中的编辑器工具使用,同时提供了丰富的自定义选项,例如通过UI或控制台命令选择要记录的具体数据通道。
该工具还具有实时调试功能,让你可以在模拟过程中实时检查物理数据。 此外,CVD还提供各种可视化选项,如粒子状态、碰撞数据和场景查询等,以帮助你高效地进行物理模拟分析和故障排除。
UE 5.7更新包括:
对象名称改进:在此版本中,我们引入了名为粒子元数据(particle metadata)的新功能。
这个新的元数据取代了以前冗长的"调试名称(Debug Name)"字符串。
现在CVD会显示拥有物理对象名称的Actor名称,并将其细分为不同的字段(关卡、组件和骨骼索引)。
此外,我们还引入了在内容浏览器中查找(Find in Content Browser)按钮,通过新元数据,你只需点击一下就能找到特定对象源自的蓝图。
性能改进:在此版本中,我们继续致力于提高CVD的性能。
现在包含大量数据(特别是超过2 GB的碰撞几何体数据)的CVD文件加载速度可提高至多30%。
将加载复杂场景(+93.000个对象)第一帧时可能出现的超过10秒卡顿时间缩短至大约3秒。
版本还包括了错误修复和QoL改进。
Chaos布料
随着布料模拟和复杂布料在虚幻引擎中的需求增加,我们的旧版骨骼网格体布料编辑器和工作流程已经难以适配未来为满足这些需求而必须进行的升级了。 时装和大多数角色创作工作几乎都转向了使用专门的数字内容创建软件(DCC)。这些DCC能提供专业的、基于面板的布料构造。 为了跟上这些外部DCC的发展步伐,我们将继续开发自己的布料编辑器,以便在完善布料设置工作流程的同时改进编辑面板配置。
虚幻引擎5.7的Chaos布料系统自带处于持续开发状态的测试版布料编辑器。
UE 5.7更新包括:
骨骼网格体布料数据集成:
现在你可以将布料资产和服装资产添加为骨骼网格体布料数据。
骨骼网格体渲染部分可通过这些资产数据流图内的布料模拟设置进行变形,从而无需额外的布料组件。
新的参考空间选项:
使用新的ReferenceBone数据流节点来明确设置ReferenceBone,而不是使用自动计算的ReferenceBone。
使用新的本地阻尼空间选项在ReferenceBone解算,而不是使用质心。
优化:我们对布料游戏线程和交互件tick进行了优化。
配饰网格体(实验性):
我们添加了额外的配饰网格体,并更新了逆止约束,以便能够使用这些配饰网格体。
目前,可以通过将现有的模拟网格体集合转换为配饰网格体来创建配饰网格体。 如果源集合和目标集合上都存在导入顶点ID,则可以使用这些ID来匹配作为SKM导入部分而重新排序的顶点索引。
Chaos核心
我们正在对Chaos物理系统进行持续的更新和优化,力求为美术师、开发者和程序员提供更好的模拟效果。 刚体动力学是大多数游戏物理都依赖的核心技术。 随着我们朝着更具规模、物理效果更丰富且更加基于物理原理的虚拟世界迈进,我们需要确保这一核心系统能适应并处理这些用例。 与刚体动力学一样,查询功能也是虚幻引擎中大量系统所依赖的核心技术,并且类似于刚体动力学,我们也需要确保查询的性能能够适应极其庞大的动态世界。
UE 5.7更新包括:
改进模拟性能:
更多并行模拟阶段。
我们增添了实验性的局部沉睡功能,以提高大型非结构堆积的性能。
提高查询性能:
改进球面和胶囊体的窄阶段。
改进一般查询层级的变换和缩放处理。
Chaos可视调试器(CVD):
提高了有大量Actor和复杂几何体场景的加载速度。
更改QoL并改进运行时调试器的一致性。
数据流物理资产:
初步支持使用数据流图表创建物理资产。
对整个模拟功能集进行了大量QoL更改和修复。
Chaos缓存
在虚幻引擎中,Chaos缓存是Chaos破坏系统框架中的一个系统,用于记录和重复使用复杂的破坏模拟,从而显著提高性能,并为短片等功能实现一致稳定的结果。 你可以使用Chaos缓存管理器(Chaos Cache Manager)管理缓存,该管理器会将物理数据记录到Chaos缓存集资产中。
这些缓存数据可以在运行时回放,以显示破坏情况,而无需重新计算整个模拟,从而使复杂场景更加高效,对硬件的要求更低。
UE 5.7更新包括:
几何体集合根代理网格支持:Chaos缓存现在可正确支持根代理网格,并会根据缓存和回放的几何体集合资产的销毁状态来切换使用的根代理网格。
自动增量缓存资产:Chaos缓存管理器现在会有一个选项,可以在每次启动新的录制会话时自动创建新的资产。
会话开始/停止控制:现在你可以控制缓存会话的开始和停止时间。 默认情况下,缓存会话会在缓存Actor的Begin Play事件被触发时(通常是在启动 PIE或模拟时)开始。 你可以选择禁用这种行为,但需要使用蓝图的启动和停止功能来触发会话启动。
观察组件功能:现在可使用蓝图函数来添加、更新、移除或清除特定ChaosActorManager的观察组件。
重大错误修复:
现在在同一会话中两次录制缓存的几何体集合时,事件在第二次录制时不再出错。
现在在运行模式下回放缓存时,Chaos破坏系统的Niagara数据接口会在回放过程中正确触发预期的尾随事件。
Chaos毛发
毛发和Groom的重点是利用数据流、骨骼网格体和导向曲线,为逼真的头发行为建立强大的模拟管线。 该系统可以进行动画驱动的模拟,在运动学和模拟发束之间进行混合,并具有先进的创作功能,如导向变形器和绘画工具。
Groom资产程序工作流将受益于UE 5.7更新中对通用数据流编辑器的改进。 我们改进了相应的节点,以提供更灵活的配置:
选择感知节点:
大多数节点都会进行选择,从而使配置更加可控、更有针对性。
你可以使用其他资产(破坏、肉体)的现有选择节点来创建选择集,并按程序对其进行操作。
性能:
具有复杂几何体的Groom资产能更快地为构造视口生成几何体,现在还能缓存信息以避免重新计算。
这还适用于数据流编辑器中其他基于集合的节点。
UE 5.7更新包括:
利用动画和物理驱动的导引样条线来模拟毛发。
在动画状态和模拟状态之间进行混合,以实现真实感和控制。
支持绘制属性、蒙皮权重和引导交换。
Chaos流体
流体项目将继续扩展虚幻引擎的水模拟功能。在UE 5.7中,我们对高级水体插件进行了针对性的改进,主要是改进烘焙河流模拟。
UE 5.7更新包括:
现已支持虚拟纹理。
提高表面质量(减少尖锐瑕疵)。
各种错误修复和性能改进。
虚拟制片
Live Link — 数据预览
现在你可以在编辑器视口中预览Live Link数据,而无需准备任何Actor或骨骼网格体。 Live Link数据预览Actor会在一个Actor中可视化所有动画、变换、摄像机和标记角色的数据。
我们还为自定义编辑器工具提供了Actor组件。 动捕管理器会使用它们来可视化Live Link的数据。
Live Link Hub — 强大的录制功能
我们改进了Live Link Hub的录制稳健性,以应对对象数据随时间变化而改变大小的情况,例如在录制过程中丢失对象的追踪数据,然后再恢复。
你可以使用录制列表中的右键菜单选项,将以前版本的录制文件升级为新格式。
Live Link — 广播组件
你可以为关卡中的Actor添加新的Live Link广播组件,并将其转化为Live Link对象,供本地网络中的其他设备接收动画。 广播组件支持变换、摄像机和动画角色。
通过这个新组件,你可以在工作流程中使用轻量级虚幻引擎项目来进行骨骼重定向,然后还能将生成的重定向姿势广播到网络上其他的虚幻编辑器项目,从而使UE成为重定向DCC软件。 广播动画的帧率等于游戏线程的帧率。
实时链接 — 可暂停的数据流
现在你可以在Live Link面板和Live Link Hub中暂停和重启来自Live Link对象的数据。 你可以单独或分组暂停对象。
此外,我们还有相应的蓝图脚本功能,可通过自定义编辑器工具来控制暂停。 动捕管理器现在也使用此API来控制对象的暂停。
Live Link Hub — 虚幻编辑器设备
在未来的版本中,Switchboard的录制设备功能将迁移到Live Link Hub,用于多用户动捕配置。 而在UE 5.7,你可以在Live Link Hub使用一个名为Live Link Unreal Device的实验性新插件,在连接的虚幻编辑器设备上控制镜头试拍录制器场记板的录制停止和启动。
这种新方法提高了多客户端镜头试拍录制器的稳健性,也取代了Switchboard使用的传统OSC消息系统,并提供了由用户控制的权限,即每个客户端应记录哪些内容,以及允许哪些客户端进行记录。
动捕管理器 — 动态道具附加
在重新定位动捕角色时,表演者的手部和动捕角色的手部之间经常会出现偏移。 当你尝试将追踪的道具与角色对齐时,这就会出现问题。
新的动态道具附加组件提供了使用动捕数据驱动道具的新方法,同时还添加了一个动态偏移量,使其保持在角色的手中。
PCapProp组件现在有了一个蓝图重载功能,让用户可以编写自己的动态附加逻辑。 动捕管理器中提供了一个实现示例,它应该适用于大多数单手道具。
动捕管理器 — 改进表演者网格体创建
为了获得最精确的重定向结果,目前的最佳做法是根据表演者的Live Link数据比例来缩放骨骼网格体。
我们改进了动捕管理器中创建该资产的工作流程,以便在可能不方便放置舞台原点,以及在使用右手坐标系的系统中使用该资产。
Composure
虚幻引擎5.7重新引入了Composure作为现代系统,用于实时合成实时视频输入以及文件/图像媒体板。 新的Composure是基于层级的工具,与传统系统相比已有诸多改进,包括:
重新设计的用户体验和简化的工作流程。
使用自定义渲染通道,为实景片段整合性能良好的阴影和反射。
改进的键控器。
媒体描述文件
一直以来,在虚幻引擎中管理实时视频输入和输出都需要多个资产(媒体源、媒体播放器、媒体纹理等)才能做到从A点到B点。 媒体描述文件旨在将这些内容整合到特定设备设置的单一配置资产中,并提供大量工作流程改进功能,例如:
动态添加多个媒体源和媒体输出,并选择所需的硬件选项(如AJA、Blackmagic、NDI)。
同时预览多个IO源。
捕捉媒体输出。
通过即时反馈来配置时间码和同步锁定。
只需点击一下即可方便快捷地访问Composure等相关工具中的视频IO功能。
镜头试拍录制器 — 卡顿保护(实验性)
UE 5.7更新增加了对拍摄过程中卡顿保护的支持。 现在你可以对镜头试拍录制器进行配置,以提高录制速度,防止数据丢失。 如果有帧丢失,镜头试拍录制器可以调整引擎评估,以便有时间记录数据后再追赶进度。
更可靠地记录完整数据。
可视化数据完整性可能丢失的重点区域。
当下就能对录制质量做出明智的决定。
命名标记 — 可编辑文本控件
我们添加了一个Slate和UMG命名标记编辑文本部件,可直接支持命名标记。 现在你可以轻松构建支持命名标记的管线工具。 聚焦时,文本框将显示未评估的{token}字符串。 提交后,文本框将显示评估结果文本。
直接从文本框中搜索和自动完成{tokens}
立即在文本框中直接查看已评估的令牌值
可与Naming Tokens插件一起使用。
过场动画组装模式的时间轴模板
过场动画组装模式现在可以引用现有的关卡序列和过场动画组装,从而作为Sequencer时间轴的模板。 你可以指定一个目标模板,并在每次使用该模式创建新的过场动画组装时重新创建该时间轴。
还请提前设计好基本时间轴。
可以在创建镜头、场景、光照序列等时,减少重复和错误!
使用Cinematic Assembly Tools (CAT)插件时可用。
带引用替换功能的复制组装
现在你可以通过引用替换将组装复制到新位置。 在复制组装时,你不再需要手动创建、重命名和重新引用子序列。
它会复制到新位置,并根据组装元数据和令牌自动重命名。
后续内容会按程序进行复制、重命名和重新引用,以确保不会留下任何引用,从而改变你所有的旧镜头。
经过简单的引导即可轻松访问。
SMPTE 2110 - Nvidia Rivermax BlueField-3支持
虚幻引擎5.7中的Nvidia Rivermax插件现已支持BlueField-2和BlueField-3 DPU,并在nDisplay中验证了镜头内视效的功能。
平台SDK升级
Windows
Visual Studio 2022 v17.14或更高版本
Windows SDK 10.0.22621.0或更高版本
LLVM clang
最低:18.1.8
推荐:20.1.8
Intel OneAPI
最低:2025.2.0
推荐:2025.2.0
.NET 8.0
构建农场编译时面向的IDE版本
Visual Studio 2022 17.14 14.44.35207工具链和Windows 10 SDK (10.0.22621.0)
Xcode 15.4
GDK
Windows SDK最低版本:10.0.22000.0
GDK:2025年4月
最新恢复版本
支持的IDE:Visual Studio 2022
Linux
原生Linux开发
推荐操作系统:Ubuntu 22.04、Rocky Linux 8或更高版本、Redhat Linux 8或更高版本
编译器:clang 20.1.8
交叉编译工具链:基于v26 clang-20.1.8
注意:Linux上的虚幻引擎用户必须更新其操作系统以使用 SDL3。 更多详情,请参阅Updating Unreal Engine on Linux to SDL3
macOS
推荐操作系统:最新的macOS Sonoma 14
最低操作系统:macOS Sonoma 14.0
推荐Xcode:15.4或更高版本
最低的Xcode:15.2
支持的macOS SDK:14及更高版本
注意:由于使用最新版本时在编译和链接方面存在一些问题,因此支持的Xcode版本已从UE 5.6降级。
iOS/tvOS/iPadOS/visionOS
推荐操作系统:最新的macOS 14 Sonoma
最低操作系统:macOS Sonoma 14.5
推荐Xcode:16.1或更高版本
最低的Xcode:15.4
支持的目标SDK版本:
iOS SDK版本:15或更高版本
iPadOS SDK版本:15或更高版本
tvOS SDK版本:15或更高版本
推荐搭载Xcode 16.3的visionOS 2.4
注意:v2.5和x16.4已通过非常有限的测试,目前未发现问题。 低至v2和x16的版本或许都能正常运行。
iOS图形API:Metal 2.4 - 3.1
其他注意事项
Shader Model 6(SM6)要求macOS 15。 此项支持目前为Beta测试版,暂不推荐应用到生产环境。
Android
Android Studio Koala 2024.1.2 2024年8月29日
Android NDK r27c
Android SDK
推荐版本:SDK 34
用于编译UE的最低版本:SDK 34
用于发售的默认目标SDK:SDK 34
最低安装SDK级别:SDK 26
如果你使用AGDE进行调试,推荐使用AGDE v23.2.91以上版本,因为该版本修复了SIGBUS错误。
编译工具:34.0.0
如果你要使用35.0.0版,那么在Windows上使用aidl时可能会出现问题。 35.0.1版本已修复此问题。
Java运行时:
OpenJDK 21.0.3 2024-04-16
OpenJDK运行时环境(构建21.0.3+-12282718-b509.11)
OpenJDK 64位服务器虚拟机(构建21.0.3+-12282718-b509.11,混合模式)
其他注意事项
虚幻引擎已更新为使用Gradle 8.7,我们使用的Android Gradle插件(AGP)版本也已更新为8.5.2。 如果你使用Android Studio进行调试,那么我们推荐使用Android Studio Koala。 Ladybug也可用,但不要从上述版本更新Gradle或AGP。
选择NDK等级时,应该以android-26为目标,因为它支持Android 8.0以上版本。
EOS
1.18.1.2-47370208
Steam
1.57
Switch
默认SDK版本:20.5.6
默认固件版本:20.1.0-2.2
最低SDK版本:18.3.1
最低固件版本:18.1.0-1.0
Nintendo文件包管理器:1.7.0
支持的IDE:Visual Studio 2022
Switch 2
默认SDK版本:20.5.6
默认固件版本:20.1.0-2.2
最低SDK版本:19.3.5
最低固件版本:19.1.0-1.4
Nintendo文件包管理器:1.7.0
支持的IDE:Visual Studio 2022
PS4
默认Orbis SDK 12.508.001
最低Orbis SDK 12.008.011
系统软件12.508.001
支持的IDE:Visual Studio 2022
PS5
默认Prospero SDK 11.00.00.40
最低Prospero SDK 10.00.00.48
系统软件 11.00.00.43
支持的IDE:Visual Studio 2022
ARCore
1.48
ARKit
4.0
OpenXR
1.1.46
支持OpenXR 1.0和1.1运行时,两者均可在项目设置中禁用。
版本说明
AI/ML
Neural Network Engine (NNE)
New:
Added multi-task support to the IREE CPU backed NNE runtime.
Upgraded IREE to version 3.5.0. for NNE plugin NNERuntimeIREE.
Animation
Animating in Engine
New:
Added a 'Tolerance' To the ControlRigPoseMirrorSettings Project settings that is used to match Controls also by position in rest pose. We still match by the Mirror table first, and fallback to position based matching. We also now cache the tables and reset them if a mirror table property is changed.
Improved Anim Details
UX Editing multiple values no longer displays the first property value.
Releasing focus on multiple values no longer sets the first property value.
Shift clicking to the left of a property name no longer resets the property.
Added support for math expressions with multiple operators.
Removed support for =operator syntax, instead use operator =, e.g *=3 to multiply the current value by 3.
No longer show parent controls of the current selection, avoiding showing too many channels when a selected control has hosted channels.
Now follows the same order as Sequencer for non Control Rig properties
Now uses meta data of Control Rig elements and Object Properties that sequencer controls, value ranges are now displayed and respected.
Selected Anim Details properties now navigate to their value widget when pressing tab.
Animator Kit:
Added a new Locator utility rig.
Adding static mesh locators and materials.
Curve Editor:
The Set Start Playback Range and Set End Playback Range shortcuts now work in the Curve Editor as well as Sequencer.
A new preference, Panning Mouse Button, allows you to choose whether right or alt-middle mouse button, or both should be used for panning the curve editor view. Also, alt-right now always zooms in/out.
The Next Key and Previous Key shortcuts now work in the Curve Editor as well as Sequencer.
Ensured we load an animation instead of trying to just find the package before we "Bake To Animation" so that it doesn't try to create a new asset.
Updated AnimationEditorUtils.cpp
Bug Fix:
Deleting a Bool channel can no longer set the key at another time if AutoKey and KeyAll is on.
No longer adds anim layers to level sequence unless needed.
Constraints now work with Pivot Tool.
Fixed shift click so it always goes to the last selected object, added a hot key to toggle pivot and motion trail modes.
Made sure to automate tangents when baking.
Made motion trails enter/exiting undo/redoable.
Motion trails can be selected without a focused viewport.
Made sure Rotator/Location/Scale controls have a curve color
Pose library can paste onto hidden control rigs
Made the AnimSequencerExport Blueprint type
Anim Details:
Properties now reset their values to the initial value of controls when clicking reset to default.
Now also displays properties that reside within a Shot Track.
Fixed navigation not working in some cases.
Fixed an issue in Anim Details where selecting a component in a plain location, rotation or scale control would not select the control in Curve Editor.
No longer shows objects if keys are selected only.
Fixed property value widgets are losing focus while scrubbing if a blueprint actor is controlled.
Fixed in some cases editing Anim Details properties creates more than one undo step.
Fixed Anim Details options no longer showing when reentering animation mode
Fixed an issue where Anim Details displayed the actor or component name instead of the track name for attributes.
Curve Editor:
Fixed issues where bezier curves were not always painted correctly.
Fixed an issue where curves were not painted when none of its keys were visible.
Fixed an issue where linear pre-/post-infinity extrapolation was not always painted correctly
Baking keys with a value different than 1 would increase range
Fixed an issue where pre-/post-infinity was not painted correctly when the first or last key's tangent mode was linear and pre-/post-infinity interpolation was linear
Fix an issue where curves flicker hovered and unhovered while editing
Motion Trails:
Made sure the Motion trail state stays on with asset reload.
Fixed strobing frame coloring with dashed by setting the start frame to be eval range start so it doesn't change when view range changes.
Fixed crash when drawing HUD since trail may not be updated due to how the hud draws. Clean pin state in UI when using modifiers.
Fixed an issue where changing additive animation modes with root motion on causes inconsistent root position when going from an additive mode to none.
Fixed a bug where starting an animation with a non-zero playback time (like rewind debugger can do) would cause an incorrect root position.
When merging sections no longer see if it's in range, just extend it so we can match up how it works without the merge.
Now only compensate from the game thread.
Can now set or add keys when recording control rig keys, previously we would just add keys causing duplicates.
Anim Layers:
Bake Fix for absolute with additives when doing per frame bakes.
Make Name Column not shrink when shrinking
Layers show up when added to sub sequence
Keep track of open anim layer UI on the anim layer asset data.
Fixed duplicate/merging control rig sections when the channel layout is different between sections.
Made generic vector channel data display more robust for position/rotation/scale control types. This also fixes the euler curve filter not recognizing rotation keys coming from Rotator control types.
Sequencer: When baking to control rig, the animation track is now disabled instead of the individual sections.
Turn off throttle when mouse button is pressed not just on drag so scrub time doesn't throttle in sequencer/curve editor
Space Switching: Remove extra keys when clicking a space key by checking to see if we are changing into the same space in which case we can delete the extra key and the space key
Hosted channels are no longer enabled if the parent is not enabled, this breaks selection. Also fixed anim layer selection with static meshes
Sequencer: The scrub shortcut (b) now properly works in the viewport, Sequencer and Curve Editor.
Fix Pivot square scale in different FOV's.
Force LOD to 1 when ticking skel meshes when baking anim sequences. Sequencer may restore state which can change the lod during the bake process.
Pivot Tool: Pivot render works in different FOVs
Animation Kit:
Added aim option for blendParent. Changed control shapes to not be solid.
Fixing bad root attachment when no control rig exists.
Fixed an issue with the recompute mesh normals kernel used by Deformer Rigs in the Animator Kit plugin causing unexpected changes to mesh normals even if they are not influenced by deformer.
Can no longer do space compensation from nongame thread which can happen when deleting many channels, in which case we probably don't want to compensate anyway
Pose Library fixes, use alt drag for non additive drags and for additive it goes from -1 to 2.
Blending and additive mode are now working on mirror.
Space Switching: Fix for undoing space switch key deletion.
Tools such as snapper, trails and baking now work better with spawnables in nested subsequences
Character Customization (Mutable)
New:
Added component naming support for spawned groom components.
Debugger improvements:
Added support for Dataless parameters.
Unified Debugger and Editor compilation options.
Reordered some widgets for better use of the available space.
Minor API improvements:
Actor:
Added ACustomizableSkeletalMeshActor::GetCustomizableObjectInstance.
Added ACustomizableSkeletalMeshActor::GetSkeletalMeshComponent.
Override Materials
Deprecated UCustomizableObjectInstance::GetOverrideMaterials(int32).
Added UCustomizableObjectInstance::GetSkeletalMeshComponentOverrideMaterials(FName).
Restricted Passthrough Mesh Component to only support Skeletal Meshes.
Bug Fix:
Fixed Material Parameter assert.
Fixed Default Values not exposed to Blueprint.
Fixed Skeletal Mesh Parameter morph check.
Fixed UpdateSkeletalMeshAsync missing parameters.
Fixed Materials comparison for merging.
Fixed Textures and Meshes not being properly cached, their hash was not deterministic.
Fixed a compiled API typo.
Fixed multiple Dataless bugs:
Crash with Default Material parameter.
Crash with Dataless Morphs having names but no data.
Fix Texture Parameter not cropping images with layout operations.
Fixed issues with GenerateMutableSourceImage cache.
Added missing COI Contains API functions.
Fixed public API Enum Parameter functions not working with the first parameter.
GetEnumParameterNumValues
GetEnumParameterValue
Fixed deadlock when saving an asset + compiling a CO while asset registry was loading.
Fixed streaming crash when no indices.
Fixed meshes incorrectly reusing poses.
Deprecated:
Removed deprecated 5.6 API functions.
Control Rig
New:
Update default hotkeys and related functionality:
Set Solve Mode: Construction Event - 1
Set Solve Mode: Forwards Solve - 2
Set Solve Mode: Backwards Solve - 3
Set Solve Mode: Backwards and Forwards - 4
Set Next Solve Mode - M
Enable profiling- P
Show Controls as Overlay - U
Display Nulls - G
Display Socket - H
Display Axes for selection - J
Using hotkey for Profiling (P by default) now creates an undo step.
Function nodes from other assets now show the asset name instead of the asset path.
Flagged Render MorphTarget MaxBlendWeight CVar as safe for render thread, in order to avoid some warning logs.
Made the animation show flags of the control rig editor never clip off of the viewport toolbar.
Fixed duplicated Control Rig assets not resetting the asset variant ID.
Control Rig Hierarchy no longer reserves transform space for non transform elements (curves and connectors).
Control Rig Physics
Moved to its own experimental plugin, though it still requires the Physics Control plugin as well.
Added ability to import collision shapes and bones
Support for "wind turbulence"
Support for colliding against world objects
Add various cvars under controlrig.physics
Numerous improvements, especially access to functionality, and fixes
Removed top level component concept from Control Rig Hierarchy
Added GetSocketTransform
Modular Control Rig:
Adding plugin Icon for Modules
Improved backwards solve for Foot Module.
Added Module tags and Root56 module to the correct ini files.
Dragging a rig element onto the graph now offers an option to Get Metadata and Set Metadata.
Update default settings and remember them per editor per user:
Display Axes On Selection is now enabled by default.
Display Axes On Selection, Axis Scale, Display Nulls, Display Sockets, Gizmo Scale, Hide Control Shapes, Show Controls as Overlays, Only Select Rig Controls are now saved per editor per user.
Control Rig now only performs one copy of the hierarchy during initialization.
Added line trace unit nodes.
Added icon to plugin.
Added Damp and Critical Spring Damp nodes to Control Rig.
The Control Rig menu now shows directly in the viewport toolbar instead of being a submenu in the Show menu (eyeball icon).
Nodes and hierarchy elements now offers options to find nodes by name locally and globally.
Updates to Set Initial Transform from Current and related Commands
Set Initial Transform from Current is now only applicable for Bones, Nulls and Connectors.
For Controls, Set Initial Transform from Current is now Zero Controls.
For Controls, Set Initial Transform from Closest Bone is now Zero Controls from Closest Bone, and no longer applicable for Bones, Nulls and Connectors.
Set Shape Transform from Current is now Zero Control Shape.
Bug Fix:
Moved findItemsWithTag to the construction event for performance.
Fixed Control Rig curve container undo / redo breaking the curve list
Fixed Control Rig editor resetting on compile curve operations made on the curve container (delete, rename, and import).
Fixed a crash in Control Rig Pose adapter when removing bones from the skeleton while having a Blueprint with a Control rig opened in the asset editor.
Fixed AnimNode Control Rig variable mappings initialization at OnInitializeAnimInstance.
Control Rig: Need to update Rotation Order table with modular rig updated names.
Fixed Control Rig Hierarchy updating more transforms than needed in propagate dirty flags function.
Modular Control Rig
Added twist to legs.
Fixed IK/FK naming.
Added back public function from arm to leg so it picks up changes.
Fixed hind legs ik fk.
Changed leg and arm softness to off by default.
Fixed socket tooltip in Spine.
Fixed HindLeg FK controls not rotating.
Fixed AnimalNeck stretch.
Fixed Shoulder backwards solve by parenting to chest null instead of body ctrl.
Fixed HindLeg to always use connectors for creation instead of parent lookup.
The editor now retains the Rig Solve Mode after compiling.
Fixed Control Rig control module iterator lambda parameters creating copies of some expensive objects.
Fix for client crash in FRigUnit_HierarchyInstantiateFromPhysicsAsset, due to Modular Control Rig object overrides getting garbage collected.
Fixed ControlRig Hierarchy serialization not storing the previous hierarchy name map.
Fixed crash in Control Rig editor when the preview floor mesh is not available, now it will trigger an error log and continue to load the asset.
Avoid a crash in Control Rig when adding an empty rule to a connector.
Fixed an editor undo redo in an AnimBPs that contains a Control Rigcrash, when performing a redo of a previously-undone SetPreviewMesh transaction.
Anim In Engine: Rotator control keys are retained in Sequencer when the controls are changed to transform controls in the rig.
Need to update Constraint Channels with updated Modular rig names, or constraints come in broken.
Fixed ControlRig editor not executing post undo for the transient editor preview actor.
Fixed undo / redo crash in Control Rig hierarchy mappings, when undoing across a construction transaction.
Converted HandleExecutionReachedExit event to function callback, to avoid worker thread contention.
Fixed ControlRig spawn control node details panel not generating the shape name list as a combo box.
Fixed a crash in ControlRig when expanding a function reference from a different graph that contains a private function inside. Now the user will receive a localize request to make a local copy of the function.
Fixed RigVM local variable customization not showing value for local variables not used in the graph and losing value after compiling.
Deformer Graph
New:
Adding Deformer dynamically in Control Rig was changed to use Async Loading to avoid hitches when the Deformer loads.
Enabled Compute Framework/Deformer Graph on mobile platforms.
Fixed SkinWeightAsVertexMask Date Interface providing incorrect data when a non-default skin weight profile is used.
Fixed skeletal meshes getting invalid tangents when using deformer graph with opengl_es31.
Fixed wrong category for a few deformer functions.
Added a pre-built dual quat deformer that supports both morph and cloth.
Bug Fix:
Made sure skin weight profiles are requested earlier so that we can avoid T-Pose on the frame that the deformer becomes active / LOD changes.
Fixed copy pasting resource node with matrix3x4 type creating a node with no pin.
Fixed an ensure related to deformer graph instance settings in packaged build caused by incorrect object name used when creating the settings object.
Gameplay
New:
Make Motion Warping switchoff conditions and warp target direction mode experimental as these APIs will change in future.
Added support for animation mirroring to UAF.
Note this is a first pass and not fully matching Animation Blueprint's capabilities yet.
Added a new version of AddAnimationNotifyEvent() that supports blueprint exposed data from notify events.
This helps prevent data loss when copying/duplicating animation notify events.
Add SmoothWalkingMode to Mover2.0
Added base class SimpleWalkingMode to help make writing walking modes easier.
Renamed AnimationMath -> SpringMath and made public Rename SpringWalkingMode -> SimpleSpringWalkingMode.
Added Velocity Spring functions to SpringMath Add character prediction functions to SpringMath.
Added documentation to SpringMath.
Added support for PoseSearchDatabase searches returning multiple results
Added experimental support to the motion matching node (FAnimNode_MotionMatching) for interaction searches (multi character motion matching, to mimic FMotionMatchingTrait).
Added a custom make bp function for FMotionWarpingTarget to ensure that the custom actor is called to calculate the target transforms when a component is passed as an input.
The ChooserTable randomization column can now keep track of multiple recently selected entries and reduce the probability of reselecting them.
Added new Chooser table column type (FPoseSearchColumn) to support motion matching searches within chooser evaluations.
Add a spring walking movement mode to Mover named "SimpleSpringWalkingMode". This uses a critically damped velocity spring model to translate and rotate the character.
Removed UE 5.5 deprecations from PoseSearch plugin.
Exposed anim to texture editor functions as a public interface.
Add threadsafe method for getting curve asset float & vector values.
Bug Fix:
Fixed UE::PoseSearch::SDatabaseAssetListItem potentially referencing a deleted asset.
Fixed a crash when opening the PoseSearchInteractionAsset editor.
Fixed FSearchContext::GetSampleRotationInternal and FAssetIndexer::GetSampleRotation not properly calculating the rotation relative to their reference bone.
Fixed motion matching tracing during throttled or skipped searches.
Stored FBlendStackAnimPlayer::StoredAttributes as FMeshAttributeContainer instead of FHeapAttributeContainer to support animation LOD changes in blend stack.
Fixed a pose search database indexing crash when using a UAnimNotifyState_PoseSearchSamplingAttribute referencing a bone that is missing from any channel included in the pose search schema.
Fixed root motion sampling in blend stack.
Fixed the motion warping switchoff condition to use the correct target transform when component following ends.
Fixed a crash in UPoseSearchFeatureChannel_Phase::IndexAsset when indexing assets with a single pose, usually caused by a very short animation in a pose search database.
Fixed UPoseSearchDatabase::SynchronizeWithExternalDependencies mistakenly synchronizing transient assets into a database, leading to reference garbage collected assets.
Removed notify guids from Pose Search Database hash generation, otherwise the hash can be non-deterministic.
Fixed a crash in FAsyncPoseSearchDatabasesManagement::CollectDatabasesToSynchronize with Objects with invalid Object->GetClass().
Fixed the Alias state nodes not working with getters like GetRelevantAnimTime.
Deprecated:
Deprecated UPoseSearchDatabase TArray AnimationAssets in favor of TArray DatabaseAnimationAssets.
Deprecated UPoseSearchLibrary::UpdateMotionMatchingState.
ML Deformer
New:
Hide certain conflicting properties (categories even) from the advanced preview scene settings tab. This was needed because the MLD asset editor has its own mesh picking and animation playback. Changing those properties inside the preview settings tab would mess things up. So we now hide those specific conflicting settings.
Make curves work with UAF.
Added support for copy paste between input bone and curve lists.
Means users can copy/paste the input lists from one model to the other.
You can now right click the input list widgets and choose Copy and Paste.
Fixed a few bugs in the tooltips as well as unique curve group name generation.
Improved the UX a bit by setting a minimum height for the bone, curve, bone group and curve group widgets and some context menu improvements.
Fixed some UI refresh issues as well when adding bones or curves. Curve group and bone group coloring did not refresh properly.
Improved performance of the asset editor. Improved responsiveness to property changes, faster loading, faster sampling of anims.
Added a new console command "MLDeformer.DebugDrawInputPoses" which will draw the input pose to the ML Deformer. It can be useful to quickly visually see what meshes have ML Deformers on them, and what bones are included.
GeomCache: Some improvements to the memory management. Prevented reallocs, resulting in faster performance.
Bug Fix:
Fixed a problem where training with curves would cause a failure during training.
Fixed a bug where curves on the skeletal mesh instead of on the skeleton would cause some error checking to fail.
Fixed a crash when adding a bone to the inputs of the ML Deformer.
Fixed a crash on undo on morph based models. Also changed the icon of the Train button.
Fixed python errors when launching with "-game" as argument.
Fixed a bug when training, related to masks of input animations. Training would fail with some error right after sampling.
Moved the tick group from pre physics to post physics.
Fixed a VertexDeltaModel python import error. This was because an import should have been inside the Train function, but it was in global scope.
Fixed async loading issues.
Some fixes where it would not detect curves.
Physics Control
New:
Now supports using a mask when invoking control profiles, which means they can be applied to a subset of the character.
Additional support for specifying control/modifier set names in function calls.
Kinematic targets are now specified the same way across PhysicsControlComponent, RigidBodyWIthControl and ControlRigPhysics.
Fixed duplication of the Linear/AngularTargetVelocityMultiplier and TargetVelocityMultiplier parameters.
Bug Fix:
General minor fixes/improvements to the physics control asset editor, including a fix for a potential crash.
Runtime
New:
Added pinning and toolbar to workspace viewport and remove scene description tab.
Now supports drag/dropping multiple bones in the abstract skeleton binding editor.
Bone items can now be dropped onto non-set items in the abstract skeleton set binding editor.
Added a filter for attributes to anim asset browser.
Added Initialize as a default implemented event in the UAF module.
State Machine: Self transitions & UX improvements:
Self transitions and state re-entry are now possible.
Re-entering a state uses inertial blending and requires an inertialization node. Old content will not use the new re-entry feature but any newly built content, when re-entering a state, will create an error if an inertialization node is not present root-wards in the graph.
The target state must enable bAlwaysResetOnEntry for the inertial blend to trigger.
To aid with managing state-reentry, a new MinTimeBeforeReentry value has been added to transitions.
Added 'reverse transition' context menu option that just reverses the direction of transitions.
Relinking transitions to other states can now be performed from the transition tail as well as the head.
State alias list is now sorted alphabetically to make finding states easier.
Look and feel of state machines has been tweaked & improved.
Now uses SVG brushes to better scale.
Different node types (states, aliases and conduits) now have different shapes.
Transitions now rotate to follow their direction and have been moved closer together and closer to their link line.
Transitions now sort in front of states.
Links are now further apart and scale correctly with zoom level.
Selection of links now scales correctly with zoom level.
Details panels for states now show the anim node functions for their result node and have been rearranged.
Added 'force transition' option to the context menu for state machines that are currently being debugged.
Made machine entry nodes non-deletable.
Extended the Create Asset menu to allow non-asset menu entries for wizards that create potentially multiple assets of various types.
Added a picker widget for animation attributes.
Added toggle to blend layer trait to blend in mesh space.
Added live updating blend mask weights in the profile blend node.
Updated animation blueprint interface icon in the 'My Blueprint' tab to show as blue when the function has been implemented.
Exposed Curve Metadata API on the Skeleton to Blueprint and Python. This includes functions to query, add, remove and rename curve metadata as well as querying and setting material and morph target flags.
Disabled adding set bindings without a set collection set.
Added a viewport to the workspace for UAF.
Paused preview animation while manipulating transform widget in animation editor.
Added an asset wizard for help authoring UAF content.
Added foundations for the abstract skeleton runtime.
Added editors for the abstract skeleton assets.
Added functionality to Open in New Tab via the context menu for collapsed nodes and function nodes in UAF
Fixed collapsed nodes and functions in UAF workspaces being opened without context of their outer, leading to loss of access to variables.
Fixed debug only assert when opening items via double click the workspace outliner.
Bug Fix:
Fixed a missing drag-drop op for adding attributes to sets in the set collection editor.
Caught a situation where the mesh asset in InitializeAnimScriptInstance is invalid. Also dealt with possible parallel anim eval tasks being in flight.
Fixed a crash when trying to create a new UAF Workspace instead of picking an existing one when prompted to choose a workspace after opening a newly created UAF Graph.
Fixed slow document navigation in the workspace editor.
Fixed a crash when attempting to add an existing curve attribute to abstract skeleton binding.
Fixed being able to rearrange a trait onto itself.
Fixed for animation modifiers not reverting correctly and crashing in some instances.
Fixed a crash when re-removing a pin on a blend multi node after undoing.
Fixed a broken root motion extraction during animation modifier evaluation.
Fixed a regression in root motion extraction which prevented animation modifiers from reading raw uncompressed data during the compilation process, causing them to fail
Fixed missing text localization in pose asset widget.
SkeletonCompatibility: Fixed a problem when using compatible skeletons where we could end in a situation where the source skeleton did not have a bone of the target skeleton, which could lead to a crash.
RBAN: Ensure RBAN doesn't write NaNs into the pose.
Fixed visualization of what the blend weight of the animation is in Animation Insights for Random Sequence Player. Now it takes the overall blendweight of the animation into account as well.
Fixed the look at edit mode locator gizmo not updating location when changes are made in the details panel
Anim State Machine:
Fixed incorrect duplicate GUID warning when a transition rule is shared.
Prevented renaming states to 'None'.
Fixed copy-paste of transition nodes creating duplicate GUIDs/assets.
Fixed clamping values preventing manual entering of valid negatives.
Anim Sequence: Fixed thumbnail scene references preventing deletion when assets contain notify states.
Anim Assets: Fixed a crash when creating a preview scene for assets with a deleted compatible skeleton.
Fixed the animation sequence segment length
Fixed a button in the montage editor not working due to property access type mismatch
SkeletalMeshComponent: Fix meshes getting ticked offscreen incorrectly when using montage-related visibility options
Fixed pose history and trajectory history desync by delta time, causing incorrect results especially noticeable when the component transform makes large translation and rotation, e.g. a 180 pivot.
This fixes a bug with bad pivot selection when the capsule rotation flips
Fixed incorrect timings on trajectory history when delta time is not constant.
Fixed duplicate trajectory entries around t = deltatime.
Fixed the set collection editor not updating when renaming a set, and added rename to the context menu.
Fixed the expansion state of tree items resetting when drag/dropping a bone in the abstract skeleton binding editor.
Fixed drag-dropping segments into composite track not matching selection order.
Fixed window scaling issue when dragging multiple notifies in the animation editor.
Changed check to ensure in SkeletalMeshComponent to avoid crash using rewind debugger.
Fixed many SAssetShortcuts unnecessarily refreshing on asset opening resulting in slow ABP navigating.
Animation Budget Allocator: Enabled component tick when unregistering.
Updated the animation attribute functions to not allow adding an attribute with a name that already exists.
Anim BP: Fix cook non-determinism with generated 'mutables' struct
Anim Instance: Fix memory leak when GC-ing both mesh & anim instance in the same pass.
Fixed an issue with tooltip names in SOverrideStatusWidgets.
AnimSequence: Fix uninitialized pose transforms being generated in some circumstances
PropertyAccess: Fix memory leak when calling functions via property access that return non-POD values.
Anim Decompression: Removed usage of deprecated GetCompactPoseIndexFromSkeletonIndex.
Fixed copying notifies when duplicating an anim sequence so the new notifies no longer reference the old sequence.
Fixed the UAF asset wizard template assets being visible in the content browser and selectable in the workspace picker etc.
Added more inline crash details when invalid values are found in animation poses.
PropertyAccess: Hardened GetAccessAddress in case of unexpected data.
SkeletalMeshComponent: Fixed a crash when calling SetAnimInstanceClass during a notify callback.
Triggered caching of all otherwise lazily computed data when a DNA is loaded from a binary stream, which can avoid potential race conditions if the same DNA reader is utilized in a multithreaded environment.
Fixed not being able to move nodes within newly created comment nodes in Control Rig and UAF.
Deprecated:
Removed deprecated Skeleton Compatibility code from the Skeleton class.
Removed deprecated Curve code from the Skeleton class.
Removed deprecated Mesh Linkup Caching code from the Skeleton class.
Sequencer
New:
Property tracks can now be renamed.
Note, the tooltip will still show the actual name of the property being animated.
Added setting to always stop when going to playback start or end.
Sequencer Navigator: There are now columns for the sequence ID and the object binding ID which are useful for debugging purposes.
Take Recorder: Add a cvar TakeRecorder.AllowPossessablePIEObjects to bypass disallowing recording PIE objects as possessables. The default is to not allow this (no change in behavior). This can be useful when recording a player pawn.
Added scripting to text
Added ISequenceVisitor callbacks for when the visit enters/exists a sub-sequence
The camera cut track now supports multiple rows. When multiple rows exist, the camera cut track does not try to auto arrange sections.
MovieScene: Exposed FLevelSequencePlaybackContext to other modules.
Hot key scrubbing will continue playing if Sequencer was playing.
Preview camera cuts in simulate. This also lets users enable/disable seeing camera cuts in PIE after ejecting from the player controller.
The colors for the playback start/end range can now be customized by user settings.
Added support for notification callbacks when animating properties.
The timeline in the cinematic viewport now respects the snapping behaviors of the Sequencer timeline.
Added fixes and improvements to the time space display. The desired time space and the local time space are now both drawn.
Bake Transform now has an option to bake with time warp applied.
Attach sections with Preserve None now default to infinite duration.
'Bake Animation Sequence' and 'Create Linked Animation Sequence' actions in Sequencer now remember the last folder that was used in the current Editor run.
Bake Transform is now available in the Template Sequence and Camera Animation Sequence Editors
The subsequence section's Origin Override Location/Rotation now respect the default float/double spinbox incremental behaviors.
Sequences: Add PlayReverse function to actor sequence components.
Editing scale channels in the Sequencer Key Details now has an option to preserve the scale ratio
Save As is now available in the Template Sequence and Camera Animation Sequence Editors.
Added the ability to get and set Mute Nodes, Solo Nodes, Deactivated Nodes, Locked Nodes, Pinned Nodes, and Binding Tags in Blueprints/python.
The view and working ranges are no longer saved with the asset. Every time you open a level sequence, it will be zoomed to the playback range.
Duplicate keys are now removed on mouse release
Update tooltip to "The interpolation type for the initial keyframe" to clarify that this is only for the first keyframe on the track/section
UE_API all blueprint exposed functions for Sequencer Scripting
Bug Fix:
Refactored track instance bindings and added the concept of "volatile" paths to fix possible memory stomps when animating array items or instanced structs.
Fixed an issue where when changing shots we could sometimes get one frame of t-pose on a character when using bForceCustomMode. The issue was that we were checking for custom mode too late in the frame relative to when we were potentially doing the binding to a custom anim instance.
Fixed the color not reverting when pressing cancel on the color picker.
Added an adjustment for an issue for capturing thumbnails for sequences. Renders at a square aspect ratio and cleans up some advanced rendering features to create the cleanest image possible like materials.
When opening a sequence, the playback mode is now set to loop selection range if a selection range is set.
Fixed the BakeToControlRig function. Now fetches the templateID for the sequence that we're in so that if the sequence we are working on is a nested, instance, or template sequence we can resolve objects within the function.
Added support for indirect gizmo manipulation of sub track offsets.
Added support for animating property bag properties.
Fixed a possible GC leak with UMG animations. It happened when using an event track, and the widget is removed from its parent while the animation is playing, and then the inactive widgets pool is discarded and GC'ed.
Sequencer Navigator: The marks column now properly updates when marks are changed/added/removed.
Exporting a binding that doesn't have a valid spawnable template no longer crashes
Fixed a GC error in restore state of skeletal mesh animation track.
Properly implemented end-at-time feature.
Now stores camera shake previewers as shared pointers because FGCObject classes are not relocatable.
Fixed Material Parameter Collection track display name so that it's not set explicitly on creation. Instead, the display name is just the name of the MPC if the user hasn't changed it. This allows the user to change the MPC and the name will automatically change.
Proxy bindings no longer allow you to mistakenly pick the same actor it is a proxy for.
Key selection is no longer emptied when right clicking on the timeline.
UMovieSceneSequence: Fixed nullptr crash.
Fixed pre-roll/post-roll sometimes still evaluating sections that aren't set to evaluate there.
No longer falls back to the double blender system when a property doesn't have blending information. Instead, it falls back to the fast path where we don't blend anything.
Fixed broken support for ping-pong playback when we only cross the loop boundary once.
Fixed the pre-animated state being incorrectly saved as "persistent" for root tracks.
Deleting a muted track row now properly no longer causes other rows to lose their mute state.
When a fixed timescale is set negative, ranges 2 levels down no longer collapse causing subscenes of subscenes not to play correctly.
This only fixes the case of fixed timescale. Similar issues still occur using the playrate/timescale curve.
Copying a folder now properly copies root tracks as well.
.MovieSceneSequenceExtensions::FindBindingByName now returns a more reliable binding because it gathers the names from FMovieScenePossessable and FMovieSceneSpawnable which are kept in sync with the actor labels.
Fixed a regression with a deprecated code path for fetching what animation is playing for UMG Sequences.
Fixed pause-at-frame logic, which was sometimes incorrectly pausing on the previous frame.
Select All Keys Forward and Backward now properly select all the requested keys.
Selecting a layer bar no longer mistakenly deselects component bindings.
Collapse Nodes and Descendants now properly collapse after being expanded.
Copying a folder now properly copies all bindings and their child component bindings.
Payload objects for event keys are no longer lost.
Disallow picking a proxy binding that's already bound to the current one.
Remove the "Blocking Evaluation" checkbox from the advanced menu, since we can already set it from the playback options.
Fixed ongoing focus issues in the key details. Sequencer are now committed when focus is lost and keys are not accidentally created with incorrect values.
Fixed the time warp curve still evaluating even while muted.
Fixed a bug where the keyable indicator would not update for the selected object in the details panel after opening a sequence. It required adding to the sequence or selecting new objects.
Fixed pre-roll/post-roll sometimes still evaluating sections that aren't set to evaluate there.
Removed calling Modify from SetPreRollFrames / SetPostRollFrames. The caller should be responsible for calling Modfiy().
If you copy an event track from one sequence to another, the events in the pasted event track will point back to the blueprint director in the copied sequence. This is not allowed, so those events are now cleared.
Fixed creating an object property track as a class property in python not properly setting the bClassProperty value which allows a class chooser to pop up instead of an object chooser.
Fixed keys not selectable on multiple rows.
Restored a section model expansion state to be closed if it was before, since RestoreLayout resets it to expanded.
We now tear down the Take Recorder's Sequencer instance before we delete and GC the sequence.
Re-added dropped support for Blocking Evaluation in UMG animations.
Fixed a crash when reinitializing a Sequencer editor on a new sequence while the previous one had legacy tracks
When importing cameras, now applies a uniform scale modifier to distance based parameters (Manual Focus Distance).
No longer blends enum values, and make the byte track use the enum system when it animates an enum.
Ensured that evaluation context buffers are flipped if an eval task is active prior to forced update.
Added a potential fix for a memory corruption of UMG animation states.
The topmost unmuted Cinematic Shot is now correctly evaluated.
Previously, if a muted Cinematic Shot was topmost, it wouldn't be skipped over.
Fixed some properties that should appear to be animatable (i.e. FieldOfView and AspectRatio for Cine Camera Components).
Fixed an issue that when converting to a spawnable, sometimes the original possessable meshes were still visible.
Fixed undo of camera cut section now restoring the camera binding properly.
Fixed regression of pre/post-roll behavior in the skeletal animation track.
Creating the initial key for material tracks now respects the default interpolation type setting.
Snap play time to pressed/dragged key only if snapping is enabled.
Fixed a reference-leak in the Track Instance system.
Setting the time of a key through the Properties menu now works properly.
Keying specific channels of a transform through the Details Panel now properly sets the key with those current values (and not 0).
Fixed calls to bool property custom accessors, which were using the wrong function signature.
Better handling looping for camera cut tracks:
Added a new "HasLooped" flag on the evaluation context.
Assumes by default that looping sequences are "seamless" and do not create a straight/hard camera cut on loops.
Added an advanced evaluation flag to opt out of this assumption.
Fixed undo not working when editing with control rigs.
Now fully supports all camera and post-process properties when previewing blending camera cuts.
Disabled ensure before cleaning up camera cut track viewport modifiers.
Fixed regression in how skeletal animation sections behave when resized from the left edge.
Take the first loop start offset into account when determining if a skeletal animation section needs to loop.
Deprecated:
Deprecated FMovieSceneBinding::Name since it's redundant and not kept in sync with actor labels.
Can now return multiple objects with FMovieSceneBindingResolveResult. FMovieSceneBindingResolveResult's Object is deprecated in favor of an array of Objects.
Migrated text tracks to Movie Scene Tracks plugin (enabled by default). Deprecated MovieSceneTextTrack plugin.
Skeletal Editing
New:
Skin weight profiles can now be switched directly in the skeletal editor viewport, if there are skin weight profiles defined for the skeletal mesh asset.
Edit Weights Tool: Fixed removing weights from vertices weighted fully to a single bone turning them into unweighted vertices.
Bug Fix:
Animation: Editing the text field in the curve editor of an anim montage no longer crashes.
Editor
Datasmith
Bug Fix:
Fixed 3dsmax plugin support for 2026.
Framework
New:
Fixed GetOwnerPackages() for instanced structs inside non-complex properties.
FStructurePropertyNode::GetOwnerPackages() fails at walking up the property nodes for a specific case, and may trigger an ensure. When stumbling upon an instanced struct, GetOwnerPackages() walks up by getting the direct parent.
However, this parent is not necessarily a complex parent (can be a non-object/structure property type). To make sure the walk happens correctly, the case should be handled the same way GetInstancesNum() does (get complex parent of parent).
Added a few virtuals to cosmetic SGraphNode getters.
Useful while adding advanced styling in custom node editors. In some cases it might be possible to avoid overriding engine methods by implementing our own variants, with different names, but not in every case.
Also reusing original methods makes the programmer's intent much clearer - what part of the base class was actually overridden.
Implements experimental Capture Stealing in ITF Input Router.
Updated MathStructCustomization metadata extraction to include InstanceMetadata
This change updates metadata extraction for header row to include InstanceMetadata. It is useful when assigning metadata to Vector/IntVector types via other customizations.
UToolMenu Items will now override any parent Tool Menu Items of the same name.
Positioned Tool Menu Items that fail to be positioned will now be inserted at the end of the section.
Improved reliability of legacy SExtensionPanel support in the new viewport toolbar. Extensions are only enabled when there is enough information to support their existence.
ToolMenus: Adds options for whether a Tool Menu Entry with an insert position that can't find its target should insert anyways and/or log.
Defaults to both inserting & logging.
Disables logging if the ToggleViewportToolbar and ToggleHideViewportUI commands can't find the ToggleFullscreen command in the Level Editor Window menu.
Bug Fix:
Fixed an edge case Blueprint Editor crash on exit.
Fixed an issue where top-level toggle buttons in Viewport Toolbars looked like raised buttons.
Users can now change the derived type on default value instantiations used to initialize a base type reference member in saved instance data when using override serialization.
Fixed the asset reference filtering not working when dropping assets on Material, Niagara Script and Texture Graphs, or on nodes and pins of any asset graph type.
Fixed inconsistencies between drag and drop visual feedback and drop behavior in Animation State Machine, Sound Cue, and Texture Graphs.
Deprecated:
The old Level Viewport Toolbar Panel Extensions are now deprecated. They will be removed in a later version.
Interchange
New:
Reduced memory usage when importing static meshes.
Added a SubdivisionAPI custom schema for specifying per-prim subdivision level.
Added support for array node attributes.
Added support for subdividing static meshes and geometry caches when importing via USD Interchange.
Added more C++ UsdWrapper types and tweaked the Unreal.natvis file to improve how they're displayed on the debugger.
Upgraded MaterialX version to v1.39.3.
Textures imported with non-power-of-2 dimensions or non-multiple-of-4 dimensions were previously automatically set to NeverStream and Uncompressed. This can now be toggled with a config setting :TextureImportSettings::bDoAutomaticTextureSettingsForNonPow2Textures .
Also when textures initially imported as nonpow2 are re-imported as pow2, they now get their settings automatically fixed to the defaults for pow2 textures.
Improved the performance of importing skeletal meshes with multiple morph targets via USD Interchange.
When importing USD stages through USD Interchange, SkeletalMeshComponent prims will be spawned with AnimSequences assigned to them, if any were imported.
Added a "Use Single Bone" option to import a static mesh as a skeletal mesh with top node as the only bone.
If "Force All Mesh as Type" is set to "Skeletal Mesh" and "Use Single Bone" is checked, the imported skeletal mesh will have a unique bone at its origin called "Root".
Added a new option to the USD Export Options dialog when exporting levels to USD called "Export to Nested Sub Folders", which restores the previous behavior of exporting asset layers to a folder structure that mirrors the content folder structure
Interchange: Added support for importing OBJ into level.
Reduced memory usage when importing skeletal meshes.
Upgraded OpenUSD version to v25.08.
Interchange USD can now import groom assets and groom caches.
Added support for dome lights via SkyLightComponents when importing via USD Interchange.
Removed FNavigationOctree::AddNode Warnings during Level Import.
Implemented a Nanite triangle threshold value on the Interchange generic asset pipeline, in order to enable Nanite only for meshes past a triangle count size.
The USD Interchange translator has a new setting for collecting prim metadata as translated node user attributes. It can also specify a regex for filtering of particular metadata fields.
Refactored the LevelSequence handling for USD imports in order to properly support subsections due to references and payload arcs.
Importing via USD Interchange will now reuse generated assets when importing instanced prims.
Added support for OpenUSD on Windows ARM64.
Refactored skeleton handling in Interchange USD to not consider the skeleton prim itself as a root joint, which prevents transforms applied directly to the skeleton from being ignored in some cases.
Interchange USD imports that preserve the pseudoroot node will now produce a top-level actor named after the root layer's display name, as opposed to being always named "/"
Now uses the default static mesh collision profile for static meshes generated via the USD Stage Actor imports.
Bug Fix:
Fixed Reimport not showing skeletal mesh conflicts.
Fixed missing AnimSequence assets when importing animation tracks via Interchange that have a total length below MINIMUM_ANIMATION_LENGTH (of 1/30 seconds)
USD: Editing keys in Sequencer now properly update back to the USD Stage.
Fixed node name collision suffixes appending to previous suffixes, producing names like Cube12345
Fixed actors with identity transform being imported via Interchange with the inverse transform of their parents in some cases.
Fixed imported LevelSequences overwriting others with the same name when importing some very complex USD scenes.
Fixed cameras imported from OpenUSD with fStop of zero so that depth of field effects are correctly disabled.
Fixed incorrect skeletons being imported via Interchange FBX in some edge cases when TransformLinks seem to represent local transforms.
Fixed static mesh collider transforms being incorrect in some cases when importing into level with Interchange.
Fixed some issues with baked skinned mesh transforms when importing skeletal meshes with morph targets via USD Interchange.
Fixed how AnimSequences seemed to have no animation data after using Actions -> Import on the USD Stage Editor.
Fixed issues with using Material Search Location when importing scenes with Material Instances via USD Interchange.
Fixed automated reimports still showing the options dialog when reimporting via Interchange or USD.
Fixed metadata not making it onto actor AssetUserData when importing scenes via Interchange in some scenarios.
Now discards empty LevelSequences when importing from USD.
Fixed SparseVolumeTexture assets not being generated by USD Interchange when importing scenes with volumes if the exact same volume node shows up on the stage more than once.
Fixed a crash when trying to parse USD LodSubtreeAPI schema applied to skinned meshes.
Fixed import of UsdPreviewSurface into Material Instances for USD materials that have output connections to other shader graph or material prims.
Fixed performance bottleneck when importing many lights via USD Interchange.
Fixed some name-prefix-based collision meshes not being correctly used when importing via Interchange in some cases involving name collision.
Can now generate the desired simple collision meshes even if the shape disagrees with the provided mesh data.
Fixed morph target normals and position offsets not being skinned with geomBindTransform when importing skinned meshes via USD.
Fixed how Interchange USD was not using timeCodesPerSecond values when baking skeletal animation tracks.
Fixed incorrect vertex ordering of subdivision surface meshes imported from OpenUSD when their orientation is "leftHanded" and subdivision is enabled.
Fixed a crash when parsing some USD SkelRoots configurations with multiple Mesh prims that contain normals.
Fixed how USD asset imports were persistently disabling the "Import Into Level" option to import actors.
Fixed OpenVDB being imported via USD stages without compensation for the stage's upAxis and metersPerUnit values.
Fixed level exports to USD always using absolute file paths for layer references and payloads.
Fixed Euler flipping issues when importing some USD stages with complex rotation animation.
Fixed invalid skeletons being produced when importing some USD stages with prim names that are not globally unique.
Fixed various issues while importing an asset containing elements named "None"
Fixed support for UDIM textures when opening or importing USD Stages via the USD Stage Actor.
Silence a couple warnings when trying to fetch transforms from Interchange scene nodes with none authored.
Fixed missing actors and assets when importing scenes via USD Interchange that contain sibling prims whose names differ only by character casing.
Fixed a crash when resaving assets imported with Interchange after deserializing them with Interchange disabled.
Fixed HeterogeneousVolumeComponents not refreshing after their SparseVolumeTextures imported via USD Interchange were reimported.
Fixed incorrect skeletal mesh influences when importing skeletons with multiple root bones via Interchange USD.
Fixed various import issues related to using names that resolve to NAME_None.
Fixed risk of missing content when importing FBX containing assets or bones requiring name sanitization.
Fix SparseVolumeTexture assets imported via Interchange USD ending up named as "Null" if the VDB filename itself was purely numeric.
Fixed the handling of some skeletal mesh edge cases via Interchange USD, like nested LOD meshes.
Fix transforms placed directly on LOD meshes being ignored when importing into level with Interchange USD.
Scripting
New:
Exposed FullyLoadPackages/FullyLoadAssets functions to editor scripting via EditorLoadingAndSavingUtils
These fully load the given objects, so that UE no longer has a write lock on their on-disk files (eg, when needing to overwrite the file via an external application).
This is also available in the UI via Asset Actions -> Load, if you hold shift while clicking on Load.
Added support for texture-based tool icons in Scriptable tools.
Added support for setting a custom UUserWidget above the tool details panel of a Scriptable Tool.
Preview Platform Blueprint Functions:
TogglePreviewPlatform: Toggle the Preview Platform On/Off
SetPreviewPlatform: Sets the Preview Platform.
The Preview Platform is set from a list of valid Preview Platforms, the same present in the Preview Platform Menu.
Added a Disable Preview Platform Blueprint Node.
Added a GetDrawableGeometryActor() BP function to fetch the actor that owns any line, point and triangle sets added by a Scriptable tool.
Exposed FTSTicker to Python:
This exposes the superior and safer FTSTicker-based ticking method to Python, and existing Python scripts using the Slate-based ticking methods should consider migrating to use this new method (unless forwarding ticks to an embedded UI framework, which was the intent of the Slate-based ticking methods).
The new ticker callables can be registered via `unreal.register_ticker_callback(...)`, which takes a callable (taking a float delta time, and returning a bool where True means continue to tick), along with the delay (in seconds; default 0) that we should apply between each ticker callback. `unreal.unregister_ticker_callback(...)` can be used to remove a previously registered ticker callback.
Examples:
def run_once(dt): print("run_once") return False # stop ticking
unreal.register_ticker_callback(run_once, 1.0) # call run_once once after 1 second
def run_many(dt): print("run_many") return True # continue ticking
run_many_handle = unreal.register_ticker_callback(run_many, 1.0) # call run_many repeatedly after 1 second delays
unreal.unregister_ticker_callback(run_many_handle) # stop calling run_many
Exposed the ability to include or exclude editor-only references from script asset registry queries
Bug Fix:
Added an encoding fix for PipInstall to force a utf-8 encoding.
Fixed a crash in ExecutePythonScript when Python was disabled at runtime.
Fixed a crash when re-registering Scriptable tools during mode shutdown.
Fixed reachable garbage objects warnings when compiling ScriptableTools containing ScriptablePoint/Line/Triangle sets.
Fixed an issue with accept/cancel/complete actions not firing in ScriptableTools mode.
Fixed 'no world was found for object' warnings when invoking WorldContextObject functions in a Scriptable tool.
Fixed a crash when calling DataTable RemoveRow from editor scripting.
Fixed non-deterministic tool order in Scriptable Tools category palettes.
Added a fix to ensure AssetTools do not call slate functions in headless.
Fixed Python Callback attached to Dynamic Delegate
Editor can now run even if Python is not able to load properly.
UI
New:
Significantly improved the Content Browser column sort performance for large search results.
Updated the Content Browser navigation bar so clicking in the empty space edits the package path if available instead of the virtual path.
Slate drawing optimization: fixed float comparison of the alpha that could send an invisible element to the renderer, for negative or small alpha values.
In the graph editors, right clicking to summon the node context menu now includes the hovered wires connected pins, if any. This allows, for example, insertion of a 'NOT boolean' node on a bool wire in the blueprint editor
Made the "Show Selected" action for actors always visible in the context menu.
SlateIM: Add support for Tab widgets
CommonUI:
Updated CommonWidgetCarousel to be more consistent in its widget caching.
Added an option to determine whether or not to cache widgets at all
Old behavior was to cache widgets in the carousel's RebuildWidget, but widgets added at runtime via AddChild would never be cached.
Currently caching is enabled by default to match the behavior when children were added at design-time, though this could result in increased memory usage in use cases where all widgets were added dynamically.
Added a clockwise ordering option for DynamicEntryBox.
Updated the source control Submit dialog to display full file paths for non-asset files in the Path column.
Waveform editor: Add icons for fade options
Waveform:
Now calculates LUFS and Sample Peak values on audio import, on Waveform Editor open, and on Waveform Transformation changes.
Now displays LUFS and Sample Peak as meta data when hovering over a soundwave in the content browser.
The Path column in the Asset View will now display the package or object path of the row item if available instead of the virtual path.
Redesigned Platforms menu moved from the toolbar to the main menu.
Can now specify a screenshot view rect via FScreenshotRequest::RequestScreenshot:The view rect will be ignored if it is invalid (empty or not within the extent of the render target), or if bShowUI=true, since that takes the slate widget screenshot pathDefault behavior remains the same (to screenshot the whole window)
Enabled 10-bit swap chains on desktop platforms even when the feature level is ES31.
Slate: Modified GetCachedWidget:
GetCachedWidget now returns the Widget returned by RebuildWidget.
GetWrappedWidget returns the Widget return by RebuildDesignWidget if available. Otherwise, returns the widget returned by UIComponents via RebuildWidgetWithContent.
Added InitializeInEditor function to UserWidgetExtension and WidgetBlueprintGeneratedClassExtension to be able to support proper initialization in Editor for Extensions.
Added utility functions to query private states in the widget.
UMG Bindings: Added a new Conversion Function SetVectorParameter that takes a FColor and converts to FLinearColor.
Added support for package path suggestions to the Content Browser navigation bar.
Added support for navigating to C++ class package and object paths entered into the Content Browser navigation bar.
Optimized the font shaping process when using complex shaping (typically for Arabic).
Added a Python script for generating an html color palette for the FColorList class.
Updated mouse capture and high precision mode handling on Windows to save up to .5ms on redundant API calls
A UFont can now be a wrapper around FCoreStyle::GetDefaultFont(), for use with editor UI.
Added a CVar `Slate.UseSharedBreakIterator` to support shared ICU Break Iterators to reduce CPU usage. False by default.
Added new Header and ToolHeader sections to the ToolkitBuilder.
Added support for MVVM Bindings in asset diff tool.
Exposed world context pin on MVVMViewModelBase. This allows blueprints on a Viewmodel to access world subsystems (assuming they have an object they can use to resolve the world context).
Add SetLazyContentWithCallback to CommonLazyWidget to improve async usage in blueprints.
Add blueprint function, SetViewModelByClass, for setting VM by class on a widget directly to simplify usage.
Exposed a setter for CategoryToolbarVisibility in FToolkitBuilder.
Bug Fix:
Fixed a regression where Toolbar buttons with a combined options menu did not display that options menu when the toolbar button was clipped.
Fixed an issue where Spline-related UI elements were displaying XYZ axis labels and tooltips even when the editor was running in LUF coordinate mode.
Details: Updated the context menu and details panel for Splines so that axis labels, tooltips, and action names now correctly reflect LUF when active.
This includes context menu areas like SnapAllToSelected, SnapToLastSelected, and SetLockedAxis (temporarily disabled).
This also includes Details panel areas for Spline settings like Selected Spline Nodes Location, Rotation, Scale, Arrive Tangent, Leave Tangent, and Up Vector Logic was added to ensure these UI elements are now dynamically aligned with the current coordinate system.
XYZ (FLU) remains the fallback when LUF is not enabled.
UMG Sequencer: Fixed 2 issues.
When adding an event track as the first item in a widget animation, the duration of the animation would reset to 0, and notably the playback range start would be set to exclusive (range as (0,0)). This would persist after the length changed, for example to (0,500), meaning that any items placed on the 0 frame, such as events, would never evaluate.
When not encountering the above issue, items placed on the 0 frame would evaluate twice. This was due to a refactor to the way widget animation would playback.
Fixed the Asset View Type column sorting by the full class path rather than the display name that is displayed.
UMG:
Fixed named slot content not saving for named slot instances of widget blueprints that extend widget blueprints.
Fixed CDO de-sync with root widget property changes.
Added a fix to avoid crashes in cases of re-entrancy.
Various fixes for widget animations:
Fixed a crash caused by the runner being invalid for an unknown reason.
Fixed iteration of active animations that can grow during that iteration.
Fixed iteration of animated widgets that can grow during that iteration.
Fixed first and last frame evaluation of animations - Don't tick the widget on the first frame, wait until the next frame. The flag for that was lost during the animation refactor in 5.6 - Fix the evaluation time for when stopping which should indeed be the first frame of the playrange, not frame 0. This was incorrectly ported during the animation refactor.
Fixed how we consume the current animation time on play, to prevent events at frame 0 from firing twice.
Double clicking on a color key in the timeline now correctly opens the color picker.
Fixed an inconsistency in the Viewport right-click context menu, where the Transform options were always ordered according to FLU rather than the expected LUF, even with LUF coordinate system in use. Behavior is now consistent and context-aware across coordinate systems.
Can now pick struct type when class type picking is enabled, eg, from within the Data Table editor
UMG Designer:
Fix to FWidgetBlueprintEditor::SelectObject to support UObject selection. Fixes a nullptr access when a property was changed in the detail panel on an object that is not a UWidget.
Fixed a crash in Drag and Drop operation. Added more checks around calls to GetCachedWidget that can return a null object during drag/drop and move operation.
Fixed a crash in UMG Designer Replace widget context menu operation in the Hierarchy panel. This happened when using the replace function with a User Created widget selected in the Palette panel.
Optimized the widget editor's palette to reduce refresh cost in large projects.
Fixed virtual texture thumbnails sometimes showing the wrong texture.
Fixed an issue where screen-space widget components wouldn't render for players other than player 1 if splitscreen is disabled. There is now an option (ShowAllPlayerWidgetsWhenSplitscreenDisabled) to overlay the player layers, instead of culling out all player layers except for player 1.
Fixed a regression that caused the editor to crash when attempting to place a cooked Actor-based Blueprint class via drag/drop.
Fixed a memory leak when trying to trigger the display of a FCanvasBatchedElementRenderItem without a primitive to draw.
Fixed an issue where SearchableComboBox couldn't be set back to the same value after resetting to default.
Fixed an issue where SCommonButton wouldn't release when it loses focus
Fixed a rare crash in SlateRHIRenderer due to both main thread and render thread possibly writing to the same arrays simultaneously.
Fixed a situation where the Asset Dialog hotkeys either didn't function, or operated on the wrong widget.
Slate: Fix SStackBox not respecting the Orientation slate arg.
Fixed various possible crashes and bugs when importing offline fonts.
Fixed Content Browser columns appearing as sorted after you click on their headers in the column view even when they are no longer the active primary or secondary sort columns.
MetaSounds WaveAsset: Removed create new asset actions for unsupported assets.
CommonUI:
Fixed not being able to click buttons with Virtual_Accept while binding hold actions to Virtual_Accept.
Ensure UCommonInputPlatformSettings load is done at the right time to avoid a synchronous load flushing async load request. Now PostLoad will be called as expected for all UPlatformSettings.
Fix persistent action bindings not always being registered as persistent actions.
Fixed custom dialogs non-deterministically aligning their buttons.
Fixed an issue where FQuat variables always displayed with the name "Rotation" in the details panel, regardless of DisplayName metadata or the variable's actual name. This fix ensures that the intended name is respected and shown properly in the UI.
Fixed a typo in BoxElem.h
Prevented Pin Value Inspector Tooltips from using global invalidation, as it can cause broken tooltips or crashes in some scenarios.
SlateIM:
Fixed a case where child rows would not get removed when no longer drawn.
Fixed Viewport roots preventing mouse input for the whole viewport.
Fixed an issue in the ListView Widget where OnEntriesGenerated would fire for each entry instead of firing once all entries are generated
Fixed a crash in SObjectWidget OnFinishedPointerInput missing CanRouteEvents that causes nullptr access.
Fixed Message Log not displaying when failing to save packages.
PropertyPermissionList: Fixed buttons not appearing for functions marked CallInEditor details panel unless added to AllowList explicitly.
Fixed an issue where users can't type polish letters s and a (with a tail) into the text input.
Fixed an issue with Slate Screen Reader at initialization of the plugin.
Add missing validation check with enabling or disabling SWindow.
UMG Viewport: Made sure we EndPlay on the preview world during teardown.
Deprecated:
Deprecated SCustomDialog VAlignButtonBox since it didn't affect the button layout, but could result in the button rendering outside the dialog if VAlign_Center was used.
UX
New:
StylusInput: Added MacOS support.
Change the default of bUseLinkedOrthographicViewports to `False`.
Simplify the camera speed settings to just expose the camera speed. Min/max values are still exposed in settings.
Slice graph connections by alt+middle-mouse dragging in the graph editor.
Fix a bug where viewports could control the movement of a locked actor in a different viewport.
Added support for direct manipulation of editor viewport orthographic near & far planes.
Added a new Editor Viewport Depth Bar that provides visual control over those planes.
FDateTimeStructCustomization now has a tooltip. Hovering over a DateTime property's text box in the editor provides a hint at the format.
Disabled use of a Template SoundWave, can be re-enabled in Editor Preferences->Audio Editor Per Project Settings.
Switched to camera-relative vertical panning by default. Add an option for world-based vertical panning.
Waveform Editor: Instated Waveform editor as the default SoundWave editor.
Splits viewport panning logic so that the middle mouse button and the left+right mouse button gestures are distinct. Middle mouse can be camera relative (and continues to be so by default) while left+right mouse button always move up and down.
Outliner: Added visibility function versions that work on the selected actor's hierarchy and set H to default to toggle selected hierarchy.
Asset Picker Size Scaling as Editor Preference: Added the Editor Setting "Scale Asset Picker Widget Size" to allow the size of asset pickers to be scaled up or down.
Added a new "Toggle Selected Actor Visibility" command & behavior. This command takes the default "H" binding from "Hide Selected Actors". The command:
Hides selected actors if any actors in the selection are visible.
Shows selected actors if all actors in the selection are hidden.
Does not affect selection.
Show template projects from all plugins:
Problem:
New Project dialog only listed template projects from enabled plugins Users couldn't see or start from templates included in installed but disabled plugins.
Empty/invalid background image paths in template categories showed broken visuals
Solution:
Updated search to include template projects from all discovered plugins Added warning icon + tooltip for templates from disabled plugins.
Selecting a disabled plugin template shows a warning/error box that the plugin is not enabled.
Warning is non-blocking (no modal), project creation proceeds after user confirmation.
Notes:
Keeps behavior lightweight.
Surfaces risk (no additional modal asking to confirm creation) but doesn't block flow.
Bug Fix:
Ensured that the "Hide Selected At Startup" action now correctly applies to all selected actors, regardless of their current visibility state. Previously, actors that were already hidden were skipped by this action. With this change, both visible and non-visible actors will be consistently marked to start hidden on load.
Foundation
Build
New:
AssetManager, AssetRegistry: Add Property AffectsCookRule to ManageReferences.
Extended the AddExternalImportValidation of missing UClass imports to validate imports of all native types.
Added support for the 'Activate' flag in PluginReferenceDescriptors. This fixes an issue where the 'Activate' flag would be deleted from plugin descriptors when running some UAT programs.
IncrementalCook is now enabled for DLC cooks, but for DLC cooks it is still experimental and is not yet robust.
UHT: Added support for engine version comparisons as preprocessor conditions.
Prevented Clang builds for Windows from launching multiple link jobs simultaneously to avoid memory exhaustion.
Bug Fix:
DLC Packaging: Fix missing .upluginmanifest when packaging without -DLCPakPluginFile.
With the plugin manifest present the output folder from a DLC package can be copied into a packaged game as-is and will load through the default plugin discovery and loading process.
SavePackage: Fix errors in IllegalReferences diagnostic; it now more accurately finds the object and property that caused the illegal reference.
Core
New:
Added UE::CFloatingPoint concept.
Added value hashes and sizes to DDC replays
RemoteObjects:
Transactional RPCs can be rescheduled per Actor. This means the transaction can abort and try other transactions while we wait for needed dependencies to service the RPC.
TimerManager now has some limited transactional support.
Exposed GetClass that may skip migrations when used with FRemoteObjectId.
Exposed GetRemoteId() on TWeakObjectPtr
Distinguished between Loaning out an Object and Reassigning a Borrowed Object. This helps clarify some situations, particularly where you're sending an object and maintaining ownership you can just check if you're Loaning it now, because ReassignBorrowed is now a separate case (which means another server has borrowed it, but you never owned it).
Allow third-party crash handling to use `FAdditionalCrashContextStack`.
Default WindowsPlatform.bClangStandaloneDebug to true. This slightly increases pdb size when compiling with clang, but improves debugging experience.
FStateGraph and FStateGraphNode no longer timeout if -NoTimeouts is provided on the command line.
Added [[nodiscard]] to mutex functions.
Added [[nodiscard]] to TLess, TGreater and TEqualTo.
Optimized TCppStructOps vtables to only include functions that will be called. This now prevents users from making UScriptStruct or TCppStructOps a friend in order to allow your class only constructible by the CoreUObject system.
Refactored FInstancedPropertyBag's CopyMatchingValuesByID function to allow the caller to provide a matching function. Added CopyMatchingValuesByName that matches properties by name instead of ID.
Added FRecursiveWordMutex to support very early and/or very late recursive mutex usage.
Removed LLM dependencies on FCriticalSection and FRWLock.
Eliminate static log records in the absence of source location and log tracing to reduce program size.
Made mutating EnumClassFlags functions usable in constexpr contexts.
Added UE_LIFETIMEBOUND to TValueOrError.
Exclude trace state when log trace is disabled and optionally compile out source location from logging to reduce program size.
Use Yield() instead of YieldThread() when spinning in mutexes to improve performance under heavy system load.
Optimized ParkingLot::Wait when there is no timeout.
Added UE::CContiguousRange and CPointer concepts.
Added CCharType concept and applied it in TStringView.
Added Max() functions to sets and maps - and TSparseArray which is needed for sets.
Replaced TSortedSet's O(N^2) Append with an O(N) (at best) or O(N log N) (at worst) and added tests.
Added some basic TSet tests, based on the existing TMap tests.
Specialized FPlatformManualResetEvent for each platform that we target.
Added FOutputDeviceFence to support lifetime management of dynamic log records
Updated debug visualizers for TDeque, supporting visualisation of elements when the container is set up to use a different allocator such as TInlineAllocator or TFixedAllocator.
Add explicit nullptr constructor/equality operators to TWeakInterfacePtr Mark functions in TWeakInterfacePtr [[nodiscard]]
Fixed overallocation for unused null terminators in TStringBuilder.
Added TFunctionWithContext to adapt a callable into a function pointer and context
Improve accuracy of GC time limit by setting object destroy granularity to 10 (instead of 100) and provide a way for it to be tweaked per project with gc.IncrementalBeginDestroyGranularity.
Optimized ParkingLot callback code generation
Updated UE::Core::Private::StringLength to use TCString::Strlen outside of a constant-evaluated context, to speed up compile times with MSVC.
Added UE_IF_CONSTEVAL and UE_IF_NOT_CONSTEVAL.
Updated Oodle to 2.9.14.
Used InitializeCriticalSectionAndSpinCount to avoid an extra function call during construction of FWindowsRecursiveMutex.
Added CConvertibleTo concept mirroring std::convertible_to.
Added a configurable intrusive unfair non-recursive mutex.
Added TInstancedStruct::NetSerialize function.
Removed contention on root flags when pinning weakobjectptrs.
Improved the logging backlog to minimize the number of missed log lines during the initialization.
Added TLogTemplate and control over log template allocation.
Added IsLocked and IsLockedShared to the mutex types.
Add Async.ParallelFor.DisableOversubscription which if enabled will only use existing threads which can be faster when cores are saturated.
Added support for nested $format in structured log formatting.
Added Intel OneAPI and Microsoft Clang 19 HWPGO integration.
Added an ExecFileOverride resource to BootstrapPackagedGame.
Optimized FLazyName to support constant initialization.
Deflate, gzip & lz4hc compressors now honor COMPRESS_BiasSpeed and COMPRESS_BiasSize
Added TExternalStringBuilder and support for TStringBuilder<0>
Improvements to GameFeaturesSubsystem and FPluginDescriptor:
Added a new hook to PluginDescriptor to allow customized loading of uplugin json data.
Updated GFS to ensure that, at least in the editor, we will try to use the PluginManager's copy of the plugin data rather than re-reading it and deserializing it from json ourselves. This is necessary to take advantage of the customized loading.
Enabled custom crash handling for GPU crashes.
Optimization for FSoftObjectPath::ResolveObjectInternal to avoid the round trip to/from string.
Add a console command, core.ResetEnsureState, to reset the ensure state so they fire again. This will cause all non-always ensures to trigger again if they've already been suppressed.
Reduced memory use by FOutputDeviceFile by 992 KiB in the default configuration.
Added better error messages when TLess, TGreater and TEqualTo when used with a type without the corresponding operator.
Now validate LinkerSave unmapped objects against the package harvester excluded object list. This removes the limitation of asserting when FindObject is called while GIsSavingPackage is set.
FPaths:CreateStandardFilename: changed behavior to normalize paths that cannot be standardized: .. is collapsed when possible.
Added UE::CNotCVRefTo concept.
Removed dependencies on ParkingLot from Windows stack walking
Made the MSVC implementations of FPlatformMath::CountLeadingZeros and FPlatformMath::CountTrailingZeros constexpr.
Added format string validation to LowLevelFatalError.
Added UE::CStringViewable and UE::CCompatibleStringViewable concepts.
ThinLTO is now enabled by default for Clang based toolchains.
Added an experimental plugin, Global Configuration Data, that can be used as a single point of access to data that may be provided from different systems.
Can be used to have console and config data added to blueprints without additional code.
Additional data routers can be registers to expand on what data sources are available to the system.
Added UE::CArithmetic concept.
Added UE::CCompatibleCharType concept and some usage in TStringView.
Added UEOps.h to aid in the correct generation of all binary comparison operators based on a couple of simple member function definitions.
Replaced the UTF8CHAR enum with C++20's char8_t.
Added checks for non-trivially-relocatable types being used in containers, particularly FGCObject-derived types.
Added UE_REWRITE, a replacement for FORCEINLINE intended to be used on macro-like functions (rather than for optimization) by 'rewriting' a function call as a different expression.
Enabled override max printed reference chains via `gc.MaxReferenceChainsToPrint` Cvar.
FVector2D deprecated comparison operators (from 5.2 onwards) removed.
Remove deprecated FLinearColor methods, deprecate unused DXT block structs.
Enabled TSharedPtr and TUniquePtr to be usable as keys in sorted containers, and TUniquePtr to be usable as keys in hashed containers.
Added std::initializer_list support to TSparseArray.
Fixed UPS cooking indeterminism for TBox[2] structs on stack Make ForceInit constructor zero out padding.
Fixed managed storage handle attempting to resolve an unmanaged file more than once after the manager becomes active.
Added UE::CDerivedFrom concept.
Added debug visualizers for UE::Math::TVector2<> and FDeprecateSlateVector2D.
Extended `gc.PerformGCWhileAsyncLoading` to provide the option to garbage collect while async loading, only when low memory is detected (based on gc.LowMemory.MemoryThresholdMB).
Package flags are now thread-safe.
Add TargetRules.bIdenticalCodeFolding setting (--icf=all).
Added intrusive unset optional support to TNotNull.
Added a benchmark for mutex types.
Added CSameAs and CDecaysTo concepts.
Added UE::CIntegral concept.
Added tests for Algo::StableRemoveIf.
Added configs managing how GenericPlatformMallocCrash handles allocation requests on non-crashing threads, allowing them to permanently suspend on allocs/frees, suspend on allocs and skip frees, or process as normal.
Removed dependency on FCriticalSection and ParkingLot in memory allocators.
Retry in the shared mutex TryLockShared while there is not an exclusive lock.
Added support for joining non-contiguous ranges in TStringBuilder.
Added support for optional sub-object references in localized structured log formatting.
Reduced codegen impact of ensure() macro.
Added an overload of CreateLogTemplate that takes the format as FText.
Added support for $locformat in structured log formatting.
Added NotNullGet for retrieving the inner value from a TNotNull without an explicit cast.
Experimental Visual Studio 2026 support.
Added a new experimental API: SpringMath:
This includes some useful functions for critically based spring damping
Added experimental blueprint library for spring math to expose functions to BP
Added SpringMath::ExponentialSmoothingApproxQuat to mirror the existing function FMath::ExponentialSmoothingApprox.
Added support for creating Property Bag Placeholder types for entity prefabs.
This is done via a new table added to package files: ImportTypeHierarchy table.
Each entry of that table contains hierarchical information for every FObjectImport entry that is a type (e.g., UClass).
This is the second part of a 2 part change. The first change introduced the package file header change along with the object version bump.
This change adds the remaining logic to save/load the new table and the change to use it when creating placeholders.
Added support for AVX10.
Added write helpers to RapidJsonUtilsAdded UE::Json::WriteCompact and UE::Json::WritePretty, to write a UE::Json::FDocument to a FString in either compact or pretty form.
Added UE::Json::MakeStringRef and UE::Json::MakeStringValue to help convert a FStringView to a UE::Json::FStringRef or UE::Json::FValue when building a JSON DOM.
Added some additional aliases to UE::Json that are needed when building a JSON DOM.
Switched UE::Json aliases to use the UE FMemory allocator, rather than rapidjson::CrtAllocator.
Added --prioritize-dependency-scanning SN-DBS build option.
Added `FNonshrinkingAllocator`, which changes the shrinking policy to No by default.
Added hidden MetaData works for base structs in Instanced Structs.
Cooker:
CookPackageSplitter: Changed the return value of GetGenerateList to a struct (and changed the name to ReportGenerationManifest) so that generators can request that the package containing the generator be not saved.
Deprecated the ability to run the cook inside the editor process when launched from editor. The cook instead should always be executed in a separate invocation of the CookCommandlet. This has been the default since 5.3, and we are now deprecating the ability to change that default and will remove all support for it in 5.9.
Added the following commandline arguments:
-cookshowremaining
-cookshowpackagenames
-cookshowinstigators
These provide a clearer behavior than -dpcvars=cook.displaymode=1|2|4.
Each flag can be specified with a value: -cookshowremaining=1|0, or with no value, defaulting to 1: -cookshowremaining.
These flags override whatever value has been assigned via config or -dpcvars commandline.
Introduced a mechanism for render asset updates to be abandoned by owning `UStreamableRenderAssets` so `UStreamableRenderAssets` can be garbage collected independently (See r.Streaming.EnableAssetUpdateAbandons). Abandoned render assets are ticked during GC or every streaming update if r.Streaming.TickAbandonedRenderAssetUpdatesOnStreamingUpdate is true (defaults to true).
Bug Fix:
Changed FMonotonicTimeSpan::IsInfinity() to stop matching negative infinity.
Fixed FMath::FindDeltaAngleDegrees and FMath::FindDeltaAngleRadians for input deltas outside [-540, 540] degrees.
COMPILE_WARNING reports as error when WarningsAsErrors is being used.
Fixed a potential infinite loop in the serialization of packed ints when loading malformed values.
Fix potential deadlock in the scheduler if a foreground task is scheduling a background one.
Fix potential deadlock in object annotations because of 2 different locks used in different order.
Made -VerifyGC and -NoVerifyGc take all verification cvars into account.
Fixed invalid access to memory location error in UnrealBuildTool.
Made sure that pinned UObject are preventing GC of clusters they are part of.
Fixed composite EPackageFlags not being shown in the debugger, caused by non-power-of-two enumerators.
Fixed _GetUObjectPacked intrinsic for debug visualizers. This addresses an issue with visualizers for weak object ptrs not working in builds where UE_ENABLE_FUOBJECT_ITEM_PACKING == 1.
Made TBox's InverseTransformBy and TransformProjectBy both check for box validity before transforming (matching TransformBy).
Fixed issues trying to load redirected native classes using the StreamableManager (and AssetManager).
Fixed a bug in GC timing where if it destroyed exactly 100 objects in a frame it could cause a large stall.
Fixed many log categories having a default verbosity higher than their compile-time verbosity.
Fixing a crash in CppStructOps caused by unloading a dll at an inopportune time resulting in a dangling pointer to a vtable.
Fixed TMemoryWriter IndexSize to be a bit count.
LaunchEngineLoop: Fixed a copy paste mistake in the error message, it now correctly identifies that it fails to load the Game Engine class instead of the Editor Engine class when instantiating GEngine.
InstancedStruct: Fixed the operator= when copying from a TConstStructView.
The loader will now flush any remaining async loads before PreExit to avoid async loading to perform operations past the exit point.
Fixed UE_STATIC_ASSERT_COMPLETE_TYPE for zero-sized arrays.
Enabled seeking to the end of a response body without returning CURL_SEEKFUNC_FAIL in the Curl implementation in DevHttp module.
Fixed UI layout for a particular view of the crash report dialog where the screenshot preview can cover button controls.
Fixed clang miss-leading indentation warnings.
Checked zlib init and shutdown for errors.
Cleaned up usages that expect nullptr_t to be in the global namespace.
Fixed StaticDuplicateObject when Source Object class and Destination class are different.
Fixed crash when loading content from corrupted pak or optional segment files.
Disabled nuget audit for the dotnet Development configuration to prevent unactionable dotnet build errors.
Force synchronous writes on type library input files.
Fixed pipe and task timeout calculations that generated bad code.
Deferred invoking the class initializer on duplicated objects until after subobject instancing has occurred.
Disable 'C4702: unreachable code' when use bUseInlining is disabled.
Fixed potential race condition in FConfigCacheIni::ForPlatform adding plugins without holding the lock.
Fixed text import of delegate properties with full object paths, and made FDelegateProperty consistent with FPropertyMulticastDelegate on text export.
Added static_asserts to TValueOrError to ensure that it's not instantiated with references.
Fixed a FARFilter with only WithPackageFlags or WithoutPackageFlags set failing to return any assets from IAssetRegistry::GetAssets(...).
Avoid TInstancedStruct::GetPtr/GetMutablePtr and TStructView/TConstStructView::GetPtr crashing when the underlying struct data is incompatible with BaseStructT
This will now ensure instead, though will still perform the bad cast in a shipping build, so any ensures need to be fixed!
Fixed TStringView::CopyString for copying an empty range.
Fix a missing test of MaybeWaitingFlag in FManualResetEvent before parking the thread.
Fixed Algo::RemoveIf calling the predicate too many times in some cases, and added some tests.
Rehashed map and set properties after instancing key subobjects in their overrides of FProperty::InstanceSubobjects.
Disabled AutoSDK for LowLevelTests targets.
Fix thread scheduler to properly apply the cvars TaskGraph.UseDynamicPrioritization, TaskGraph.UseDynamicThreadCreation, and TaskGraph.OversubscriptionRatio which can be used to modify thread performance.
Adding -nocrashreports support for windows. When provided, we will log crashes/ensures/etc but will not perform more complex reporting that could risk hanging on a file pipe.
Reimplemented TVectorRegisterType with partial specializations rather than std::conditional_t to work around alignment issue using Clang on Windows.
Disabled custom property lists during native struct serialization.
Fixed a race waking threads in FSharedMutex and FSharedRecursiveMutex.
Added workaround for getting an array reference element from an rvalue tuple under MSVC.
Deprecated:
Deprecated Alignment in TStaticArray and fixed UB behavior in it's GetData. Made TArrayView and Invoke constexpr.
Deprecated TSortedMap::GetMaxIndex, fixed TSortedSet::GetMaxIndex and correctly commented TSet::GetMaxIndex and TMap::GetMaxIndex.
Deprecated public and protected ways of initializing TStringBuilderBase from a buffer.
Deprecated member TFunction::CheckCallable which was never intended to be public.
Deprecated TIsConst.
Deprecated PLATFORM_COMPILER_SUPPORTS_CONSTEXPR_BUILTIN_FILE_AND_LINE.
Replaced bExactClass with EFindObjectFlags in the FindObject family of functions.
Deprecated the original log template API.
Delete FCbFieldIterator::MakeOwned() to avoid breaking the iterator.
Dev Tools
New:
Added compile warning argument ordering.
Wildcard support in project sections of UGS ini files.
Improved the summary outputs of UnrealPak. The units of memory now scale with the number of bytes making it easier to read for both smaller and larger containers.
UBT DefaultBuildSettings:
Build Settings V6 now applied to wundef.
Default Build Settings Updates for Targets - V6 - engine.
BuildCMakeLib: Added support for building third-party projects with CMake using the Ninja build system.
Adding capabilities to the warning defaults, cleaning up tests, adding more warning+error strings for easier long term adoption & toggling.
UHT will flag U macros (i.e. UCLASS) found in skipped blocks of code as deprecated. This will be made a warning in a future version of UE.
UBT Editor: Added graceful messaging for Target upgrade requirements on editor path.
Emit the target build settings version & build environment to target file for editor runtime consumption.
Consume target file metadata to improve error messaging for Target versions.
Bug Fix:
Fixing a bug where UAT could hang waiting for output. We now log a warning instead.
Shaders: Fixed the shader pipeline skipping work if the number of shaders to compile is less than the number of tasks available.
Fixed an issue where if a TInstancedStruct is used as a function argument, Clang platforms would fail to compile.
Fixed BuildCookRun to include base build .sig files when generating patches.
Updating UHT to once again generate an error when a USTRUCT contains more than one base.
Fixed an issue in UnrealVS that could cause UnrealVS.P4->History to open an empty window
Updated UnrealVS - Includes fixes to test discovery and execution
Corrected define usage (UE_BUILD_SHIPPING vs UE_SHIPPING)
Fixed UHT parser issue where if FArchive is forward declared when used in the Serialize function declaration, UHT would fail to generate the proper code.
Fixed inconsistent exception logging in Gauntlet.TestExecutor. It now consistently uses Exception.ToString().
Fixed issue in UHT where it was allowing a USTRUCT to have multiple USTRUCTs as base classes.
Fixed a bug where presets would be added to the global sync filters if the tab with the preset had its sync filter view opened and the okay button pressed.
Fixed UGS not showing investigations as "resolved" when using Horde's metadata endpoint.
Fixed destination files potentially not having the correct permission during SafeCopyFile in UAT, on non-Windows platforms.
Horde
New:
BuildHealth Server Build: Added JobSummary telemetry.
Hashed issue handler will now automatically check for a file property in the event's structured logging, and use that data in suspect finding. This should lead to suspect changes being identified more accurately, but relies on emitted warnings and errors including file metadata.
Analytics:
Added a Build Health Dashboard View that shows step outcome history for selected templates & streams.
Add ExternalIssueKey & Fingerprint to the telemetry payload for issues. Also includes AnalyticsIntegrationTests.
Added example of implementing a new Secrets Provider for Azure Key Vault. This secret provider is experimental and provided as an example of how to implement a custom secret provider.
Added Secrets plugin configuration option WithAws that controls if the AwsParameterStore provider is enabled.
Added new Secrets API api/v1/secrets/resolve/ that resolves a string to a property value of a secret. For example the string horde:secret:SecretName.PropertyName would resolve to the value of PropertyName for the secret SecretName.
Only commits with Code CommitTag are considered when searching for Compile issue suspects.
Removed the unused Password property from EpicGames.Horde.Streams.IWorkspaceType.
Added the attribute ResolveSecret that allows properties in the Global Config to be resolved to the value of a Horde secret during configuration load.
If the property's value is of the form horde:secret:SecretName.PropertyName then if a secret SecretName exists and has a property PropertyName it will be replaced with the value from the Horde secret.
This allows sensitive configuration properties to move out of the configuration files to an external secrets provider such as AWS or HashiCorp Vault.
New: Updated the Password and Ticket properties for the Build Config's PerforceCredentials property to use the attribute ResolveSecret allowing Perforce credentials to be moved to an external secret provider.
Changed build graph updates where a node that is skipped but modified does not fail the whole build. This allows the build to continue with only dependent nodes being marked as skipped while non-dependent subtrees can continue to run.
Replaced the deprecated code coverage tool JetBrains.dotCover.GlobalTool with JetBrains.dotCover.CommandLineTools.
Added to the Stream Config a StreamTags property, which is a set of name and Boolean pairs; and to the Schedule Config a Condition property.
The Condition property can be used instead of the Enabled property to control if the scheduled jobs for a stream should be enabled.
Each stream tag will have an environment variable named after it with the UE_HORDE_STREAMTAG_ prefix and a value of True or False, which can be used in BuildGraph script conditions.
Fixed an issue where capabilities for agents was missing their RAM capacity.
Updated Temp Storage to allow the maximum number of exports to write in a single request to be configurable from the agent settings. The new option is TempStorageMaxBatchSize and defaults to a value of 20. Modified from contrib .
Bug Fix:
API encounters ".NET type System.Text.Json.JsonElement cannot be mapped to a BsonValue" on swagger API invocations.
Fixed an issue where GetNext for ScheduledDowntime would return the previous downtime.
Fixed an issue where the log for the Downtime Service would print the next downtime being in the past when an expired non-repeating downtime was in the global config.
Server Tests: Fix the DatabaseIntegrationTest class to properly forward dispose calls to the mongoDBRunner.
BuildHealth Server: Exposed DateUtc on GetCommitResponse.
Fixed an issue where capabilities for macOS agents was missing information for:
CPU number of logical cores.
CPU performance and efficiency cores for Apple Silicon.
GPU name and core count.
User name, domain name and running as administrator.
Fixed an issue where the Notices Get method would not return the start and finish times, and if the start and finish times are set then set the active value accordingly.
Insights
New:
Adds pre and post state change callbacks for TraceLog channels. Allows instrumentations to deny state changes and provide a reason for the denial, as well as performing actions when a channel is enabled or disabled, such as sending initial state, resetting tracked state or activating tracking.
Added a method of creating a TraceAnalysis session using a custom data stream.
Added an ability to copy a tooltip value to clipboard from the bookmarks track.
The PlatformEvents channel now uses callbacks to deny enabling channels and provide user feedback, if requirements are not fulfilled.
Added support to save data traced via the Direct Trace mode to disk. FDirectSocketStream can now accept an optional FArchiveFileWriterGeneric used to write the data to disk.
Added support for Frame Start and End Misc Trace events in the minimal trace API.
Added config variables to provide variable trace log write buffer size and prevent writer sleeping. This helps prevent the write thread from getting saturated under heavy load.
Increased version of Unreal Insights to v1.08, for the UE 5.7 Release.
Improved management of TraceLog worker thread in various scenarios. The worker thread can now be started on demand.
Bug Fix:
Fixed a startup deadlock when launching with -trace=memory without tracehost or tracefile.
Fixed an issue where FTraceAuxiliary::Relay did not respect the Options parameter provided.
Fixed an issue due to Trace gap detection using three sync points. Previous logic used two sync points to calculate gaps, but the engine sends out three. In some scenarios this caused an error in gap detection which meant a higher serial was chosen as the next serial. This would leave much of the trace data unprocessed.
Framework
AI
Bug Fix:
Fixed an issue where selecting subnodes would result in the currently-edited property value to be discarded instead of applied.
AI Behavior Trees
Bug Fix:
Fixed reinstantiation for Blueprint-based nodes using blackboard key selector.
Fixed Blueprint reinstantiation issues with some BehaviorTree types.
AAIController::UseBlackboard: Fixed to correctly return the result of trying to initialize the Blackboard.
Changed InstanceIdx to use a const int32 to prevent a need for IntCastChecked to prevent possible data truncation.
AI Debugging
New:
Added possibility in Rewind Debugger tracks to override the default behavior to step backward and step forward commands.
VisualLogger log entry initialization can now also assign a valid location for components. With this change, double-clicking on such an entry will bring the camera to that location instead of the world's origin.
Fixed GameplayDebugger local-multiplayer render duplication.
Bug Fix:
Fixed ever growing buffer in FVisualLoggerBinaryFileDevice when VisualLogger is not set to record to file.
Fixed debug draw helper functions and SmartObject visualization to properly handle scaled DPI.
AI EQS
New:
EnvQueryTest_GameplayTags: Added searching for tags container in actor's components if actor itself doesn't implement IGameplayTagAssetInterface.
Upgraded the description details of the UEnvQueryTest_Pathfinding test to better reflect its behavior in EEnvTestPurpose::Score mode.
Bug Fix:
Fixed blueprint reinstantiation for EQS types
AI Navigation
New:
NavLink Generation:
Added a name property to generation configs, and JumpMaxDepth can now be negative.
Activated the "enable" property now that multiple configurations are supported.
Added multiple link configurations for generated navlinks.
Added LinkGenerationSelectedConfig to debug a specific config.
Improved trajectory ground sample debug display.
GameplayDebuggerCategory_Mass: Now draws a purple circle around entities that are LOD off.
AsyncNavWalkingMode can use navmesh normal instead of physics hit normal.
Now always take the highest hit location in z when searching for ground location.
Mass Navigation:
Added text to MassNavigation::Debug methods.
Added an option to avoid slowing down when steering.
Added a MassSceneComponentVelocityTranslator to copy velocity between mass entities and actors.
Updated NPC desired movement based on current velocity when in animate mode for root motion driven NPCs. This helps with smooth blending into animated states from steering when character is root motion driven.
Added navmesh path boundaries to mass gameplay debugger.
Added logs in the navigation flow.
Mass Entity: Fixed an infinite loop caused by loop variable overflow ().
NavMesh: Added a navmesh tile building optimization when using CompositeNavModifiers with lots of data.
Mass Navmesh Navigation: Increase default corridor width used by FMassNavMeshPathFollowTask.
Pathfind: Changed warnings to logs when InitPathfinding can't find a polygon at the start or the end location.
Removed deprecated 5.4 navigation code.
MassNavMeshPathFollowProcessor: Improved logging information and clamping distance on the closest segment.
MassNavMeshPathFollowTask: Removed overlapping points when building a corridor.
Mass Navigation and Avoidance:
Made a fix to apply max speed in UMassApplyForceProcessor.
Added debug to display standing entities in mass avoidance.
Pathfollow -> Made a fix to keep the steering force when near the end of a path (we want to apply the fade only on the avoidance forces).
Used stronger avoidance forces when getting out of environment boundaries.Added an optional tag to prevent moving backward while avoiding.
Navigation: Added in the output log information regarding invalid pathfind requests and changed log verbosity from error to warning.
NavigationSystem: Replaced legacy repository unregisternavrelevantobject method with UnregisterNavRelevantObjectInternal.
Bug Fix:
Navigation:
Fixed a crash occurring when building navmesh on PIE ending.
Made a tentative fix for a crash occurring when navigation is being rebuilt because a navigation override is being removed when clearing world components.
Update SplineNavModifierComponent to apply the NavAreaToReplace to its modifier.
Guarded against zero DeltaTime in UPathFollowingComponent::FollowPathSegment to prevent division by zero ().
NavLink Generation:
Fixed missing links on small navmesh patches.
Made a fix to avoid filtering overlapping links if they used different navigation areas.
Fixed automatically generated navlinks being created without the NavLinkFlag.
NavMesh:
Made a tentative fix for a rare crash in storeWallSegment.
Fixed assertions occurring in UE::NavMesh::Private::CalculateMaxTilesCount().
Fix FindDistanceToWall returning incorrect result and finding a closest position that is not on a wall.
Fixed editor crash when a large number is typed in the Agent Radius value.
ISMC: Fixed an ensure in UInstancedStaticMeshComponent::GetNavigationBounds() caused by invalid navigation bounds. CachedBounds were being invalidated and not being recomputed when instances were added individually.
ZoneGraph: Fixed problem with converting FZoneGraphTag::None to FZoneGraphTagMask ().
Fix for AsyncNavWalkingMode using stale normals.
AI Smart Objects
New:
Added method to retrieve a Smart Object slot's UserData from the SlotView.
Added basic MRU slots implementation for MassSmartObject with settings in Mass SmartObject section of the project settings:
MRUSlotsMaxCount: Possible values between 0 and 4 (default: 0, meaning that the feature is not used; up to 4 slots).
bUseCooldownForMRUSlots: to allow the most recently used slots to be considered again a given period of time.
MRUSlotsCooldown: period of time during which a given slot will not be considered after being used.
Added all camera controls to the SmartObjectEditor toolbar
Bug Fix:
Fixed a crash in AITask MoveTo
Fixed an issue where the NavNodeRef was not included when requesting the slot entrance location with the option for projecting to navmesh enabled.
AI State Tree
New:
Added a rule to remove sustained state. All reselected states are new states.
Added Blueprint helper 'RunStateTreeRunStateTree' to execute a StateTree on an actor. Helper will use an existing StateTree component or add it if necessary.
Added Multiply operator to the Consideration score calculation.
Added ExecutionExtension callback when a transition is about to be applied.
Bug Fix:
Fixed a Runtime Validation false positive error when changing state trees without running any.
Fixed a transition that didn't remove the frame when a sub-frame changes root.
Prevented a reentrant call into StartTree and Tick for StateTreeComponent and GameplayInteractionsContext.
Fixed temporary frames not cleaned up when we run multiple transitions and did State selection more than once.
State tree references can now change while the tree is not run.
Fixed editor freezing when the user spams undo/redo operation inside State Tree Editor.
State Tree Editor: Hide level actor picker in the state tree editor.
Fixed property function node value not being retained in new nodes when copied/pasted/duplicated.
Fixed property bindings not being retained in new nodes if the old bindings were removed before pasting.
Fixed details view not always syncing correctly with the selected editor node.
Fixed Delegate Listener being unable to bind to the nested Delegate Dispatcher.
API
New:
Added DrawDebugCircleArc version accepting a quaternion for orienting the arc with an arbitrary roll.
Bug Fix:
SlateIM ComboBox now properly shows its selected value when spawned.
Audio
New:
Waveform Editor:
Added a noise threshold for zero crossing logic.
Added an inverted S fade function.
Streamlined the trimming workflow to have new UI handles and be enabled on opening the waveform editor.
Added loop, delete, and conversion options when right clicking.
Playback hotkey adjustments to allow move playhead to start
Added an icon to fade handles.
Made adjustments to default nudge settings.
Added controls to scroll left and right when zoomed using the right mouse button.
Made memory improvements for MetaSounds in the Operator Cache.
Added a Fade Node in MetaSound Experimental.
Added Blueprint equality operator for MetaSound literals
SoundWave Cue Point Origin now has improved defaults. Default origin is now the Waveform Editor Transformation Markers, unless the .wav had cue points on import.
Added a new Virtualization Mode: Seek Restart. This mode will virtualize, but keep track of playback time and, when realized, seek to that time as if it was playing the whole time. It's a less accurate, but more performant alternative to Play When Silent.
Performance improvements when using and destroying a large number of Quartz subscribers.
Metasound Trigger Filter node display name is now Trigger Chance to better convey its meaning. Some of its advanced pins are now hidden by default, and the node & pins tooltips have been made clearer.
Added "MaintainAudioSync" input to Wave Player Node as an advanced input to the Wave Player MetaSound Node.
"MaintainAudioSync" will compensate for latency during playback of streaming wave assets so that the playback of the audio stays in sync within the playing MetaSound.
Added a new debug display for Audio Modulation: au.Debug.Modulation.ActiveMixes
This will display all currently active mixes.you can choose whether Global Control Bus Mixes are included with au.Debug.Modulation.ActiveMixes.ShowGlobalMixes
Both experimental and legacy subtitle fields are now initialized for DialogueWaves so users can switch between them.
Added Subharmonizer MetaSound Node to standard library.
Added an option to only support Vorbis decoding, not encoding, for memory-constrained targets.
Renamed the "Create Subtitle" Asset Utility action to the more-specific "Make Asset UserData from Legacy Subtitles."
Improved extendable MetaSound node configuration editor details customization.
Added two new features to Control Bus Mixes:
Control Bus Mix Timer: Set a duration on the Control Bus Mix, and it will disable itself that many seconds after activating.
Retrigger on Activate: Optional behavior where, when a mix is activated when it's already active, it sets the values on the CBM to its default values and starts the attack over again (like retriggering an envelope).
Added a new Asset Action Utility that enables converting Overlay assets into subtitles in bulk.
MetaSound presets now inherit default metadata (ex. float range/clamp) from parent graph if applicable.
Subtitles and Closed Captions plugin:
Multiple Subtitles can now be added to a single SoundWave. All of them fit inside a single Asset UserData.
No longer queues subtitles if the engine settings for subtitles are turned off.
Added an Enum to Subtitle Assets to distinguish when the duration property is relevant vs when it stops automatically using a sound's length.
Subtitles from now have a default priority of 1.
Subtitles created in a SoundWave's Asset UserData will automatically estimate the length of the sound and default their duration thereto.
Sequences now support dragging and dropping subtitles.
Changed the USubtitleTextBlock class name to USubtitleWidget.
Added automatic subtitle playback support for DialogueWaves inside SoundCues.
Added a Blueprint node for queuing all the subtitles in an Asset UserData at once.
Added a Blueprint function for hot-swapping the Widget.
Added StopSubtitlesInAsset BP function.
Bug Fix:
Waveform Editor:
Fixed an issue where selecting a loop region marks the soundwave dirty.
Fixed an issue where highlighting and saving with a loop region selected disables the rest of the soundwave playing.
Fixed SoundWave markers with incorrect position data on export to USoundWave.
Scrubber Undo Fixes
Fixed frame length resetting to default instead of min when sliding loop region size.
Fixed exported soundwaves not supporting undo transactions.
Fixed ensure on undoing loop deletion.
Fixed editor crashing when closing out a Sound Wave asset after canceling to Export Waveform.
Fixed undo markers triggering ensure
Made UI fixes for markers with positive frame length
Made fixes to popup clearing.
Fixed right click getting stuck when scrolling waveform.
Subtitles in the Subtitles and Closed Captions plugin with delayed starts now respect internal/external timing choices.
Subtitles from the Sequencer plugin now correctly update their visibility when scrubbing along PIE.
Fixed crash with MetaSound user preset widget tab.
Fixed shutdown crash on Audio Streaming Cache handle ref counting.
Fixed a bug where, when a submix is deactivated, Modulators attached to it would still be active.
Fixed a bug where submixes with modulators could not disable via the Auto-Disable setting.
Fixed an issue with the Seek Restart Virtualization mode where it did not properly account for changes in pitch before virtualization.
When the sound virtualizes, it will use the last pitch it was set to to estimate where it should seek upon realization.
Sound Attenuation: Fixed == operator on FSoundAttenuationSettings.
Fixed MetaSound relative render cost being incorrectly reported in some cases when using the operator cache.
Fixed a bug where some Modulation inheritance settings were not working in some cases for non-volume modulation on sound sources.
Fixed MetaSound comment node positions not saving properly after resizing.
Fixed a bug where projects with the Audio Modulation plugin disabled had logspam.
Fixed crashes when using MetaSound node configuration with pages.
Fixed a MetaSounds edge case when the on-done trigger is triggered mid-buffer.
Fixed a MetaSound crash when clicking audition menu after closing asset editor
Fixed a bug where the Chorus Source effect modulation settings did not respond to Modulation changes.
Fixed Sine Curves on FVolumeFader when used outside [0,1] range. They should now follow the expected curve between any two values.
Fixed a bug causing various ITD features to have an enormous delay.
Blueprint
New:
By default the Blueprint editor no longer searches for references to variables when the variables type is changed via the blueprint editor
To re-enable this behavior, set "bSearchForReferencesWhenVariableTypeChanged" to true in your editor settings.
Can now call BlueprintFunctionLibrary functions from classes that do not implement GetWorld or ShowWorldContextPin. It now always shows the pins if needed and will always connect invisible pins even if they are marked as optional.
Added a SetFocusInViewport node to UScriptableInteractiveTool. This means scriptable tools can give focus to the viewport so that key bindings pass through without user interaction.
The Blueprint Debug Draw Line / Point / etc. methods now have the option to draw with 'screen' depth priority.
Added ToRotationVector, MakeFromRotationVector and GetShortestArcWith to the Kismet Math Library.
Structs tagged as HasNativeMake can now still have their individual members set.
Asset/Actor Actions in Developer folders show for everyone.
GetBlutilityClasses already had code to ensure that we don't list other devs' blutilities.
However, it didn't use the correct path format, which caused FPaths::IsUnderDirectory to always return false.
Similarly, UEditorUtilitySubsystem::HandleStartupAssets never had a similar filter to begin with.
Bug Fix:
Fixed failure to copy instanced Blueprint component value overrides on copy/paste workflows.
CollectionsManagerScriptingSubsystem:
Removed a warning from GetAssetsInCollection when an asset could not be found.
Fixed an issue where logs displayed as red despite actually being warnings.
Fixed an editor crash after clicking on a deleted graph node hyperlink in the Blueprint editor's compiler results tab.
UK2Node_VariableGet::SetPurity erroneously removed the SetPurity function from the public API of UK2Node_VariableGet. This fix now re-adds SetPurity, but changes its implementation to use TogglePurity.
Fixed an editor crash after clicking on a deleted graph node hyperlink in the Blueprint editor's compiler results tab.
Fixed a crash when editing children from a cooked Blueprint that had editor-only components.
User defined structs with Text fields with non-trivial default values no longer alter themselves on load.
The Blueprint diff tool now reports changes to Create Event Node's signature function.
Fixed potential for ICH override template namespace collision after reparenting an Actor-based Blueprint.
The engine no longer crashes when it exits while a search in Blueprints is ongoing.
Added more crash report context to paths where we are failing to resolve a node's owning Blueprint and/or graph, while using an ensure to avoid crashing the editor as a result.
Blueprint Compiler
Bug Fix:
Fixed crash in SerializeUnversionedProperties during cooking.
Fixed crash when cooking blueprints with local object references set to objects in asset.
Fixed compiler failing to find newly added functions on Blueprint interfaces, which led to implemented functions being renamed.
Fixed one cause of 'Reachable Garbage' when recompiling Blueprints.
Blueprint's delegate signature checking logic no longer accidently looks at local variables when matching function signatures.
Fixed one cause of loss of Blueprint subobjects when a Blueprint that is contained in another Blueprint is compiled.
Fixed a crash in garbage collection due to mislinked SKEL_ classes, most frequently seen during long-running cook operations.
Blueprint Runtime
Bug Fix:
Fixed a bug where arrays of structs with custom identical operators could fail to copy from Blueprint generated classes correctly.
Fixed push-model blueprint array property not properly marked dirty if modified by different actor.
The root cause of the issue is due to incorrect function signatures on array function thunks. Several of them mark their input array as 'const', but clearly change the array.
When push-model support was added, this problem was discovered and worked around by adding MARK_PROPERTY_DIRTY calls directly in the thunks. The problem with this solution is that it doesn't work when we change an array on a different actor.
Additionally, the thunk doesn't have enough information to determine that easily.
The correct solution is to leverage the existing code in FKCHandler_CallFunction that has sufficient context to inject MarkPropertyDirtyNode accurately.
In order to get array functions working, we needed to fix their signatures to use UPARAM(ref) instead of 'const'. One issue with this fix is that there might be existing Blueprint code that incorrectly uses mutable array functions with read-only data.
For now, we'll support this, but with a warning to fix the code as it'll become an error in 5.9. Currently, this warning is disabled until we fix affected content.
Fixed a memory leak when using containers with types that allocate memory by default.
Gameplay
New:
Mover:
Added a method of canceling movement features by matching gameplay tags.
Added User-Defined Struct support for Mover data collections, so Blueprint-only users can include custom data without requiring native code.
Now supports spring-based walking mode work in networked play.
Reduced potential memory operations when adding to a data collection by preferring to copy onto an existing matching struct if possible.
Added options for supporting root motion for non-vertical moves, which makes possible combining them with gravity-based falling.
Added a double buffer for cached sync state to avoid issues with reading in data that may be freed/overwritten.
Added Mover-Mass translators along with a Mover Integrations plugin to house various integrations between Mover and other systems.
NavWalking mode now sets floor results in the Mover Blackboard when projecting to level geometry is enabled.
Added an auto-expire policy option for rollback blackboard entries.
Added support for blueprintable layered moves through a new system that splits up Layered Move Logic and Data.
This allows Layered Move Logic to be made natively and in Blueprints in an effort to expand blueprint support in Mover.
These new layered moves exist alongside the old ones at the moment with the intention of these new moves eventually replacing the old ones.
Added options for handling out-of-band movement changes, whether to warn about it and whether to accept it as the new starting sim state. Usage is primarily for non-networked play, where an external system is allowed to move the actor around, such as during cinematics or temporary physics simulation.
Converted absolute timesteps to double-precision.
Now supports avoiding state-copying operations when the simulation state doesn't change.
Added AdditiveVelocity MixMode support to MultiJump Layered Move.
Made small adjustments to the extended Mover pawn to make sure additive velocity is respected by turning off extra jump input from CharacterMoverComponent Jump.
Added option for flat-bottom floor checks.
Added consistent angular velocity when changing movement modes.
Adjusted mover API to use a FVector for angular velocity instead of a FRotator. This changes some public API related to Mover.
Removed the gravity orientation from angular velocity calculation.
Added simple montage replication support for the character-focused MoverComponent.
Added first version of rollback-aware blackboard.
Added experimental option to append inputs into sync state, for cases where you want to share inputs with sim proxies that are not simulated and may not have those inputs available.
Made MoveInput and MoveInputType BlueprintReadOnly, so setting this input is done through specific functions only. This means we can properly apply some precision to input to make sure all clients/server have same value after NetSerialization.
Cameras:
Added Blueprint getter nodes for camera rig parameters.
Added evaluation context to transition conditions' API.
Now shows the name of the camera rig on the rig prefab node.
Added more debug information for blend stacks.
Added ResolveCameraRigProxy method to Blueprint camera director.
Moved lens calibration camera node to the CameraCalibrationCore plugin
Some changes to input slots:
Now runs input nodes in OnRun. OnUpdateParameters is only meant for pre-blending input parameters, not running actual logic, if only because it is run in isolation on just a few nodes that opt-in.
Moved the revert axis options onto the base input slot class.
Added a speed option on the input slot class. Pre-blend that instead of pre-blending the actual player input.
Moved the user-exposed option for accumulation onto the axis-binding specific node, in preparation of adding an actual accumulation node for more complex input chains.
Moved axis-binding code to a helper class in preparation of a "raw" input action node.
Added raw input action and accumulator node for complex input chains.
Added "driven control rotation" input node:
This input node makes possible using a "centralized" player input system which drives control rotation on the pawn, while still enabling cameras to have different orientations, such as when using target preservation with various lateral offsets (and therefore parallax requiring converging cameras with different orientations).
The active camera rig uses control rotation as-is, but any blending-out camera rigs use their last control rotation driven by the "delta" control rotation each frame.
This seems to be a good compromise between cameras limited by a single orientation and having player input managed by camera rigs individually.
Added the GetPlayerController method on the Blueprint camera node evaluator.
Added an option on camera components to set control rotation.
Added the ability for the Camera Debugger panel to bind to specific camera system instances (for instance, picking which Gameplay Camera actor to debug).
When drag-and-dropping a camera or camera rig asset onto a level or a sequence, create the corresponding actor.
Camera rig parameters now default to not pre-blended.
Defaulting to pre-blended benefited a few cases, but also caused visual bugs in a couple of other cases, so it's not worth turning it on by default.
Moved persistent rig activation functions onto the camera components and the camera manager.
These Blueprint functions were previously global, affecting whatever camera system host was currently considered "active".
This turns out to be unclear and prone to errors. Now the user activates persistent rigs exactly on whatever they intend to.
Now auto-create camera rigs and assets when nothing is specified on a Gameplay Camera component (but log a warning).
Made the orientation initialization service available to 3rd parties, and added an API for overriding the target or yaw/pitch to preserve.
Added a Blueprint utility function to access the evaluated camera's orientation.
Added Teardown API for node evaluators, added layer and active camera rig information.
Made node evaluator and evaluation service flags inclusive by default (i.e. opt-out).
Added a new "initialize with ideal framing" option on screen-space framing nodes.
Added a "family shortcut" bar to various camera asset editors for helping navigate between related assets.
Users can now set variables to be pre-blended.
Made QoL improvements to the Blueprint camera node.
Added bone/socket options to the attach to player pawn node.
Improved advanced camera shakes (add shake instance IDs and the ability to interrupt and stop a shake), improved the internal API for implementing shake nodes, and fixed a few bugs.
Implemented a more proper auto-build for camera assets for PIE.
GAS:
Improved logging for missing attributes in FActiveGameplayEffectHandle when using GetGameplayEffectMagnitude.
Gameplay Tag display ends in an ellipsis when the display is cut off rather than overflowing.
Gameplay Tag and Tag Container meta data "DisplayShortTagNames" will now remove the Categories filter from the beginning of the Tag chip in the details panel.
Gameplay Effects stacking options now have better names and comments.
CooldownGameplayEffectClass validation: When a GameplayAbility is configured with a cooldown GE class, validation will check whether that GE applies any tags.
Updated the GameplayTagCountContainer to serialize tags itself and provide for fine control of what tags should replicate where via EGameplayTagReplicationState enum.
Exposing common GameplayEffectSpecHandle and ActiveGameplayEffectHandle queries to Blueprint. The following Blueprint callable functions have been added to AbilitySystemBlueprintLibrary to empower Blueprint programmers when making GameplayAbilities. Since some GameplayAbilityTask callbacks only provide a GE spec handle and/or active GE handle, now you can do more with those handles:
GetGrantedTags: Gets gameplay tags granted by a Gameplay Effect, from the effect's spec handle.
GetAssetTags: Gets gameplay tags describing the GameplayEffect, from the effect's spec handle.
GetGameplayEffectFromSpecHandleIsDurationGameplayEffectSpecHandle: Whether a GameplayEffect is instant or non-instant.
IsActiveGameplayEffectHandleValid: Whether a handle for an active GameplayEffect is a valid handle or not. Applied instant GEs don't result in an active handle.
IsActiveGameplayEffectHandleActive: Whether a handle for an active GameplayEffect is a valid handle and it's still applied.
GetAbilitySystemComponentFromActiveGameplayEffectHandle: Retrieving the AbilitySystemComponent from an active GE handle.
Renaming a gameplay tag in the Gameplay Tag Manager now automatically renames all sub tags.
Added predictive gameplay effect stacking and improved stack overflow handling.
The data validation error for when there is a null input trigger on a key mapping now includes the name of the input action which it is mapped to.
You can now call "SetShouldConsume" on any Enhanced Input bound action handles.
You can also define "ENHANCED_INPUT_ALLOW_LEGACY_BINDING" in your game's .build.cs file to enable legacy key bindings onto enhanced input components, making upgrading to enhanced input easier.
Added GetActorFilter UPROPERTY meta support to object picker (mirroring GetAssetFilter).
Added a virtual function to UBlueprint, ShouldAutomaticallyRegisterInputOnConstruction, which can be overridden in widget blueprints.
Added a set of deprecated input action/axis names in the project settings.
Added "Setter=SetShowMouseCursor" to APlayerController::bShowMouseCursor.
Added ReleaseGameFeaturePlugins for multiple plugins at once. Unloading plugins batches GC and GameplayTags tree changes together which improves performance of unloading operation
Added an editor preference for setting a "Simulated Device Mapping Policy".
This can be used in the editor to change how input devices get mapped to platform users, which can be useful for testing device connection sequences for your UI, log in flows, etc.
Added the current device mapping policy to the output of the "Input.LogAllConnectedDevices" command.
Added helper functions to Ability system library: HasAnyAbilitiesWithCondition and HasAnyAbilitiesWithAssetTag
Added QueueWorkFunction and SendQueuedWork to the TaskSyncManager which can be used to queue a batch of function pointers to execute as a simple tick task. This can be used with RegisterTickGroupWorkHandle to safely schedule batched gameplay thread work from any worker thread.
Calling GetDeviceSpecificData now uses the given input device ID. If that is invalid, it uses the platform user's most recent device.
Added LoadGameIfExistsAsync to SaveGameSystem which combines the exists and load checks into one async call to avoid an extra frame delay. Changed GameplayStatics to use this for async loads which fixes a warning when trying to load a nonexistent save game.
Added ensure and comments to prevent creation of registered FTickableGameObjects on worker threads which is an unsafe race condition.
Added an option to the FTickableGameObject constructor to enable creating with a disabled tick, which is safe on a worker thread.
Added bindable "virtual" accept and back FKeys.
Added a OnPostUserSettingsInitialized delegate to Enhanced Input, which will fire after the Enhanced Input User Settings have been initialized on the subsystem.
Added more ways to detect a local player subsystem when using the node which does not have an explicit player controller target pin.
Implemented SlideAlongNavMesh option for CMC NavWalking mode. This means pawns in NavWalking mode can move along a navmesh rather than just moving towards a projected point on the navmesh.
CineCamera: Added an option to disable dynamic exposure.
Previously, turning off depth-of-field with FocusMethod would also turn off exposure simulation. This was fixed recently, but also meant that CineCameraComponent would now always simulate exposure, which isn't always desirable.
This change adds a new ExposureMethod setting to allow disabling exposure too.
Made sure that the key mappings "supported key profile" tag is respected, and made the OnKeyProfileChanged delegate Blueprint assignable.
Fixed a race condition crash on shutdown of the SteamController plugin.
Added an "Input.LogAllConnectedDevices" command to dump all the currently connected input devices and some metadata about them to the logs.
Reduced mouse input overhead on Windows by processing raw mouse moves on a separate FRunnable thread in the WindowsApplication..
GameplayTags and GameplayTagContainers created in Blueprint give the user a way to edit the "Categories" metadata for tag filtering in the owning Blueprint.
Fixed a crash where UPlayerInput::SmoothMouse would assert before it would attempt to divide by zero.
Bug Fix:
Mover:
Fixed a bug in mover angular velocity clamping where the limit was not respected when rotating off axis
Added CommonLegacyMovementSettings shared settings in various movement modes to avoid a crash that could happen if they were the only mode added.
Fixed an issue where pawns wouldn't follow a navlink off the navmesh if bSlideAlongNavMeshEdge was true.
Nav walking modes now force a navmesh projection if something comes along and invalidates our last floor information, such as teleportation.
Now initialize the Mover mode state machine earlier so it can be used in backend initialization if desired
Fixed NaN issue in UMovementUtils::ComputeVelocity that could happen when MoveDirectionIntent was zeroed out.
Fixed issue where backends could leave stale non-persistent structs in sync state between frames.
Fixed several cases where strict equality checks on orientations could fail due to float point imprecision.
Fixed an issue where a specified InputProducer could fail to have ProduceInput called on it.
Fixed a Blueprint editor crash during validation if there's a shared settings object set to None.
Fixed issues with trying to maintain the small distance off of floors in falling/flying modes where a character could get pulled towards the floor.
Fixed improperly calculated angular velocity for mutli-axis rotation cases, and added utility function to compute it.
Fixed a bug in standalone mode where the time step was being rounded down to the nearest whole millisecond.
Fixed floating point precision error in mover's fixed delta time calculation.
Finding a movement modifier by handle and by type now searches through the queued modifiers on the Mover State Machine as well. Fixes an issue where modifiers weren't found immediately after queuing them.
Fixed local->world root motion conversions when non-yaw rotations are involved.
Fixed cases where some movement modes were not respecting the setting for remaining vertical.
Fixed bugs where an actor can violate the min/max distance it's supposed to float above walkable floors.
Made sure we use BaseVisualComponentTransform to update PrimaryVisualComponent transform in FinalizeFrame so changes to BaseVisualComponentTransform apply to the visual component regardless of whether we're smoothing state or not.
Now properly expose Movement Mode in-out references in GenerateMove and SimulationTick to Blueprint.
Searching modifiers by handle with an invalid handle will return nullptr rather than active modifiers with invalid handles that haven't been fixed up yet.
Now passing along starting velocity in Falling modes if we didn't use any time. This fixes some velocity cancellation that sometimes causes a stutter on landing.
Cameras:
Fixed main camera assets not being usable as Blueprint variables.
Fixed crashes and bugs with rewind debugger integration.
Improve debug info display with extra data, more filtering options, and a few other things.
Fixed single-rig updates missing some of the steps the blend stack does.
Fixed static initialization problems that can lead to debug blocks not saving their fields in trace files.
No longer freezes camera rigs during stateless evaluations.
No longer warns about a camera asset not using any rigs if it's using proxies, and builds any rigs in the proxy table.
Fixed a crash when a camera's enter or exit transitions have empty pins.
Fixed an incorrect reset-to-default behavior on the camera parameter editor UI.
Now prevents infinite recursion when there's a cyclic reference of camera rigs.
Fixed gameplay tag transition condition; when a tag query is specified, it should fail if there is no previous/next camera rig.
Normalized yaw/pitch for spline orbit node
Can now run the target ray-cast node when there's no player controller.
Can now build and run camera rigs and shakes with no root node.
Now prevent rig prefab nodes referencing their own camera rig.
No longer throws asserts or error messages when we have a camera actor without an asset specified on it
Fixed activating persistent rigs during director initialization, and having these rigs receive custom parameter overrides.
Now validates that exposed camera rig parameters have the correct type for what they're connected to.
Fixed possible crash in GPC camera manager when the last evaluation context is removed from the stack.
No longer updates dampers and interpolators when the delta-time is zero.
Now properly freeze blends (possibly mid-blending) when freezing a camera rig in a blend stack.
Fixed simple fixed-time blends not saving/restoring their current time.
Fixed a crash when changing the type of a camera rig parameter.
No longer shows byte/int types for data parameters.
Now resolves camera rig name conflicts when building the property bag for a camera asset.
Fixed camera rig parameter nodes not being added to the list of graph objects.
Fixed assert when adding an enum data parameter to a camera rig.
Fixed broken "inline" evaluation of camera shake prefabs.
No longer pre-blends camera variable table entries that are not flagged for it.
Fixed the tick group for the camera components.
Fixed a crash when running editor builds without an editor.
Added missing initialization call for blend nodes in merged camera rigs.
The camera reference widget is now disabled if overridden with a rig parameter.
Fixed a crash when connecting a camera variable reference to a camera rig parameter.
Fixed an issue where rigs could keep running with old data after their asset was rebuilt.
Fixed "Home" button in camera rig editor.
Deleted references to camera variables when a variable collection is deleted.
Fixed a possible crash when running with unbuilt or outdated rigs.
Fixed Blueprint breakpoints not working on GET/SET parameter nodes.
Fixed shake prefab node not passing shake parameter values over to the visual layer in deferred mode.
Fixed SET parameters nodes not setting anything if the parameter wasn't already known in the variable/data tables.
Fixed error messages for unexpected situations lerping/overriding variable tables.
Fixed variable and context data tables sometimes returning uninitialized memory, and replace assert with one-time warning.
No longer uses manual focus distance on the output camera component if the focus distance isn't set.
Fixed pin types and colors for some data parameters.
Fixed incorrect parameter/pin types on the Blueprint camera node for object and class pointers.
Camera modifier rigs added from the player camera manager should now be aware of the player controller.
Added fixes for the player camera manager:
No longer double-updates Gameplay Camera actors
Now run the vanilla (Blueprint-based) camera modifiers ourselves after the camera system.
Now sets the transform of the camera manager itself to where the final viewpoint is.
GAS:
Consolidated code that checks whether an AttributeSet's FProperty represents a gameplay attribute, and improved coverage and stability:
FGameplayAttribute details customization dropdown will only show attribute set properties that represent GameplayAttributes. Previously it showed all properties.
GameplayDebugger will now also display doubles. Doubles as FGameplayAttributes remain supported for legacy reasons.
Fixed GameplayDebugger crash when an UAttributeSet had any int32 UPROPERTY().UAttributeSet::InitFromMetaDataTable now only processes property types that can back gameplay attributes.
Fixed a crash when debugging gameplay effects with aggregate by source stacks.
Fixed an issue where SetTagMapCount didn't call OnTagUpdated like the other tag update functions. This will now be called when Gameplay Cue tags and Loose Tags are added and removed (No change for changing values that don't add or remove the tag).
Fixed target data recalculating source tags and attributes when applying Effect Spec.
GameInstance pointer for Async Actions is correctly reset after it is un-registered.
Network Prediction: Changed static initialization of FNetworkPredictionModelDefRegistry's singleton to avoid issues with static initialization happening out of order causing registered Network Prediction model definitions to be skipped/removed. Also, made some minor adjustments to FNetworkPredictionModelDefRegistry::FinalizeTypes to avoid potential ODR issues.
Fixed an error in ULocalPlayerSaveGame::IsSaveInProgress where it always returned true even if one was not in progress.
Added an ensure to protect against missing player state crashes during seamless travel.
Map placed actor Event Dispatcher duplicates:
A map placed Blueprint actor's bindings to another map placed actor's multicast delegates (including Event Dispatchers) are now cleaned up when the actor is destroyed and reinstanced.
This fixes a bug that bindings to other actors' multicast delegates accumulate when recompiling an actor blueprint. Previously this resulted in event nodes firing multiple times, increasingly when the Blueprint is recompiled.
Now return the playercontroller if found from the owner.
Network Prediction: fixed crash in smoothing service that could occur after adding more simulation objects during runtime
Fixed replication issue canceling Gameplay Abilities when destroying the ASC from the server while abilities are active.
Fixed Multiply (Compound) modifiers not calculating correctly with stacked GameplayEffects.
Prevented a crash in APlayerCameraManager when the owning player controller has been GC'ed.
Input triggers and modifiers will now properly respect the priority of an input mapping context. This fixes a bug where if you had the same input modifier class on an input mapping context of a different priority, it would always use the modifier values of the one which was pushed to the stack first.
Fixed code that removes ?listen from client URLs to work correctly with # options as well.
Ensured that the "SlateApp.GetModifierKeys" function will return the correct values when called on platforms using GameInput to process keyboards.
Fixed OnBlendComplete not being broadcast in Standalone (non-networked) games.
Find-in-Blueprints: When a BP member variable is a struct, its members' default values are now searched and returned as results. Map keys are not supported yet.
Chaos Mover: Fixed floating point precision error in ChaosMoverStateMachines's fixed delta time calculation.
No longer restarts a camera animation blend out when reaching the blend out time if we were already stopping.
Fixed DefaultToInstanced subobjects breaking on blueprint duplication.
Fixed instanced subobjects, including DefaultToInstanced classes and UPROPERTY(Instanced), breaking when a blueprint class with instanced subobjects got duplicated.
This fixes the following editor actions which previously resulted in data loss:
Duplicating blueprints with user defined instanced subobjects.
Duplicating blueprints with GAS attribute set DefaultSubobjects.
Player Input: Fixed a bug where if you had an input component whose outer was a subobject of the currently controlled pawn, the input component would be processed twice.
One example where this could be a common issue is within the "Modular Gameplay Framework". Users would add a UInputComponent to some UActorComponent, and then call "PushInputComponent" on the owning player controller. This would result in the UInputComponent being processed twice.
This would happen because in "APlayerController::BuildInputStack" it calls "GetComponents" on the controlled pawn, which would return the UInputComponent which had already been pushed to the controller's input stack, thus adding it twice to the stack for processing.
Enhanced Input: Do not load platform-specific override data on post load of the platform settings. If you are referencing an object that is in a plugin, this will just fail anyway and does not improve any sort of loading behavior.
Fixed an incorrect Deleter being used on FGameplayAbilityTargetData when calling FilterTargetData, and exposed FGameplayAbilityTargetDataDeleter for this purpose.
Use this deleter when creating an FGameplayAbilityTargetData using FMalloc, such as in UAbilitySystemBlueprintLibrary::FilterTargetData.
When creating TSharedPtr to FGameplayAbilityTargetData which was created with FMemory::Malloc, please use the FGameplayAbilityTargetDataDeleter
Deprecated:
Deprecated the "Speech Mappings". These speech mappings were originally added to support Hololens, which is no longer a supported platform and can be removed.
Removed the deprecated functions on the camera manager, GetCameraCachePOV and GetLastFrameCameraCachePOV.
GAS: Deprecated StackType to make it private in the future, use new accessors instead.
Mass
New:
Added time-slicing with FMassEntityQuery::FExecutionLimiter to limit execution to a set entity count.
Added a Mass command for grouping entities.
Mass Debugger:
Added "Open In Query Editor" button to all query displays in the debugger.
Added handle-based sorting of entities on the Entities tab.
Completely overhauled breakpoints with new types, filtering, hit counters, session to session persistence, copy-paste.
Added query editor UI with load/save and copy/paste support for authored queries.
Added Fragments view tab.
Added new "Selected Entity" breakpoint filter to break for whichever entity is selected in the gameplay debugger or debug UI.
FMassFragmentRequirements and FMassEntityQuery are no longer UStructs, which they were never supposed to be.
Added observers locking to commands flushing. This change results in batching observers calls, significantly reducing the number of individual observers executions (~20 times in CitySample).
Added MassQueryExecutor to unify the functions of MassQuery and MassProcessor and create a foundation to remove dependency on UObjects for Mass processing in the future.
Simplified Mass data access with templated UE::Mass:FAccessors collection.
Added a way to fetch base-typed fragment views from Execution context while providing the actual, specific class with a UScriptStruct pointer.
CFragment concept now checks whether types are std::is_trivially_copyable and if not emits errors requiring users to manually mark fragment types that are not trivially copyable.
The goal is to educate fragment creators about good practices and point out fragments that might accidentally violate the requirement.
Deprecated FMassBatchedCommand::Execute as a const function and introduced non-const replacement named `Run`.
Unfortunately a new name had to be introduced since the constness of the function is the only thing that's changing.
Added a temporary construct to MassCommandBuffer to statically detect commands that still implement the deprecated virtual Execute in an attempt to make it easier for people updating their code to notice the change.
The construct will check at compile time all the pushed commands of known types and statically assert if the command type still overrides the deprecated `Execute` function.
Entity Builder API extension, supporting use of an arbitrary "element" type and having the builder figure out what kind of an element that is and store it appropriately. Additional changes:
Fixed FEntityBuilder::AddInternal implementation to not add duplicated instances of a given element type if one is already present.
Added creation context to the deferred path, to ensure the fragment values are already set when the observers kick in. This was already done in the synchronous path, so this change addresses the inconsistency
Added a couple of functions to MassEntityManager, that deal with types passed in as UScriptStruct, and pass the argument to the appropriate function, based on the type (Tag or Fragment).
Mass Command Buffer API extension:
PushUniqueCommand: the function lets callers add a hand-crafted command. Use it to push commands that you don't want to get merged with other commands of the same type.
AddTag and RemoveTag: added versions that take an array view of entity handles.
DestroyEntities: Added a version with rvalue ref parameter.
Added FMassFragmentRequirements::AddElementRequirement that can be called at runtime with UScriptStruct.
It will add the provided type to Fragment or Tag bitsets, depending on the type represented.
Added FMassRepresentationParameters::Identical to implement logically-correct FMassRepresentationParameters instances comparison. The operation by design ignores CachedDefaultRepresentationType and CachedRepresentationActorManagement.
Added a way to ask a MassCommandBuffer about its host thread.
UMassVisualizationTrait can now be configured to not check mesh descriptions for validity which can be used to procedurally populate trait instances.
Bug Fix:
Fixed inconsistencies between single and multi-threaded deferred command flushing in FMassProcessingPhase::ExecuteTick.
Modified the occasionally failing ensure condition in UInstancedActorsData::OnInstancedActorDestroyed and provided it with more comments and a message to emit.
Properly handle shared fragment hash collisions.
Mass puppet actors now get destroyed immediately when the puppet is destroyed.
Fixed configuration issues of FMassProcessingContext created in UMassSpawnerSubsystem::DoSpawning for running initializer processors.
The original configuration was flushing commands if any have been issued, but did so in a way that forced flushing of all the system's commands accumulated up until that point. That resulted in different behavior in entity spawning depending on whether there were initializers for a given entity available or not.
The new configuration results in keeping the behavior consistent, regardless of initializers presence, which is to not flush commands and if any are issued they will be appended to the main buffer when FMassProcessingContext goes out of scope.
MassGameplay:
Fixed a crash when a mass representation actor is destroyed while mass simulation is active.
Fixed a teardown crash in MassAgentComponent.
Fixed a situational crash in UMassRepresentationSubsystem on world teardown.
MassAgentComponent changes to update EntityHandle-to-actor mapping in MassActorSubsystem when dealing with a player-owned component.
The change fixes an issue with GameplayDebugger's Mass category not being able to display info on the player-owned entity. A tiny change to the category removes the friction when doing that (no longer requiring the transform fragment to display data).
Fixed an issue in FMassEntityQuery::ParallelForEachEntityChunk stemming from the code not taking into consideration that ParallelForEach's workers can be moved between threads.
If that happened and the query was run with `bAllowParallelCommands == true`, then the command buffer would complain about being used outside of the thread of its creation. The fix is updating the thread ID of the command buffer whenever it's picked up.
Now sorting observer processors to utilize UMassProcessor.ExecutionPriority.
Fixed FarmTest to not crash on PIE:
The existing implementation is crashing since the changes to processor initialization have not been applied there.
This issue is limited to the farm-test, due to the custom and legacy way of setting up and running processors.
Fixed standalone-game IA uses by properly talking to ServerInstancedActorsSpawnerSubsystem, which fixes some IA representation issues.
Also, ServerInstancedActorsSpawnerSubsystem has been fixed to `FinishSpawning` actors only once their IAComponent has been configured.
Marked UMassCapsuleTransformToMassTranslator as "game-thread only" to avoid data races when the observed component is modified in game thread as the data is being accessed by the processor.
Networking
New:
Implemented RPC state stomp detection which can detect state buffer writes between quantization and serialization. The cvar to control this is net.Iris.RPC.ServerStompDetectionEnabled which is false by default.
Support Iris when using NMT_JoinNoPawn and NMT_JoinNoPawnSplit.
Adding an FSocket::ReleaseNativeSocket for use with native socket API's (e.g. asio). Using this new function inside the TraceAnalysis' FDirectSocketStream to support cases where we want multiple connections, not just a single connection (e.g. a multi-server capture).
Iris
Implemented seamless travel support. If seamless travel support is not needed for a project the cvar net.Iris.AlwaysCreateLevelFilteringGroupsForPersistentLevels can be set to false to avoid unnecessary overhead of filtering objects in the persistent level.
Optimized polling to only poll objects/properties that are marked dirty.
Added some async loading failure debugging cvars:
net.Iris.AsyncLoading.FailPackageName Name: fails async loading all packages containing the package name.
net.Iris.AsyncLoading.FailNextLoad 1: fails the next async load regardless of the name and resets the cvar.
net.Iris.AsyncLoading.FailAllLoads 1: fails all loads until the cvar is set to 0.
Gracefully handle reaching the end of the bitstream even if it's unexpected. The behavior is controlled via cvar net.Iris.ReplicationReader.GracefullyHandleReachingEndOfBitstream.
Added better logging when handling end of bitstream issues. Reset the read journal when deserializing huge objects.
Added a NetDriver command for printing out all of the actors registered for replication (generic replication system only).
NetEmulation:
Added netEmulation setting to simulate buffer bloat on game traffic.
Set PktBufferBloatInMS for outgoing packets and PktIncomingBufferBloatInMS for incoming packets.
Ex: 'netEmulatation.PktBufferBloatInMS 1000' will apply 1sec of buffer bloat on outgoing traffic.
netEmulation.BufferBloatCooldownTimeInMS can also be used to set a cooldown period between each buffer bloat occurence.
Ex: 'netEmulation.BufferBloatCooldownTimeInMS 2000' means buffer bloat is not applied for 2secs after a buffer flush.
Added a "BufferBloat" emulation profile that enables buffer bloat of 400ms (in and out) over an 'average' emulation profile.
Added metrics to measure the performance and behavior of the multiserver proxy.
Multithreaded Iris Polling Step:
FObjectPoller can now kick off multiple FReplicationPollTasks, each of which processes a subset of the ObjectsConsideredForPolling array.
This is set to process cache line sized Chunks in an interleaved pattern so that each task gets a roughly balanced amount of work, and we avoid false sharing the same cache line.
Also supports the ForcePoll flow if PushModel is disabled.
Added NetBitArray ForAllSetBitsInRange function to facilitate iterating over different parts of the same Array inside each task.
FNetTypeStats now supports threaded access through the use of ChildNetStatsContexts that are used during parallel phases and then accumulated into the parent context at the end of a frame.
Configuration is done at the ReplicationSystem level so that we can enable it just for GameNetDriver on the Server.
We define a flag called bIsInParallelPhase which is true whilst the FReplicationPollTasks are running, and is used to protect against non-thread-safe access during this time.
Added capability for Networking Iris Polling phase to be run in parallel. This can be enabled by adding bAllowParallelTasks=true to the ReplicationSystemConfig
MultiServer:
Refactored LaunchMultiServer script. Users can now derive from it to add their own features.
The -ProxyGameServers command-line argument can now accept a port range. This helps with launching multiple servers on a single host, so you can just use 127.0.0.1:9001-9025 for 25 servers.
RemoteObjects: Now reschedules aborted ServerReplicateActor calls rather than retrying them.
Fixed an issue where UActorChannel::ReplicateActor did not account written bits in one of the paths
Renamed RepNotifies CSV stat to Generic_RepNotifies to better distinguish between Actor Channel based replication (generic) and Iris replication.
Added support for closing child connections in the net driver and closing connections on the multiserver proxy.
Added mutators to UNetworkMetricsDatabase functionality.
Mutators can be added to UNetworkMetricsBaseListener and get a chance to process input metrics every frame. They report an output metric to their owning listener on the listener's reporting interval.
Use mutators to aggregate metrics that are set more frequently than a listener's reporting interval. Basic mutators for min, max, and average are provided.
Added server-side network metrics for RawPing values across all client connections.
Added support for actor replication relevancy when using the multiserver proxy.
The multiserver proxy now shares a single NetGUID cache and objects are cached on the proxy when migrating between servers.
Bug Fix:
Fixed a crash which could occur if an actor channel was removed during replay playback scrubbing.
Iris:
Fixed bug with FastArraySerialzierFragment if using not replicating items.
Fixed bug where FGameplayAbilityTargetingLocationInfoNetSerializer would not properly call FreeDynamicState.
Fixed bug that could prevent a default subobject from receiving a large RPC.
Fix edge case with prioritization causing a crash.
Fixed issue where dirty status of new subobjects created from PreUpdate of objects was masked out.
Now resets NetBitStreamReader between batches to get correct read journal entries and clear overflow status.
ObjectProperty class type is now validated property when serializing object references.
Fixed a bug where initial state was not applied when beginplay() was dispatched for world from AGameStateBase::OnRep_ReplicatedHasBegunPlay.
Fixed a bug that allowed adding subobjects to torn off root objects.
FScriptInterfaceNetSerializer can now handle blueprint implemented interfaces.
The ObjectReplicationBridge's AddDependentObject method will now prevent circular dependencies.
Fixed bitstream corruption that could lead to disconnects.
Can now pass zero size to FNetBitStreamWriter's InitBytes method.
Network:
Added UE_FAST_ARRAY_COMPILE_LOG_LEVEL that enables a program to control the compile time verbosity of LogNetFastTArray logs.
Since this class is templated the logs in the functions are unique per implemented class so it can grow the amount of the log static strings if they are left compiled-in.
Fixed issue with FObjectReplicator's CanSkipUpdate with net.PushModelSkipUndirtiedReplication enabled.
Made a change in UNetDriver::IsLevelInitializedForActor to avoid iterating over net connections if the actor we are evaluating has the correct world, or if the actor it is not a player controller
NetDriver:
Fixed ping updates discarding higher ping values when multiple Acks were received in one packet.
For example this caused ping values to stay low during BufferFloat occurrences.
Added RawPing metric that tracks the highest ping value received every frame.
RawPing will not change if no packets are received or the incoming packets contain no new Acks.
When using Iris replication, objects that have a spatial filter set at runtime will now always use their correct location for filtering calculations.
When using Iris replication, actors and subclasses without explicit FilterConfig overrides in ObjectReplicationBridgeConfig will now be filtered based on their relevancy flags like bAlwaysRelevant.
Previously these actors were treated as always relevant regardless of their bAlwaysRelevant flag.
Deprecated:
Removed error prone SetConnectionFilter API from UReplicationSystem. Use exclusion groups instead.
Deleted UNopNetObjectFilter. It's been superseded by UAlwaysRelevantNetObjectFilter which has identical functionality.
Deprecated GetSubobjectsWithStableNamesForNetworking function
Level Design and Art Tools
Geometry Core
New:
We now use the fast cluster simplifier for convex decomposition's pre-pass simplifier (since the main use case is to make the decomposition faster).
Geometry Core: Added morph target attribute as a core dynamic mesh vertex attribute.
Added path intersection & difference.
Added a ReparameterizedCloserToWorldFrame to the GeometryCore TOrientedBox3 class.
Added a CreatePerVertex method to dynamic mesh overlays, as a faster alternative to the CreateFromPredicate() method in the per-vertex case.
Added a vertex -> single triangle method to dynamic mesh, as a faster/more-convenient path (vs e.g. using a vertex->triangles iterator to get a single element).
FDynamicMesh3 queries now optionally take an inline-allocated array for local vertex-neighborhood mesh queries.
Added optional scale factor to DynamicMeshUVEditor::ScaleUVAreaTo3DArea utility function.
Added option for geometrycore's MeshBoolean to report the source mesh of each result triangle.
Added option for the Mesh Boolean to take a custom 'inside mesh' function, per mesh.
[GeometryCore] Delaunay 2D iterative update support.
Added a version of Expand() to FAxisAlignedBox3 and FAxisAlignedBox2 that takes a vector.
Segment Tree: - add option to build the tree with an array of segments - make use of the filter function that's passed in as an option.
Bug Fix:
We now reset the UsedCount on a moved-from RefCountVector, so it is left in a valid state (and e.g. a mesh will not fail CheckValidity after being moved from).
Made the implicit morphology generator not hit an ensure() when passed an empty mesh (and still return an empty result).
Fixed the dynamic mesh color transfer method handling of non-compact meshes when biasing element positions, and simplified the lerp-toward-centroid logic used.
Fixed static mesh's LOD -> dynamic mesh conversion handling of non-compact polygon group IDs
We need to compact these IDs so that they correspond to static mesh section indices, which all our tools and geometry script processing expect.
Improved performance of MeshRegionGraph operations:
Region merging transfers known neighbor information, rather than recomputing it.
Less redundant validation on internal operations.
Less redundant array searching when building neighbors.
Added api exports to the OBJMeshUtil methods so they can be called from other modules.
Made MeshConvexHull's grid sampler exit when mesh bounds are empty, to avoid ensures on grid w/ zero cell size.
Fixed dynamic mesh CompactInPlace creating a triple-sized TriangleEdges array + add coverage for this case in CheckValidity, and guard against this kind of error breaking AppendWithOffsets.
We now do not leave unused vertices in the cluster simplifier mesh result mesh.
Fixed incorrect transforms on GeometryCollectionToDynamicMesh converter, and added more comments to document the expected coordinate spaces for these meshes.
Fixed crash in implicit morphology offset operation due to offset grid dimensions overflowing int32.
Fixed a possible crash in algorithms that use the sparse solver wrapper, by properly handling failed factorizations.
Geometry Script
New:
Added various oriented box functions to geometry script, to create and query / test intersections and convert to meshes.
Added an OBB containment function to geometry script (matching what simple collision fitting does, but exposing the found oriented box directly).
Improved geometry script's CopyCollisionMeshesFromObject support for complex collision.
It now supports any type that implements the IInterface_CollisionDataProvider interface, and specifically should now work better with Skeletal Mesh Components and Spline Mesh Components.
Added a 'select occluded from outside view' jacketing method to geometry script, to have more controllable occlusion operations (e.g. from specific directions, for specific material IDs/parts of mesh, w/ transparent tris).
Also, cleaned up the detect exterior visibility function logic to support the new options and be a bit faster / more robust.
Added target edge length QEM and cluster-based simplification methods in geometry script.
We now more consistently use the term "Connected Islands" instead of "Components" when referring to connected pieces of a mesh in Geometry Script nodes.
Filled out geometry script list conversion extract/set methods for the various list types: Scalar, UV, Vector and Color.
FOrientedBox is now exposed to Blueprint.
The 'debug' pins in geometry script are now hidden in the Blueprint graph
Geometry script now supports standard MikkT tangents in the Compute Tangents node, on platforms where the MikkT library has been compiled (i.e., win/mac/linux).
Bug Fix:
Added Vertex and Triangle ID validation to geometry script Mesh Query methods so users do not crash on querying an invalid element ID.
Made dynamic mesh pools safer to use from a non-game thread.
Fixed the output param display name for GetMaxMaterialID.
In geometry script asset creation methods, we now test that the paths for new assets are valid before attempting to use them.
Fixed a bug with "AppendXWithSimpleCollision" geometry script methods where repeated calls of a script could accumulate extra copies of the collision shape, because blueprint re-uses output reference objects across script invocations.
Removed requirement that patch unwrap mesh be non-compact.
Fixed issue where Geometry Script would maximally simplify a mesh if "Simplify to Tolerance" was run with a tolerance of 0.
Deprecated incorrect geometry script perlin noise node, and added a corrected v2.
Landscape
New:
No longer visualizes disabled landscape patches.
Now sorts landscapes alphabetically when multiple landscape actors are editable in landscape mode.
Changed the landscape Collapse Layer tool to use selective render weightmaps code instead of intermediate render code.
Added weightmap support for edit layer selective renders.
Added a GrassMap RenderEveryFrame command, to debug grass map runtime generation.
Changed landscape tools with the "Combined Layers Operation" feature to use new selective layer render code.
Stops using old "intermediate render" code and avoids polluting the persistent texture data with intermediate results. The new version is faster and safer.
Moved the Landscape feature level warning (for shader modes < SM5) from a blocking notification to a simple console log.
Landscape optimization for the editor:
No longer inspects materials for finding mobile layer names when generating mobile weightmap allocations while there's no weightmap allocations in a given landscape component in the first place.
Performance optimization when undoing landscape edits.
Added a transient landscape property to track the last selected edit layer index. Edit layer selection state is persistent when toggling between editor modes.
Removed the ability to place Landscape Blueprint brushes from the Place Actors panel.
Added all landscape brushes from the Landscape Manage - Blueprint Brush tool.
Enabled dynamic Landscape Spline control point billboard size and offset in editor.
To change the offset and size, configure Spline Icon World ZOffset and Spline Icon Scale under the Landscape Project settings.
To maintain legacy spline behavior, set CVarLandscapeSplineEnableFixedSpriteIcons=True.
Removed the Landscape Spline Deform to Landscape buttons used to update spline data for non-edit layer landscapes. With edit layer landscapes, Landscape splines automatically affect the data when a Spline Edit Layer is added.
Added API exposure for all public BlueprintCallable Landscape Patch functions.
Exposed landscape component's GetGrassTypes to Blueprint.
Added generic World Partition Landscape Builder Commandlet. Builds all landscape grass maps, physical materials, and nanite components.
Improved landscape.DumpLODs command:
Now it only displays the landscape LOD information by default and -detailed needs to be used to get the verbose mip-to-mip delta information.
Added an option to align landscape grass instances with the precise triangle normal when using jittered grid mode.
Also fixed an issue with the triangle normal calculation.
Added API exposure to virtual functions on landscape patch plugin UCLASSes so that they can be inherited from in other modules.
Remove redundant and unsafe non-blocking landscape nanite build from PreSave. No longer builds Nanite at all on auto-saves.
Added an option to Add Unassigned Blueprint Brushes in the Landscape Edit layer context menu. If a Blueprint brush does not have an assigned edit layer, the right-click context menu will include an option for re-assignment
Added a DeleteActors helper in order to let the editor's delete actors dialog run when possible but also to let actors be safely deleted without using the UI in other cases.
Added Landscape Edit Layer Context Menu customization system.
Added the ability to easily extend right-click context menu actions for custom edit layer classes.
Moved LandscapePatch plugin out of Experimental.
UX improvements:
Updated icons to landscape target layers display order methods.
Added sort type (ascending/descending) for this.
The sort/filter options have moved next to filter box within the Layers property (since they affect only the layers that are visible, these buttons should not be present when the property is collapsed).
Added a number of target layers in the Layers property header, in order to be similar to standard arrays and also the edit layers property above.
Added Collapse All Edit Layers action to the Edit Layer context menu.
Removes all edit layers and flattens the current data into the default edit layer.
Updated default spline edit layer selection behavior:
Selecting the Splines Edit Layer no longer auto-activates the Splines tool.
Double-Click on the Splines layer, or use the right-click context menu option, to toggle between the Splines Tool and last active tool.
Bug Fix:
Fixed mobile landscape weightmaps not being taken into account by streaming.
Fixed a crash when auto-filling target layers from material.
Fixed height/weight alpha precision loss when merging landscape.
Fixed grid-alignment warnings when creating a landscape with more than one region worth of components.
Added refined Water Body underwater detection to avoid applying post-processing when the camera is underneath or outside the bounds of the collision volume
No longer calls UpdateResource when changing texture LOD settings for render targets. This fixes the water brush breaking landscape after switching between desktop mobile preview mode and desktop renderer.
Fixed landscape legacy weight blending potentially leaving ghost weightmaps on large landscapes.
Turned assert about landscape physical material tasks failing to complete on save into an error, since that is something that can happen if the material fails to compile.
Fixed a crash that happened when trying to clear a Landscape Paint Target Layer that was already empty.
Fixed a crash when a Landscape Blueprint brush was deleted and then restored via Undo.
Removed spurious assert when the landscape material references a texture named "Heightmap" (implicit name for heightmaps in landscape).
Fixed determinism issue when updating landscapes with conflicts on the border of landscape components that would lead to landscape proxies getting dirty in an inconsistent way.
Fixed an issue with World-Partition Landscape Proxy Nanite Materials not updating after using Undo/Redo with the Landscape Paint Tool.
Fixed invalidations of landscape physical material during painting.
The last few frames of a paint stroke could be lost because the invalidations were ignored while a physical material task was still pending.
Fixed several issues with ReinitializeHeight/Weights in landscape patches.
Fixed crash with multiple patches. The render command recorder was not stopped at the right moment: both Render and Blend operations must respect the render mode (Immediate or Recorded), which could be broken in case the renderer was grouped with another one earlier.
Fixed landscape that was not updated after having reinitialization had been executed.
Fixed a crash when the same patch is rendered in several batches. The boolean bReinitializeHeightOnNextRender does not support this and that supposes that during reinitialization, the patch is rendered in a single batch. The fix artificially increases the batch size to the entire landscape, which is wasteful, but the best we can do until the reinitialization is replaced by a proper landscape edit layer partial merge.
Fixed landscape batched merge not handling multiple weight patches (i.e. multiple target layers) being rendered on the same patch component (the render targets would cycle in between each, leading to invalid blending).
Fixed landscape patches' input area (which was the size of the patch), that would lead to needlessly large batches.
Fixed potential determinism issue with landscape patches that could theoretically render before their referenced textures are fully streamed in.
Handle null landscape patch weight entries in the couple of places where it was not.
Fixed invalid checks in landscape batched merge.
Stop over-invalidating on empty landscape components. Change to invalidating only components that added or removed weightmap allocations.
Fixed PCG refresh on undo/redo landscape painting.
Moved creation of landscape nanite's UStaticMesh out to the game thread to remove danger of threading issues.
Fixed improper blend of landscape edit layers with custom height/weight flags.
Avoided a crash if saving when FLandscapeTextureStreamingManager is not available.
Fixed a bad ensure condition when trying to cache data from an empty area in the landscape smooth/flatten/erosion tools.
Fixed a crash with the Landscape Copy Tool when attempting to copy data from an invalid or deleted landscape.
Fix deleted landscape spline points/segments coming back after duplicating the spline.
Fixed a crash occurring when saving level instances that include World-Partition Landscapes.
Fixed ctrl+alt+right click drag increasing/decreasing the landscape brush continuously even when the mouse was still.
Fixed mobile landscape data hash being zeroed when entering PIE. That was leading to all landscape mobile data being rebuilt when entering PIE while in mobile preview mode.
Fixed a landscape flatten tool conflict with undo.
Fixed landscape flatten tool behavior at the edges of geometry.
Fixed landscape painting errors when toggling "invert" during a brush stroke.
Fixed an issue with the Landscape Resize tool clearing all heightmap/weightmap data for edit-layer based landscapes.
Fixed an issue with Water Bodies automatically generating invalid collision boxes in the Blueprint editor when changing the Wave Source property.
Prevented a crash when redoing an undo of a Water Zone actor deletion.
Fixed an issue with the Landscape Resize tool using the wrong Y position offset while expanding the landscape.
Fixed the handling of changing transforms when building landscape groups.
Fixed additive blend mode for landscape texture patches.
Fixed various landscape+water new cases where it was assumed that GetWorld() returns a valid world while it's not the case when a world is deleted from the content browser.
Improved the Landscape Import/Export Exposed user experience by exposing the Landscape Gizmo location property to the Landscape details panel.
Fixed a crash updating landscape edge snapshots when heightmaps are not readable.
Fix landscape edit layers merge on Vulkan SM6.
Fixed a crash when renaming a Landscape Paint Target Layer to an invalid name. Target Layer names must be unique non-empty names.
Keep landscape patches in sync with their host landscape by upgrading them from the soft-dirty package list to regular dirty status when the landscape makes that same change.
Enabled landscape grass culling when running MRQ.
Previously we would pass an array of no camera to RegenerateGrass, which prevents all landscape grass from being distance-culled.
Instead, we now pass nothing, which leads landscape to use the streaming manager to get the current "views", one of which is the captured camera (the other, the editor).
This is better handled in the new movie render graph but at least this solves a performance issue in grass-heavy scenes. The user can now override the grass cull distance (as well as grass density) via Game Overrides settings.
Default = override + cull distance multiplier of 50, to have (mostly) backwards compatibility with the previous MRQ captures (which prevented all grass culling) The default for grass density override is false, though, also for backwards compatibility reasons.
Note that the new movie render graph doesn't have these settings since it doesn't have them for ViewDistanceScale, ShadowDistanceScale, etc. so we figured it didn't need those grass settings either.
Also added a CVar (grass.VisualLog.ShowCameraLocation) to show the camera locations used by landscape grass in the visual logger.
Now displays an error message instead of crashing when failing to import an image file to a landscape layer.
Avoided a crash on opening a scene containing the legacy LandscapePatchManager when the scene was already at the max number of edit layers. Ignore the soft limit when creating the new dedicated patch layer.
Fixed OOBB->AABB computation in landscape batched merge, which was leading to bad blend groups for landscape patches.
Fixed an issue with landscape brushes that would sometimes modify height/weight data on the border with unloaded tiles.
Avoided a crash when opening a map with a disconnected landscape patch manager, when the editor isn't ready to provide the current selection set.
Fix for Nanite landscape possibly generating invalid Nanite mesh streaming data on cook.
Added an option for landscape Blueprint brushes to tell if they require power-of-2 render targets to operate. For backwards compatibility reasons, it's set to true by default, although it's not the best option. This ensures that the water brush behaves precisely how it used to before UE 5.6
Fixed the water brush on Vulkan SM5.
Fixed an issue where Landscapes only generate Nanite for the first 64 components of any given landscape proxy.
Fix missing landscape spline meshes after undo of merger of two splines.
Now hides the landscape selector when the New tool in the Manage panel is active.
Fixed a rare crash in the landscape texture streaming manager when landscape textures are GCed while the landscape is still active.
Fixed missing updates to landscape physical material when using a material instance.
Fixed a crash using Undo operation with a Landscape Patch and Patch Edit Layer.
Landscape add component tool fixes:
Now properly generates extrapolated height data on each persistent edit layer, so that there's continuity on the corners on each of them.
No longer generates collisions on component creation because at this point, the height data is set to all zeroes (i.e. the minimum height, not the median, default height value) and doesn't correspond to what comes out of the the subsequent edit layers merge, whose readback would generate an identical heightmap hash, and would therefore not re-generate collisions. Delaying collision generation until the merge fixes this, since that's the first time the collision values would be valid anyway.
Now prevents existing neighboring components from being dirtied when adding a new component (previously they would get dirty by the simple act of caching/interpolating their height data).
Automatically apply splines after component creation, so that new components are immediately affected by the splines that overlap with them.
Improved visualizer for the component about to be added.
Prevent landscape edge fixup from running on world composition maps, where heightmap sharing is still possible.
Fixed all logs involving landscape LandcapeGroupKey and LODGroupKey.
Fixed ensure loading old landscape data with landscape.StripLayerMipsOnLoad = false.
Fixed a crash occurring after exiting a level instance with the Landscape Editor - Landscape Copy tool active.
Deprecated:
Deprecated legacy non-edit layer landscapes:
Removed all editor tooling related to non-edit layer landscapes (e.g. Landscape Retopologize Tool/XY Offset data).
Disabled the creation of non-edit layer landscapes and the ability to toggle between edit layers and non-edit layer landscapes.
When non-edit layer landscapes are loaded, an automatic conversion to an edit layer based landscape occurs. During this process, all proxies copy the existing non-edit layer data to a new default edit layer. Any existing Retopologize data is removed and the proxy is flagged as "soft dirty" with an editor viewport warning.
Removed global and local merge code and deprecated anything that was only available for this.
Since the console variable "landscape.EditLayersLocalMerge.Enable" is deprecated now, a new console command was added, to trigger a landscape layer full update (landscape.ForceLayersFullUpdate) :
With no argument: Updates all landscapes.
With arguments: Updates all landscapes whose display name (partially) matches the argument (e.g. with 3 landscapes named Landscape_0 Landscape_1 and Landscape_2, "landscape.ForceLayersFullUpdate _0 _1" will trigger an update on the first 2 only)
Changed landscape edit layers merge API from experimental to official.
Removed landscape's "intermediate render" code path.
Modeling Tools
New:
Added support for the tangents tool to choose the reference UV layer to use when computing tangents.
Added BrushValue property to the AttributePaintTool to allow users to specify the target value that is painted down rather than always accumulating to 1.0f.
Added symmetry support to the Paint Vertex tool.
The target requirements for the Inspect tool have been relaxed to support DynamicMeshProviders rather than MeshDescriptionProviders.
Modify UBoundarySelectionMechanic to be able to operate on either closed loops (current behavior) or open spans (new optional behavior).
Lattice Deformer Tool:
Modified the FFDLattice to optionally accept an oriented bounding box rather than computing one from the input mesh. This means the lattice can operate on just a portion of the mesh. Lattice computations are now all done in local space.
Added an ILatticeStateStorage interface, which enables the interactive LatticeDeformerTool to store its state in when the tool ends.
Added support for a HitBackfaces option to the MeshAttributePaintTool.
The attribute paint tool now has the option to use a more-shaded material.
Added an option to the Mirror tool to averaging normals along the weld.
Bug Fix:
Fixed a crash on attempting to split meshes w/ invalid material IDs.
Fixed an issue where the AttributePaintTool's stamps would be skewed for meshes with non-uniform scale.
Fixed where modeling tools could incorrectly change material ID assignments due to the static mesh tool target 'IMeshDescriptionCommitter' interface not finding the right material ID mapping method.
The same function is also on the Provider, so needed to be pulled to the top level for both interfaces to find the method.
Made vertex sculpt tool skip render decomp step if the sculpt mesh has no triangles (fixing ensure when tool is run on an empty mesh).
Fixed a crash in the subdivide tool. We were passing in the wrong vertex count to OpenSubdiv.
Fixed a potential crash when enabling UVLayoutPreview.
Fixed a warning about realtime mode erroneously appearing in modeling and scriptable tools modes when the editor doesn't have focus.
Fixed a potential crash in DisplaceMeshTool for meshes with invalid topology.
Fixed a GC crash with mesh element selection's usage of PreviewGeometry.
Fixed support of the 'join method' for closed curves in the Mesh Splines tool (previously always used 'square' joins).
Fixed a crash on starting modeling mode w/ an actor selected that has null components attached.
Fixed a crash when swapping from Modeling Mode to Animation Mode with Motion Trails active.
Fixed a potential crash in the ISM Editor tool.
Fixed a potential nullptr dereference crash in OnActiveViewportChanged for StylusHandling.
Fixed the OutputType properties' display name and tooltip to SourceType in the BakeVertex tool to better reflect the function of those properties.
Fixed an issue where tools in Modeling Mode and Scriptable Tools Mode would not tick if the viewport did not receive focus yet during the editor session.
Fix for crash in Extrude Path tool when creating a totally straight polyline.
Fixed a rare crash when hovering over Mesh Element Selection before viewport is focused.
Fixed Mesh Splines tool handling of duplicate start/end points generated on looping splines, which could previously cause incorrect triangulations.
Lattice Deformer Op: Fixed a check that fires when operating on non-compact meshes.
Fixed an issue where the Union tool only transferred UV Channel 0 in the result mesh.
Fixed a potential crash in TDynamicVector::TruncateBlocks for an empty vector.
Added a workaround to prevent a crash in UVAtlas.
Normal seams on dynamic meshes are now automatically hard edges when converted to mesh description, which can better preserve sharp features when the dynamic mesh is used for editing a static mesh or skeletal mesh asset.
Reduced confusion during displace tool computations by adding a slight delay to the appearance of the 'in progress' material.
Addressed a bug which displayed random gizmo orientation in local space in the PolyEdit tool.
Fixed an error in AddSingleClickBehavior and AddDoubleClickBehavior function tooltip.
Fixed the StaticMeshSelector only working on exactly StaticMeshComponents.
Procedural
New:
Added "SetWorldObject" on the PCG Data Exporter for Blueprints.
Objects can't be cast to World in Blueprints, and when doing an utility widget, Get Selected Assets returns an array of objects.
Does the cast internally, returns false if the cast fails.
Added support for skeletal meshes in BoundsFromMesh and PointFromMesh.
Deprecate StaticMesh property to Mesh property in PointFromMesh, with override alias
Added a new "Extract Attribute" node to extract any attribute from any data and domain.
Factorized code for Get Attribute From Point Index.
Get Attribute From Point Index now works with data domains too.
Added the Polygon2D data type, that represents a 2d polygon (e.g. on a plane), with an additional transform. Has some polygon specific metadata properties on both the data domain and the vertex domains.
Added Python Interop Plugin and Execute Python Script Node.
Stand up the Break Debugger debug feature for GPU nodes, and make the breakpoint conditional on inspection so that it is usable in partitioned/higen use cases.
Fixed multiple performance bugs where GPU-resident data is unnecessarily read back when passing through Change Grid Size nodes.
Added toggle to GPU nodes to trigger render captures for debugging (editor only).
Added GPU processor node for Attribute Sets.
Fixed runtime generation bug where changing Partition Grid Size setting on PCGWorldActor resulted in generated actors being leaked into the level.
Added re-nameable categories for organization in Graph Parameters + Includes Drag and Drop.
Improved priority calculation in distance and direction runtime generation policy to behave more uniformly across grid sizes and to be easier to tweak.
Note: May require re-tweaking if non-default weights were in use.
Added Generate Landscape Textures node that can generate a height map as well as grass maps from the landscape. This path does not rely on virtual textures, and is significantly more efficient than the CPU path.
Added LLM tags for tracking memory allocations.
Added a get segment node that allows the user to retrieve a segment from a polygon 2d, spline or point data, in the form of two points or a spline containing a single segment. Support negative indices (-1 being the last segment) in all cases and hole support for polygons.
Added 'Clip Paths' node to cut paths (points or splines) with clipping polygons. Supports either difference or intersection.
Add new property for data that supports elements: @Data.$NumElements.
Useful to combine with Filter Data by Attribute.
Added the concept of read-only for properties in the Selector menu to not show for output.
Applied this concept to Polygon2D properties.
Added support for property remap when converting back and forth between Attribute Set and Points
Saves adding "Copy Attribute" nodes to do the conversions.
Added option to disable default input creation for top-level graphs. Will become default eventually.
Improvements on Boolean and Bitwise op.
Boolean op now supports arithmetic types as input, still produces a bool as output.
Added operators NAND, NOR, XNOR, IMPLY, NIMPLY.
Added ShiftLeft/Right for Bitwise.
Added "AddModulo" operation in maths node.
Do operation (A + B) % C .
Useful to get the ($Index + 1) % NumPoints.
Added comma-separated tag list (override) to create target actor node.
Added polygon offset functionality (offset positive or negative, open and close holes).
Added polygon operations (intersection, difference, union, inner intersection, exclusive or, cut polygon with paths).
Added GPU implementation of Transform Points.
Added change detection to runtime generation state to throttle scans over grid cells, saving per-frame Game Thread cost.
Added 'Split Spline' node to split splines based on a few criteria (key, distance, alpha) or on a predicate on control points.
Add `IsBuilder` to Get Execution Context node.
Needed to know which component the builder was scheduling.
Added that information to the PCG Editor Module, which can be queried through IPCGEditorModule.
Add helper function to get the result from the IPCGEditorModule.
Added support for attribute curve remap.
Added a new mode in the existing attribute remap node.
Added an alias for curve remap.
Also exposed ExternalCurve for the spline sampler (with the new PCG_OverridableChildProperties).
Added a 'Spline Intersection' node that computes intersections between splines (in 3d).
Added a debug feature that repeatedly dispatches the compute graph to enable profiling, compiled out by default (PCG_GPU_KERNEL_PROFILING).
Added String Contains and Matches nodes and .Length extractor + Extractor:
.Length - Length of the string
Contains - Whether string A contains substring B
Matches - Whether string A matches string B exactly
Added Cvar pcg.GPU.FuzzMemory which initializes GPU buffers to random values during execution to help catch uninitialized data bugs and other undefined or unreliable behaviour.
Added the ability to retrieve the ray hit material with GetMaterialFromCollisionFaceIndex, instead of needing to specify a material index.
StructUtils: Added new features to the Property Bag Details View Child Row Widget:
Customizable via the EPropertyBagChildRowFeatures enum (set via metadata specifier).
New STypeSelector widget (wrapper around SPinTypeSelector) for type selection.
New Access Specifier button.
New drop down menu.
Added 'Get Asset List' node to get assets from a folder or from a collection. Can extract asset classes and generated classes when these are blueprints too.
Anim - SkinnedMesh: Exposed SkinnedAsset and TransformProvider on FSoftSkinnedMeshComponentDescriptor.
To have parity with the non-soft version.
To be used for the Instanced Skinned Mesh Spawner in PCG.
Nanite Assemblies: Initial prototype of Nanite Assemblies builder to support creating Static Meshes.
Interop plugin, as this is still very experimental.
Added specific graph cache enabled and budget CVars for editor worlds vs game worlds.
Can now override nested properties in the Static/Skinned Mesh Spawner.
Bug Fix:
Fixed multiple cook warnings arising from GPU node kernels.
Fixed bugs with CreateGrid2D and CreateGrid3D Custom HLSL helper functions where the NumRows/NumCols arguments were not used correctly.
Fixed Filter Elements by Index node's indexing issue.
Now supports Attribute Rename for Selectors and Data domain.
Improvements to Spline Mesh spawning.
Component class is now respected when spawning the spline mesh.
Added override on the component itself, if users have special fields they want to fill.
Fixed an outstanding issue in package build where the Switch and MultiSelect nodes can fail if the DisplayName is different from the real name for an EnumValue.
GetDisplayName won't return the display name in package build but the real name.
Since we use the Display name for naming the pins, we need to keep a mapping.
Fixed Create Points Sphere crash from divide-by-zero when graph params are used to set degrees to 0.
Fix bool attribute in Write to Niagara Data Channel.
Writing bool values was crashing.
Fixed bug causing Inline Constant not to respect required pin.
Fixed Per data CRC caching issue when there are N:N mappings, which was the case in some configurations of the Match & Set node and the Distance node.
Added support to call Pre/PostEditChange on objects on ApplyOnObjects.
When overriding objects with ApplyOnObject node, we call Pre/Post Edit change to have any pre/post processing to do after a change.
Fixed an outstanding bug in match and set attributes for attribute sets in keep unmatched mode.
SetAttributes metadata entry keys arguments were in the wrong order.
Can now drag and drop in the graph any asset that is a subclass to UPCGBlueprintElement.
Fixed the RemapMaterial not working if the target dynamic mesh didn't have any material.
This was breaking appending a mesh with materials to an empty dynamic mesh, for example.
Fixed erroneous readbacks and re-uploads of arrays of GPU data items that are not placed first in the compute graph's input data collection.
Texturing Tools
New:
Improvements to UCurveLinearColorAtlas.
A bug was fixed which caused nearly black negative values to become white.
TextureHeight of Atlas is now automatically set to the number of curves.
The default width of new atlases is now 64 instead of 256.
Interactive updates are now much faster.
The UV scale for sampling atlases is now fixed so that the U range of [0,1] goes from the first to last pixel center. Old atlases will automatically be updated for these changes.
Added Virtual Texture feedback and warmup support to TextureGraph material rendering nodes.
Virtual texture samples will now stream to the correct mip level before the final render.
Added a new console variable to control the warmup length: "TG.VirtualTexture.WarmupFrames".
UV Editor
Bug Fix:
Fixed localization issue for the "Advanced Transform" category label.
Fixed UVEditor launch conditions to support BP actors with mesh components.Fixed an issue where the RMB context menu would not display the UV Editor option for actors with any invalid components.
World Building
New:
Added a Save Texture to Asset node (editor only).
Added a world partition function to insert a new runtime cell transformer.
HLOD:
Support Spline Mesh Components in Approximate Mesh HLOD.
Added world partition validation to detect actors having a HLOD Layer which doesn't support that actor class. Rules can be specified using a config file and violations trigger a warning.
Standalone HLOD: Added AWorldPartitionHLODOnlyLevelInstance Actor to allow users to place Standalone HLODs in the world without having to add actual Level Instance to the world
After adding the actor to the world users can select the level for which Standalone HLODs should be loaded.
The actual level is neither loaded nor cooked. It's only used by the Standalone HLOD Subsystem to pull in the corresponding Standalone HLOD levels.
Add overridable attribute support to CustomHLSL node
Custom HLOD support:
Added WorldPartitionCustomHLODActor, an actor you can place in the world to provide a custom HLOD representation (using static mesh component).
Added a new HLOD Layer type: "Custom HLOD Actor".
Custom HLOD actors assigned to "Custom HLOD Actor" layer are injected as-is into the HLOD runtime partition.
The "Custom HLOD Actor" layer can specify a parent layer. In that case custom HLOD actors are also used to generate parent layer's HLOD representation.
Custom HLOD actors can also be assigned to other (non-Custom) HLOD Layers. In that case they are used only during HLOD generation and are not pulled into the HLOD partition themselves.
Adds a new LinkedLayer property to UHLODLayer, visible only when LayerType is set to Custom HLOD Actor
LinkedLayer is used to control the visibility of Custom HLOD Actors. They become visible when actors from the LinkedLayer are unloaded.
If LinkedLayer is not specified, Main Partition is used to control the visibility.
Added a SceneCapture node.
Added GPU implementation for CullPointsOutsideActorBounds.
Now supports overridable attributes on GPU nodes.
Added a world partition function to check if runtime cell transformers are installed.
Cell Transformer: Improved handling of components that can be ignored.
FastGeo: Moved FastGeoContainer PSO Precaching from PostLoad (GameThread) to be asynchronous.
Added grid streaming dependency mode to scheduling policy
Move PCG GPU from Experimental to Beta.
Bug Fix:
Standalone HLOD:
Fixed a crash when adding a standalone LI with standalone HLOD to a non-WP world.
Made sure that Standalone HLOD Actors are injected into appropriate containers during streaming generation.
Fixed attached spatially loaded actors not being GCed when AttachParent exists.
EDL: Fixed handling of EDL injection of client-only cells in cases when it happens after BeginPlay Removes irrelevant cells from cells lists during the injection.
Foliage Editor Subsystem: OnActorMoved optimization to avoid expensive TActorIterator operations when no work is done inside the TActorIterator loop.
HLOD: Fixed distributed HLOD builds running on non-WP worlds not doing any work.
WPBuilderCommandlet: Fixed logging when processing additional maps.
Standalone HLOD: Fixed logic that generates the list of Standalone HLOD levels returned by ShouldProcessAdditionalWorlds, to correctly handle cases where the number of HLOD Setups differs from the maximum HLOD hierarchy depth.
FastGeo: Fixed a crash on mac caused by TArray relocation of FFastGeoPrimitiveComponent which contains a FRWLock.
[Cell Transformer] Replaced references to objects that could be recreated during RerunConstructionScripts triggered from ApplyRuntimeCellsTransformerStack in Standalone Editor.
Fixed a crash while level editing. Deleting an actor inside a level instance then pressing save in the bottom of the level viewport would crash in some situations.
Media
Media Viewer (Beta)
New:
Extra keybinds for videos:
Fixed spam of updates when offset / scale was not changing.
Exposed delegates to the public API so it can be used in the image viewer overlay.
Transform lock now also duplicates media playback controls between players.
New dragging options:
Revamped dragging system a little to support more zoom types.
Added alt+rmb to zoom (in addition to scroll wheel).
Added alt+mmb for panning (in addition to left click).
Improved level editor viewport robustness:
Made sure all settings have default values.
Moved level viewport render to end of RT thread event.
Added cross-thread robustness to the pixel color system.
Media track section:
Added a media track section that lists tracks in sequencer that have a media texture.
Added the refresh dynamic group button.
Images now support yaw rotation.
Added a clear history button.
Added Snapshot category.
Bug Fix:
Fixed controls to properly display when playing in reverse.
Also added keybind info to tooltip buttons.
Media Viewer / Media Player Editor:
Added scrub event to IMediaPlayerSlider.
Integrated scrub event to allow dual scrubbing.
Fixed bug in file drag/drop for media viewer not allowing comparisons to current image.
Media Stream: Fixed for packaged games.
Fixed crash relating to viewport.
Added texture size constraints to render calls.
Fixed struct initial values.
Fixed a crash with invalid library thumbnail.
Fixed changing splitter location in single image mode.
Media Stream:
Corrected the "Add Track" button for Media Sources.
Will now always display the button, but disable it, rather than hide it, when it is not available.
Added tooltip to the button explaining what it does and when it is usable.
It is now disabled if the Media Stream's world is not the level level sequence's world.
Fixed relevancy issue for Sequencer.
Fixed Sequencer binding issues.
When locked scrubbing, the videos not being directly scrubbed is paused.
Invalid assets are removed from history when the tab is opened.
When in dual view and without an A image, the slider position now works correctly.
Fixed pixel sampling for compressed images - All pixel samples now work via a render target.
Fixed an issue with A-image not being displayed behind B-image when the slider was set to 0%.
Right click asset fix: There's now a maximum parent check for material instances
Fixed crash when 2 viewport tabs are open.
Added cross-thread hardening for pixel sampling.
Added more texture encoding types to the no-read-with-rhi list.
You now must supply a unique name when saving snapshots.
Toggling the overlay while in comparison mode no longer blocks the custom image ui (i.e. video control overlay).
Mobile Rendering
Mobile Lighting
New:
Translucent objects now receive CSM shadow when surface lighting.
Mobile Postprocessing
New:
Added EUpscaleMethod::Area and swapped in for PrimaryUpscale using the mobile renderer to reduce blurriness at low screen percentages.
Online
Crash Reporter
New:
Apple:
Unified crash dump format on iOS & Mac to crashlog
Added commandline/ini override to enable crash dump on iOS.
Upgrade PLCrashReporter to 1.12.0 and apply our existing modifications by diffing 1.8.1 vanilla & our modified 1.8.1
HTTP
New:
Added an option to enable different http versions per IHttpRequest via SetOption(HttpRequestOptions::HttpVersion).
Limit the number of concurrent HTTP requests by default. This helps avoid connection timeouts when queuing up very large numbers of HTTP requests.
Bug Fix:
Fixed Blueprint compilation crash due to mismatching pin names.
Fixed a low rate crash in HTTP requests.
Online Subsystem
New:
OSS for GDK: Propagate the checkout failure error codes from GDK APIs into PurchaseFailure and PurchaseFailureStart errors.
OnlineServicesCommon: Added TOnlineAsyncOp::GetWrappedHandle to transform the result of an operation to simplify cases where one operation is implemented in terms of another.
Added OSSv2 PSN Connectivity interface.
Bug Fix:
Fixed OnlineServicesNull handling FPartialUpdatePresenceFix FPartialUpdatePresence not merging RichPresenceString.
"ENABLE_PGO_PROFILE 1" Shipping configuration can now disable online subsystems from the commandline.
Fixed Push Event related issues
Fixed FNpPushEventWrapper::Initialize not correctly handling callbacks disposing.
Fixed OSSv1/2 FNpPushEventPushContextWrapper not handling TOptional value safely
Fixed crash in FUserManagerEOS::ReadFriendsList callback when user failed to authorize.
OnlineSubsystemIOS: Fixed a race condition that caused a purchase to fail when purchasing an offer immediately after finalizing a successful purchase of the same offer.
Deprecated:
Removed deprecated GoogleSignIn support from OSSGoogle for Android.
Platform
Linux
New:
Upgraded toolchain to LLVM 20.1.8
Added preliminary support for BuildCMakeLib from Linux.
Add -NoStripSymbols to UBT to support build systems where stripping needs to happen later in the process.
Bug Fix:
Re-enabled PreLoadScreens.
Now skips chmod +x dotnet if file is already executable. This addresses permission errors if UE is run on a read-only file system on Linux.
Fixed an issue where BuildCMakeLib can produce .so files that depend on system shared libraries.
Fixed loss of precision when FLinearColor is requested in VulkanDynamicRHI::RHIReadSurfaceData.
Updated FLinuxPlatformProcess::BaseDir to support -basedir=.
Mac
New:
Inline Ray Tracing is now available for Mac platforms running with the SM6 renderer.
Parallel translation of encoders is now enabled by default on Mac (and can be used on iOS). This gives a significant reduction in overall RHI thread time.
Compute shaders are now executed with concurrent dispatch on iOS and Mac platforms. This provides a significant performance boost when using Nanite.
Adding Metal-strip to lib processing to reduce metallib sizes (around 10% reduction).
Delete iAD framework (deprecated) from Core.Build.cs.
Mac: Included Mac MainThread in CrashContext.runtime-xml for CrashReporter.
Added support for Aliased formats to be explicitly declared enabling optimisation on Metal platforms.
Bug Fix:
Fixed tweakobjectptr debug on Mac OS.
Fixed process reaping to be non-blocking and not leaking.
Fixed an issue where on Mac/iOS SM5 uniform buffers were bound to indices that were unnecessarily high, which caused validation errors in the RHI.
Stopped the submission thread getting stuck when encountering a NotPermitted GPU error.
Fixed bug where Metal runs out of counter sample buffers.
Metal now longer breaks encoders by default when profiling, this can still be enabled with GMetalSampleComputeEncoderTimings and GMetalSampleBlitEncoderTimings.
Mac:
Fixed Cursor offset from visual because of an outdated ScreensArray when processing OnWindowDidMove, resulting from a DPI change.
Fixed MainThreadChecker issue in FMacApplication::OnWindowDidMove. Move bDisplayReconfiguring from FCocoaWindow to FMacApplication since it's not dependent on FCocoaWindow
HairStrands: Disable HairStrands rendering on Mac SM5.
ApplePlatformFile: Refactored to use the common implementation FFileHandleRegistry to support more than the limit of read-only opened files.
Changed Fatal log to a Warning when posix_spawn fails in CreateProcInternal, for consistency with Windows, and to prevent unnecessary crashing.
Fixed DPI scaling bug which could cause Mac's to render at 2x res when using PIE.
Fixed performance issue on editor start up with mdfind taking multiple minutes due to matching incorrect types.
Fixed potential bug where bindless handle could be null when retrieving viewport texture.
Online
New:
Updated GooglePlay Billing library to 7.1.1 in OSSGooglePlay
Bug Fix:
Pixel Streaming:
Fixed a crash when streaming with Pixel Streaming and a user attempts to enter text through the stream text modal on a multiline text element.
Fixed a crash in the editor when setting the streamID on the command line and streaming with Pixel Streaming.
AVCodecs: Encoding frames with VP9 can now have odd pixel width or height.
Windows
New:
Moved Win32 calls for mouse cursors off of the game thread and onto the task graph to reduce stalls on the game thread from internal lock contention that occasionally occurs.
Moved processing of mouse inputs to a dedicated thread to reduce overhead on the game thread for Windows. This is useful for mice with high polling rates, e.g. 8000 Hz.
Made Clang 20 the preferred version of Clang on Windows.
Changed thread priorities for Game, Render, and RHI threads from Normal to AboveNormal on Windows.
Increased MinimumWindowsX64TargetVersion from 0x601 (Windows 7) to 0xA00 (Windows 10) to make more functionality available directly from Windows headers.
Bug Fix:
Ensured that shared resources are created as committed resources for improved compatibility.
Changed our heap VA computation for transient resource allocations on Windows to fix D3D12 call failures on some GPUs.
Fixed FWindowsPlatformMisc::SetEnvironmentVar to unset the variable if it is null or "", just like on Mac and Linux, and .NET 8.
XR
New:
Added native support for the OpenXR XR_EXT_frame_synthesis extension, including Application SpaceWarp (AppSW) on Meta Quest:
To enable, set:
r.Velocity.DirectlyRenderOpenXRMotionVectors=1 (read-only)
xr.OpenXRFrameSynthesis=1 (toggleable at runtime).
Currently only supported on the Vulkan mobile forward renderer, and cannot be used alongside features which require standard velocity rendering (such as TAA/TSR).
Added Android Runtime category tag for immersive mode selection.
See https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#appendix-android-runtime-category
AddedIOpenXRExtensionPlugin hook OnCreateHandTracker().
OpenXR XR_EXT_user_presence is now supported:
Added support for the user presence extension, which tells us whether the hmd is being worn if the platform supplies that information.
Removed the previous implementation which attempted to drive the worn state from other openxr state transitions. This had inconsistent and sometimes broken behavior across platforms.
Replace xr.MobileLDRDynamicResolution with a new CVar, xr.MobilePrimaryScalingMode, which controls whether primary scaling is redirected to the HMD runtime (which will always use spatial scaling) when it would otherwise be unsupported.
Options are:
0: Never
1: DynRes Only (default)
2: Always.
Updated device profiles for standalone XR devices. They no longer inherit from each other in sequence, and the new Android_OpenXR device profile matches the Quest 3 profile which has had its shadow quality increased for dynamic shadows to draw by default in Mobile Preview and on Device. Consider lowering this value if dynamic shadows are not required.
Improved expose passthrough support via the editor:
Added a new UENUM for environment blend modes, EOpenXREnvironmentBlendModeUpdate SetEnvironmentBlendMode() node to accept EOpenXREnvironmentBlendMode.
Added a new GetEnvironmentBlendMode() node.
Added a new GetSupportedEnvironmentBlendModes() node, which returns supported blend modes in an array in order of runtime preference (highest to lowest).
Added a new IsCompositionLayerInvertedAlphaEnabled() node.
Added an xr.OpenXRInvertAlpha checkbox to the OpenXR plugin settings.
Added an r.Mobile.PropagateAlpha checkbox to the Engine->Rendering->Mobile settings
Renamed OpenXRHMDSettings to OpenXR Settings, since it controls settings for the entire module.
OpenXR is now building for all platforms:
The platform specificity of the openxr plugins and modules was problematic because content derived from these would not load on non-xr platforms for projects that are meant to be cross platform.
OpenXR is not actually platform dependent. It can be implemented on any platform. If it is present as a fully independent openxr runtime a small amount of platform specific code is needed to implement an openxr loader.
It is also possible to create an unreal plugin which either acts as an openxr runtime or is able to find an openxr runtime.
The plugins are still disabled by default.
Bug Fix:
Removed permissions not allowed by Quest App Store.
Fixed various debug draw elements failing to render when using Instanced Stereo or Mobile Multi-View:
r.VisualizeOccludedPrimitives
ShowFlag.Bones
DrawDebugBox and other similar calls, excluding DrawDebugString.
Fix a bug where late update camera movements were not accounted for when calculating scene visibility, causing smearing, latency, or other artifacts when some rendering features were used.
Fixed GetHMDData TrackingStatus field:
It was only checking if the hmd device tracking handle was valid, needs to check if the hmd is actually tracked.
It was also attempting to use the camera position rather than the hmd tracking position.
Removed GetMotionControllerData and FXRMotionControllerData which were deprecated in 5.5.
Added handtracking permissions for Quest.
Fixed OpenXR AddProfile for input always being given true rather than the passed in bHasHaptics parameter.
Fixed a crash when using the SteamVR runtime with Vulkan.
Fixed MetalViewport SubmitImmersive: [IOGPUMetalCommandBuffer setProtectionOptions:]:585: failed assertion `setProtectionOptions: with uncommitted encoder'
Fixed Visionos cp_frame_query_drawable null handling:
We abandon the frame if the drawable is null, this indicates that the app is either being paused or exited.
Essentially we just continue the frame but don't call the cp_ functions.
At the beginning of the next frame we handle the state change.
Deprecated:
Deleted the formerly deprecated functions from 5.3 to remove references to the UPlayerMappableInputConfig type.
Platform Mobile
Android
New:
Added -FastIterate flag to Visual Studio/Rider/Quick Launch, to have libUnreal.so outside the APK, and made build iteration faster in general.
Added -AndroidStudio flag to GenerateProjectFiles that generates a Gradle project that wraps around the original Gradle project that is suitable for use in Android Studio.
The Android Vulkan detection logic now uses the same VkApplicationInfo parameters (e.g. App name, Engine version) as used by the VulkanRHI initialization, so graphics drivers that need to opt out of Vulkan for Unreal Engine apps can do so consistently.
Implemented support for factoring screen rounded edges in computing the safe zone. The implementation means users can align the safe zone horizontally or vertically to the rounded edge excluded areas or to an average of both.
Additionally, cleaned up current safe zone implementation to determine size relative to the main view instead of the display as the system may reduce the main view to exclude cutout areas.
Constrained kotlin stdlib dependencies to >= 1.8.0 to fix building issues.
Recompiled libopenxr_loader with 16kb page support based on NDK 27.2.
Removed need for security token for debuggable applications when using AndroidFileServer with UnrealAndroidFileTool.
Added warning if a library on Android is not 16kb page size compatible.
Removed bashrc/bash_profile related code, instead using zshrc for Mac as primary source of environment variables.
Report resident size of "libUnreal.so+base.apk+[anon:.bss]+[anon:linker_alloc]" as ProgramSize on Android.
Report resident size of all memory mapped files as MMIO on Android.
Tag all virtual memory with "UE" VMA tag on Android.
Added the vkquality 1.2.2 library which can be used as another data point as to whether to select Vulkan or OpenGL ES.
The result of the vkquality check is returned in the SRC_VKQuality that can be queried by the Android device profile selector rules.
Updated AutoSDK "MinVersion" to NDK r27c.
Improved AndroidFileServer (AFS) file transfer - retries and resumes for file push to device.
Resolves potential sync issue that leaves the EditBox non responsive to text input and the keyboard in a state where it doesn't get dismissed its the 'Done' button.
Additionally, replaced setVisibility with add/remove View to work around an Android level spam issue when keyboard is repeatedly dismissed/invoked.
Improved Android Camera Player with the Android Camera2 APIs and support for Vulkan frame data processing.
Default NDK is updated to r27c, buildtools to 35.0.1, bundletool to 1.18.1.
Recompiled libopenxr_loader with 16kb page support based on NDK 27.2.
Replaced libhwcpipe with C wrapped .so to avoid C++ STL ABI conflicts on Android.
Now starts loading libUnreal dependencies early for faster startup time
Created Android-arm64/x64 configs in Visual Studio.
Made Quick Launch now build an x86_64 binary when launching on x86_64 devices, such as the emulator.
Lowered Android SDK "MaxVersion" to NDK r28c, due to NDK r29 compiler bug.
Update GooglePAD to 1.15.4 / 2.3.0.
Added engine device profiles for Mali-G1-Ultra and similar devices.
We now detect devices using the ANGLE OpenGL ES driver and use the Vulkan deviceName string for SRC_GPUFamily. This means the device profile Vulkan selection can continue to match the same string as used when the device is in native OpenGL ES mode.
Bug Fix:
Enabled desugar for older Android support.
Filtered out AFSProject task if running it from Gradle (prevent second run).
Ensured java sources are wiped when FirebaseEnabled is toggled off. Otherwise, source files are left behind that don't compile as the Java dependencies don't get populated by the plugin when FirebaseEnabled = false.
Additionally, registerBuildSettiings for the Firebase settings referenced from the plugin's UPL.
Fixed the timing of firing the MediaOpened event in Android Camera Player.
Fixed the issue that the Console Command input is disabled when "Show Launch Image" is off in Project Settings.
Ensured keyboard OnTextCommitted messages are dispatched when using Android improved virtual keyboard.
Ensured nativeKeyboardInputResult is invoked when keyboard is dismissed and keeps the reference to VirtualKeyboardWidget valid until the result is handled.
Corrected issue with file locking in UnrealAndroidFileTool for writes.
Fixed black screen when playing start movies.
Added a watch for deletion complete before database close in Fetch2 (part of background downloading).
Moved early load sync point to prevent possible crash due to an ordering issue.
Made NDK toolchains detection for manual SDK installs more robust.
Made JAVA_HOME environment setting for manual SDK installs more robust.
Added missing setting of ndkPath to Gradle property value
Fixed generated install scripts with overflow OBBs that are broken on non-Windows
Updated Breakpad dump_syms with version supporting compressed symbols.
Added catching of UnsatisfiedLinkError in GameApplication.LoadLibraries, in case some other ClassLoader has already loaded them
Fixed the WebView freeze when switching the game to the background while loading a URL.
Fixed VersionScriptFile not being created robustly, sometimes causing build failures.
Worked around a Gradle bug whereby when only assets change, it attempts to patch the existing APK from previous packaging by adding asset deltas resulting in growth of the final APK payload. Workaround is detection of changes to assets and wiping the existing APK to force Gradle to repackage it correctly.
Fixed a Java exception when closing the Camera Device during initialization.
Fixed the "Play On Open" feature for the Android Camera Player.
Fixed the keyboard EditBox layout on devices with cutout when the cutout area isn't used.
getWindowVisibleDisplayFrame returns a rectable in screen space, however, the edit box coordinates need to be provided in the main decor view's space.
As such, translate the results of getWindowVisibleDisplayFrame to the decor view's space by translating these by the decor view's screen position.
libGPUCounters: Android early crash fix libGPUCounters is built with statically linked libc++, exposing a bunch of std symbols, which override those in libUnreal.so.
For example, it overrides std::to_string leading to an early crash:
Other plugin calls to_string (uses libGPUCounter implementation and its operator new & memory alloc).
That string is later destructed, using engine's operator delete.
Our allocator fatals on unrecognized pointer.
The fix is to add a linker version script to the libGPUCounters build and only expose C API related symbols as global.
Updated Android TargetSDK Fix templates with AFS configuration.
Updated Fetch2 3.3.0 with new version of androidx.room 2.7.1 (used for background downloading).
Added detection of SQL lock error on enqueue (can happen after deleteAll in Fetch2 background downloading).
Added new dump_syms_comp.exe supporting compressed Symbols for Android use.
Fixed an issue with assets with starting offset other than 0.
Made MakeApk do a clean during packaging if EnableBundle is flipped between builds.
Fixed crash from pending JNI exception in non-Shipping builds, when skipping over checks.
Now round rather than truncate Android getRefreshRate when converting to integer.
Fixed the freeze of Android Media Player playback on Xiaomi 13T or devices with a similar chipset.
Fixed TargetSDK 35 compatibility issues with background downloading.
No longer requests WRITE_EXTERNAL_STORAGE permission if TargetSDK doesn't support non-scoped storage.
Ensured that keyboard dismissed isn't called when the text input is accepted by the Virtual Keyboard's done key or a physical keyboard's enter key.
Additionally, ensured that on dismissal of the virtual keyboard, text entry type is Canceled so that text committal only triggers if the widget is configured with behaviour 'Text commit on Dismiss'.
iOS, tvOS, and iPadOS
New:
IOS: Notification about network path characteristic FIOSPlatformMisc::OnNetworkConnectionCharacteristicsChanged can be used to know about network characteristic changes, e.g. knowing if a new connection is constrained or expensive.
Re-enabled SetBytes and SetBufferOffset on iOS and enable on tvOS.
Added support for Xcode26.
The IOS rotation code now defers applying a new rotation until after we have rendered a new frame in the new orientation, for both auto-rotation and programmatic orientation selection.
This fixes the issue with a squashed aspect ratio when the user rotates the app at a time we cannot immediately render a new frame, such as during loading.
Now ask for background time on iOS until all delegates called from applicationWillEnterBackground are invoked.
Disallowed resolve of R32F MSAA targets as this format isn't MSAA resolvable in Metal.
Additionally, make the texture memoryless as we'll never be resolving to it.
Exposed network changed delegate for iOS.
Implemented functionality for -MetalPSOCache=use.
Bug Fix:
Deferred handling of notifications if the engine isn't ready to receive.
Occlusion Query Helpers now correct the number of frames for Metal mobile platforms.
Ensured valid URL for pipeline cache save location.
The current invalid URL generated was invalid as it was constructing a file URL using the absolute string of another URL as a path parameter to the constructor, causing MTLBinaryArchive->serializeToURL to crash when used.
Now store webauth credentials in iOS keychain using a key that does not change after uninstalls.
Fixed some memory leaks in the iOS web browser.
Rendering
Architecture
New:
Virtual Texture:
Renamed "r.VT.Support16BitPageTable" to "r.VT.PageTableMode".
The setting can now be modified live at run time instead of being read only.
Also removed "r.VT.SplitPhysicalPoolSize" which now corresponds to setting "r.VT.PageTableMode=2".
Unified mip color debug display for Virtual Textures.
"r.VT.RVT.MipColors" is deprecated and Runtime Virtual Textures now respect "R.VT.Borders" which other Virtual Textures already use.
"r.VT.Borders" is no longer on/off. The value now sets the debug border texel width.
Also added "r.VT.Borders.Mip" which isolates the mode to a single mip level.
Release/Recycle Virtual Texture spaces after they are unused for some time.
We don't release immediately to avoid cases during loading where this might trigger unnecessary Recreate/Resize work.
The old behavior was to never Release/Recycle unless we ran out of space slots.
Added "r.VT.SpaceReleaseFrames" to control this. The default is to release after 150 frames. Setting to -1 will return to the old behavior.
Changed draw behavior for selected meshes which only write to Runtime Virtual Texture.
Previously we would fully show those meshes on selection (they are hidden in the main pass otherwise).
Now we only show the selection outline.
Runtime Virtual Texture:
The display name of the "Virtual Texture Builder" (also sometimes previously known as "SVT") asset is now "Streaming Runtime Virtual Texture" (i.e. SRVT). This avoids confusion with Sparse Volume Texture (SVT).
It can now be created from the content browser.
Now prevent StreamingTexture from being carried over when duplicating a RVT component (Save As, copy/paste...). This avoids the common mistake of using another map's SRVT after a Save As.
Added optional Z-increment parameter to FPixelShaderUtils::AddRasterizeToRectsPass, in order to control the Z of the quads (Z = quad index, i.e. instance id * ZIncrement). Combined with depth test enabled, this enables making the rasterization deterministic in case of overlapping quads.
Bug Fix:
Runtime Virtual Texture preload requests now work for the adaptive page table case.
Fixed programmatic RenderDoc captures randomly crashing.
Fixed non DBuffer mesh decals not obeying the mesh component "Receive Decals" setting.
Lighting
New:
Enabled VSM receiver masks for directional lights by default.
~10MB memory overhead (depending on settings/scalability).
Often fairly significant performance improvements in uncached cases with lots of dynamic geometry.
Disabled the selection of Virtual Textures on Rect Light components. These have never been supported in a cooked build, but were still shown in the Editor.
Exposed Max Draw Distance and Max Distance Fade Range to Blueprint.
Now store and propagate "cleared" flags to avoid reclearing pages we never wrote into; particularly relevant for receiver mask where we treat all dynamic pages as uncached but often don't write into them all.
No longer allocate unnecessary receiver mask space if local light receiver masks are disabled.
Refactored VSM ID allocation so that we can control the order more consistently. The immediate goal is to guarantee that directional lights get allocated first so that we can easily allocate receiver masks just for directional lights without the memory overhead of doing it for all local lights as well
Added TexCreate_3DTiling flag to volume textures in TranslucentLighting to reduce memory and boost performance on some platforms.
Marked r.UseClusteredDeferredShading and r.Mobile.UseClusteredDeferredShading as deprecated and added notification about future removal. Clustered deferred shading will be removed in a future release due to lack of utility to reduce maintenance burden.
Bug Fix:
Fixed incorrectly reported one pass projection overflow with megalights active. Only run VSM coarse page marking once when there are multiple views as it is view-independent.
Scale the light fade range by `GLightMaxDrawDistanceScale` to avoid lights becoming too dim at lower scales.
Lumen
New:
Enabled half res integration on High scalability (r.Lumen.ScreenProbeGather.StochasticInterpolation 2).
This can soften normals in indirect lighting, and make GI a bit more noisy.
On the other hand it saves ~0.5ms on console at 1080p, which feels like a right tradeoff for High scalability intended for 60hz on console.
Lumen Screen Probe Gather: Bent Normal Integration improvements (r.Lumen.ScreenProbeGather.ShortRangeAO.ApplyDuringIntegration 1)
Implemented r.Lumen.ScreenProbeGather.ShortRangeAO.ScreenSpace.FoliageOcclusionStrength.
Fixed EvaluateSHIrradiance which was causing brightening in corners.
Removed double AO apply during bent normal integration. Now instead of applying AO for the second time we apply only the GI approximation using AOMultiBounce, as DistantIlluminationRescale was too strong.
Clamp decoded AO as it could be larger than 1 causing too strong indirect specular occlusion.
Now support ShouldApplyDuringIntegration when Screen Probe Gather Integration and Short Range AO downsample factors match.
Fixed artifacts when ShortRangeAO is disabled, but ShouldApplyDuringIntegration is enabled.
Lumen HWRT path now supports split screen.
R.LumenScene.DumpStats 3 will now dump primitive culling information. This is useful, as it merges instances into a single entry making it easier to read the log.
Moved GBuffer tile classification out into a single pass, which is also storing opaque history for the next frame. This pass is reused across Lumen and MegaLights for better performance.
Screen tile marking optimizations, which speed up reflections, GI, and water reflections.
Tweaked default settings:
r.Lumen.TraceMeshSDFs 0 - SWRT detail traces (mesh SDF tracing) is now a deprecated path, which won't be worked on much. For scaling quality beyond SWRT global traces it is recommended to use HWRT path instead.
r.Lumen.ScreenProbeGather.MaxRayIntensity 10 - firefly filtering is now more aggressive by default. This removes some interesting GI features, but also reduces noise, especially from things like small bright emissives
Bug Fix:
Fixed missing subsurface energy by removing extra divide by PI. Now an emissive card matches a rect light reference of the same irradiance. This bug was only affecting Epic scalability (r.Lumen.ScreenProbeGather.IrradianceFormat 0 path).
Fixed a bug on Mac platforms when running on SM5 using R11G11B10 for Typed UAV's causing rendering corruption.
Fix visual artifacts and out of memory reads/writes when using non power of 2 Tracing Octahedron Resolution. Now Tracing Octahedron Resolution is always clamped to valid input values.
Nanite Skeletal Mesh now supports bHasRayTracingRepresentation, so that those primitives can be skipped from Lumen under certain conditions.
Fixed landscape culling stealing the r.Lumen.DiffuseIndirect.Allow's on changed callback. This is not needed anymore since this CVar's callback already invalidates all components, including landscape ones.
Fixed tile artifacts on indirect specular on cloth pixels in the same tiles as hair pixels
Don't reset temporal history on SceneTexturesExtent change. Sometimes SceneTexturesExtent can change due to inline view rendering (like water) which causes full history reset and results in visible noise on screen until things converge again.
Skip creating RGS when Lumen is disabled from the PPV volume.
Materials and Shaders
New:
Added an asset registry tag to find material instances causing shader permutations.
Enabled Virtual Texture sampling on Volume material domains.
Changed the interpretation of the PreSkinned Local Bounds material node when used on Instanced Static Mesh. Previously it was the bounds for the entire component. Now it is the bounds for the mesh instance.
Added platform cached ini value to determine whether to compile 128 bit base pass pixel shader variations on platforms which require them. These are infrequently needed and turning them off can save 50k shaders / 15 MiB at runtime r.128BitBPPSCompilation.Allow (default is true, for backwards compatibility).
Improved error messages reported by shader conductor to properly identify where individual error messages begin and end (and so ensure each compile error is reported on its own).
Disabled the ZoomToFocus behavior when creating a usage node from the declaration - No longer zooms the focus of the editor since this was visually jarring for the user.
Optimized material instance post-load in Editor builds by directly hashing the portions of shadermap ID used to construct the unique asset name, rather than constructing the full string representation then hashing.
Added a Base field to Material Parameter Collections, which can be used to derive one collection from another, with the derived collection inheriting the base's properties.
Added support for overriding a material's parameter collections with derived collections in material instances.
Material scalar parameters can now optionally select an enumeration object to use for selecting scalar values by name in the material UI.
Added default initialization of fields of FMaterialEnumerationEntry.
Added function APIs to MaterialEditingLibrary to manipulate the new Enumeration material parameter.
Reworked ShaderDebugData output to unify the "worker input" and "direct compile" debug mechanisms:
Removed r.ShaderCompiler.DebugDumpWorkerInputs cvar; always dump a valid worker input file for all jobs whenever debug info is enabled.
Moved writing of this file into job completion callbacks alongside the other debug artifacts, so will be written out for cache hits if r.ShaderCompiler.DumpDebugInfoForCacheHits is true.
Modified these files to not include a copy of the compressed source, instead using the .usf artifacts.
Renamed "direct compile" mode to "debug compile" and made it use this file instead of needing to serialize extra data into the debug .usf file.
Removed the r.DumpShaderDebugWorkerCommandLine cvar; all jobs will export a DebugCompileArgs.txt file containing the commandline that can be used to run SCW in debug compile mode by default.
Modified shader pipeline compile jobs to export a single worker input file (in the first stage's debug folder).
Each stage of a pipeline will export their own DebugCompileArgs.txt (for convenience, so if only a single stage fails you can still navigate to that stage's debug folder and run the job from there).
The debug compile for any pipeline stage will run the full pipeline job (so compilation always matches what happens in the normal context) with paths modified to be relative to that specific debug folder for convenience (so when downloading debug output from another machine, only one path in the commandline needs to be fixed up to run)
When using the Material Editing Library of functions, now always refreshes the material instance editor when changing material instance parameters.
This fixes a bug where you would set a MI parameter via a python script and the MI Editor wouldn't update the properties panel to show the newly updated value.
Automatically call UMaterialEditingLibrary::UpdateMaterialInstance() whenever a parameter on a instance is set via the library.
UMaterialEditingLibrary::UpdateMaterialInstance should try to find any open material instance editors and tell them that the material instance has changed.
FMaterialInstanceEditor::NotifyExternalMaterialChange now calls `Refresh()` which will update the whole editor, including the property window, to properly reflect any parameter changes made by the library.
Inconsistency fixed on Comment Bubbles on Material Editor:
To ensure visual consistency new Comment bubbles created use the same color value as the other node editors, like Blueprints.
Material Editor: Added two experimental custom output nodes `Motion Vector World Offset (Per-Pixel)` and `Temporal Responsiveness` to give users a way to modify per pixel motion vectors and set how responsive the temporal history is.
Temporal Responsiveness: Describes how temporal history will be rejected for different velocity mismatch levels.
Default :0
Medium (0,0.5]
Full (0.5, 1.0].
Now, it will be used by TSR to change rejection heuristics. Translucency material can also use it to request higher responsiveness if depth is written (r.Velocity.TemporalResponsiveness.Supported=1) or clipped away (r.Velocity.OutputTranslucentClippedDepth.Supported=1).
The translucency mask generated improves TSR thin geometry quality.
Motion Vector World Offset (Per-Pixel): Works similar to the `Previous Frame` input of `Previous Frame Switch` but in the pixel shader. Regions with invalid velocity will be approximated with the current frame's offset.
This function currently supports non-nanite meshes only in non-basepass velocity write and is implemented in two passes. Use r.Velocity.PixelShaderMotionVectorWorldOffset.Supported to enable it.
Added support for customizing the file name for ShaderSymbols and ShaderTypeStats output files.
Exposed EMaterialProperty::MP_MaterialAttributes to Blueprints, Python, and the Editor UI.
This way users can use the Blueprint MaterialEditingLibrary to connect expressions to the MaterialAttributes output on the material block for materials that use MA.
Added a MaterialEditingLibrary function called RenameMaterialParameterGroup and RenameMaterialFunctionParameterGroup which bulk renames all the Group Names on many Material Parameters at once.
Changed LogMaterialEditingLibrary verbosity to include `Log` messages.
Simply loop over all material expressions that are parameters and if the OldGroupName matches change the name to the new one.
Call RecompileMaterial to force the material to recompile so MIs update through the editor.
Unfortunately the `Group` property of material expressions is spread across many different classes. To avoid checking all the different material expression types (there are 8 different UMaterialExpression classes with their own unique Group), I've opted for a property system approach that looks for the property by name.
Optimize pipeline cache to reduce single allocation size and improve performance by copying less data on resize.
Modified output of shader formats using DXC (DXIL output) to keep the reflection data in the DXIL container if the r.Shaders.ExtraData cvar is enabled. This is a workaround for graphics tools which cannot correctly re-generate reflection information from external PDBs.
Note that this bloats runtime memory usage so should only be enabled locally if you are encountering issues seeing data formats (i.e. cbuffer layouts) in such tools.
Can now copy/paste material errors in the PlatformStats panel.
Simply makes the text read-only "editable" so the user can select the text and get automatic copy/paste functionality.
Rename the aliases for the Convert node from `Make Float4` to `Make Vector4` to match "Vector Parameter" and "Constant Vectors'.
This also avoids confusion with the existing Make Float 4 Engine Material functions.
Added additional project-specific texture groups.
Vector Parameter Expression now shows output pin display names to avoid confusion on what the first output pin is.
Also fixed "Convert to Constant" for vector parameters. By default the outputs are now:
RGB
R
G
B
RGBA
Users were expecting the first output pin to be RGBA, but it was RGB.
Now shows output name on pins by default for vector parameter.
Added RGBA output as the final one to match what TextureSample does.
Updated this behavior in the new material translator (it should really use the outputs array which is already defined).
If no channel names are specified show R, G, B by default.
No longer truncates and loses user data when using "Convert to Constant" for Vector Parameter -> Constant.
Gave constant 4 expression display names so the conversion code can match outputs by name when converting nodes.
Marked deprecated virtual functions from MaterialInterface and FMaterial as final to avoid silent errors.
Modified all derived classes to override the right functions.
Improved IO performance of FinishPopulateShaderLibrary.
Added a new debug artifact (ShaderTypeStats.csv), dumped by default for all cooks to the ShaderDebugInfo folder for each shader format.
This CSV file contains permutation counts/code sizes for all shaders in the shader library, grouped by shader type.
Note that this is not directly representative of final shader memory usage since it doesn't account for potential duplication of bytecode introduced by the pak chunking step (where shaders used in multiple pakfiles will have a copy in each).
This is only intended to be used as a tool for tracking and comparing shader growth over time or between cooks.
Subsurface Profile: Improved neighborhood validation for checkerboard when enabled, less bleeding into subsurface scattering region for low res.
Bug Fix:
Virtual Texture Pending Mips debug view now takes screen scaling into account.
Fixed UMaterialExpressionParticleSubUV::Compile bug that caused the node not to use the texture object connected to the Texture input pin.
Repaired cook editor-only-data nondeterminancy in materials.
Ensured that FDefaultMaterialInstance's CacheUniformExpression is cancelled on destroy if still pending.
Under certain conditions the FDefaultMaterialInstance could be destroyed and subsequent dispatch of CacheUniformExpression would result in a crash due to a dangling reference. This replicates functionality from FMaterialInstanceResource for which this guard is already implemented.
Fixed a potential out-of-bounds read when remapping shader compile diagnostic messages; could occur if there were no digits before the end of the line in the diagnostic message after the __UE_FILENAME_SENTINEL marker.
Fixed material shader map not releasing compilation ID if shaders failed to compile.
Fixed incorrect reporting of line numbers when compile errors are encountered in generated material code.
The code calculating the line number offset of the substituted #line directive in MaterialTemplate.ush was incorrect.
Fixed a bug that could cause a retry loop when running with shader development mode enabled and a preprocessing failure is encountered.
Fixed crash in SafeRenameEditorOnlyData() when EditorOnlyCurrent is null.
Fixed a material derivative autogen crash when dealing with uints.
Fixed a crash occurring when the material parent of an instance is changed through scripting.
Fixed ShadingModel material expression in-node combobox to display only valid shading model entries.
Made a minor fix for custom ShaderTypeStats customized name, needs to lookup cvar by ShaderFormat.
Added support for Nanite Geometry Collections to Preskinned Local Bounds material node.
Fixed an issue where the Vulkan shader pipeline cache would sometimes incorrectly produce cache misses for shaders that had already been compiled and serialized.
Fixed shader output for preview/transient materials being cached in DDC.
Changed UMaterialFunctionInterface to include the BlueprintType annotation.
Removed incorrect application of the component scale to the output of World Space Vertex Normal node when used with skinned mesh.
Fixed an uncommon crash in Lerp material expression when the alpha pin was connected to a non-primitive output.
MegaLights
New:
Implemented MegaLights-driven VSM marking to only mark VSM pages that MegaLights has selected samples for.
Added the r.MegaLights.DownsampleCheckerboard, which can run sampling/tracing at half res (every other pixel). It's a good middle ground between default quarter res sampling and option full resolution sampling.
Exposed r.MegaLights.HardwareRayTracing.ForceTwoSided, which allows to flip between matching raster behavior and forcing two-sided on all geometries in order to speedup tracing.
Now always vectorize shading samples. This saves on average 0.1-0.2ms in complex content on current gen consoles.
Improved spatial denoiser filtering after disocclusion.
Limited number of samples sent towards the directional lights to a specified fraction (r.MegaLights.DirectionalLightSampleFraction). This helps with noise indoors, where there's a strong directional light inside taking over the entire sampling budget.
Now uses downsampled neighborhood for temporal accumulation. Interpolated pixels don't add much to neighborhood stats, so we can skip them, improving quality by effectively using a wider neighborhood filter. This also improves performance of the temporal accumulation pass, as it now can load less data into LDS.
Now properly handle invalid sample upsampling. Sometimes during upsampling we can't find any valid sample and need to fallback to history (without any neighborhood clamp). This makes lighting on highly detailed or thin geometry a bit sharper and a bit more stable.
Disabled guiding tile filtering and added stochastic bilinear sampling of guiding tiles in order to hide tile artifacts.
Now merge identical rays in order to avoid overhead of duplicated traces. Duplicated rays happen with strong point lights, where we may send a few identical rays to the same light doing unnecessary work.
Added screen space trace for hair (r.MegaLights.Hair.ScreenTraces). Screen space traces improve card hair quality compared to approximate RT fallback mesh, but can be noisy. In order to reduce the noise there's now extra hair only screen space trace bias (r.MegaLights.Hair.ScreenTraces.Bias).
Merged downsample factor / checkboard CVars into a single r.MegaLights.DownsampleMode CVar.
Bug Fix:
Now require ray tracing platform support, in order to skip compiling and cooking MegaLights shaders on certain platforms.
Fixed split screen crash due to out of bounds memory reads.
Fixed denoiser artifacts on borders between dielectrics and metals (bright outlines) caused by too aggressive material demodulation factors.
Nanite
New:
The dithered opacity mask option is now supported for Nanite rasterization.
Added a new culling check that can improve Nanite culling speed and reduce the amount of memory needed for candidate clusters (r.Nanite.Culling.MinLOD).
Added support for rendering Nanite skinned meshes in the animation editor.
Exposed NanitePixelProgrammableDistance for Nanite skinned meshes to enable forcibly disabling pixel programmable rasterization of Nanite when the mesh is further than a given distance from the camera.
Added experimental and optional passes to prime the HZB before VisBuffer rendering if the HZB is missing (e.g., due to a camera cut), see cvar r.Nanite.PrimeHZB et al.
The main idea is to draw a lower resolution (HZB or lower) and lower detail (by using LOD bias and/or drawing only ray tracing far field scene geometry).
This new render is then used to build a HZB with some depth bias that is then used to render the full scene, greatly improving the cost in many cases.
GeometryCollection: Added a "Nanite Minimum Residency" setting for Geometry Collection assets. This controls the number of resident nanite root pages.
Previously we used a single root page and this is still the default.
Increasing the value can avoid pop-in when a Geometry Collection is first shown.
Added support for disabling "Render In Main Pass" on static mesh components for Nanite meshes.
Bug Fix:
Fixed a bug where the World Position node would return incorrect results when used to calculate opacity in a masked material.
Automatically disable Software VRS when Nanite is not enabled, preventing it from generating shading rate images which will not be used.
Fixed a rare streamer crash that could occur when a streaming page is resident in the streaming pool while its root page slot gets reused a multiple of 256 times.
Invalid page requests from the GPU are now ignored and optionally logged, instead of potentially resulting in a crash.
Suppressed console warning spam when `r.Nanite.Visualize` is set to an invalid value.
Fixed an incorrect conservative instance draw distance test used in the hierarchical instance culling that caused missing instances.
Nanite: Fixed incorrect geometric normal when using r.RayTracing.Nanite.Mode=1.
Fixed a GPU crash that could occur when Nanite was rendering to odd viewport sizes.
Fixed a crash in Nanite primitive filtering that can happen if HLOD force-hidden primitives, or the view's ShowOnlyPrimitives/HiddenPrimitives, contain invalid primitive IDs when there are no primitives in GPU scene.
Fixed a regression where if a static mesh has multiple mesh sections of the same material, Nanite build would merge them into a single mesh section, which could cause them to be re-ordered and cause issues. Now the multiple mesh sections remain intact, but the fallback will not have triangles in the duplicated sections.
Fixed an issue where the sign of the TwoSidedSign node would be flipped for masked materials.
Fixed a crash caused by enabling a Nanite visualization mode when instanced stereo rendering is enabled.
Fixed an issue where MaxHierarchyDepth was not calculated correctly, which could under rare circumstances result in streaming not progressing beyond a certain point.
Fixed an issue where having a non-Nanite capture in the scene can cause the Nanite streamer to not get updated and result in GPU hangs.
Fixed an issue where scene captures and main view rendering would independently try to update residency, sometimes resulting in visual artifacts.
Niagara
New:
CascadeToNiagaraConverter: Can now add template emitters.
Supported read / write icons for stateless: You can now more easily see where bindings are used in LW emitters.
Added a way to release resources from render target 2D:
Changed handling of null texture to set the material default to avoid dangling references.
Removed slate dependency from emitter merging (used by python scripts), which could trip up commandlets that ran without the editor UI.
Other distribution types can now opt into indexing / address / interpolation.
Initialize particle add lookup value mode options:
Added initial look up value mode enum.
Enabled lookup on initial position.
Changed color to a distribution.
Added getter method for Niagara parameters.
Lazy instantiate parts of the baker to reduce memory usage: Added a call to tick the baker world as paused, this ensures the world manager is called to process clean up functions.
Arrays for LW distributions:
Made a large refactor to make reading a distribution a function call vs a structure.
When sampling a value needed for motion vectors pass in multiple time parameters and it will return both values to ensure random is respected.
Some limited space was added to pack indexing into the data, this can be controlled using meta data on the distribution property.
GPU storage moved to ByteAddressBuffer for LoadX operations which gave a small speed boost.
Perf on a large number of particles was marginally better vs before.
LWE:
Added support for debug HUD particle attribute display.
Added support to data set readback.
Adjusted display name for SKM / SM DIs to remove confusion between the asset types.
Changed pin color based on Data Interface vs UObject to reduce confusion.
LWE Shape Location Changes:
Added shape scale.
Fixed plane shape not applying rotation.
Added surface mode to the cylinder.
Material Parameter Collection Data Interface: You can now push scalar / vector parameters from Niagara to MPCs.
Removed UNiagaraEmitter from stateless emitter on cook.
The cooked build does not require them, various parts of the UI still make assumptions and will be cleaned up.
This saves ~4k per stateless emitter.
Added rotator distribution to stateless & use in shape location to allow the rotation to be bound to an attribute.
Fixed the axis not properly being used on the display name for each widget.
Fixed the same binding being added multiple times.
Niagara Editor Preview Actor:
Used for previewing and tuning Niagara Systems without the need to run PIE.
Has some simple default motion options which can be overridden by a derived Blueprint for more complex behavior.
Niagara Fluids: Added vector controls for turbulence frequency and gain.
Niagara Content: Added distribution curve dynamic inputs for float, vector, and vector2D types.
Weighted Distribution Int Array:
Each entry has a value & weight.
The Weight is used in the random calculation, so the higher the weight the more likely it is to return that value.
CascadeToNiagaraConverter: Added UPROPERTY() tags.
When changing the preview platform, now invalidate the cooked status.
We need to make sure everything is in sync when the device profile changes to avoid crashes inside the VM.
Added Niagara to Visuals placement menu.
Updated Stateless Rotate Around Point module:
Added coordinate space / rotation / center.
Added a CPU path for the module.
Added Debug Draw support.
Added a property to customize quick capture number of frames.
Added ID support to Sim Cache Reader.
Added wildcard name match exclusions to sim cache compare.
Validation rules can now be disabled by config file.
Added information about who is using sorting.
Added a marker to sort key generation.
Added a console variable fx.Niagara.Batcher.DumpSortedSimulations which can be used to dump to the log.
Changed the color grad editor stop time widget to use the spin box.
This allows for math operations and validation of the input data.
Dynamic Mesh Sim Cache Storage + Visualizer.
Added all base Niagara float types to sim cache interpolation.
Enabled by default can be disabled by changing bInterpolateAllTypes in the creation parameters.
This improves MRQ renders with temporal samples.
Added concurrent sim cache reading when no data interfaces are cached.
Can be disabled using "fx.Niagara.SystemSimulation.AllowASyncSimCache".
Enabled concurrent execution for fixed DT systems if it's a single tick.
Fixed a bug in the component recaching where it ran all the time in the editor.
Stateless Curve Editor Improvements:
Moved the existing LW curve editor into the compact curve editor.
Added a new curve editor for distributions which is closer to the existing curve editor.
Exposed some of the common widgets shared between the editors.
Future change will be to wrap the DI inside the distribution adapter and share the editors, which will be useful for the compact editor also
Made the FXSystemInterface sharable to fix world tear down reference issues.
In some situations an FX component can be destroyed after the world.
When the world is destroyed it will destroy the FX system set, which will enqueue a command to destroy the FX interfaces.
The render command can execute before the FX component's are destroyed leaving them with a dangling reference.
Added a setting to enable HLSL 2021 in Niagara.
HLSL 2021 features will fail to compile on the VM and on some platforms, but this allows users to experiment.
Added an enum for notify progress, none / forward / reverse.
Fixes issues around using negative rate scaling and allows the user to still use 0-1 when playing backwards.
Disable Source Mode with LWE to reduce confusion.
We don't have a particle stack so there is no way to modify the data without binding to system / user parameters.
Added console commands (fx.Niagara.Component.ReinitializeActive & fx.Niagara.Component.DeactivateActive) to allow a quick way to kill / restart Niagara components.
Cleaned up various console variables while I was here.
Niagara: Properties (Section Start Behavior, Section Evaluate Behavior, Section End Behavior, Age Update Mode, Allow Scalability) in UMovieSceneNiagaraSystemSpawnSection can now be set in Blueprints / Python.
Multiply the debug draw color by alpha so we can have translucent lines.
Now send the current bounds to the GPU for the emitter properties DI.
This makes the result of GetBounds consistent between both paths when using fixed bounds on the emitter.
Removed stateless emitters from compilation.
Previously they would still generate some HLSL data resulting in compilation when added / removed.
Cleaned up several areas that assumed Emitter Data would always be valid.
Made renderer memory savings by reducing FNiagaraVariableAttributeBinding.
Sprites 1992 -> 1320 = 672
Mesh 1688 -> 1160 = 528
Ribbon 1888 -> 1312 = 576
Light 800 -> 560 = 240
Added a rule for validating material usage in renderers.
This makes it possible to block content that does not have the appropriate usage flags set.
Niagara Content:
Added a new dynamic input to support querying values from the new Weighted Distribution Int Array data interface.
Added new modules for spawning particles from simulation caches.
Removed all the async optimize / decompression of VM byte code.
The new VM does not use this path so the code is dead.
Enabled Sub UV cutouts ES3.1.
Can now use the Niagara Data Interface to set material parameters on Material Instance Dynamic objects, from a CPU stage.
CascadeToNiagaraConverter: Add more script input types.
Added Shift+D to enable selected emitters (reverse of D which disables selected emitters).
Refactored renderer widgets to share code and use small chip
Added a menu entry when we have no stateless bindings to make it clear to the user what type we are looking for.
Added a debug draw to renderers.
Implemented debug draw for light & decal renderer.
Added column sorting to sim cache viewer.
Also cleaned up how we build the table data to make it less confusing.
Bug Fix:
Fixed issue where ParticleSystem EPSUM_FixedTime had no effect due to incorrect assignment.
Fixed validation accidentally changing usage with flags on materials.
CheckMaterialUsage will both check and set which can result in a race with shader compilation.
Use the component transform for local space vs the simulation one - When disabling requires current frame data (for performance) these could be out of sync, which mismatches other renderers on the RT (i.e. sprites & meshes)
Fixed hash function in data channel to use full string data instead of just half of it.
LWE: Set the sim target on the compiled data set to match the mode.
This fixes a mismatch that can cause attributes to not upload to the GPU when we are in CPU mode due to using the light / decal renderer.
No longer call the OnSystemFinished delegate if we are constructing Blueprints.
The delegate might interfere with the actor / components and can cause crashes.
Shader loading: Now prevent dereferencing potential nullptr when file is not found.
Fixed emitter renderer tick ordering issue when combined with LWE.
Added missing postload calls for stateless emitters.
Guarded against using EmitterData as it can be nullptr.
Fixed binding buffer changes causing dispatches to serialize on some RHIs.
Fixed potential OOB reads if a binding is invalid.
Added a lock to GPU Sort Manager AddTask to ensure no concurrent access.
This fixes a race between Niagara & Cascade adding tasks.
Now calculate spawn probability per particle for spawn rate, rather than per loop.
Fixed user variables being removed and renderers not updating correctly.
The variable was without namespace so failed to match.
Added a missing null check for the graph source that can happen during undo.
Fixed GetResourceSizeEx miscalculating for non-isotropic UTextureRenderTargetVolume.
Niagara component renderer: now only register one object replacement delegate with the CDO to prevent races during asset loading.
Added missing CanBind to user parameters.
Changed style of binding to be more consistent with other bindings.
Now sets the world time information in the baker.
This fixes things like Engine.Time always being 0.0 and material based time effects not working as expected.
Used GroupMemoryBarrierWithGroupSync with Radix Sort to fix issues on various GPUs.
No longer load niagara system when getting asset registry tags, to prevent deadlocks during emitter merging.
Disabled low latency when anything other than the lit view mode is active.
Some of the view modes short circuit rendering so the data may not be ready in time.
Fixed a crash when copying script variable metadata.
Handled null data interface inside Niagara Variant.
It is unclear how the variant DI becomes nullptr at the moment, this will at least avoid crashing the editor, but more investigation is required to understand why.
Fixed duplicating an emitter with RunUpdateScript set for interpolation mode changing post duplication to NoInterpolation.
Fixed single segment GPU ribbon UV calculations being incorrect.
Fixed a potential use-after-free on world tear down.
If the compute interface is marked pending kill we can ignore sending the command to remove from the computer interface as it will be killed before.
Fixed an asan issue using the component in the lambda.
Bring changes over for garbage references also.
Fixed incorrect stride with FRibbonAccumulationValues when using different features.
Fixed color curves not working inside NPCs when using GPU emitters.
When modifying parameters in the detail panel, now use the editor setting GetResetSimulationOnParameterChange to see if we should reset the system or not.
Disabling reset can be useful to iterate on content live.
Fixed editor undo crashing due to order being out of sync and the thumbnails.
Fixed update context killing systems that are waiting for compilation.
When switching preview modes the update context is called multiple times.
The first time it's considered active.
The next time it's no longer active but is waiting for compilation (compontent ticking) so is now removed from the reactivate list.
We now check if the component tick is enabled due to waiting for compilation results.
When setting up previous data use current if previous does not exist.
Current changing to a new position binding which does not have a previous value generated it would use the default position which is 0,0,0. Using the current value won't produce corrupt motion vectors, but will also not produce correct motion vectors.
Changed default for LOD size Y to -1 to fix issue with meshes being culled incorrectly.
A value of -1 indicates that it will never be culled by screen size.
The previous value of 2 would be adjusted to 1.0 and fail the >= screen size test if bounds were large enough.
Now uses the aliased variable when finding the default mode
This fixes an issue if the first time a variable was encountered it was in StackContext as we would ignore the binding.
Fixed a bug where min instead of max distance was used as LoD parameter.
Fixed a nullptr and weak ptr bug in error log format.
Fixed a bug when an error during script merge occurs.
Fixed memory leak in data channel object destructor.
Path Tracer
New:
Improved the adaptive sampling heuristic.
Added an option to hide the planet ground surface.
When using reference atmosphere mode, the path tracer no longer displays a large ground sphere to represent the planet for better parity with the deferred renderer.
The old behavior of showing the planet ground can be accessed by the cvar r.PathTracing.EnableAtmosphereGround.
Post-process materials can now be specialized for the path tracer.
This adds a permutation of the PostProcess Material that is used when the path tracer is enabled on the view.
This can be used to account for differences in how the path tracer creates the image. Behavior can be customized with the PathTracingQualitySwitch node.
Bug Fix:
Improved shadow artifacts in transparent shadows due to double-counting of transparent hits.
Improved startup time by moving rarely used permutations to experimental.
Fixed a crash when enabling decal normal projection.
Postprocessing
New:
Changed the EOTF for UI composition in HDR from sRGB to BT.1886 for improved parity between SDR and HDR appearance. A new CVar r.HDR.UI.CompositeEOTF was added to provide control over this behavior.
TSR:
Added an option to allow all shading models to use TSR thin geometry detection when r.TSR.ThinGeometryDetection.Coverage.ShadingRange=2.
Added exposure offset (r.TSR.ShadingRejection.ExposureOffset) back so global darkening ghosting can be improved. The value behaves a little differently and is now used to adjust the exposure offset for the reject shading moire luma and guide history. Any legacy project before UE5.5 using the old CVar should consider adjusting the value.
Updated shader selection logic for CombineLUTs to force compute shader rather than pixel shader if graphics volume rendering is guaranteed, and reduced the size of the dispatch group from 512 threads to 64 threads.
Bug Fix:
Replaced usage of PF_R32G32B32F with PF_R32_FLOAT for the ACES gamut table texture to make the implementation compatible with more platforms.
Fixed alpha invert show flag on desktop if primary upscale was active.
Fixed Bloom not working with TSR when motion blur is disabled.
Forced the invalidation of the low-res scenecolor for translucency after motion blur pass if motion blur is not run.
RHI
New:
AddEnqueueCopyPass can now be used with texture arrays.
Metal:
Refactored bindless to support new FeatureLevel & Platforms and include a per-project experimental Mac option to enable SM5 Bindless.
Upgraded Metal Developer Tools from 4.4 to 5.3
MetalCPP: Upgraded to metal-cpp_macOS15.2_iOS18.2
Bug Fix:
Fixed a bug in the PS4 renderer submission queue that delayed signaling occlusion query events.
Fixed UpdateTexture2D() failure case where the source region has an offset and the texture is block compressed.
Substrate
New:
Improved the rough diffuse shading model to minimize energy loss and improve the shaping at high roughness.
Improved legacy conversion of cloth materials.
The roughness range of cloth has been adjusted for better parity with the legacy cloth BRDF.
The specular amount is now automatically adjusted to account for the Fuzz layer being added on top of specular in Substrate whereas it was linearly blended in the legacy model.
Removed r.SubstrateBackCompatibility as we now rely on the Substrate Rough Diffuse option to drive that instead.
Set Blendable GBuffer format as default for new projects. Some archvis and automotive project templates are set to Adaptive GBuffer format by default.
Bug Fix:
Fixed most material properties not being added to FMaterialData::PropertySizes when baking Substrate materials on the Actor Merge -> Simplify path.
Simulation
Chaos Visual Debugger
New:
Improved batching of TEDS operations performed when new physics body data is loaded in the scene. This change, combined with some other improvements made in TEDS itself, resulted in ~75% reduction in the processing time when the first frame of a large CVD recording (+90.000 objects) is loaded. The stall in this particular case went down from ~12 seconds to ~3 seconds.
Added support to enable CVD recordings in Shipping configurations.
Added a new pop up notification to provide a cleared indication of when CVD is still processing trace data for a loaded file.
Added a non-blocking loading bar. This bar will appear in the status bar to indicate the loading process of very large CVD files.
Added initial experimental support for tracing smaller sections of a map instead of the entire map.
This can be configured from code with the CVD_SET_RELEVANCY_VOLUME macro or via Blueprint with the CVD Set Trace Relevancy Volume node.
Note: If a recorded body moves to outside the recorded volume, CVD will show that body frozen in time. This will be addressed in the next release.
Implemented the new view port toolbar the rest of the editor uses.
Extension System:
Added support for attaching custom data to the CVD Recording instance.
Added support for implementing 2D visualizations via CVD's component visualizer API
Improved tracing performance by removing the need for locks (and reduced the contention of ones we could not remove) in some heavily multi threaded paths. Mostly in collision geometry and physics body metadata serialization paths.
Removed connection details from the Recording status message, and moved it to its own message which is sent when needed. This reduces the message bus bandwidth usage when a CVD recording is active.
Bug Fix:
Added missing serialization for FChaosVDParticleDynamicMisc::MLinearEtherDrag.
Added missing serialization for FChaosVDParticleDynamicMisc::MSleepThresholdMultiplier
Added missing serialization for FChaosVDParticleDynamicMisc::MCollisionConstraintFlag.
Fixed an issue where attempting to trace multiple processes at the same time could fail to playback, even if the recording was successfully started.
Fixed a race condition when a CVD recording is started at the same time or right before PIE is started, resulting in a crash.
Fixed an issue where CVD's sessions manager broadcasts a session discovery ping every second, even if CVD is not open in the editor.
Fixed incorrect visualization of per particle position/velocity/projection iteration counts.
Moved iteration counts to FChaosVDParticleDynamicsMisc and added serialization version guards accordingly.
Fixed an issue where trying to load the same CVD recording twice caused an ensure, and failed.
Fixed an issue where the first frame of a recording was not automatically loaded in some scenarios, resulting in an empty scene until you scrubbed to a new frame or started playback.
Fixed an edge case where the recording controls UI could get soft locked, blocking you from stopping a recording that was just started.
Fixed an issue where QueryData was used instead of SimData, in the details customization used for Collision Geometry details panels.
Fixed an error where the Network Tick sync mode was not clamping the track tick offsets to the supported limits in some scenarios.
Fixed an issue where recorded destroyed particles were not being properly removed from the scene.
Fixed a crash that could happen if you play a CVD recording while it is still loading.
Cloth
New:
Added a ReferenceSpace local damping option to Chaos Cloth. This enables local damping about the reference space bone instead of the existing center of mass option.
Updated ChaosClothAsset and ChaosOutFitAsset to use SoftObjectPaths internally to better handle renamed dependent assets such as the Physics Asset.
Updated Chaos Cloth to internally use FNames instead of FStrings for properties. This fixes a long-standing performance regression when setting simulation properties at runtime via the cloth blueprint interactor.
Added the ability to specify the ReferenceBone for a cloth asset.
Added additional accessory meshes for chaos cloth.
Updated the backstop constraint to be able to use this accessory mesh.
This feature is considered experimental.
Cloth Remesh Node: Can now transfer vertex weight layers to output cloth render mesh.
Updated Chaos Cloth and Skeletal Mesh-based cloth to better handle non-simulating LODs.
Fixed a bug where chaos cloth could stop simulating if there was a non-simulating LOD sandwiched between two simulating LODs.
Updated Skeletal Mesh-based cloth to no longer tick cloth for non-simulating LODs when cloth is present on other LODs.
Chaos cloth debug draw improvements: Added wind velocity and updated gravity display.
Bug Fix:
Fixed an editor crash which could occur when remeshing a chaos cloth asset with Long Range Constraints.
Fixed issues with Kinematic Collider and Skinned Triangle Mesh, these were regressions from implementing Skinned Triangle Meshes in Chaos Cloth in the last release.
Kinematic Collider was using previous frame's positions for its constraint Apply causing it to lag behind and not fully resolve collisions.
Kinematic Collider debug draw was broken due to an indexing bug.
Added ClothCollisionThickness parameter on the SimulationCollisionConfigNode was not setting the correct string, so it wasn't being used.
This fix for this will not affect existing assets (ClothCollisionThickness will be set back to 0 to retain existing behavior).
Cloth Render Node: Now populate all UV Channels for output.
Fixed CorrespondClothAssetIndex never set in BindToSkeletalMesh, since checks are stripped out in Shipping.
Cloth Remesh Node: use the DynamicMesh UV layers to determine how many UV channels should be on each render vertex in the output ClothCollection (so that we don't accidentally add 4 channels when the input only has 1, for example).
Core Physics
New:
Partial Island Sleep:
Added a console command to enable partial island waking when the user explicitly manipulates the transform of a rigid body ("p.Chaos.Solver.Sleep.PartialIslandSleep.PartialWakePreIntegration").
Added a console command to enable rigid body waking based on the velocity change introduced by the velocity collision solver ("p.Chaos.Solver.Sleep.PartialIslandSleep.PostStepWakeThreshold").
Added a console command to restrict partial island sleep to collision constraints only, i.e. rigid bodies connected by other constraint types will have to be both awake or asleep ("p.Chaos.Solver.Sleep.PartialIslandSleep.CollisionConstraintsOnly").
Added console command to enable the propagation of impact momentum though the physics constraints to determine with the purpose of waking rigid bodies in partially sleeping islands ("p.Chaos.Solver.Sleep.PartialIslandSleep.MomentumPropagation").
Introduced a Blueprint event to enable or disable partial island sleep for the entire island a rigid body is in ("Set Allow Partial Island Sleep").
Improved performance by limiting partial island waking to scenarios with any sleeping rigid bodies.
Added a console command to only enable partial island sleep if the decimal percentage of motionless rigid bodies is above a user-defined threshold ("p.Chaos.Solver.Sleep.PartialIslandSleep.MinimumMotionlessRatio").
Added generic AddElem function for AggGeom and helpers to access the correct containers based on input element type.
Added SetUseMinTimestep function in Immediate Physics API.
This makes it possible to avoid switching to a fixed timestep when the delta time is small, bypassing the cvar p.Chaos.ImmPhys.MinStepTime
Added a new p.Chaos.MinParallelTaskSize cvar and CVarMinParallelTaskSize function to set a threshold of tasks to run in parallel, which can improve performance on low-core platforms.
Enabled some p.Chaos cvars (like p.Chaos.MaxNumWorkers) in Shipping so they can be used to tweak game-specific performance.
Enable some physics cvars (like p.Chaos.MaxNumWorkers) in Shipping so they can be used to tweak game-specific performance.
Added support for setting CollisionEnabled per ISM body.
Exposed functions for calculating covariance matrix of a set of points and retrieving the dominant eigenvector.
Added a per poly collision setter function to SkeletalMeshComponent.
Moved several shapes from Chaos to ChaosCore.
Added an option to treat default as simulated for RBAN.
Bug Fix:
Enforced drive linear force limits when non-linear joint solve is enabled.
Fixed SphereTraceComponent not returning the hit FaceIndex when tracing against complex shapes.
Fixed an issue where AddForce related methods did not generate wake events in some scenarios.
Now detect and remove null constraints from CCD swept constraints prior to application.
Fixed collision behavior when converting from probe to nonprobe.
Optimized allocation in cable mesh building
Chaos: Fixed wrong rotation axis when using simd for linear joint solver.
Fixed an occasional crash when unwelding rigid bodies.
Fixed a physics bug where unwelding via socket name failed to unweld. This could lead to a crash when the parent body was destroyed and a query was performed against the child.
Fixed FKShapeElem copy constructor accidentally changing the CollisionEnabled flag instead of copying it.
Dataflow
New:
Double clicking on a Dataflow variable now finds the related nodes in the Dataflow graph and sub-graphs.
Dataflow construction views are now generally more performant for large meshes and allow render data caching.
Added transform support to dataflow rendering geometry groups.
Added capsule rendering support to the rendering facade.
Updated the weight map tool in dataflow to more closely match the UI of existing painting tools.
Dynamic mesh processor blueprint can now optionally specify that it is ok to run async.
It is now possible to edit some of the bool / int / float non-connected input parameters inline on Dataflow nodes.
Added a 'Cut Planes' array input to the PlaneCutter dataflow node, to support directly specifying the cutting plane(s).
The Geometry Script based Dataflow node now exposes the Geometry script parameters out to the Dataflow node as connectable inputs.
Added general array Dataflow nodes for getting an element or reading the size of an array.
Dataflow can now automatically add a node to auto convert from an output type to an input type.
Added an option for dataflow FilterPointsWithMesh node to filter by mesh min/max distances in addition to inside/outside winding number test.
Added a general dataflow selection -> index array conversion node (so that e.g. one can iterate the selected indices).
Added support for root proxies for Dataflow based Geometry Collection asset.
Enabled construction view rendering for most of the geometry collection Dataflow nodes.
Added a generic version of the math Clamp dataflow node.
Dataflow variable nodes can now be used directly in Subgraphs.
Added the possibility to promote a dataflow input to a variable ( right click menu ).
Geometry Script based dataflow nodes will now open the Geometry Script blueprint when double clicked on.
Dataflow now show an array pin icon for array types.
Added a Dataflow node to set a string transform attribute and to select from a string pattern.
Added dataflow nodes for conversion from an index or index array to a dataflow selection.
Support "Only Same Parent" option for TinyGeo "Merge Geometry" mode (and corresponding dataflow node).
Added Dataflow nodes for getting bounds from static mesh and dynamic meshes.
Added support for setting up root proxies in Dataflow.
Added a Dataflow node to set the dynamic state of geometry collection bones.
Updated the Dataflow Editor to better handle Save As by reconnecting the newly created derived assets (e.g., Dataflow Asset) to the main asset.
Added display of performance data for Dataflow subgraphs.
Optimized the Dataflow collection spreadsheet ( up to 25x for large collections ).
Added Box, Capsule and Convex simple builders as geometry generators for dataflow physics assets.
Added support for manipulating bones from the Dataflow Edit Skin Weight tool.
Added Fov and planes options to the view menu in both Dataflow simulation and construction views.
Bug Fix:
Fixed crashes due to incorrect selection init for some dataflow fracture nodes.
Expanded out fracture brick pattern bounds by a half-brick, to fix bricks not quite covering the intended bounds in many cases.
Made the collection->mesh dataflow node take an optional selection and perform the conversion more consistently with the collection selection->meshes dataflow node.
Changed the dataflow 'show/hide inputs' menu to use the localized display names instead of the internal source code names.
Add correct struct handling to dataflow context cache to support nested UObject references.
Made blueprint dataflow nodes default to evaluate on the game thread, for safety.
Added guards against selecting invalid indices. Now returns false instead of crashing on attempting to set an invalid selection.
Fixed Dataflow graph not re-evaluating when switching from manual to automatic evaluation mode.
Made sure Dataflow nodes performance data is recorded per node even when the data is not shown on screen.
Fixed the Dataflow Selection by Level Node to make sure the level attribute exists in the collection.
Fixed "append collections" dataflow node not updating transform indices correctly.
Fixed array support for Dataflow subgraph inputs and outputs.
Fluids / Smoke
New:
Added default drag for accurate integration.
Added support for landscape proxies.
Drag model updated buoyancy tests make sure physics assets for rafts computes mass with the correct material.
Added water, spray, foam shading improvements, translucent spray particles
Refactored capture modules in sw emitters to handle overhangs in terrain with better controls rework summary views.
Bug Fix:
Fixed spike artifacts by only advecting to wet cells. This can avoid issues where we advect into steep areas that we shouldn't be.
General Physics
New:
Added a way to reset the state of a geometry collection (from Blueprint or live from the editor with a button in the component details).
Added the ability to incrementally create new cache collection assets each time a Chaos cache records.
Exposed Chaos cache observed component functions to Blueprints.
Geometry collections can now be converted to Skeletal meshes (right click on the asset or in Dataflow).
Added a way to start and stop a Chaos Cache from Blueprint.
Added API for generic sweep traces (Sphere, Boxt, Capsule and Raycast) on the physics thread.
It is now possible to query a geometry collection leaf bone using a line trace from Blueprints (FindLeafTransformByLineTrace).
Added asset user data support to physics assets.
Added support for override materials for geometry collection root proxies.
Bug Fix:
Creating a Chaos cache from the main menu can now be undone.
Fixed Chaos cache not recording events properly after the cache was recorded once.
Fixed Chaos cache not properly replaying simulations of geometry collection using root proxies.
Geometry collections with no materials are now assigned a default material. This prevents issues where the geometry collection may have weird rendering artefacts.
Fixed spawned geometry collections not properly using the physical material set on the asset.
Fixed a crash in the geometry collection SetLocalRestTransforms method happening when the rest of the collection is empty.
Fixed Chaos Niagara interface not playing trailing events properly.
Fixed Nanite based geometry collection not replaying properly from a Chaos cache.
Fixed geometry collections not properly waking up when applying velocity.
Fixed force based local fields not working properly when applied to a geometry collection.
Made sure gravity settings are propagated to cluster unions or cluster group unions.
Fixed geometry collection anchored and other attributes being stripped when using strip on cook on Nanite based geometry collection.
Fixed Chaos cache not properly restoring Simulate Physics or notify break flags when deleted or when removing an observed component.
Fixed geometry collection local field not properly working with partial clusters when using minimal resolution.
Fixed an issue with geometry collection Nanite fallbacks not rendering when enabled and when Nanite is disabled in editor.
Modular Vehicles
New:
Added an additional input quantization mechanism.
Networked Physics
New:
Made improvements to how and when RewindData caches physics states along with fixes for KinematicTarget resimulation.
Optimized NetworkPhysicsSettings memory footprint from padding and alignment.
Added a NetworkPhysicsSettingsDataAsset and converted the NetworkPhysicsSettingsComponent to reference the DataAsset instead of holding all settings in memory for each actor instance.
Added the first iteration of Iris support in the NetworkPhysicsComponent with a new base struct for inputs and states along with a new interface for custom implementations to communicate with the NetworkPhysicsComponent.
Scheduled Physics Thread command lambdas with resimulation handling.
Added new settings and features to balance simulated proxies and post-resimulation corrections.
Option to trigger a resim when receiving new inputs.
Option to apply input decay curve over a set time instead of over the remaining resim frames.
Option to decay post-resim error in render interpolation exponentially, with a half-life setting.
Bug Fix:
Fixed an issue where inputs can get dropped when the server input-buffer runs empty because only the latest received input gets injected at the front of the buffer.
Fixed an issue where input wouldn't be produced for locally controlled pawns not using a player controller.
Fixed Geometry Collection and Cluster Union post-resimulation render interpolation issues with stuttering and rotational calculation.
Added fixes for inputs getting lost.
Tools
BuildGraph
New:
Added the Boolean attribute ReportOnExecution to report diagnostics during execution of a step. The name list attribute ReportOnNodes is used to limit which nodes will report diagnostics during execution.
UnrealGameSync
Bug Fix:
Fixed an issue where Update Settings would fallback to Horde when changing theme even though Perforce was previously selected.
Virtual Production
Compositing
New:
Marked HoldoutComposite plugin as hidden, since it was deprecated & renamed to CompositeCore.
Changed the default Lens Distortion rendering mode of the Lens Component to use the Lens Distortion Scene View Extension.
nDisplay
New:
Removed a dependency on legacy Composure.
Bug Fix:
Improved stage geometry mesh generation to mitigate deformities when geometry edges are near the mesh equator.
Fixed an issue where the ICVFX window would throw a failed assert when -rhivalidation was used.
Performance Capture
New:
LiveLink:
Added a LiveLink Broadcast Component. This component currently allows streaming LiveLink data for Transform, Camera, and Skeletal Mesh data. Adding a broadcast component will create a LiveLink subject that automatically rebroadcasts data from the component.
You can now synchronize a Virtual Subject rebroadcast to one of its subjects.You can enable this through the "Sync Subject" option on Virtual Subjects.
Live Link Hub:
Added a playback mode, which is a compact view of the playback widget. Keyboard Shortcuts for Recording Playback
Left / Backspace: Step back one frame (hold to scrub backward).
Right: Step forward one frame (hold to scrub forward)
Space / Enter: Toggle pause Added a "Select Recording" button when no recording is selected, which opens a pop up window with the recording list.
Added support for config autosave.
Refactored the discovery mechanism to enable seeing all clients without connecting to them automatically.
Added a crash recovery mechanism that attempts to restore the last autosave after launching following a crash.
Note: When launching multiple Live Link Hub instances, this system will only allow crash recovery for the first session that was launched.
Added Client filtering and filter presets support.
Added more information to the discovered clients list (IP, Hostname, Project, Level).
Aja: Updated Aja SDK to 17.5.0
Users can now choose what class of prop component to use. Default is the native version but users can override with their own derived class for uses such as building custom constraint behaviours.
Added a delegate to emit when a Live Link subject's bool bIsEnabled is modified. Required for Performance Capture workflow to respond to subjects being modified in the Live Link client panel.
Removed Mocap Manager requiring all spawned characters to be a ACaptureCharacter actor. All ASkeletalMeshActor classes can now be set to the CaptureCharacterClass property in a PCapCharacterDataAsset.
Changed CaptureCharacterClass member type in UPCapCharacterDataAsset from TSoftClassPtr to TSoftClassPtr.
Relocated the Performance Capture properties under a 'Performance Capture' details category for ACaptureCharacter actors.
Improved PIE/SIE usability of the stage manager and the outliner.
Cleaned up unused nodes in mocap manager EW.
Refactor of LiveLink data pausing:
Moved all calls from the individual actor components (performer, prop, retarget) to simple pausing the LiveLink data on the LiveLink client.
Subjects that are paused can still be recorded in Mocap Recorder.
Pausing a subject will update the pause state in the UI in all locations.
Subjects that go invalid will no longer be removed from Record Manager. Only subjects that are disabled (requires UI interaction with Live Link panel to accomplish) will be disabled from being recorded.
Removed tracking what's paused and what's enabled from the LiveLinkEval struct and renamed to LiveLinkVisual. The array of this struct in the viewmodel now only keeps track of what subjects are being visualised.
All calls to determine a subject's state or enablement go to the Live Link Blueprint function library functions.
Introduced the functionality to calculate a dynamic prop offset via Blueprint native function (dynamic constraint).
Added Function library to query IK Rig and Retargeter properties at run time for calculating dynamic constraint.
Improved handling of spawning custom props actors from the PCap Prop data asset.
Added runtime module for -game sessions.
Refactored actor, actor component and animinstance classes into new runtime module to enable running tools/actors in -game session.
Added redirectors to new class locations.
Updated plugin description to aid discoverability in the plugin browser by including text referring to Mocap Manager.
Enabled Mocap Manager retarget tuner and prop offset widgets to run in PIE/SIE.
Added F keyboard binding to focus on Pcap UMG viewport actor.
Mocap Manager Viewmodel now caches the initial state of Take Recorder settings and reverts them to the initial state when closing Mocap Manager.
Users can now select a folder for their PCap data.
Can now be a Content Plugin path or a game content path.
Now creates a session template per project as part of the first-run workflow, removing dependency away from Engine/Plugin content.
The session template is now unique per uproject.
Did a full pass on all Blueprints, setting namespace to PerformanceCapture on all assets, to prevent functions leaking into the function palette when they're not wanted.
Added Hide actor in-game button to outliner, only visible during a multi user session.
Added missing delegate for when a Live Link subject is added.
This is needed for Virtual Subjects.
Added OnLiveLinkSubjectAdded delete to the PerformanceCaptureSubsystem.
Now remove illegal characters from the filename of created Skelmesh when using Live Link subject name as the basis for the new asset's name.
Improved scaled performer mesh workflow:
Now uses poseable mesh component to shuttle live link transforms to the new skelmesh.
Added ability for user to a freeze the pelvis bone above the origin.
Added bone picker so users can choose which bones is the pelvis
Auto find the pelvis bone function executed on invoking the panel.
Warning if the bones in the given skelmesh do not match the Live Link data.
Modified the bone visualizer to work with any actor containing at least one skinnned mesh component. Always defaults to the first found skinned mesh.
Removed pausing/unpausing of render in the main level viewport when starting the custom UMG viewport. This was negatively impacting prop line up workflows when the user wants to use both viewports.
Added exclusion list of components to the Take Recorder permission list User Asset data object and a function to audit a Take Recorded actor's components in the motion actor row of Mocap Recorder.
Users can now filter recording on component names.
Bug Fix:
LiveLink: Added multi-select for subjects, so you can pause multiple subjects at once.
Live Link Hub:
Added a column that displays the translated role for a subject (hidden by default).
Fixed Live Link Hub resetting timecode and genlock upon exiting, even if these options were not enabled in the Hub.
Can now pick an interpolation processor if transmitting evaluated data is enabled.
Pause subjects when pausing a recording so they appear as valid on UE clients. Dragging the playback slider will no longer pause recording on end if the recording wasn't paused.
Added a prompt to verify if the user intends to close the hub before closing.
You can turn off this behavior by changing the "Confirm Close" option in the LiveLinkHub settings.
Fixed a crash when launching a game in shipping configuration with Live Link Hub plugin enabled.
Fixed potential Multiuser crash caused by emitting change to take recorder metadata during recording. Emit is now gated behind bIsRecording=false.
Retarget character mesh will now tick and update pose on the same frame as the perforrmer source mesh.
Prevented base mocap mesh getting set to null after creating a performer.
Prevented character name getting set to null when creating a character data asset.
Prevented pre-requisite cycle when SourceMesh == ControlledMesh because FComponentReference wants to set default to first skelmesh component on the owning actor.
Fixed crash in Performer mesh creation if the chosen skelmesh has no valid skeleton assigned.
Fixed session missing message after first-run creating the base PCap datatables.
Fixed Motion outliner UI getting invalid information from the level when assets have been deleted which the mocap actors reference.
Fixed bug with mesh visualizer in Performer mesh workflow not clearing the mesh from the viewport.
Fixed bug where Live Link recording subjects aren't refreshed when subjects are removed from the record manager.
Fixed a bug in the Mocap Manager picker widget preventing excessive calls to the asset registry during Take recording.
Deprecated
Deprecated the SourcePerformer, RetargetAsset and bForceAllSkeletalMeshesToFollowLeader properties on ACaptureCharacter in favor of the same properties on URetargetComponent.
Deprecated the AdditionalMeshes property on UPCapCharacterDataAsset.
Rendering
New:
Exposed linear versions of the UE emulation color spaces in OpenColorIO plugin config, useful for tonecurve inversion for example.
Fixed lens distortion material default support for packaged games.
Tools
New:
Live Link Hub:
Store external plugin paths in a versioned directory that reflects the plugin ABI (e.g. "%LocalAppData%\UnrealEngine\LiveLinkHub_5.7"). Outside of an installed build, the workspace Engine/Config directory is used instead.
Added "auxiliary channel" endpoint negotiation. It's now possible to register a channel type handler with ILiveLinkHubMessagingModule, and initiate a channel request to a known client using ILiveLinkHubClientsModel.
Fixed not properly replaying tracks that had inconsistent framerate or data.
A track's timestamps are now always used when seeking to frames across tracks rather than only relying on qualified frame time conversions. For efficiency we still convert the desired frame time to a track's local frame time first which often puts as at or near the desired frame.
Timestamps are now saved and loaded in bulk, rather than with each frame. For old recordings the file is iterated once to load the timestamps, which can be slow.
Added an Upgrade feature which will force load the entire recording into memory and then save it to a new file, providing users a way to convert old animations to the new format, and decrease future load times. The recording list will now specify if a version is outdated or not. If a recording is outdated a context menu option "Upgrade Recording" will be available.
Fixed multiple event fires when committing a scrubber change via spin boxes.
Fixed a crash when exiting the app while streaming frames.
Added extendable data for Productions.
User defined UStructs can be registered as extended data types and are displayed in the Production Wizard.
This data is saved with each Production in the default engine configuration file (Engine.ini).
User defined customizations can be registered for the Production Wizard for registered extended data types.
User defined 'User Settings' tabs can be registered to the Production Wizard.
Added a Tracking Alignment Tool into the Camera Calibration plugin. This tool aligns two tracking spaces together by calculating the aligned origin transform of one of the tracking spaces.
Remote Control:
Made behaviors rearrangeable in the RC panel.
Added Select Source button to the action list
Also added icon to right click on exposed property right click menu.
Changed "in use" visualisation for properties to a background color similar to selection.
Added indication of whether a property is bound to a controller.
Added support for enums and additional struct types.
"Fill path from selected asset" now looks for selected exposed properties if there are no assets selected.
Added a stateless controller button.
Revamped path behavior.
Added the "controller" category .
Changed entity bind numbers over to runtime objects.
You can now select bound action sources.
Switchboard:
Updated the BP OSCListener to use the TR subsystem in all functions. Now all calls to get take metadata use the Subsystem so it can be used without take recorder being open (Mocap Manager)
Start and stop recording now uses the subsystem and will open a level sequence by default to keep the behaviour the same as previous when triggering start record from SB.
Removed some debug prints that snuck in during the dev process that don't help the end-user.
Added an experimental "Use Fast Sync" option to Source Control Settings.
This enables incremental sync functionality in sbl_helper.py.
In the case where the currently synced changelist is known, and we are syncing ahead to a future changelist, we can pass a revision range to the Perforce commands involved in order to achieve a potentially dramatic speedup (reductions from >3 minutes to <30 seconds were observed in large projects internally).
Perforce changelist dropdown refresh now occurs asynchronously, avoiding attendant UI hitches/hangs for long-running Perforce operations.
sbl_helper.py now explicitly maintains workspace sync state in JSON files in the engine/project directories; this is more reliable than the previous mechanism which relied on `p4 cstat ...#have`.
Additionally, if the workspace is "dirty," this will be indicated by an asterisk next to the changelist indicators in Switchboard.
Added a button to the progress dialog to interrupt population / refresh of the asset cache, which can take a long time in large projects.
Can now pass command line arguments to specify the Unreal Editor OSC server address and port.
Added a setting to optionally the Live Link Hub device to suppress the crash recovery dialog following an unclean shutdown.
Take Recorder:
Root cinematics path can now refer to both content and plugin content.
Made Take Recorder Source types public. Sources that weren't already exported now are. This is for consistency since all sources were previously exposed to Blueprints.
Fixed custom time dilation failing when bStartAtCurrentTimecode is true and sequencer is disabled.
Added a command line flag to bypass source control checks when joining a Multi-user session. The new command line arg is -CONCERTSKIPSOURCECONTROLCHECKS.
Motion Design:
Text3D:
Hid the Text3DCharacterTransform from the "add component" list to avoid being added to the new Text3D.
The UText3DLayoutTransformEffect is the new approach to handle per character transform, and keep components to migrate properties to newer systems.
Adding LocationBegin in LayoutTransformEffect to adjust starting offset.
Recycle components instead of creating/destroying using a pool.
Components and renderer are no longer transient.
Reduced number of components needed by 2
Suppressed material & mesh warning when using Text3DComponent in a Blueprint.
Added effects section for text (layout effects) in Details panel.
Reworked the default text transform extension effect to support ease curve.
Fixed the mask material function to work fully in local space without continuous updates to adjust itself.
Added missing Blueprint functions to retrieve text extensions.
Now uses a single custom material for front, back, extrude, bevel slots.
Naming Tokens:
Now supports case-insensitive namespace lookup. bForceCaseSensitive is now recognized for namespaces to force case-sensitive checks.
Registering namespaces is unchanged, and still requires a unique name regardless of case.
Added Naming Tokens Editable Text Box UMG widget for displaying token text, both as raw tokens and resolved tokens. This wraps a new slate version: SNamingTokensEditableTextBox.
The default behavior allows you to type in text with {tokens} through NamingTokens that are automatically resolved when committing the text.
An autocomplete suggestion dropdown is included which allows you to search for namespaces and tokens and automatically insert them into the text box.
Added EvaluateTokenList API to evaluate specific tokens and return their evaluation data.
Added the TokenNamespace field to FNamingTokenValueData so the namespace is always returned.
Added a CombineNamespaceAndTokenKey utility function in case the key and namespace need to be recombined.
Added support for specifying additional mount points via the command line for the storm sync plugin.
SwitchboardListener: Enabled separate handling of stdout and stderr streams.
Template Level Sequences or Cine Assemblies can now be set for assembly and sub-assembly construction through the Cine Assembly Schema 'Content Hierarchy' tab.
Using the take recording feature, you can now capture microphone audio sources on -game clients.
Created a new stat category for the Take Recorder and its sources. This allows users to see what sources are assigned on a -game client.
CineAssembly
Added Productions level toolbar to change the active production.
Added naming token support in Cine Assembly Schema metadata String fields.
Added Python functionality to access and set the author property of a CineAssembly(get_author, set_author).
Added Blueprint functionality to access and set the author property of a CineAssembly (GetAuthor, SetAuthor)
Added Python functionality to access the created data and time of a CineAssembly (get_created_string, get_date_created_string, get_time_created_string).
Added Blueprint functionality to access the created data and time of a CineAssembly (GetCreatedString, GetDateCreatedString, GetTimeCreatedString).
Added a new token to access a CineAssembly's author property ({author}).
Added a new token to access a CineAssembly's created date and time ({created}, {dateCreated}, {timeCreated}).
Exposed the author property of a CineAssembly at creation time in the CineAssembly creation window details.
Added a new property (bIsDataOnly) to Cine Assembly Schema's and Cine Assemblies to set schemas and assemblies as data only.
Data Only CineAssemblies now cannot be added as SubSequences to other Sequences or Assemblies.
SubSequence compatibility with a parent sequence is checked by two new optional virtual functions on UMovieSceneSequence (IsCompatibleSubSequence, IsCompatibleAsSubSequence).
Added a Shot Duplication tool to the Cinematic Assembly Tools plugin, featuring configurable options for duplicating the subsequences of a Cinematic Assembly asset.
Added a new asset content menu entry widget to set the favourite rating of a Level Sequence or Cine Assembly.
Added a widget to the 'Edit Properties' window of a Level Sequence and Cine Assembly to set the favorite rating.
Added display of the favorite rating of a Level Sequence or Cine Assembly in their Content Browser asset tooltips.
Removed reflect visibility in-game cvar for users. A new workflow is supported in the level editor where users have more explicit control over level visibility.
When recording multiple clients in Take Recorder, we recommend that you disable remote sequencer open. An error is now displayed to enforce this condition.
Bug Fix:
Fixed Remote Control Interception on function calls with constant reference parameters.
Take Recorder:
Fixed not applying time dilation when Sequencer was closed.
Now transacts when removing a source from the subsystem, fixing MultiUser usage.
Fixed OnStopped event not firing in subsystem.
Fixed recording over an existing level sequence crashing when using the Take Recorder subsystem.
ActorRecordingSettings no longer creates settings objects in the constructor, improving struct validation times.
Fixed Take Recorder Subsystem IsReviewing() returning true for a frame when stopping a recording.
Fixed GetLastRecordedLevelSequence not returning the last level sequence while reviewing a recording.
Fixed a crash when creating a level snapshot in a multi-user session.
Fixed a crash that occurred when a Cine Assembly Schema was created with a name whose length exceeded path limits.
Naming Tokens:
Evaluation data no longer initializes datetime in the constructor, fixing an issue with CDO stability.
Now provides world context by default.
Motion Design:
Text3D:
Fixed missing glyph geometry when using some fonts like Antonio, Teko... caused by the code checking if a contour is contained within another only testing a segment instead of the entire polygon or bounding box.
Fixed UnrealServer compilation warnings caused by FreeType and HarfBuzz macro redefinition.
Fixed dynamic mesh renderer crash when text gets regenerated due to update flags not triggering a complete refresh of the render proxy.
Added game ready player collisions for static and dynamic mesh
Fixed layout extension to handle RTL text.
Adjusted wrapping code for RTL text.
Fixed Text3D can be used in packaged builds.
Switchboard:
Included rsync daemon in the job object to ensure it doesn't outlive the Switchboard process.
No longer discard keystrokes in the Add Device dialog that would otherwise cause the device name to collide with an existing device.
SwitchboardListener:
Avoided leaking ETW trace sessions via PresentMon invocations in the event of unclean shutdown.
Prevented child processes from inheriting unintended handles. Unintentionally leaking various resources into child processes that outlive SBL is suspected to be involved in a multitude of intermittent issues, such as:
Inability to bind to the configured listening port when re-launching SBL.
NVAPI initialization failures.
Network performance degradation and disconnects.
Updated OSCSwitchboard editor utility object to use new Take Recorder Subsystem events in addition to keeping the legacy TR BP delegate events.
Mocap Record manager: Added missing calls to emit take and slate changes and to accept an externally called StartRecording event.
Remote Control:
Fixed issues with deleting/renaming groups in the group context menu.
Fixed a crash when playing a level in PIE with embedded Remote Control preset and opening another level while PIE is running.
Fixed an issue where the Create Camera button would not show up for Cine Assemblies in the Sequencer editor.
Fixed a Web Remote Control building issue on Mac where the bin directory added to PATH in the Start script was not absolute causing the subsequent web app scripts to fail.
Protocol bindings now correctly mark the preset modified when changing the override mask.
Fixed issue where the 'Add Actor Track' menu option would not show up for Cine Assembly assets.
Live Link Hub:
Fixed play and reverse button tooltips not updating correctly while in playback.
Fixed a freeze when looping large recordings.
Fixed a freeze if waiting for frames to buffer where the range required was spread across different tracks, but not within a single track.
Fixed a possible freeze when reversing or stopping a recording immediately after looping.
Fixed the default selection end time possibly ending early. Recording length now goes by furthest track timestamp, not frame number.
Added a delay when scanning the asset registry after a directory change detection to help cases where the file system may still be locking the file after a manual move.
Added a recording context option to rescan the recording list manually.
Prevent loading or creating a config if the playback session is active.
Fixed recordings not always looping.
Improved frame time calculation and increased precision.
Buffer range reported should no longer report past max frames.
Fixed issues when jumping to a specific frame. Waiting for a frame to buffer will now properly validate the frame is ready across all tracks. Fixes several issues:
Previously buffered frames that were cached and pending removal would still be considered buffered even if they weren't ready, resulting in the wrong frame being displayed initially.
Jumping to a frame that was buffered and ready on one track, but not ready on another track that had inconsistent frames or a faster frame rate would not wait for this track's frame to be ready, displaying the wrong frame.
Reversing from the start to end frame, such as from a reverse play loop, would hit one or both of these issues and the animation would not always continue playing correctly.
UDP Messaging:
Fixed an issue when the loopback device was not added to the multicast group; so only the first editor instance launch would receive multicast packets. We now always join the group across all instances so other editor instances can be in the same multicast group.
Made multiple reliability improvements to UDP Messaging.
Fixed Media Plate's Aspect Ratio and Mesh Mode transactions to fix Multi-User operations.
VR Editor: FVREditorModeManager now explicitly shuts down VR Editor in response to FEditorDelegates::OnEditorPreExit.
Fixed the Render Grid crashing when passing in an empty string when setting Remote Control values
Fixed an issue where attaching an actor to the socket of a skinned mesh actor would not transact in Multi-User or reapply the attachment as part of an undo operation.
Multiuser: Fixed a possible crash when stopping a take record or reverting take changes.
Capture Manager: Fixed several crashes while aborting take upload.
Deprecated:
Lens Calibration no longer depends on (legacy) Composure, and all features that relied on it have been replicated using internal functionality. Opening lens file assets will no longer add a temporary Composure actor to the level.
Templates
New:
VR Template:
The directional light is now configured to draw shadows on standalone XR platforms. Enabled Single Sample Shadow from Stationary Lights on BP_Pistol to reduce shadow cost (it's already enabled on all other dynamic actors in the scene).
Implemented an example of how Passthrough can be toggled. The option can be found in the hand menu. Note that this native Passthrough solution is currently only available on Meta Quest as the OpenXR runtime must support XR_EXT_composition_layer_inverted_alpha.
VR Template content has now been moved to be a shared template resource named XRFramework. This enables the VR template content to be used in multiple templates.
The mannequin hands are now a shared template resource. We can now use them in multiple XR templates.
Renamed Blueprints to match the style guide of new templates
Added unique descriptions to all Input Actions and Input Mapping Contexts
Added the Android Runtime category tag for immersive mode selection. See the OpenXR specifications appendix about the Android runtime category for more information.
Bug Fix:
VR Template:
Now prevent VR Spectator inputs if HMD is not enabled. This fixes an issue when trying to use a mouse and keyboard pawn in the VR Template for testing.
Grab-logic now works even if MotionControllerSource is changed to non-default (such as Palm).
Fixed hand models staying hidden if switching which hand the Pistol was being held with.
Rebuilt lighting to get rid of shadow artifacts from Point Lights.
Collaborative Viewer Template: Fixed default pawn not turning when moving mouse. The template used a Set Mouse Position-function hack which doesn't behave the same as it used to, and input logic had to be updated to not use that function in the same way.
更新说明
Animation
Control Rig
Upgrade Notes:
Projects using Control Rig Physics, previously provided by the Physics Control plugin, will now need to enable the Control Rig Physics plugin as well.
Runtime
API Change:
Since this code change causes some variables to become unused in a variant of UpdateHistory_TransformHistory, it is now marked as deprecated.
The signature of experimental function UpdateHistory_WorldSpace has been changed
Editor
Framework
Upgrade Notes:
Previously, the UEdGraphSchema performed asset reference filtering when dropping assets on graphs (but not nodes or pins). This high level assumption doesn't hold up for all types of graphs, for example, some graphs open the asset dropped on them for edit. Since the UEdGraphSchema doesn't have knowledge of what the graph represents, asset reference filtering has moved to the implementation details of the various graphs that support it.
Any classes that derive from UEdGraphSchema and implement DroppedAssetsOnNode should perform their own asset reference filtering if dropping an asset on the graph creates a reference from the graph asset to the dropped asset.
UI
API Change:
Public access to UFont::CompositeFont is now deprecated.
Use UFont::GetCompositeFont() if you want to resolve the FCompositeFont to use at runtime (if any).
Use UFont::GetInternalCompositeFont() or UFont::GetMutableInternalCompositeFont() if you need to specifically access/modify UFont::CompositeFont.
Developers should carefully review their use of GetCachedWidget. If a system depends on the outer wrapped widget being returned, use GetWrappedWidget instead. GetCachedWidget may not always return the wrapped widget as expected.
UX
API Change:
The depth bar supports displaying custom widgets that are automatically arranged by depth. This is used in the Level Viewport Client to display selected objects along the depth bar.
These features can be disabled with the "r.Editor.ManualOrthoDepth 0" CVar.
Foundation
Build
Upgrade Notes:
For projects overriding UAssetManager's functions GetPackageManagers, ModifyCook, GetPackageCookRule, GetPackageChunkIds, or UpdateManagementDatabase, there is now an additional EDependencyProperty::CookRule on EDependencyCategory::Manage properties, and there are two types of PackageManagers reported by the UAssetManager:
GetPackageManagers for managers that control only chunk assignment (which pakfile/iostore container an Asset is placed into).
GetPackageCookRuleManagers for managers that affect both cookrule (whether an Asset gets cooked), and chunk assignment.
Assets that declare usedingame dependencies affect both categories of their dependencies.
Assets that declare editoronly, non-build dependencies affect neither.
Assets that declare editoronly, build dependencies affect chunk assignment but not the cookrule. This new property was added to support correct chunk assignment for platform-specific dependencies.
Core
API Change:
MSVC v14.50 compiler bundled with Visual Studio 2026 is not currently supported.
Developers can change the default behavior of TArray<> and related containers to behave more like traditional C++ containers, so that they will only compact when Shrink() is explicitly called. Use the `FNonshrinkingAllocator` as your array allocator to request this behavior. This can also be passed as the secondary allocator for TInlineAllocator.
API Change:
Nuget packages will continue to be audited for other configurations as these are urgent issues to address, but this will prevent blocking errors for licensees and CI while they are addressed.
Dev Tools
Upgrade Notes:
Updating Project Build Settings:
If your project is a code project, the following applies. This does not apply to content-only projects, as they do not contain *Target.cs files.
For Launcher & Installed Engine Builds:
For each *Target.cs file in your project, update the build settings to V6:DefaultBuildSettings = BuildSettingsVersion.V6
Note: If the project is opened from the Epic Games Launcher, you’ll see a prompt identifying which *Target.cs file must be updated. After making this change, reopen the project.
For Source Engine Builds (not an installed version):
For each *Target.cs file in your project, you have two options:
Recommended (Upgrade): Follow the same steps as for Launcher & Installed builds and set the DefaultBuildSettings:DefaultBuildSettings = BuildSettingsVersion.V6.
Stay on Current Build Settings: If you wish to remain on your existing DefaultBuildSettings, you must declare a unique build environment:BuildEnvironment = TargetBuildEnvironment.Unique.
Framework
Audio
Upgrade Notes:
Existing subtitles inside Asset UserData will need to be remade.
Any classes inheriting from USubtitleTextBlock need to instead inherit from USubtitleWidget.
Gameplay
API Change:
You can suppress the deprecation warnings with the bEnabledLegacyMappingDeprecationWarnings option in the project's input settings.
The CVar AbilitySystem.WarnCooldownEffectWithoutTags can be used to opt-out of this, for example if your GameplayAbility subclass implements a different way of checking cooldowns.
Trying to create a FTickableGameObject with default options from a worker thread (such as during async loading) will now ensure as this is a race condition that could crash. To fix this, use the new FTickableGameObject(ETickableTickType::Never) constructor and then call SetTickableTickType after initialization is complete.
If you make a custom camera node evaluator, you can now opt-out of features you don't need, but you get them all by default. It avoids the situation where making a new node results on stuff not working because you didn't add the correct flag.
This behavior is enabled by default, but you can go back to processing only on the main game thread with this console variable: [ConsoleVariables] WindowsApplication.UseWorkerThreadForRawInput=false
Authors of custom movement modes in Mover 2.0 will need to update their code:
Callers must now provide an angular velocity to FMoverDefaultSyncState::SetTransforms_WorldSpace in order to ensure that angular velocity can persist when changing mode
FRotator FProposedMove::AngularVelocity is now replaced by FVector FProposedMove::AngularVelocityDegrees.
UMovementUtils::ComputeAngularVelocity is now deprecated, callers should use ComputeAngularVelocityDegrees
Add a way to deprecate specific "legacy" axis and action mapping names. If this flag is set to true on the project settings, then any BP references to it will have a deprecation warning. Any C++ Bind calls using these names will also emit a warning.
Some of your camera rigs may need some parameters to be pre-blended. Backwards compatibility was not kept for this change (it was too costly and unnecessary given GameplayCameras' "Experimental" status) so you'll have to re-enable the option for these parameters.
Added a "IsVirtual" flag to FKeys so that you check at runtime if the key is virtual.
Added two new virtual keys for accept and back, which are bindable and useable in Enhanced Input.
We need to make new keys here because FKeys are serialized via their FName, so in order to make sure that it properly serializes per-platform we need to save out the keys with unique names and then populate the key details with the "real" value at runtime.
Check for the instigating controller on an actor.
For actor components, get the owning actor and check that instigating controller.
Upgrade Notes:
If you are dealing with the map-placed actor duplicating bindings bug in UE 5.5 and 5.6, see the resolution notes here.
Mass
API Change:
Renamed all `FMassBatchedCommand::Execute` overrides to `Run` and made it non-constant.
Level Design and Art Tools
Landscape
API Change:
Example Command Line: ProjectName MapName -run=WorldPartitionBuilderCommandlet -SCCProvider=Perforce -Builder=WorldPartitionLandscapeBuilder -AllowCommandletRendering ( -IterativeCellSize=Value)
Deprecated ULandscapeEditLayerBase::GetActions and FEditLayerAction to remove custom actions from runtime logic. Edit Layer customization classes can implement IEditLayerCustomization and register to the Landscape Editor module.
Online
Crash Reporter
Upgrade Notes:
Previously, the format was protobuf and needed to be converted using plcrashutil, but now the format is crashlog.
Platform
Mac
Upgrade Notes:
If HairStrands rendering is needed on Mac SM5, the feature can be enabled in addition to using the experimental feature bindless SM5 in project settings.
XR
Upgrade Notes:
If your project has an xr.MobileLDRDynamicResolution setting, you should replace it with an xr.MobilePrimaryScalingMode setting:
xr.MobileLDRDynamicResolution=0 -> xr.MobilePrimaryScalingMode=0
xr.MobileLDRDynamicResolution=1 -> xr.MobilePrimaryScalingMode=1
API Change:
Added FOpenXRRenderBridge::RunOnRHISubmissionThread, which should be used to wrap all OpenXR calls that can submit directly to the graphics queue (xrBeginFrame, xrEndFrame, xrAcquireSwapchainImage, xrReleaseSwapchainImage).
xrEndFrame in FOpenXRHMD is currently exempted because the submission thread is flushed before we present.
Rendering
Lighting
Upgrade Notes:
Added immediately deprecated r.LightMaxDrawDistanceScale.UseLegacyFadeBehavior_WillBeRemoved to temporarily restore previous behavior.
Materials and Shaders
API Change:
Cached the ShaderPlatform inside MaterialResource, derive the FeatureLevel from that ShaderPlatform.
Cache/Find MaterialResource by QualityLevel/ShaderPlatform instead of QualityLevel/FeatureLevel.
Deprecated all the Setter/Getter functions for MaterialResource, MaterialRelevance that take FeatureLevel and replace them with ShaderPlatform.
Deprecated all FMaterialResource/FMaterial/UMaterial/UMaterialInstance functions that take ShaderPlatform as argument, since the ShaderPlatform should already be cached inside the MaterialResource when it was added.
Deprecated BuildFeatureLevelWidget, LoadEditorFeatureLevel, SaveEditorFeatureLevel for BuildShaderPlatformWidget, LoadEditorShaderPlatformPreview, SaveEditorShaderPlatformPreview.
Deprecated GetCurrentFeatureLevelPreviewText, GetCurrentFeatureLevelPreviewTextVisibility, BuildFeatureLevelWidget for GetCurrentShaderPlatformPreviewText, GetCurrentShaderPlatformPreviewTextVisibility, BuildShaderPlatformWidgetMark.
Deprecated virtual functions from MaterialInterface and FMaterial as final to avoid silent errors.
MegaLights
API Change:
Marking for HairStrands data is not yet implemented; it will produce a warning. "Reference mode" works the same with raytracing and will often tend to work with VSM, but could in theory miss marking some pages, so also produces a warning. This is not expected to be a useful mode though as reference mode should generally use raytracing (and perhaps should force it for all lights).
Simulation
Core Physics
API Change:
Added a dependency to the ChaosCore module.
Modular Vehicles
API Change:
Added an additional input quantization mechanism.
Virtual Production
Tools
API Change:
GetValue and GetValueInArray of the IRemoteControlPropertyHandle now correctly take UObject* references.
Remove ProvidedNamespace as it was not in use anywhere. No deprecation as this is an experimental plugin.