Unreal Engine 5.2 Release Notes

Overview of new and updated features in Unreal Engine 5.2

What's New?

Unreal Engine 5.2 continues to build on the framework and features of 5.0 and 5.1, bringing even more new tools to users. The 5.2 release delivers further updates and improvements to facilitate the creation of next-generation, real-time 3D content and experiences. We continue to focus on making our feature set robust, workflow-friendly, and versatile, while keeping the needs of different sectors in mind.

Procedural Content Generation

The Procedural Content Generation Framework (PCG) provides you with the means to create your own procedural content. PCG provides artists and designers the ability to build fast, iterative tools such as buildings or biome generation, up to entire worlds.


Substrate is a new way of authoring materials that gives users more control over the look and feel of objects. When enabled, it replaces the fixed suite of shading models with a more expressive and modular multi-lobe framework that provides a greater range of surface appearances and a wider parameter space from which to work.

Virtual Production Improvements

SMPTE 2110 integration

In your nDisplay clustered setup, you can now use the Rivermax SMPTE 2110 to:

  • Have multiple streams of 4K video.

  • Render your camera's inner frustum to a dedicated machine.

iOS Stage App You can now use an iOS native operator app on-stage, which has simplified controls for:

  • Light cards

  • Flags

  • Color Correction Windows

Virtual Camera improvements With Virtual Cameras, you can now:

  • Stream multiple cameras in a single Editor session.

  • Use Rigrails. We've also simplified the Virtual Camera Blueprints.

DMX improvements DMX now has a simplified Control Console for quicker debugging and control of both physical and virtual fixtures, as well as several UI improvements.

ML Deformer Sample

Download the new Machine Learning (ML) Deformer Sample Project to see a showcase of full-body character mesh deformations using the ML Deformer system.

Launcher Builds now use Universal Binaries for macOS

The build of Unreal Engine distributed through the Epic Games Launcher now includes Universal Binaries for macOS, providing native support for both Apple Silicon (ARM64) and Intel-based (x86-64) macs. When you download and install UE 5.2 on your macOS machine, Unreal Editor will automatically choose the binary slice appropriate for your architecture. Apple Silicon users should experience improved performance. In addition, we have made several improvements to the macOS user experience specifically for Apple Silicon devices, including:

  • Fixes to handling window focus.

  • Support for the "notch" at the top of current-generation Mac screens.

For more information, refer to Native Apple Silicon Support for Unreal Editor. Additionally, with this update, Unreal Engine Marketplace content for 5.2 is now available for macOS users!

Keep reading to find out more information about these tools, and the full list of all improvements in Unreal Engine 5.2.

This release includes improvements submitted by our community of Unreal Engine developers on GitHub. Thank you to each of these contributors to Unreal Engine 5.2:

909185693, aaronmjacobs, ActiveXSturcture, AfterThunk, aidinabedi, alexirae, ameaninglessname, ameyghan, amuTBKT, anon-oss, APandaWithAGun, aquanox, bestofact, bretternst, brian2524, brumenn, brunnio, chris03, dapetcu21, davidyrgilbert, dbsigurd, DecoyRS, disseminate, dman82499, dorgonman, DreikaEru, Duroxxigar, EchoRed-3D, Edstub207, ennorehling, Erlite, foobit, forsakenyang, gaborpapp, galeone, gameknife, geordiemhall, gtreshchev, hach-que, huklen, HunterVacui, Ident, imatakeharuhiko, iniside, jlnordin, jlsalmon, jm00517, joeycarr, jszakmeister, kedamazigoku, KeithRare, kentzhang-geek, l2oe, LairdWT, leith-bartrich, LiamGiiV, lineageiori, LizardThief, LouRohanNV, marcussvensson92, Mattiwatti, Megafunk, MichaelBell, MilkyEngineer, MothDoctor, Murazaki, nklose, nutti, oxxxydimon, PapeCoding, pear-studio, Pico-XR, RadAlex, RandomInEqualities, real-mikhail, Ryan-DowlingSoka, satoshi-iwaki, Scaless, SeamusBao666, SlashParadox, slonopotamus, Sn-a-ke, SRombauts, stlnkm, sunduk, SungJJinKang, Sythenz, Temaran, TheJamsh, thomasvanta, timrademaker, TroutZhang, Tryum, tustanivsky, tuxerr, UntamedLoli, VesCodes, Victov, vorixo, whatthesamuel, x157, zorbathut



Nanite feature and performance updates include:

  • Additional feature support for Custom Depth and Stencils, Lighting Channels, and Global Clip Plane.

  • Variable precision normals — for example, for high-quality reflections on cars.

  • A new "Max World Position Offset Displacement" setting to mitigate artifacts common to objects that use World Position Offset with Nanite.

    • Use Visualize > Out of Bounds Pixels in the viewport view modes to see where WPO is getting clamps by the max offset.

  • We updated the Nanite Streamer, which is responsible for streaming clusters of geometry data from disk, for performance, stability, and improved statistics.

  • Precomputed Nanite displacement mapping with a static texture map (Beta).

For more information, see Nanite.


Quality and performance updates in Lumen include:

Comparison of Lumen Character Lighting in 5.1 and 5.2

  • Improved GI and occlusion on characters for thin geometry (such as folds in shirts, nose, and ears) and better integration with hair grooms.

  • High-quality reflections on translucency now support material roughness, rather than being restricted to mirror-only).

  • The Surface Cache is now driven by feedback for Software Ray-Traced (SWRT) reflections, providing higher-resolution reflections and faster reactions to scene changes.

  • SWRT mode uses Async Compute on console by default.

  • Better approximation of secondary bounces in reflections with Hardware Ray Tracing (HWRT) hit lighting.

  • Two-sided foliage support in HWRT hit lighting.

For more information, see Lumen Global Illumination and Reflections, Lumen Technical Details, and Lumen Performance Guide.

Substrate (Experimental)

Substrate (previously called Strata) replaces the fixed suite of shading models, such as Default Lit and Clear Coat, with a more expressive, modular framework that provides a greater range of surface appearances and a wider parameter space. Performance scales according to complexity and desired budget, with legacy materials having a similar cost as before.

Substrate was released for early testing in UE 5.1 and is still Experimental in 5.2. It should not be used for production scenes, but we encourage testing it and are seeking feedback during this phase of development.

Unreal Engine 5.2 contains many improvements in capability, stability, and performance. Some of the changes include:

Substrate 5.2 Example

  • We removed Metallic parameterization to simplify logic of Slab nodes. You can use a Substrate Metalness-To-DiffuseAlbedo-F0 helper node to convert Metallic-style parameters.

  • You can now specify Slab thickness in the Vertical Layering node to make it easier to reuse Material Functions containing Slabs while providing independent layering control.

  • You can now preview Substrate nodes similarly to legacy material nodes.

  • We improved layering / energy preservation for Cloth materials and added an independent roughness value.

  • We added initial support for Mobile platforms with the exception of Deferred Mobile.

  • We added initial support for Nintendo Switch.

  • We improved node placement for readability when converting legacy materials to Substrate.

  • We fixed issues with Post Process reading scene GBuffer data.

  • We improved node previewing in the Material Editor.

  • We improved refraction controls so that F0 drives index of refraction (IOR) by default but it can be overridden.

  • We updated Substrate Blend Modes and they are now available with Material Instances.

  • You can now preview the simplification of the full material from the Substrate tab in the Material Editor.

  • We resolved multiple crashes and bug fixes discovered.

To learn more about Substrate in its experimental state, visit the Epic Developer Community forums.

DX12 PSO Precaching

A new PSO precaching mechanism was introduced as experimental in 5.1 to improve PSO hitching in DX12 titles. Improvements to this system in 5.2 include:

  • We improved the performance and stability of the system. There were various corner cases which we needed to address.

  • We now skip drawing objects if their PSOs aren't ready yet. The system aims to have the PSO ready in time for drawing, but it will never be able to guarantee this. When it's late, it is now possible to skip drawing the object instead of waiting for compilation to finish (and hitching).

  • We reduced the number of PSOs to precache due to improved logic that omits ones which will never be used.

  • We improved the old (manual) PSO cache system so that it can be used alongside precaching.

Path Tracer

Path-traced example scene

The path tracer in 5.2 closes several gaps in feature parity with the rasterizer, and offers several new capabilities similar to those available in offline rendering pipelines.

  • Subsurface shading in the path tracer now has optional support for scattering anisotropy, and map-driven subsurface color with a Mean Free Path parameter.

  • We added Mesh Decal support and improved overall performance for decals.

  • We added support for Spline Meshes.

  • We added support for Specular Scale value in Lights.

  • You can now optionally decouple the reflectivity of glass (Fresnel effect) from the index of refraction which controls how rays bend through the glass.

  • We added the ability to make objects invisible to camera rays but not global illumination / shadows.

  • We added the ability to render objects as holdouts without changing the material.

  • We added a Path Tracing Ray Type Switch node for filtering by path tracer ray type in the Material Graph.

  • Basic lighting passes, sometimes referred to as AOVs, including diffuse, specular, indirect, and others, can be rendered individually now. These passes do not come free with each render and must be rendered separately.

  • We added primary ray visibility toggles that honors Cast Shadow, Hidden Shadow, Affect Dynamic Indirect Lighting, and Affect Indirect Lighting While Hidden, along with primary visibility toggled to disable Visibility, Enable Hidden Shadow, and Affect Indirect Light While Hidden.

  • You can use the new Enable Path Tracing Blueprint node to toggle path tracing at runtime

For more information, see Path Tracer.

Virtual Textures

Virtual Textures includes the following improvements and features:

  • We added a feedback option to the Runtime Virtual Texture Sample node that disables requests to stream in visible virtual texture pages.

    • An example of when you would use this would be where your grass material samples the landscape Runtime Virtual Texture. The landscape will generally drive the virtual texture update, and you'd want the grass to sample the same mip used on the landscape. Using this option stops the grass from requesting higher mips than necessary.

  • We added the ability to export all UDIMs using the right-click Asset Actions options. These export as separate UDIM texture blocks.

For more information, see Virtual Texturing.

Enhanced Shadow Rendering

Improvements to Ray-Traced Shadows include:

  • Ray-traced shadows for Rect Lights and lights with a source size are now more accurate and more closely resemble results from the Path Tracer.

Improved ray-traced Rect Light shadows.

(Left to Right) Old Rect Light shadows, New Rect Light shadows, Path-traced Rect Light shadows.

For more information, see Hardware Ray Tracing.

Improvements for Virtual Shadow Maps include:

  • The Distant Lights implementation lowers the shadow rendering cost significantly for scenes with many local lights.

  • Single-pass Virtual Shadow Maps shadow projection achieves the same result for the shadow sampling stage, which is currently underusing modern GPUs. All local lights' virtual shadow maps are projected in a single pass for better performance.

For more information, see Virtual Shadow Maps.

Material Improvements

The Material Editor sees the following additions and improvements:

  • We added the Switch node that makes it easier to switch between different texture types. This node takes any input and reduces the overhead of having multiple nodes reflect each type of texture sampler.

  • We added a Max World Position Offset Displacement setting to Materials that resolves issues with culling and self-occlusion caused by World Position Offset. It also allows you to restrict how much offset is permitted, which can be helpful for WPO materials assigned to Nanite meshes.

  • We added the ability to jump to an error in the Material Graph.

Jump to an error in the Material Graph.

  • The Material Editor's Comment Block now has feature parity to those in Blueprint:

    • The comment bubble can be shown while zoomed out.

    • The comment bubble can be drawn with or without color.

    • The comment block can group expressions or be standalone.

Improved comment blocks in Materials

Temporal Super Resolution Improvements/Optimizations

Temporal Super Resolution includes the following changes:

  • The Engine Scalability for Anti-Aliasing when set to Epic now has its screen percentage set to 200.

    • This is defined by r.TSR.History.ScreenPercentage=200 in the Scalability.ini configuration file.

  • TSR can now reproject static (non-drawing velocity) geometric detail thinner than a pixel. This is enabled by default with r.TSR.Subpixel.Method 2.

For more information, see Temporal Super Resolution. You can also leave feedback for the development team on the EDC forums in the TSR Feedback Thread.

Exposure Improvements

Exposure includes the following improvements:

  • We added separate controls for Local Exposure highlight / shadows contrast scale.

  • We are deprecating Eye Adaptation Texture in favor of Eye Adaptation Buffer (and will remove it in Unreal Engine 5.3).

  • We added experimental support for calculating exposure based on illuminance.

For more information, see Auto Exposure.

Enhanced Hardware Ray Tracing Tools

Debug view for Ray Tracing Instance Overlap.

  • We added initial support for toggling ray tracing on / off at runtime. This feature is Experimental and does not support all possible geometry types.

  • There is a new debug visualization mode to show overlapping ray tracing instances (Lit > Ray Tracing Debug > Instance Overlap) to help with ray tracing scene diagnosis and optimization. It shows bounding boxes read from GPUScene, which excludes dynamic instances. This mode works on all platforms making it usable by artists in the editor.

  • We now support async compute for inline ray-tracing passes.

For more information, see Hardware Ray Tracing.

Multi-View Optimizations

With Virtual Production, where performance can be limited by CPU Render Thread time and sometimes GPU times, it's critical that multi-view and multi-GPU rendering on the stage remain performant throughout the process.

This release sees optimizations and improvements in the following areas:

  • Multi-View Ray Tracing

  • Submission thread as optimization

  • Cross-GPU Stall (Niagara Work)

  • Reduced CPU and Debug code overhead for Development builds of the engine.

Subsurface Scattering Improvements

Subsurface Scattering includes the following improvements:

  • We improved rough surface rendering for human skin.

  • We added path-traced anisotropic subsurface scattering using the Subsurface Medium output node in the Material Editor.

Path Tracer Subsurface Medium expression for Materials.

Render Resource Viewer Tool

The Render Resource Viewer is a tool that gives full visibility into where all GPU memory allocations are going and to what render resources, such as Vertex Buffers and Index Buffers, and which assets they come from, like Static and Skeletal Meshes. This provides artists and developers with information needed to optimize GPU memory and keep their projects within their rendering budget.

Render Resource Viewer

The Render Resource Viewer includes:

  • An interactive UI in the editor that displays each render resource allocation with its name, size, type, flags, and owner.

  • A table of allocations you can sort and filter.

  • A clear view of information to identify and understand which assets are making the allocations.

Shader Compilation Improvements

Shader compilation is something that happens frequently and has a large impact on developer and artist iteration when loading the editor, opening maps, launching PIE, and it has a big impact on cooking projects. This is an area we are continually developing and improving.

This release includes:

  • We implemented a new shader preprocessor that offers a 2x speed-up in shader preprocessing. This is enabled by default.

  • We reduced redundant compilations with non-determinism issues with caching shaders in the DDC.

  • You no longer have to wait to compile shaders when launching sample projects and templates distributed by Epic Games because we fixed DDC caching of shaders for the projects we ship with the engine.

  • We added the ability to do Unreal Insights traces of the Shader Compiler Worker process.

  • It's now easier to diagnose crashes since Shader Compiler Worker now catches exceptions and reports them to the main cook process.

Tier 2 Variable Rate Shading (Experimental)

We expanded Variable Rate Shading, previously available only on XR devices, to desktop in UE 5.2. It now supports Contrast Adaptive Shading, a new approach that analyzes the preceding frame to determine which areas can be rendered at rougher shading rates, without producing noticeable changes in the final image. Desktop VRS is experimental for version 5.2, and will receive further updates and improvements in the releases to come.

XR Variable Rate Shading

Contrast Adaptive Shading + Debug Visualizer

  • We added support for Contrast Adaptive Shading, which you can enable with the console command r.VRS.ContrastAdaptiveShading 1. See ContrastAdaptiveImageGenerator.cpp for a full list of available parameters.

  • Nanite, Light Functions, Deferred Decals, and Screen Space Reflections are now affected by Variable Rate Shading, potentially lowering the cost of those features when VRS is enabled.

  • We added a new debug visualizer to the VRS manager so developers can see how it's affecting their scene in real time, which you can toggle with the console command r.VRS.Preview.

  • On XR devices, you can use the new Contrast Adaptive Shading generator alongside the existing XR-only Foveated Shading generator by enabling both at once.


Audio Parameter Modulation Improvements

New Blueprint nodes for Audio Parameter Modulation

We made some quality-of-life improvements to Audio Parameter Modulation to improve your workflow.

  • You can now set up your modulation pipeline entirely in Blueprints.

  • You can create LFO and Envelope Follower Generators in Blueprint.

  • We updated the Blueprint nodes to produce cleaner, easier-to-read graphs.

  • You can now iterate faster as changes to active sound routing apply immediately (instead of requiring a restart).

To learn more about Audio Parameter Modulation, see the Audio Parameter Modulation documentation.

New MetaSound Nodes

New nodes for MetaSounds

We've expanded our node library in MetaSound, our high-performance graph-based audio system.

  • Perlin Noise

  • Low Frequency Noise

  • Super Oscillator

  • Evaluate WaveTable

To learn more about MetaSounds and the new nodes, see the MetaSounds documentation.

Editor — UI

Localization Key Debugging Improvements

The localization tools for UE 5.2 now include a debug culture for displaying localization keys in your UI. You can set your project to this culture using the console or a command line using the command -culture=keys. This displays the localization key for any localizeable text in place of the normal text. This helps localization QA find the localization key for misformatted or mistranslated text more easily, and exposes text that's unlocalized during debugging.

Using localization keys in the Lyra sample game

Additionally, there is a CVar called Slate.LogPaintedText for debugging onscreen text. When you set Slate.LogPaintedText to true, any text currently painted onscreen will appear in the log. If you combine this with the keys culture detailed above, you can see the full localization key in the log without any UI clipping issues.

Enhanced Input Support for CommonUI (Experimental)

In UE 5.2, CommonUI has limited compatibility with the Enhanced Input System. This support is experimental, and we recommend avoiding using it in productions until it has been tested and refined more.

To enable Enhanced Input support for CommonUI, make sure both plugins are active in your project, then open Project Settings and navigate to Game > Common Input Settings > Enable Enhanced Input, then toggle Enable Enhanced Input Support.

Select this checkbox to enable Enhanced Input support

You can then map Enhanced Input actions to CommonUI's UI actions. See Using CommonUI with Enhanced Input for more information.

Expanded CommonUI Documentation

In addition, the CommonUI documentation now has more details on input management. We recommend reading them for more insight on how Input Routing works, as well as some tools that will help you fine-tune CommonUI in your project.

Scriptable Tools Framework (Experimental)

We added a new set of experimental plugins that exposes the Interactive Tools Framework to Blueprints (BP). By creating BP subclasses of the Scriptable Interactive Tool base classes, you can add custom user-defined tools to the Scriptable Tools editor mode. These tools behave similarly to the tools in Modeling Mode in that:

  • They are modal tools that have access to capturing the mouse input.

  • They can create gizmos.

  • They can be Accepted and Canceled.

In addition, you can add and visualize tool properties through a standard details view (like the tool properties in Modeling Mode). There is also support for responding to property changes using delegates.

Paired with Geometry Scripting, Scriptable Tools can implement complex modeling and asset editing workflows. However, you can also use Scriptable Tools for simpler functionality unrelated to Modeling Mode or Geometry Scripting.

To access these features, enable Scriptable Tools Framework under Edit > Plugins.

Scriptable Tools Framework Plugin

The Scriptable Tools editor mode will appear under Selection Mode.

Scriptable Tools Editor Mode


Modeling Workflow Improvements (Beta)

Modeling workflows can be composed of numerous steps involving a variety of interactions. With UE 5.2, we introduce several improvements to the ongoing process of creating efficient workflows for artists.

Transform Panel

We implemented a new Transform Panel widget for precise transformation control. Coupled to a modeling gizmo, it gives artists numerical control over world space and local delta values. The widget shows directly in the Viewport, and is available for a number of modeling and UV tools.

Now, artists can accurately build and scale their models without being tied to scale reference assets.

Gizmo Improvements

We continue to improve the modeling gizmo not only with the addition of the Transform Panel, but the following:

  • An editor preference to turn on individual gizmos, consistent with the editors standard translation, rotation, and scale.

  • Translation and rotation snapping supported in the local coordinate system.

These gizmo options are accessible in a new dropdown menu, reached by clicking the gear icon in Modeling Mode Quick Settings.

Gizmo Settings

The expansion of the gizmo features provides artists the intricate control of transforming geometry while in Modeling Mode.

To learn more about Modeling Mode and modeling gizmo see Modeling Mode Overview.

PolyEdit Tool

The Insert Edge operation in PolyEdit now has the option for continuous inserting of edges–making topology edits quicker and precise.

To learn more about the PolyEdit tool, see PolyModel Category.

Seam Tool

Creating UVs is an important step during and after modeling, and streamlining that process is a continuous effort. In 5.2 the Seam tool in the UV Editor now has the option to remove seams, as well as add them.This process smooths the artist's UV workflow experience with quick seam editing interaction directly in the 3D preview pane.

To learn more about the Seam tool and other UV tools, see UV Editor documentation.

Pattern Tool (Beta)


We extended the Pattern tool with new jitter properties. Using the settings artists can create more naturalistic repetition and scenes. You can also use the jitter settings to promptly block out levels in conjunction with other modeling tools.

Pattern Project

In addition the Pattern tool can now project the generated pattern into the world. You can use this generation capability to distribute the pattern elements onto the Landscape, but also onto other meshes. The implementation creates a workflow for efficiently adding detail to meshes, especially large ones.

We also updated Packed mode to now account for start scale and start rotation to improve the packing within bounds.

Render Capture Baking Tool (Beta)

In 5.1 we added the Render Capture Baking tool, labeled BakeRC, to the Baking category in Modeling Mode. BakeRC bakes textures for a target mesh from multiple source meshes through a virtual photo or render capture.

Baking Textures

For 5.2 we updated the tool to support:

  • Subsurface Color channel

  • Opacity channel

  • Higher quality texture multisampling

Baking Opacity and Subsurface Textures

In addition, the tool has a new Cleanup Threshold option which helps artists remove baking artifacts due to incorrect occlusion tests. These new features improve performance and user iteration time.

Geometry Scripting (Experimental)

Geometry Scripting provides Technical Artists a toolkit for creating custom modeling tools and workflows. We continue to expand functionality with the following additions and improvements:

  • By user request, we added Translate Pivot To Location to simplify positioning a mesh in space relative to a local Pivot location.

  • Copy Mesh From Component node now supports copying a Dynamic Mesh (in the current deformed state) from Spline Mesh Components, Posed Skinned Mesh Components, and Skeletal Mesh Components.

  • We implemented several utility and convenience functions for creating and querying transforms.

  • We added a set of functions for barycentric triangle interpolation of properties stored at mesh vertices, as well as a function to compute barycentric coordinates for a point in a mesh triangle. With these functions, you can easily sample mesh properties for other usage.

Ray Functions

Ray utility functions expose the FRay type to Blueprints, and adds a library of functions for creating and querying Rays. These are particularly useful for building interactive user interfaces in Blueprints and specifically designed to support the Scriptable Tools plugin.

Ray Functions for Geometry Scripting

Box Functions

We added a new library of utility Box functions for working with FBox objects–exposing a Blueprint API similar to the existing C++ APIs. These kinds of basic math functions and nodes can save a significant amount of time for users who otherwise are forced to re-implement common math operations using multiple basic math nodes.

Box Functions for Geometry Scripting

Bone Weights

We added a small library of functions for manipulating skin weights. UDynamicMesh objects support skin weights when initialized by copying from a Skeletal Mesh Asset, through the existing Copy Mesh From Skeletal Mesh function. You can query and modify skin weights at a vertex, then write them back to the Skeletal Mesh–providing a minimal but functional procedural skin weight authoring mechanism.

Mesh Surface Sampling

We implemented a new technique for generating sample points that are well-distributed over arbitrary 3D meshes. This technique is based on Poisson Dart Throwing and guarantees that none of the spheres will intersect if a sphere is placed at each sample point and radius pair. Both uniform and non-uniform spacing are supported.

The following nodes have been added to use the new technique:

  • Compute Point Sampling

  • Compute Non Uniform Point Sampling

  • Compute Vertex Weighted Point Sampling

These functions are based on a new FMeshSurfacePointSampling class in the GeometryCore library.

Surface Sampling with Geometry Scripting

To learn more about Geometry Scripting and complete list of nodes, see Geometry Scripting Users Guide and Geometry Scripting Reference documentation.



Console Variable Presets in Movie Render Queue (Beta)

You can now use preset Console Variable (CVar) assets in the Movie Render Queue (MRQ). Once authored in the Consoles Variable Editor, you can specify a CVar preset in the MRQ, which applies the CVar preset before render time, in the order you've set the presets. Additionally, you can override CVars using a preset in the MRQ.

Sub-Sequence Track Improvements

You can now dynamically blend Sub-Sequences within a Level Sequence for more control over runtime playback during broadcasts and gameplay.

blend subsequences in level sequence shots tracks

You can also now set sequence blends to use Quaternion Interpolation to take the shortest route between poses, when performing transformed blends.

Anim Track Root Motion Improvements

Blending Root Motion Animation Sequences using the Blend First Child of Root property can now blend poses where the Root Motion is not on the first child bone of the Root Bone. Additionally, when applying Root Motion offsets, the manipulator will now always work in the matched space.

blend first child of root property

Section Colors

You can now color code Sequencer Shots and Sections for organizational purposes.

shot track section color coding

You can now use Shot and Section color coding as a debugging tool when using blended shots. After assigning colors to Sections within a Shot, you can enable a debug render of a character's skeleton that will color code the bones relative to your section colors.

skeleton debug render color coding

Frame Marker Improvements

We improved Frame Makers when editing Sequences in the Timeline to make them easier to see, select, and edit. You can now right-click a Frame Marker to access a context-menu with properties and settings, such as adjusting the Marker's color, add comments, and set whether or not the marker is a Determinism Fence.

shot track frame marker

Additionally, you can now multi-select Frame Markers in addition to other Sequencer elements to make bulk edits.

multi select edit frame markers


Retargeting Python Support

You can now implement custom Python scripts to automate and expedite the retargeting process using IK Rigs.

New Mapping Tools for Retarget Chains

We streamlined the user interface when creating Retarget Chains using the IK Rig, with less pop-up dialogs and with a heavier reliance on contextual buttons relative to your source and target character.

Additionally you can now map retargeted chains using their exact name, between the source and the target character.

retarget bone chain properties fuzzy exact map

Control Rig

Control Rig Closed Splines

When creating Splines in Control Rig, you can now create Closed Splines by enabling the Spline from Points node's Closed pin.

closed loop spline property

Control Rig Graph Improvements

  • The ItemNameSearch node now supports wildcard references.

  • While animating using Control Rig, you can now enable the new Restrict Space Switching property on Controls to prevent control manipulation errors.

  • You can now use the new Get Shape Settings and Set Shape Settings nodes to query and set control shapes when spawning procedural controls using the Construction Graph.

  • When animating with Control Rig, Filtered Channels now support per-channel visibility and keyability for Controls.

  • You can now jump to specific instructions in the Execution Stack.

Animation Blueprints

Relinking State Machines

You can now re-link transition rules in State Machines. By dragging a transition arrow to a new state, all transition rules and logic will carry over to the new link. Alternatively, you can multi-select some transition rules and then drag the transition arrow to a new state, which will carry over only the selected transition logic, leaving the un-selected rules still linked to the previous animation state.

relink edit state machine graph transitions

RigidBody Node Warnings

RigidBody Animation Blueprint nodes will now display a visual warning when a chain is missing a bone.

rigidbody animation graph node warning


Skeleton Compatibility Improvements

Skeleton Compatibility will now be automatically recognized within Unreal Engine between skeleton assets that share identical skeleton structures. When applicable, you can share assets between any skeleton asset that shares an identical skeletal structure, such as animations, and you can select them in asset selection properties.

By default incompatible skeletons will not appear in asset selection properties, you can toggle their appearance using the Allow Incompatible Skeleton Selection property in the Editor Settings or the asset selection Settings menu.

set skeleton compatible editor preference property

set skeleton compatible content filter setting

Additionally, manually setting Skeleton compatibility is now bi-directional. After setting a skeleton to be compatible with another, you can share animations from either skeleton.

manually assign skeleton compatible

Rewind Debugger Improvements

The Rewind Debugger now outputs a single Trace File per recording session, to organize debug data and reduce file sizes.

Additionally, the Rewind Debugger now features the following:

  • You can use new Property Watch tracks to isolate and observe values in your animation system as their own track in the Rewind Debugger Timeline.

  • You can now toggle Pose Watch debug renders of character's skeletons while using the Rewind Debugger.

Animation Synthesis

ML Deformer Sample Project

You can now download the new Machine Learning (ML) Deformer Sample Project that features a showcase of full body character mesh deformations using the ML Deformer system. The sample project includes an interactive cinematic of a Control Rig driven, animated character, that you can observe and compare linear skinned mesh playback against ML Deformer generated deformations. Additionally, you can manipulate the character using alternative animations, Control Rig edits, and by toggling clothing and skin visibility, in order to observe real time changes to the mesh and learn more about the ML Deformer system and capabilities.

You can download the ML Deformer sample project using the UE Online Learning tab of the Unreal Engine Marketplace.

ml deformer example project marketplace

ML Deformer Improvements

The Machine Learning (ML) Deformer system has been greatly improved, bringing faster more efficient workflows, with more detailed and accurate results. The following notable improvements have been made:

  • Performance of the Neural Morph Model's inference has been significantly improved. In some cases it is up to 20x faster on the CPU side, now generally only taking a few microseconds per update.

  • The Neural Morph Model in local mode now supports Curves.

  • Added support for bone and curve groups in the Neural Morph Model's local mode. This allows for higher quality deformation in cases where deformation depends on multiple bones or curves.

  • Quality levels in the Neural Morph Model allows you to set a maximum number of active morph targets as a form of LOD. This currently only works within LOD 0 though.


macOS Development Requirements

Users running Unreal Engine 5.2 on macOS must meet the following development requirements:

  • Minimum macOS version: 12.5 Monterey or newer.

  • Recommended macOS version: Latest macOS Ventura.

  • Minimum Xcode Version: 14.1

These reflect the new/upcoming minimum requirements for the App Store. In the future, macOS requirements will reflect the requirements for iOS, tvOS, and iPadOS to ensure consistency in our support across Apple's platforms.

Native Apple Silicon Support for Unreal Editor

Starting with UE 5.2, the Epic Games Launcher now distributes builds of Unreal Editor for macOS with Universal Binaries. These binaries have slices for both x86-64 and arm64 architectures, providing native support for both previous-generation Intel-based Macs and current-generation Apple Silicon Macs. Whichever you are using, the editor will automatically run using the slice appropriate for your hardware architecture. Apple Silicon users should experience less processing overhead, as the editor does not depend on Rosetta2 to translate instructions anymore.

Mac developers building Unreal Engine from source need to explicitly set their target architecture to x64+arm64 to build the editor with universal binaries, as Xcode will default to building for the user's native architecture.

Supporting Apple Silicon in the UE Marketplace

From 5.2 on, developers releasing code plugins on the UE marketplace are required to build their plugins with universal binaries to be considered compatible with macOS. This ensures that code plugins can be distributed to all Mac users with minimal version management.

macOS Limitations in UE 5.2

Although native Apple Silicon support reduces processing overhead, overall macOS support is still a work in progress. The following is a list of features that currently have limited or no support on macOS:

  • Nanite relies on image atomics and forward progress guarantees Apple hardware may not support. We hope to enable this feature in the future, but for now, it is not supported on macOS.

  • Quixel assets set to use Nanite will fall back to non-Nanite versions of those assets. Otherwise, they will function as intended.

  • Hair/fur/groom strands are not supported on macOS, but hair cards and meshes are supported.

  • Hardware ray-tracing support for Lumen is not supported on macOS, which means Lumen will fall back to using a software-only ray-tracer. This means Lumen will produce lower-quality results (for example, reflections are less detailed and dynamic meshes are not visible in them) on Apple Silicon compared with devices that have hardware ray tracing support.


OpenXR Face-locked Stereo Layer Emulation Support

We added face-locked stereo layer emulation, making face-locked stereo layers available on platforms that do not support the minimum number of layers provided by OpenXR (16)

You can enable this setting by changing the xr.OpenXRForceStereoLayerEmulation CVar to true.

XR Device Visualization Component

We introduced a new XR Device Visualization Component to decouple the visualization of the Motion Controller Component from its tracking part. This lets you directly modify the visualization of motion controllers within your project.

You can activate this feature by selecting the Is Visualization Active checkbox in the Details panel or from Blueprints by using the Visualization Active Blueprint node

The Details panel showing XR Device Visualization component options

XR Creative Framework Plugin Experimental Support

The XR Creative Framework is built for OpenXR and enables you to build editor tools for XR devices. It supports stereo rendering, head mounted display pose, motion controller poses, and input. It's designed to be extensible in Blueprints without the need to modify engine code or plugins. Examples of such tools could be for Level Design, Modeling, and Animation.

VR Notifications Component Delegates Work with OpenXR Runtimes

VR Notifications Component Delegates now work with OpenXR runtimes.

Optimized Instanced Stereo Rendering and Mobile Multi-View

We optimized Instanced Stereo Rendering and Mobile Multi-View and you can expect to see a ~5% GPU performance improvement on Meta Quest 2.

WebBrowser Widget Support for Meta Quest Devices.

We added support for the WebBrowser Widget for Meta Quest Devices. This includes support for input via the WidgetInteractionComponent.

Vive Trackers Experimental Support

You can now use the OpenXRViveTracker Plugin to add support for Vive Trackers to your XR projects. For more information about setting up your Vive Trackers and the OpenXRViveTracker Plugin, refer to this Development Community tutorial.

Palm Pose Extension

The OpenXR Palm Pose is now available as a MotionController Motion Source.


Development Requirements and Compatible Hardware For Mobile

The following are the supported OS versions and minimum hardware for Mobile devices supported by Unreal Engine 5.2. For additional information about required SDKs and IDEs, refer to the Platform SDK Upgrades section.

iOS, iPadOS, and tvOS

UE 5.2 supports iOS, iPadOS, and tvOS devices with OS that support version target SDK 15 or later, and use an Apple A8 processor or later.

The following are the minimum compatible device models for UE 5.2:

  • iOS 15

    • iPhone 6S or later

    • iPod Touch 7th generation

  • iPadOS 15

    • iPad 5th generation or later

    • iPad Air 2* or later

    • iPad Mini 4* or later

    • iPad Pro (all models)

  • tvOS 15

    • Apple TV HD*

    • Apple TV 4K (first generation)

    • Apple TV 4K (second generation)

*Apple A8/A8X-based devices iPad Air 2, iPad Mini 4 and Apple TV HD require a project setting for support to be enabled.

5.2 will likely be the last release to support A8/A8X devices.

For information about the required SDKs and MacOS versions, refer to the Platform SDK Upgrades below.


UE 5.2 supports Android devices meeting the following specifications:

  • Android 8 or higher

  • 64-bit Arm-based CPU

  • Compatible GPUs

    • Mali T8xx, G7x and G71x series

    • Adreno 5xx, 6xx or 7xx series

    • PowerVR GM9xxx

    • Xclipse 920

  • Compatible Graphics APIs

    • OpenGL ES 3.2

    • Vulkan is supported on Android 10 or later devices with compatible drivers.

For information about the required SDK versions, refer to the Platform SDK Upgrades below.

Android Game Development Extension Now Requires JDK 17

The Android Game Development Extension (AGDE) plugin for Visual Studio now requires JDK 17. To use it, make sure you do the following:

  1. Download and install Microsoft OpenJDK 17 on your computer.

  2. Add an environment variable to your system called JDK_AGDE_HOME.

  3. Set the path for JDK_AGDE_HOME to the installation path for JDK 17.

Refer to our documentation for using AGDE with Unreal Engine for more information.

Prepare for Debugging for iOS, tvOS, and iPadOS (Beta)

UE 5.2 has a new Prepare for Debugging command for iOS, tvOS, and iPadOS. Previously, developers needed to build code and cook content to proceed with packaging a project, but Prepare for Debugging introduces flexibility to this process by injecting previously-cooked data into a build, skipping the cooking step. This is especially convenient for programmers, who can use Prepare for Debugging from UAT to deploy to a device content from a build-farm generated build along with their locally-generated executable, without having to make an Editor build.

To access Prepare to Debug using UAT, use the command Turnkey -command=WrangleContentForDebugging -project=[name of your .uproject file]. Alternatively, you can click the Platforms dropdown in Unreal Editor, navigate to iOS or tvOS, then click Prepare for Debugging.

Highlighting the Prepare for Debugging option for iOS in the Platforms dropdown

Prepare for Debugging is considered Beta for iOS. You can use it on a macOS machine with Xcode to inject cooked data from a .ipa into your Xcode builds, but it does not currently support remote builds from Windows.

Mobile Preview Improvements

With UE 5.2, we introduce several stability and accuracy improvements to the Mobile Preview mode in Unreal Editor, available by selecting a Preview Rendering Level device from the Settings menu:

  • We improved stability when changing preview devices.

  • Using the Engine Scalability Settings window in the editor now applies the preview platform's scalability settings, applying any platform-overridden scalability variables to the editor viewports. For example, settings like mesh LOD transition distances that depend on the overrides in the platform Scalability ini file will be correctly previewed.

  • All console variables set by the target preview platform's device profile will now be applied, so the editor viewports should accurately preview the set of rendering features that would be enabled when running on the device.

iOS, tvOS, and iPadOS Improvements

UE 5.2 adds support for the following features on iOS, tvOS, and iPadOS:

Background Audio Support for iOS and iPadOS

Background Audio is now supported on iOS and iPadOS projects using UE 5.2. This makes it possible to continue playing your application's audio in the background when you switch to another app. You can toggle this in Project Settings > Platforms > iOS > Audio by using the setting labeled whether audio from this plays in the background.

Enable this setting for background audio support

Gamepad and Input Improvements

We made the following improvements to gamepad support on iOS, tvOS, and iPadOS devices:

  • Gamepads can now interact with Slate UI. This behaves similarly to gamepad UI support on consoles.

  • Nintendo controllers now work on iOS, tvOS, and iPadOS devices. This includes both the Pro Controller and Joy-Con Controllers.

  • Using a mouse as an input device is now supported. However, there is no hardware mouse cursor and your app must render one.


Gameplay Targeting System Plugin

The Gameplay Targeting System is a way to create data-driven targeting requests. It expands on the

[Gameplay Ability System Plugin](making-interactive-experiences/GameplayAbilitySystem)
, but could be used outside of the feature.

You can enable the Targeting System from the Editor by navigating to Edit > Plugins > Gameplay > Gameplay Abilities > Targeting System.

Setting up the Targeting System

The Targeting System uses a Targeting Preset. This Targeting Preset is a data asset that defines a set of Targeting Tasks that are run from top to bottom for an executed targeting request.

A feature of targeting presets is each task supports inline property editing. This means you can define reusable targeting tasks and presets that set up how the tasks behave without defining a UAsset for each one.

See the Gameplay Targeting System for complete documentation of the feature.

Force Feedback Assets

When working with Force Feedback Assets in Unreal, each platform has a different implementation of how their vibration motors or feedback systems work. Force Feedback assets now support Per Device Overrides for values.

This is an abstraction layer that provides users with a method to set different feedback settings for each platform. For example, you can have strong vibration applied to an Xbox controller, but a more detailed and nuanced vibration to a PlayStation controller.

You can see these in the Per Device Overrides section of the Force Feedback Effect device properties.

Using Per Device overrides for the Force Feedback effects

See the Force Feedback documentation for more information.

Device Properties

Device Properties represent different physical properties of an input device, such as its light color display, or haptic trigger resistance. You can activate device properties by adding to an existing Force Feedback Asset in the Device Properties category, from a Burst Gameplay Cue Notify Blueprint, or from the Input Device subsystem.

Device Properties have a simple lifetime that is exposed with virtual functions for you to customize. Each device property has a duration, which is the same as a Force Feedback effect's duration attribute. Properties will be activated, evaluated, applied, and then reset once they have reached their duration.

You can make your triggers have more resistance based on the type of weapon you have, or change light color over time for special effects, and other gameplay possibilities.

The list of devices is populated by a config file, so third-party vendors can add their own devices as an option. By default, we support every console. You can see these config settings in the editor by navigating to Project Settings > Input > Platform Settings > (Platform) > Hardware.

As an example, a PS5 can have a DualSense or a DualShock4 as an option.

DualSense or DualShock4 options in the Device Properties

See the Device Properties documentation for more information.

Diff Tool

You can use the UE Diff Tool to compare assets in Unreal Engine. It supports comparing an asset with a previous version of itself from source control and supports comparing two different assets. The current support is for Blueprints and Blueprint-adjacent types.

Overview of the UE Diff Tool

To diff two assets against one another, navigate to the content browser, select two assets then right-click and in the context menu select Diff Selected.

Diffing two assets together

The Diff Tool features options to diff a local asset against a specific source control revision. See the UE Diff Tool page for complete documentation of this feature.

Review Tool

You can use the UE Review Tool to list all the assets in a shelved or submitted changelist. When you use the UE Diff Tool, the Review Tool is used to review those assets. Currently, the Review Tool is only supported for Perforce.

Artificial Intelligence

State Tree

We made several improvements to StateTrees in UE 5.2.

StateTrees now have Global Tasks, which provide a way to run StateTree Tasks that are active between the Tree Start and Stop events.

Global Tasks can be used when you need to have permanent data available for State selection. For example, a time of day system could create a Global Task that determines the current time of day. Since the Global Tasks are started before the Root State in the tree, this information would be available when the tree starts and during the first State selection.

Smart Objects

We made several updates to Smart Objects in UE 5.2.

Smart Object Collections are no longer created automatically. Instead, you can now create one or more Collections per level to suit your needs.

In addition, Smart Objects now offer better support for World Partition and Data Layers, while also working seamlessly with persistent levels.

[NEW] Neural Network Engine (NNE)

You can now run neural networks within your game using the Neural Network Engine plugin.

Users can import an ONNX file into their project and pass it to the plugin to create a runnable model. This model can run on the CPU or can be queued to a render graph builder so it runs on the GPU. This is the case for both desktop platforms and some of the current-generation consoles.

This plugin is considered experimental and we will continue to improve it in the upcoming engine versions. The updates will target increased performance and support for additional platforms.

To learn more, visit the NNE course on the Epic Developer Community.


Machine Learning Cloth Simulation

Machine Learning Cloth Simulation

Unreal Engine 5.2 makes significant improvements to our Machine Learning Cloth system.

We implemented the following features:

  • Automatic pose selection: We introduced a new tool that automatically selects poses for the nearest neighbor dataset, making it easier to fine-tune machine learning models.

  • Faster network inference: We improved the performance of our network inference, making it four times faster than the previous release.

  • Improved Mesh deformation: We introduced a new method of computing Mesh deformation, which significantly improves model accuracy.

  • Bug fixes and UI improvements: We made several bug fixes and UI enhancements to improve the process of creating a cloth simulation.

[NEW] Chaos Flesh Simulation

Unreal Engine 5.2 introduces the new Chaos Flesh system. This system provides high-quality, real-time simulation of deformable (soft) bodies in Unreal Engine. Unlike rigid body simulation, the shape of soft bodies can change during simulation based on their properties.

The Chaos Flesh system supports the simulation of Static and Skeletal Meshes with a variety of parameters - giving artists unprecedented control over the end result. The system's main focus is on the simulation of a character's muscle deformation during skeletal animation.

The Chaos Flesh system achieves high performance by simulating low-resolution geometry at runtime, along with cached results from an offline simulation of high-resolution cinematic-quality geometry.

Asset Modeling

As the first step in simulating soft bodies, you must convert an object's surface representation into a volumetric representation of the same object. The Chaos Flesh system converts a Static or Skeletal Mesh into its equivalent tetrahedral geometry representation for use during simulations.

The system supports the following:

  • Isosurface-stuffing tetrahedralization of closed geometry, stored within a Static or Skeletal Mesh surface.

  • The Tetrahedral Meshing in the Wild (Tet Wild) algorithm for automatic tetrahedralization of closed surfaces.

  • Tetrahedralization from a custom generation algorithm.

Tetrahedral Simulation

The Chaos Flesh system uses its generated tetrahedral geometry to run a physically-based simulation in real-time.

The simulation supports the following:

  • Physically-based, real-time and offline, simulation of tetrahedral structures.

  • Kinematics for constrained animated vertices of the simulation mesh.

  • Weak constraints to bind disjointed simulation geometry.

  • The ability to set per-particle simulation properties.

  • Integration with the Field system for per-particle property initialization.

  • Asset authoring through a procedural node graph interface.

World Solver Interactions

The Chaos Flesh simulations have the ability to interact with the environment in real-time.

These external interactions include the following:

  • One-way collision interaction with world solver objects.

  • Support for collision against convex and analytic geometry.

  • Using Skeletal animations to drive constrained tetrahedral vertices.

  • User-configurable tick order relative to the world solver.

  • Surface raycasts against static world geometry.

  • Adjustable collision performance.

Rendering the Simulation

While the tetrahedral Mesh is a good volumetric structure for simulation, it is usually not an ideal surface for rendering. Since the primary concern is making the rendering surface look good, the system transfers the simulation results onto an optimized surface for rendering.

The system currently supports the following:

  • A deformer which transfers the simulation results onto a Skeletal Mesh.

  • World position offset for the displacement of Static Mesh geometry.

  • Tetrahedral debug drawing of the simulation mesh.

Caching the Simulation

Flesh simulations can be very computationally expensive to run in real-time. For this reason, the Chaos Flesh System comes with the ability to cache its simulation results for smoother run-time playback.

The system supports the following features:

  • Capture simulation results in a caching asset for playback.

  • Play the results back in the game as canned deformations.

  • Scrub cache results within Sequencer to time against cinematic events.

  • Rendering and simulation using Get Take and the Movie Render Queue (MRQ).

Learn more about the Chaos Flesh system by reading the Chaos Flesh Overview documentation.

Niagara Fluid Simulation

Chaos Fluid simulation used on the Rivian GDC demo

Fluid simulations in Niagara have received substantial improvements in 5.2.

Better Performance

In UE 5.2, 2D Gas and Liquid simulations are 200% faster and 3D Gas and Liquid simulations are up to 60% faster, compared to previous releases.

In addition, all uses of Grid2DCollection and Grid3DCollection are significantly faster than before. Note that for 3D grids, collections with a single attribute (float, vector, and so on) are much faster due to superior memory management.

Improved Usability

We updated the 3D gas emitters to be more robust, resulting in more feature-rich template systems.

We also simplified the Summary View and user parameters to make them more user friendly.

Sequencer Caching

Simulation caching in Sequencer

You can now cache all fluid simulations using Sequencer and the new Niagara Sim Cache workflow. This provides the ability to bake (cache) simulations, then scrub the results in Sequencer, render them with the Movie Render Queue, or play them back in game.

Rendering Improvements

3D gas simulations are now rendered exclusively with the Heterogeneous Volume Rendering framework. This provides the ability to use an arbitrary number of lights and geometry shadowing volumes

In addition, this update provides a robust and easy way to author materials, without the need for custom code.

General Improvements

We also made the following improvements to Fluid simulations:

  • Better collision: Subframe accurate collisions are now available with the Rigid Mesh Collision DI. This is integrated into 2D and 3D fluid simulators.

  • Shallow water: Better support for shallow water simulations with support for mesh SDF collisions, smoother results, and improved performance.

  • Significantly faster SDF smoothing for 3D liquids.


Decal Renderer

In UE 5.2 we added a new renderer called the Decal Renderer. Similar to a Decal Actor, you can use the Decal Renderer to generate and apply decals through a Niagara system. The Decal Renderer is available for CPU only.

When you generate decals using the Decal Renderer, the decals are projected onto the geometry they intersect with. This is really useful for cases like paint, that needs to splat onto surfaces.

Decals do not show up in the Preview window of the Niagara Editor, so you need to apply them to a surface in the Level Editor to see the effect. Also, there are new properties DecalColor and DecalLifetimeOpacity to use when you want to change the color of the decal through the Niagara system. You can also link those to the ParticleColor attribute if you want them to update together.

All renderer bindings should work as expected. Dynamic parameters are unsupported.

The cost of rendering an individual decal using a Decal Actor is identical to rendering a decal through Niagara. However, if you want to render many decals at once, it's cheaper to do so through Niagara.

To learn more, see Render Modules.

Niagara Sim Caching (Experimental)

There is a new, experimental plugin called NiagaraSimCaching that provides ways for you to capture and store Niagara simulation results for future re-use. Sim Caches save out the data for system, emitter, and particle attributes, such as positions and rendering information. A full cache will store all attributes, whereas a rendering cache will only store the attributes relevant to that cache. You can also save some data interfaces to the cache, such as the Render Target Volume.

When you run a Niagara simulation, there are small variations that happen. By baking out the Sim Cache, you make the data static and predictable, which can be useful for cinematic workflows where you need reliable results in Movie Render Queue. Once you have cached the results of the simulations, you can pull them up in Sequencer, or load the data into a Blueprint for whatever custom purpose you desire. Other uses include creating optimized stand-ins for common effects at runtime for performance, generating run-up for a live simulation so that you can start with particles already in existence, and debugging system simulations in the game that do not behave as expected.

Niagara Simulation Cache in Sequencer

There are several ways to save a simulation cache:

  • Using the Baker

  • Through Sequencer

  • In the Level Editor

Using the Baker

Cache a simulation by using the Flipbook Baker and selecting the option for Simulation Cache Output (Experimental). For more information, see Flipbook Baker.

The advantage of this method is that artists who may not be familiar with working in Sequencer can save their cache files directly from Niagara. Simulation caches are saved as standalone assets. This means that you can take advantage of version control when dealing with large cache files. Once you have saved the sim cache, you can then apply it in Sequencer or use the data in Blueprints.

Through Sequencer

You can also record a sim cache directly in Sequencer. The methods to do that are:

  • (Recommended) Inserting a cache track on the Niagara Component and recording from there.

  • Recording using Take Recorder.

When you save a simulation cache in Sequencer, it saves it automatically to the sequence and not as a separate standalone asset. This method is ideal for doing quick iterations and captures.

Recording a simulation cache in Take Recorder adds the Niagara actor as a spawnable instead of a possessable. The advantage of this approach is that you can record multiple sources and caches at the same time.

In the Level Editor

You can record a simulation cache in the Level Editor. Select the Niagara Actor, then in the Details panel, in the Niagara Utilities section, you will find a Capture button. You can configure the length for this Capture in the Project Settings, under Niagara > Simulation Caching > Quick Sim Cache Capture Frame Count. By default, this capture does a quick 5-frame simulation cache.

For more information on simulation caches, see Niagara Simulation Caching in Sequencer.

Dynamic Mesh Data Interface

Use the Dynamic Mesh data interface to build geometry within a CPU or GPU simulation. You can modify the built geometry however you like, by rebuilding it every frame, modifying the triangles, modifying a subset of vertices, or build it just once.

When you use the Dynamic Mesh data interface, you can copy the geometry on each frame. This can then be instanced per particle in another emitter. For example, you can create a doppelganger effect where you have many copies of a character animation. Currently we only support one material per skeletal mesh.

The following is an example of marching cubes running inside Niagara. One emitter controls the particle spheres, another emitter then reads the particles to generate the mesh.

In order to use the Dynamic Mesh data interface, you need to create your own custom modules and simulation stages.

Improved Load and Compile Times

We have significantly improved the performance of Niagara in two key areas for UE 5.2: the time it takes to load a Niagara system, and the time it takes to read previously compiled results from the DDC.

Loading a Niagara system happens when:

  • Opening an asset in the Niagara Editor for the first time.

  • Loading a map that contains a Niagara asset.

  • Compiling a Niagara system.

For these types of operations, we improved a portion of the computation, PostLoad, to be up to 5 times faster.

In addition to the improvements with loading, we also made the following improvement to compiling the Niagara system. The first time you compile the system, the results of various operations are saved into the Derived Data Cache (DDC). That way, if you close the editor and re-open it, and do the same operation again, UE doesn't need to re-compile the Niagara system.

In previous versions, the cost of pulling data from the DDC was substantial. In UE 5.2, pulling from the DDC is up to 4 times faster. You will particularly notice a difference with large project files, with many Niagara assets in them.

Niagara Fluids

For improvements to Niagara Fluids, see the Physics section.

Unreal Insights

Insights Editor

You can now launch and manage Unreal Insights by using the Insights / Trace status bar widget located in the bottom-right corner of the Editor.

This new widget consolidates functionality for controlling a trace by providing you with a new user interface where you can manage which channels you are tracing, capture a Trace Screenshot, insert a Trace Bookmark, or start and stop a trace.

Trace in the bottom-right corner of the Insights editor

For a complete overview of these menu features, see the Unreal Insights documentation page.


We made multiple improvements to Trace Insights in Unreal 5.2.

  • We added the screenshot channel to the default channel preset.

  • There is a new console command Trace.SnapshotSend [] []. This command sends a snapshot of the current in-memory trace buffer to a trace store by using the arguments provided for a host and a port.

  • We optimized Trace with better memory management during Trace analysis.

  • We committed several bug fixes, including a late connect functionality fix for scoped events.

  • Trace now provides error feedback from trace analysis to applications. These include errors for unsupported trace versions.

Timing Insights


We added new Export functionality for counters data. You can locate these new options in the context menu of the Counters panel.

Export options in the Counters panel context menu

Menu Option



Exports the selection (counters and their aggregated statistics) to a text file (tab-separated values or comma-separated values).

Export Values...

Exports the values of the selected counter to a text file (tab-separated values or comma-separated values). Exports the values only in the selected time region (if any) or the entire session if no time region is selected.

Export Operations...

Exports the incremental operations/values of the selected counter to a text file (tab-separated values or comma-separated values). Exports the ops/values only in the selected time region (if any) or the entire session if no time region is selected.

Export Counters...

Exports the list of counters to a text file (tab-separated values or comma-separated values).

Execute Commands

  • We added support for unknown wildcard types when specifying regions in the TimingInsights.ExportTimerStatistics execute command.

Timing View

You can now reset highlights for timing events by double-clicking on the event. Double clicking an empty space will also reset the highlight.

  • We fixed CPU Timing events with metadata not having correct timestamps in "late connect" sessions.

  • We added detailed CPU performance scopes for the "LoadModule".

Memory Insights

Memory Allocations Table
  • Added "Export Snapshot" in the context menu. This exports memory allocations as a .csv / .tsv file that is ready to be imported in the Table Diff mode.

Table Diff Mode is an experimental feature.

  • We added memory allocation tracing for D3D11 and D3D12 resources.

  • We added a callstack to the Free and Heap trace events.

Asset Loading Insights

  • We added support for Asset Loading Insights Editor.

Tree/Table Views
  • We added the option to Hide All Columns in the context menu of column headers.

  • We added Session Browser / Table Diff for two memory allocation snapshots.

  • We added Diff Tables and Import Tables to the Session Browser drop-down menu.

Memory Profiler

The old Profiler from UnrealFrontend and its runtime have been deprecated as of UE 5.0.

The MemoryProfiler2 tool and the MallocProfiler runtime have been deprecated as of UE 5.0.


Datasmith Solidworks Exporter Plugin

Support for Solidworks Configurations

In Solidworks, you can use configurations to create several variations of a model in a single document. You can now export multiple Solidworks configurations as variants in a Level Variant set.

The Datasmith Solidworks exporter exports separate static meshes for each configuration you export. If some parts are not visible in some configurations, the exporter uses visibility toggles to hide them.

Datasmith glTF Importer Plugin

As we finalize the transition to the Interchange glTF plugin, we've marked the Datasmith glTF plugin as deprecated in the Plugins window.

Interchange glTF Plugin

Exporter Uses Actor Labels

The glTF exporter now exports Actor labels instead of Actor names. Actor labels provide more meaningful information in the exported hierarchy.

Actor labels displayed in the Unreal Engine Outliner Actor labels displayed in an exported GLTF hierarchy

Custom Extensions Removed

We removed all of the custom Epic glTF extensions from the glTF exporter. The corresponding export options no longer appear in the export options dialog.

Removed Extension

Removed Export Options


Material Options > Export Extra Blend Modes


Animation options > Export Playback Settings


Texture Options > Export Lightmaps


Texture Options > No Lossy Image Format For

Texture Options > Texture HDR encoding


Scene Options > Export HDRI Backdrops


Scene Options > Export Sky Spheres


Scene Options > Variant Sets Mode

Variant Set Options > Export Mesh Variants

Variant Set Options > Export Visibility Variants

CAD Import

We now consider the CADKernel tessellation engine production ready. However, it is not yet activated by default.

In this release, we made several stability improvements to CADKernel, including:

  • Removal of duplicate surfaces.

  • Improved meshing along iso-curves.

  • The ability to bypass the Max Edge Length setting on very large flat surfaces.

We also added a new console variable to the Datasmith CAD Translator. ds.CADTranslator.RemoveDuplicatedTriangle prevents duplicate triangles — two triangles with the same triplet of vertices — in a mesh. Duplicate triangles can appear when a surface patch is duplicated. When the two patches have identical meshes, it produces duplicate triangles in the global mesh.

USD Support

Asset Caches

You can now create caches for the assets Unreal Engine generates and reuses when you open a USD Stage. Using an asset cache can improve load times when you work with different Stages that use the same assets, because Unreal engine doesn't have to re-process cached assets.

You can specify a default asset cache for the project, or have Unreal Engine create a new asset cache for every Stage Actor that needs one. When you set a default asset cache for your project, every Stage Actor that opens a stage, and does not have an asset cache previously assigned, uses the default asset cache automatically.

Unreal Engine prompts you to create or specify a default asset cache the first time you open a USD stage Actor in a project. You can also create an asset cache from the Add menu in the Content Browser (Add > Miscellaneous > USD Asset Cache), and set it as the default from the Project settings. The Default Asset Cache setting is in the Engine > USDImporter section of the Project Settings window.

A USD asset cache is an asset you can open and edit from the Content Browser as you would any other asset. When you edit an asset cache, you see all of the assets in the cache, and can set memory limits for persistent assets that are always saved to disk, and unreferenced assets that are loaded for the current session, even if they are not used.

Developer Tools

Default Visual Studio Version

Visual Studio 2022 is now the default Visual Studio version for compiling Unreal Engine. The preferred versions of Visual Studio 2022 (VS2022) and Microsoft Visual C++ (MSVC) are:

  • VS2022: 17.4.x and later

  • MSVC: 14.34.31933

Unreal Header Tool

We removed the C++ Unreal Header Tool (UHT) that was deprecated in UE 5.1. Unreal Engine now uses the new C# Unreal Header Tool introduced in UE 5.1.

Include-What-You-Use Tool

Include-What-You-Use Tool is now integrated into Unreal Engine's Unreal Build Tool. Include-What-You-Use (IWYU) is a command-line tool written on top of Clang. IWYU compiles files in the same way as Clang, but does not output an object file. Instead, IWYU outputs a list of the #include directives needed for the provided source file to compile.

To use IWYU, build your target on Linux and use the following syntax:

    RunUBT.bat <TARGET> Linux Development -IWYU

Foundation — Core

Virtual Asset Improvements

In UE 5.2, we have added several user experience improvements to the Virtual Assets system:

Virtual Asset Offline Support (Experimental)

To support users who may need to go offline for extended periods of time, we added an offline mode for the Virtual Asset system. To use offline mode, you need to run a precache pass that downloads any virtualized data from your storage locations onto your local machine, then switch to a backend graph that uses the local cache instead of connecting to online storage. Currently, this functionality is considered experimental, as it requires manual setup to create a background graph supporting it.

Auto-Fix Unvirtualized Check-Ins

In some situations, users can accidentally un-virtualize assets meant to be virtualized. To catch issues like this, UAT now includes a script that can re-save and re-virtualize files on a project-wide basis. This makes it possible to configure a workflow for your organization (such as in a build farm) that will ensure assets are consistently virtualized. To run this operation, use the command -run=VirtualizationEditor.VirtualizeProject. This does not re-save packages and relies on the project's content being up to date with its virtualization settings.

Clang Static Analysis is Now Production-Ready

In UE 5.2, we addressed all enabled warnings for the Clang Static Analyzer from 5.1. Therefore, we are moving Clang Static Analysis out of Experimental status, and it is now ready for use in production.

Pixel Streaming

Google has informed developers of a vulnerability in versions (earlier than M102) of WebRTC. Impacts, workarounds, and updates can be found here.

VR Pixel Streaming (Experimental)

Pixel Streaming now supports VR. You can stream to a web browser as usual, but now if you have an XR device plugged in, you can click the "Enter VR" button to show the video stream in the HMD. Additionally, the system captures the HMD and XR controller transforms and transmits them back to Unreal Engine, meaning you can interact with your Unreal Engine VR-enabled application using nothing but Pixel Streaming and an XR device. This makes it possible to build zero-install XR experiences, and opens up Unreal Engine to a world of XR streaming use cases.

This feature is experimental in Unreal Engine 5.2 and has the following known limitations:

  • We tested with Quest 2 and HTC Vive, but not all XR devices are supported..

  • Network latency is present in the headset as there are no prediction or latency mitigation techniques implemented. This means VR Pixel Streaming is currently most suitable for local setups.

  • You must launch your application with -PixelStreamingEnableHMD for instanced stereoscopic rendering to take place.

  • The OpenXR plugin must be disabled to use the PixelStreaming HMD.

  • To use in-headset browsers such as the Meta Quest Browser, you must configure the signalling server to serve content over HTTPS.

Multi-streamer Support

Pixel Streaming now supports multiple streamers connected to the same signalling server, with the ability to select which one you are interacting with on the browser side. This makes it possible to switch points of view, stream local multiplayer experiences, or operate multiple Pixel Streaming VCams at once.

When streaming on consumer NVIDIA GPUs, you will be limited to three video encoding sessions. In cases where you have exhausted all your sessions, we have implemented a graceful fallback to software encoding. However, this will quickly consume your CPU processing capacity. In our testing with 1080p streams, three GPU encoded streams and one software encoded stream is achievable on most modern systems.

Pixel Streaming Frontend Library

We overhauled the Pixel Streaming frontend (.html, .js, .css) in UE 5.2 to move to modern web development practices and make the frontend easier to work with, debug, and build on top of. We converted the existing monolithic JavaScript files to a set of TypeScript classes, created NPM packages, and have a public API following SemVer. We also separated the core functionality away from the UI code, meaning that from UE 5.2 onward we will ship two NPM packages for the frontend:

  1. lib-pixelstreamingfrontend: The core Pixel Streaming frontend for WebRTC, settings, input, and general functionality.

  2. lib-pixelstreamingfrontend-ui: The reference Pixel Streaming UI that users can optionally either modify or apply on top of the core library.

Users can either build their own UI on top of the core library, or use the reference UI as a starting point to customize. For more details about consuming these libraries or the Pixel Streaming frontend in general, visit the official Pixel Streaming infrastructure Github repository.

Updated Pixel Streaming Demo

We refreshed the Pixel Streaming Demo showcase project to include a new frontend built on top of the new Pixel Streaming frontend library. It also includes specific feature showcases with accompanying explanation text. This will showcase the features of Pixel Streaming in an educational way for users wanting to explore the new features or pick up Pixel Streaming for the first time. Going forward, we will upgrade this showcase project to demonstrate new features as they are released.

Procedural Content Generation Framework (Experimental)

The Procedural Content Generation Framework (PCG) is a toolset in early development for creating your own procedural content inside Unreal Engine. PCG provides artists and designers the ability to build fast, iterative tools and content of any complexity ranging from asset utilities, such as buildings or biome generation, up to entire worlds.

We built the PCG framework for extensibility and interactivity, providing easy integration into existing world building pipelines, effectively blurring the lines between procedural and more traditional workflows.

Using PCG to place foliage on uneven terrain

PCG provides a new node graph, a library of operators, and a component to generate content and interact with data in the world. The Node Graph editor is completely interactive, with changes updating in real time to support a live workflow.

For more information on the Procedural Generation Framework, refer to the Procedural Generation Framework documentation.

Virtual Production


SMPTE 2110 Support

SMPTE 2110 graphic.

We updated the nDisplay system to support the use of the SMPTE 2110 standard via the Nvidia Mellanox - Rivermax SDK. This means you can have multiple streams of video I/O, and that you can use a hardware setup for nDisplay systems where each inner frustum is rendered by a dedicated machine, which can improve your content performance.

Multi-Process and Offscreen Rendering

This is a new cluster configuration methodology that improves parallelization of resource usage in nDisplay render nodes, which in many cases improves performance on systems with multiple GPUs.

In short, PCs equipped with multiple GPUs can run headless render nodes that share their renders cross-GPU to display facing nodes running on the same machine.

Multi-Process GPU workflow shown.

Where JITMR stands for Just In Time Media Rendering, which is a new feature in the Media I/O Framework that players can take advantage of to consume frames that arrive at the Engine as close as possible to the time they are needed, which in the case of nDisplay frame composition, is near the end of the rendering pipeline.

Cluster PIE Preview

Previewing the clustered setup in PIE mode.

You can now preview the nDisplay Root Actor in the Play in Editor (PIE) mode, so you can pre-visualize clustered setups.


iOS Stage App

There is now an iOS remote control app available, which helps you easily control many common In-Camera VFX features. From this app, you can place light cards, flags, color correction windows, and chromakey cards on a live interactive visual preview of the nDisplay render on the LED volume, perform color grading, and modify frequently-changed ICVFX properties.

Chromakey Cards

Place a green (or blue) screen within the volume and easily position it like a Light Card in the ICVFX Editor, automatically taking on the characteristics of nDisplay's chromakey settings.

Multi-user Receive-only Mode

In multi-user sessions, you can now toggle your local instance to only receive updates from the multi-user session. In the Receive-only mode, you'll receive updates, but any modifications you make to the scene will not be sent to the server. You can use this to make changes locally before toggling back to the Default or Send-only mode and populating your changes to the Multi-User session.

Virtual Cameras

Single Editor Multi-Cam

We extended WebRTC Pixel Streaming support to multiple simultaneous named streams from a single server, accessible from the Pixel Streaming Output Providers. We also extended enhanced input support on Virtual Camera so you can select accepted input devices per Virtual Camera. Collectively, these changes provide the means for you to operate multiple simultaneous Virtual Cameras off a single editor instance.

Live Link VCam App

Live Link VCam for iPadOS and iOS now supports selection of a target stream when targeting a multi-streaming server. We also added support for the use of virtual keyboards for interacting with text boxes streamed from the editor.

Rail Construction from Virtual Camera

VCamActor now offers the ability to construct, edit, and ride rails directly from the VCam interface for the execution of complex, pre-planned camera moves.

Aspect Ratio Adaptation to Target Device

Virtual Camera now adapts the viewport resolution to the appropriate aspect ratio of target devices when connected using Pixel Streaming. Resizing the viewport or manually entering an override resolution is no longer required.


Render Grid

The new Render Grid plugin helps you to easily version MRQ Job renders. You can create a new playlist asset and create jobs in a workflow that's similar to the Movie Render Queue panel. You can assign jobs with saved property values to a remote control preset, so you can quickly duplicate jobs and use the same level sequence animations for different jobs.


DMX Control Console

DMX Control Console displayed with different color mappings.

We simplified the DMX Control Console for quicker debugging and quick control of both physical and virtual fixtures. You can now select a DMX Library and Path within the Output Console UI and have it populate sliders automatically, so they can immediately be used to generate DMX.

The Global Search lets you quickly filter within the exposed control sliders, so you can easily navigate to the properties you want to tweak.

DMX UI Improvements

The DMX UI now has the following improvements, to make it easier for live show designers, virtual production operators, and anyone desiring to use DMX to drive in-editor elements for real-time preview:

  • Batch add fixture patches

  • Updated naming conventions (OX vs X)

  • Selection for universes

  • Copy-paste arrays of fixtures

  • Multi-select and move fixture patches

  • MVR Import Options

Media IO

Media IO Thumbnails & Preview

File preview for Media IO shown in the editor.

Media IO Thumbnails

You can now generate thumbnails for Images and Media Source assets by dragging and dropping one or more video files. You can decide which frame of the video becomes the thumbnail.

Video Preview

You can now preview video by double-clicking on a File Media source, Playlist, or Image Media Source asset.


Cross-fading shown in the Media Plate Actor.

The Media Plate Actor can now create crossfading between media. Use a combination of multiple Media Players to cross fade up to 2 (2x) tracks.

Color Pipeline

Working Color Space

The Working Color Space is a project setting that allows you to provide information to the engine so that texture inputs and display outputs can properly convert to and from the intended working color space.

OCIOv2 Improvements

We updated the OpenColorIO plugin library to version 2.2, which adds new features including built-in configs and support for .ocioz compressed config archives.

OCIO support for ICVFX Light cards

You can now apply OCIO to Light card renders, which means they can be correctly represented on the wall in terms of intensity and color, and optionally separated from corrections done for the camera.

Nanite Support for Per-actor Color Grading with Color Correction Regions

Color grading is now available for specific Nanite actors in addition to a region/volume. This means you can isolate the effect on your desired Nanite content, as you already can with traditional content.

Platform SDK Upgrades

Logos for Platform SDKs

  • Windows

  • IDE Version the Build farm compiles against

    • Visual Studio: Visual Studio 2022 17.4 14.34.31933 toolchain and Windows 10 SDK (10.0.18362.0)

    • Xcode: Xcode 14.2

  • GDK

    • Windows SDK: 10.0.19041.0

    • GDK: October 2022 Update 1

    • Firmware Version: Recovery November 2022 10.0.22621.2864

    • Supported IDE: Visual Studio 2022

  • Linux

    • Native Linux Development

      • Recommended OS: Ubuntu 22.04 or CentOS 7

      • Compiler: clang 15.0.1

    • Cross-Platform Development

      • Cross-Compile Toolchain: v21 clang-15.0.1-based (CentOS 7)

  • macOS

    • Recommended

      • Latest macOS 13 Ventura

      • Latest Xcode 14.1 or newer

    • Minimum

      • macOS 12.5 Monterey

      • Xcode 14.1

  • iOS / tvOS / iPadOS

    • Recommended

      • Latest macOS 13 Ventura

      • Latest Xcode 14.2 or newer

    • Minimum

      • macOS 12.5 Monterey

      • Xcode 14.1

    • Supported Target SDK versions: iOS 15 or later

    • Graphics API: Metal 2.4 and Metal 3.0

  • Android

    • Android Studio 4.0

    • Android NDK r25b

    • Android SDK

      • Recommended: SDK 32

      • Minimum for compiling UE: SDK 30

      • Minimum target SDK for running on device: SDK 26

      • AGDE v23.1.82+ required if you are using AGDE debugging.

        • AGDE requires JDK 17. We recommend using OpenJDK 17.

  • ARCore

    • 1.22

  • ARKit

    • 4.0

  • Oculus

    • 33.0

  • OpenXR

    • 1.0.22

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 14.3.0 or 15.3.0 + optional NEX 4.6.7

    • Minimum Firmware Version: 14.3.0-1.0

    • Nintendo Dev Interface 2.5.5

    • Supported IDE: Visual Studio 2022 (SDK version 15.3.0), Visual Studio 2019 (SDK version 14.3.0)

  • PS4

    • Orbis SDK 10.008.011

    • System software 10.010.001

    • Supported IDE: Visual Studio 2022

  • PS5

    • Prospero SDK

    • System Software

    • Supported IDE: Visual Studio 2022

Release Notes



  • You can now relinking State Machine transitions in the AnimGraph. Additionally, you can make selective relinks by multi-selecting a subset of the transition nodes.

  • You can now use per-bone blend profiles as overrides in Blend Spaces.

  • Added a new visual Blend Curve widget to replace the previous text-based solution. The new widget shows the selected blend curve and displays animate information while hovering over it with the mouse.

  • Shared AnimGraph State Machines transitions can now be used and referenced across hierarchy levels by their parent and child state machines.

  • Exposed more animation blueprint features to the animation blueprint templates to support the new expanded skeleton compatibility.

  • Unreal Engine will now prefer to use the physics asset of the currently displayed mesh instead of the one who's preview mesh matches the current mesh.

  • You can now add Animation Composite Assets to Motion Matching Database assets in order to select poses from them at runtime.

  • You can now set a limit to define the number of bone influences, per-vertex, below what the project supports.

    • You can use the BoneInfluencesLimit property to set a limit on each LOD of an asset.

    • You can also use the DefaultBoneInfluencesLimit property as a per-platform global default, that can be set from the Project Settings.

    • For example, you can enable Unlimited Bone Influences on a project while ensuring that meshes don't use more than 8 influences by default, even if they've been imported with more.

  • You can now toggle the Unlimited Bone Influences property as a per platform default, rather than having one global setting for all platforms.

  • Skeletal Mesh Assets now display their Max Bone Influences in the metadata tooltip that you can access by hovering over an asset in the Content Browser.

    • Additionally, you can now filter assets by Max Bone Influences.


  • Improved the accuracy of some comments about how the Support Ray Tracing setting on Skeletal Meshes affects their usage of the skin cache.

  • Deprecated properties have been wrapped with WITH_EDITORONLY_DATA in order to avoid runtime waste.

Crash Fix:

  • Fixed an issue that could cause a crash when duplicate blend profile indices are introduced, due to a virtual bone rename operation.

Bug Fix:

  • Fixed a bug that would display incorrect values for some Watched pin values in Animation Blueprints.

  • Fixed a bug that could cause LOD bones to not display correctly in the Animation Editor Viewport.

  • Prevented redundant node spawner actions from being registered for every loaded Animation Blueprint asset context in the editor.

  • Fixed a bug that could cause blend profile bone indices to go out of sync when virtual bones were deleted.



  • Exposed Montage_GetEffectivePlayRate, which accounts for PlayRate * RateScale. You can use the new Montage_GetEffectivePlayRate to get more accurate Montage playrate as the current Montage_GetPlayRate returns only PlayRate, so it doesn't provide an accurate final play rate if the Montage asset has a RateScale that isn't 1.

  • You can now use new Property Tracks in the Rewind Debugger to isolate, watch and debug any recorded property in its own dedicated track in the Rewind Debugger timeline.

  • Added support for overlay icons to be displayed on the Rewind Debugger's Tracks.

  • You can now undo and redo changes made in the Pose Search Database editor.

  • You can now set the blend behavior of the Motion Matching node, such as blend Time, Mode and set driving Blend Profiles.

  • Added a new filter to the pose search Rewind Debugger track that you can use to hide invalid poses.

  • You can now preview Blend Spaces in the Pose Search Database editor.

  • You can now set a dynamic Play Rate Minimum and Maximum to control the playback of Motion Matching nodes.

  • You can now view a Pose Search Database's statistics, using the Database Statistics Tab in the Pose Search Database editor.

  • In the Rewinder Debugger, you can now open the currently selected object's blueprint editor by double-clicking its track in the object outliner.

  • When opening an asset or database from the Rewind Debugger's Pose Search track, the asset is paused and will match the time in the recorded gameplay segment, making it easier to inspect and debug assets.

  • Added new icons adjacent to assets listed in the Pose Search Database editor's Asset Tree panel to quickly show a database entry's state and properties.


  • The motion matching Pose Search Database editor's stability has been improved.

  • Performance improvements have been made to the Pose Search Database indexing.

Crash Fix:

  • Fixed an issue that could cause a crash when the Motion Matching Trace State search throttling was enabled.

Bug Fix:

  • Fixed a bug that could cause parallel indexing of Pose Search Database assets to not perform correctly.

  • Fixed a deserialization issue that could occur with a Pose Search Database index kdtree.

  • Fixed issue that could cause a bug while packaging Pose Search Database assets.

  • Fixed an issue that could occur when concurrently indexing a DCC Pose Search Database.

  • Fixed an issue that could cause a root motion enabled animation preview character to not start at the origin point when switching to a new root motion mode while the animation is paused.


  • Removed the pose search EPoseSearchFeatureDomain.

  • Removed UPoseSearchSequenceMetaData.

  • Removed support for the Pose Search Database sequence lead in and follow up asset definitions.

    • You can now use Animation Composite assets with Motion Matching to set sequences of animations that must play in order.

  • Removed support for UPoseSearchFeatureChannel_Pose::SampleTimes.



  • You can now reorder elements of the rig in the Hierarchy view using drag and drop.

  • Added a new node to create an array of items out of a fixed item list.

  • When dragging and dropping elements in the Control Rig's Hierarchy view, the list wil auto-scroll when moving the cursor to the boundary of the view.

  • Added new graph nodes that you can use to get and set the rig's control settings during the construction event.

  • Added a new set of Control Rig Make nodes in order to use other variable values such as Vectors, Transforms, and more.

  • You can use the new hotkey command, Ctrl-G to Go To a specific instruction in the execute stack view.

  • Once a pin of a Control Rig template node is resolved, it will add a preferred type. This change is also reflected in the API, as once a template pin is resolved, it will not unresolved unless manually unresolving the node.

  • You can now use Anim Controls to drive other Control Rig Controls.

  • You can now select any Mesh that uses a compatible Skeleton asset, as a Preview Mesh.

  • Using the Skeletal Mesh Modeling Tools plugin, you can now use a utility function in the Content Browser to convert a Static Mesh to a Skeletal Mesh using a reference Skeletal Mesh asset and its associated Skeleton asset.

  • Several Improvements have been added to AnimToTexture:

    • Improved UpdateMaterialInstanceFromDataAsset by setting UVIndex, Animate, and NumBoneInfluences.

    • Renamed several Material parameters.

    • Fixed Static Mesh bounds.

    • Setting Static Mesh FullPrecisionUVs only to a given LOD.

    • Forcing PowerOfTwo for 16bit precision.

    • Added 16bit precision for Vertex Mode.

  • When creating Splines in Control Rig, you can now create Closed Splines by enabling the Spline from Points node's Closed pin.

  • Added the Deformer Graph source library DSL_Matrix which contains useful shared matrix functions.

  • Added the new experimental plugin, PoseCorrectives, that you can use to set up corrective pose behaviors. The new plugin contains similar functionality to the Pose Driver node but features a more interactive workflow.

  • Added the console command r.MeshDeformerMaxLOD that you can use to disable mesh deformers below a fixed LOD.

  • Added new Inline function bytecode to the Control Rig. Functions are now only compiled once and their bytecodes are inlined when function references are found.

  • You can now promote Control Rig node Pins to Interface Pins when inside a function or collapsed node.

  • Added a new half edge connectivity data structure that you can use in the Deformer Graph.


  • Control Rig Controls are now always selectable even if they uses a translucent material.

  • Buffer creation is now done per-instance at runtime.

  • Control Rig Components now tick the Post-Process AnimBP with the correct delta time instead of a zero delta time. Previously a tick with a zero delta time could cause any present Rigid body anim node in a PPABP to stop working.

Crash Fix:

  • Fixed a crash that could occur when loading a Control Rig with an invalid parent class.

  • Fixed a crash that could occur when exiting PIE when the Control Rig editor is attached to a Control Rig instance in PIE when debugging.

Bug Fix:

  • Fixed issue where AnimNode_LayeredBoneBlend was not updating the blend weights correctly when using a LOD Threshold.

  • The Deformer Graph Shader Text Editor now updates tab names according to the name of corresponding custom kernel nodes.

  • Custom Deformer Graph Kernel nodes now show the user-defined names in the graph.

  • Fixed the Curve Expression plugin's verify button in the Remap Curves from Mesh panel.

  • You can now copy/paste Custom Compute Kernel node's parameter bindings in the Deformer Graph.

  • Fixed a bug that could cause the Apply To Asset button to not save the preview mesh setting with Deformer Graph assets.

  • Fixed a bug that could occur when copying and pasting Deformer Graph nodes.



  • Exposed access to Curves, TickRecords and Graph Data from UAnimInstanceProxy.

  • Improved Animation Modifier Error Handling with Dll Export.

    • You can now batch apply modifiers by script to the FApplyModifiersScope object using Python or Blueprint Scripted Actions.

  • Added a new tree view for Animation Curves.

    • You can now use UseTreeViewForAnimationCurves and AnimationCurveGroupingDelimiters to enable tree view for curves in an Animation Sequence Editor Checklist.

  • Added additional settings in the Animation Editor and Timeline:

    • Unreal now supports multiple delimiters, which default to "._/|\".

    • Unreal now supports path compression, "A.B.C" and can be presented as one node instead of three if B is the only child of A.

    • Unreal now supports reused names for both curve & path. For example, curve "A.B" and "A.B.C" can exist at the same time.

    • Unreal now supports name collision with different delimiters. For example, "A.B", "A/B" and "A_B" can exist at the same time.

    • Additionally you can now access the Remove Curves & Edit Curves Context menu actions.

  • Added the ability to edit multiple curves simultaneously inside of the Animation Editor by adding/removing curves of interest

  • Added a new custom Animation Blueprint option for additional meshes in animation preview.

  • Added a setting for Animation Modifiers you can use to reapply the modifier post owner change.

  • Exposed the add_socket method to the SkeletalMesh class in Python API.

  • Added a new validation and visual warning to Animation RigidBody Nodes that will display a warning on the node in the AnimGraph if the referenced bones are missing.

  • You can now play Animation Composite assets in the Random Sequence Player node.

  • Exposed functionality on Blend Spaces to force snap to a passed input.

  • Added Blend Space player library to support editing blendspace players.

  • Manually set Skeleton asset compatibility is now bi-directional. Specifying a compatible skeleton A -> B, now implies B -> A.

  • Skeleton compatibility is now an editor-only concern. The runtime will attempt to match skeleton assets via name -> name mappings. Only the editor will prevent assigning incompatible skeletons, for example, in asset selection properties.

  • Skeleton compatibility checks in editor can now be disabled in the Editor Preferences, and each asset picker now has a filter toggle in its View Settings that allows you to see non-compatible skeleton assets.

  • You can now copy and paste data in the Animation Curve Viewer.

  • You can now use the Montage tracks in Rewind Debugger to observe montage data. Montage assets can also be opened by double clicking the asset in the track.


  • Improved Custom Attributes project setting naming.

  • MLDeformerComponent::FindSkeletalMeshComponent now returns nullptr instead of the first available SkelMesh in the event that no matching SkelMesh is found.

  • Skeleton Compatible is now determined using a more optimized IsCompatibleSkeletonByAssetString method that doesn't rely on the asset manager.

  • Several improvements have been made for LookAt AimOffset: You can now use ShowDebug Animation.

    • Input filtering is now accessible.

    • Allows the source or pivot to be a bone or socket.

  • Added an option to display filter categories as sections rather than submenus to SBasicFilterBar.

  • When browsing to assets by clicking hyperlinks in the Rewind Debugger Details panel, the tool will now navigate to the appropriate frame in a referenced AnimSequence, Blendspace or Montage (pausing playback on that frame), and will also set the BlendSpace X/Y Parameters in the editor preview after opening a blend space.

  • Blend curve rendering has been improved in the Rewind Debugger to both improve performance, and display overlapping curves more accurately.

    • Blend weights curves are now rendered as a bar graph, rather than a smooth curve, where the width of each bar is the duration of the frame.

    • If the same AnimSequence is playing in two different places in the graph with different blend weights, it will now display as alpha blended overlapping bars on the same frame; previously this behavior was rendered as a jagged curve.

  • The Rewind Debugger's eyedropper tool for actor selection, is now disabled when player control has not been ejected. Additionally, a tooltip has been added to explain that you must eject player control first, before using the eyedropper tool.

  • The Reset to Default operation in Blend Space axis Min and Max properties has been explicitly disabled because it causes various issues.

Crash Fix:

  • Fixed a crash that could occur when using the Pose Handler AnimBP node, where it was using the bone container without first checking if it was valid.

  • Fixed crash that could occur when a USkeletalMeshComponent is created as a DefaultSubObject of another component.

  • Fixed a crash that could occur when deleting a Skeleton used by a Skeletal Mesh Component instance, which also uses a post-processing animation instance.

  • Fixed an issue that could cause a crash when cleaning up invalid Blend Profile entries leading to OOB access when more than one entry is removed at once.

  • Fixed an issue that could cause a crash when splitting a post process settings pin on a Property Access node.

  • Fixed an issue that could cause a crash when selecting a curve after removing transform curves in an animation sequence.

  • Fixed an issue that could cause a crash by right-clicking a modify curve node in a template animation blueprint.

  • Fixed an issue that could cause the Animation Asset editor to crash when a preview skeletal mesh executes a raw delegate on an already destroyed preview mesh.

  • Fix a crash that could occur with the AnimationViewportClient, when the preview mesh has been destroyed before the client destructor has been called.

  • Fixed an issue that could cause a crash when accessing out of bounds notify index after deleting an Anim Notify in a montage.

  • Fixed an issue that could cause a crash when deleting an Animation Blueprint asset.

  • Fixed an issue that could cause a crash when deleting a curve then validating its asset post-save.

  • Fixed an issue that could cause a crash when using a Skeletal Mesh Component, when the Leader Pose Component is a Poseable Mesh Component.

  • Fixed an issue that could cause a crash when using the Skinned Mesh Component when overriding vertex colors or skin weights and then performing any change that rebuilds LOD information, such as changing the displayed mesh.

  • Fixed an issue that could cause a reinstancing crash when using a custom anim instance proxy as a linked anim graph.

Bug Fix:

  • API can occasionally suppress warning or error dialogs when applying modifiers from script. 'YesToAll' and 'NoToAll' will now not be respected when both error and warning are thrown from the same modifier class.

  • A bug was fixed that could cause an error when transferring Aniamtions Modifiers to a new Skeleton when the ownership of 'PreviouslyAppliedModifier' was from an animation modifier instance of the animation sequence being applied. Stateful animation modifier can now be reverted correctly (Applied modifier instance is no longer reverted after OnApply call)

    • Previously when transferring an Animation Modifier to a new Skeleton, the USkeleton would be dirtied everytime the modifier is applied to an animation sequence.

    • The CanRevert and OutOfDate status for the Animation Modifier on the Skeleton did not reflect the true status of all animation sequences referencing that skeleton.

    • CurrentAnimSequence/CurrentSkeleton was not set on OnRevert().

    • IAnimationDataController::FScopedBracket was not open on OnRevert() before re-apply modifier

  • Unreal will now consider Unreal Engine's Skeletal Mesh bone naming system when importing non-base-LOD Skeletal Mesh assets.

  • Fixed a bug that could cause Additive Transform tracks on an Animation Sequence to not be enabled/disabled.

  • Fixed a bug that could cause an error when using a BlendMask on a Layered Bone Blend node playing back on a compatible skeleton.

  • Fixed a bug that could cause the "Allow incompatible skeletons" property's state was not saved to config files.

  • Fixed a bug that could occur when mirroring Animation Attributes, that caused assigned bone indices to not be remapped correctly.

  • Fixed a bug that could cause CTRL+Z/CTRL+Y to not undo/redo changes to some Preview Scene settings.

  • Fixed a bug that could cause Animation Curve LOD settings to be lost when merging two (or more) Skeletons together.

  • Fixed a bug that could cause PoseAssets to not correctly be evaluated for compatible Skeletons due to bone index mismatches.

  • Empty tracks are now removed to ensure track key count is consistent with the data model.

  • Fixed a bug that could occur by protecting against a null source object when handling re-instancing in custom property nodes.

  • Fixed a bug that could cause Animation Notify States to be ended when CustomTimeDilation is set to zero.

  • Fixed a bug that could cause 'reachable garbage object' errors in anim BP thumbnail preview scenes.

  • Fixed a bug that could cause distorted meshes when assigning assets that rely on skeleton compatibility.

  • Fixed a bug that could cause index mismatch/out-of-bounds access when drawing bones using Pose Watch that doesn't use the full set of bones.

  • Fixed several truncation errors in the AnimationCore, SkeletonEditor AnimationBlueprintEditor, AnimationGraph, and AnimationGraphRuntime modules

  • Swapped ordering of 'Use Selected' and 'Browse to Asset' Skeletal Mesh asset context menu options to match the rest of the editor.

  • Fixed a bug that could cause Anim Notifies in a sequence to not be triggered when played on a slot node inside a linked animation blueprint.

  • Fixed a bug that could cause a Mirror Data Table asset to not automatically add sync markers during creation.

  • Fixed a regression that caused Anim Notifies from all the animations within a montage to be queued as standard notifies and skip the slot relevancy check before triggering the animation events.

  • Fixed a bug by adding a test of bone index validity in animation Pose Assets to avoid runtime failure in rare conditions.

  • AimOffsetLookAt and RotationOffset blendspaces now correctly validate for dynamic properties.

  • Fixed a bug that could cause irregular performance, by skipping updating compatible assets in the asset family shortcut bar, if the asset registry is still loading assets.

  • Fixed a bug that could cause Anim Sequence Curve colors to be reset to white.

  • Fixed a bug that could cause the Anim Timeline Trimming tools to create invalid key data.

  • Fixed a bug that could cause incorrect out-of-bounds access when using retargeting.

  • Fixed a bug that could cause OrientAndScale retargeting to not function properly in the presence of skeleton remapping.

  • Fixed a bug that could cause check() to not operate correctly when deleting certain configurations of Anim Notifies or Notify States.

  • Fixed a bug that could cause an error in the level of detail bone reduction calculation, as it was showing incorrect counts when performed from the Skeleton Tree.

  • Fixed a bug that could cause the BoneContainer's SetDisableRetargeting property to be ignored for packaged projects. SetDisableRetargeting now works in both editor and packaged projects.

  • Fixed a crash that could occur when generating thumbnails for cooked additive animations.

  • Fixed a bug that could cause a AnimNodeReference check assertion to not function properly.

  • Fixed a bug that could cause Animation Sequences to not trigger Notifies if the sequence preview is dragged all the way to the left of the sequence.

  • Fixed a bug that could cause out of range errors when using the Random Player AnimNode, due to precision rounding errors.

  • Fixed an issue that could cause a crash when using the AnimInstance display debug, when a montage ends while blending physical animation.

  • Fixed a bug that could cause Animation Attribute data to not update when reimporting data from the source FBX file.

  • Fixed a bug that could prevent the creation of a child animation blueprint via the content browser.

  • Fixed a bug that could occur when the leader-pose component was used in construction scripts, which could cause distorted meshes.

  • Fixed a bug that could cause attached actors such as weapons to not display properly while scrubbing in Rewind Debugger

  • Fixed a bug that could cause debug data to disappear in the Rewind Debugger when Animation Blueprints are updated and compiled during a single PIE session. Now, debug data will still display correctly, but data will be listed as a new AnimInstance track, with new sub-tracks for Blend Weights, each time you recompile.

  • Fixed a bug that could cause a sync group's start position to be ignored.

  • Fixed a bug that could cause copy and paste functionality in Blend Space axis Min and Max properties to not operate correctly.

  • Fixed a bug that could occur in the Rewind Debugger that caused the debug components and tracks for the selected Actor to be filtered out based on incorrect lifetime information.


  • Disabled 'resync to sync group' functionality for sequence and blend space evaluators, as they generally should be driven with explicit time.

  • Dragging functions into the Animation Blueprint from My Blueprint is now disabled, as the functions are not usable in the Animation Graph.



  • Added sub-components support when constraining an actor with Skeletal Meshes to be consistent with the attach track workflow.

  • Added an option to the ObjectID pass to decide whether or not to include transparent objects. If included, they will write to the ObjectID pass as opaque pixels.

  • Camera Cut Track section now has more information when a camera cut is not found.

    • Instead of just showing no label it will instead specify if there is no binding specified, or if there is a binding specified it will say that the binding/object cannot be found.

  • Added a simple auto-completion widget to the Config Editor UI that will helpfully suggest possible format tokens when you type a "{" in the File Name Format field. This doesn't change which tokens are supported and this does not work in the Output Directory path (as it already has a customization). This also enables support for double-click selection in the footer text and allowing copy/paste from the footer as another way to get the format tokens.

  • Media tracks can cross fade in Sequencer.

  • Added axis filters for translation, rotation, scale, and parent constraints to specify what axis it operates along.

  • Added native accessors for common float/color light properties to improve performance when setting them after sequencer evaluation.

  • Holdout and visibility flags can be controlled by sequencer/blueprints.

  • You can now toggle an autocomplete property for console variable entries in the Console Variables setting.

  • Added new Console Variables Editor presets to the "Console Variables" setting. You can use any number of presets with your project.

  • Added a new filter button to the Sequencer Content Browsers.

  • CameraRig_Rail private methods and properties have been made protected so that the child class has access.

  • Take Recorder now records using auto keys.

  • NLA now exposes the Start Offset for Translation and Rotation, and also exposes the Skeleton to Blueprints and Python.

  • You can now use new Sequencer commands for key context menu items, such as Set Key Time, Rekey, Snap To Frame, and Delete.

  • You can now assign a color tint to Sections in Sequencer, which will be blended with the track color.

  • Added a menu to set a Section's color tint from a list of user-defined color tints to the Project Settings.

  • Skeletal Track Editor's skeleton color for the animation clips are now based on the section color if defined. Otherwise, it defaults to the original hardcoded colors.

  • You can now view a Seqence's Frame Count and Duration using a new display.

  • The MRQ UI now allows CVars to be toggled. By hovering over a CVar property a tooltip will be visible that describes the CVar's functionality, as well as a value resolution tooltip to indicate where the CVar value originated such as the startup value, the preset value, and the value set in MRQ.

  • When using CVars with MRQ, the Console Variables settings will now display a UI warning if the sequence having its settings modified has at least one CVar track in the Sequence. Sub-sequences will also be searched for CVar tracks. For the warning to display, the CVar track must not be muted, and contain an active section that contains set CVars.

  • You can now register additional film overlays for Level Sequence assets.

  • You can now Group Sequencer properties using the property in (+) Track menu by their defined Category, if it exists.

  • The Window > Cinematics > Sequencer menu item is now always clickable. If there is an existing Sequencer window, the Editor will focus your view to it when the menu item is clicked.

  • The Console Variables setting now displays a read-only view of the CVars within each CVar preset that has been selected.

  • Sections will now be cleared when a control is deselected, otherwise they may not be deselected in the non Sections To Key.

  • You can now use the new CVar, ControlRig.Sequencer.SelectedSectionSetsSectionToKey in order to set the section to key based upon the current selected key area.

    • The CVar is set to false by default.

  • Added the new SetSpawnableBindingID() which allows you to possess a spawnable binding from python/blueprints.

  • Added the new GetSortingOrder() and SetSortingOrder() to get and set sorting order for bindings through python/blueprints.

  • Pasted object bindings now operate more dynamically based on user input.

    • If there is no existing binding in the sequence being pasted into, the pasted binding will be bound to the original object. If there is an existing binding in the sequence being pasted into, a menu will prompt the user to select one of the following options:

    • Duplicate: Which will duplicate the bound object, resulting in a duplicated copy of the object with its associated bindings and tracks.

    • To Not Duplicate: Which will unbind the object, indicated with a red color in the UI. You can then rebind the object to a new parent object.

  • Added a new option to Reset Playhead When Navigating which resets the playhead to the start of the playback range when navigating in and out of subsequences.

  • Added a new AudioAssetName property to the Take Recorder's settings, that you can use to format the name of the audio asset file that is recorded. The default naming convention will use the following format: Audio_{slate}_{take}.

  • Added generic support for hierarchical easing on sub-sequences, and dynamic weighting on level sequence players

    • This new feature allows seamless blending between sub-sequences using the familiar overlapping ease ranges. Blendable tracks contained within each will naturally blend together in the transition range.

    • A new API exists for specifying the global weight of a sequence, allowing completely different Sequences to be blended together using gameplay code.

  • Added Curve caching to the Curve Editor so curves are only recreated when something changes for massive speed ups.

  • You can now set the Additive From Base blend type to byte, integer, and perlin noise channels.

  • Added a new Quaternion (Slerp) blending algorithm for blending transform tracks using a 'shortest path' rotation.

    • Tracks that support multiple blending methods will now have a Blending Algorithm sub-menu within their context menu, which is used for choosing which blending method to use between assets.

  • Added the ability to assign console variable collections to console variable tracks.

  • Added the ability to set FK Control Rigs as Additive in both Python and Blueprints.

  • Add a new tooltip for track outliner items that shows property binding information.

  • Added new APIs to allow top-level channels to do extra drawing.

  • Improved the Seqeuncer's skeletal mesh animation track to run with the new ECS-based evaluation.

  • Added function to the Constraint Python and Blueprint APIs for adding, keying, and compensation.


  • MRQ has been updated with an overall streamlining of queue save and load workflows, similar to what was done for configuration presets.

  • You can now assign multiple characters for the generated Shot or Take naming property. For example, you can now define a take separator as _v so that the shot name can be generated as, MyShot_v001.

  • Numeric sliders in Sequencer now correspond with property metadata so that the behavior in the key editors is identical to the Details Panel.

  • Improved the context menu operations, Pre and Post infinity Extrapolation, Interpolation and Reduce Keys. These properties now affect only the selected channels, when channels are selected, rather than all channels of the section.

  • MRQ preset workflows configuration has been streamlined. The editing dialog now indicates the name of the preset being updated, and provides "Save" in addition to "Save As" options.

  • Renamed CinePrestreaming to CinematicPrestreaming to match the Cinematic Prestreaming plugin's convention.

  • The mutual component inclusivity API has been improved to provide a robust framework for defining mutually inclusive component types.

  • Fade tracks are now converted to ECS evaluation.

  • Template sequence menus are now only displayed on Actor bindings, and not on component bindings.

  • Marked frames in sequencer have been improved with a revamped look, improved UX, the ability to add a marked frame to the selection, and can be commented on using the Comment field.

  • ECS evaluations have been improved by performing a series of basic checks before dispatching tasks to determine if there are any irrelevant operations.

  • Fixed a bug that could cause issues when working with rigs that have the root animation at some bone beyond a direct child. The operation now searches the rig for the first bone with animation on it which enables the use of non-zero roots.

  • Now, when manipulating a root bone offset in the edit mode, edits must be made in the space of the start of the section, since that's the space that the edit is being performed.

  • The color of perlin noise curves has been changed, since the background color of sequencer sections has changed.

  • The ECS evaluation of perlin noise channels now uses the new EvalSeconds component.

  • A key's default Interpolation type will now be based upon the previous key set, rather than the default setting. The default setting is only used when setting the first key.

  • Tangents will now be modified to follow the curve when user or broken keys are set in Sequencer.

  • The Time Undo operation is now controlled by Sequencer using the TimeUndo Console Variable.

  • Channel evaluations have been optimized using a cached interpolation component.

    • During stress tests this improvement saves roughly 60% of evaluation time by removing indirection and increasing cache utilization.

    • This can be disabled or enabled with the Sequencer.EnableCachedChannelEvaluation console variable, which by default is enabled.

  • Added several new functions and improvement to Constraint Scripting:

    • Added a new function to remove Constraint in the Constraint Manager.

    • Exposed the CreateTransformableHandle to Control Rig.

    • Added the new TimeUnit to MoveConstraintKey, Compensate, and SetConstraintActiveKey so you can use display time.

    • Added the new GetConstraintKeys that will return an array of times and bools.

  • Set disabled styles for transport control buttons.

Crash Fix:

  • Fixed an issue that could cause a crash when removing keys on mouse up in the Curve Editor. Now insurance is made that the key handles are unique to prevent this issue. Additionally, a check is made to ensure the last dragged keys are up to date on mouse up.

  • Fixed an issue that could cause a crash when the Deferred Rendering setting has the Add Default Layer property enabled, but no stencil layers are supplied. This condition now generates an error.

  • Fixed an issue that could cause a crash when exporting an FBX and its RootSequence is null.

  • Fixed an issue that could cause a crash when null animations are used in an animation section.

  • Fix an issue that could cause a crash when undoing the creation of a subsequence.

  • Fixed an issue that could cause a crash when using Match with Previous/Next with animation sections trim.

Bug Fix:

  • Fixed a bug that could cause undulating jitter in the cloth simulation when Temporal Samples are enabled. This was caused by the cloth simulation time step smoothing being enabled during renders.

  • Fixed a bug that could cause the UWorldSettings::MinUndilatedFrameTime/UWorldSettings::MaxUndilatedFrameTime to be modified and not restored after a render.

  • Fixed a bug that could cause the example Runtime Executor to always make a call to https://google.com when the editor launched. This issue was fixed by commenting out the code, but leaving it as an example for anyone building their own Executor class.

  • Fixed a bug that could cause the cache in media tracks to only be drawn for the first loop.

  • Added a workaround for the UI Renderer setting that could cause some Layout Widgets not liking the 720p PIE preview window (vs say a 4k render).

    • To activate this workaround, navigate in the Project Settings, to Movie Pipeline In Editor, and enable bResizePIEWindowToOutputResolution.

    • Your PIE window is still limited by your monitor resolution so you will need to launch the editor with -ForceRes if you wish to render your project at a resolution higher than your monitor resolution.

  • Fixed a bug that could cause sequence tick managers, with budgeted frame evaluation, to reuse linkers with stale evaluation data, if the linker group was torn down in the middle of a multi-frame evaluation.

  • Fixed a bug that could cause the details panel "Add Key" buttons to only display for read only sequencers.

  • Fixed a bug that could cause the -MoviePipelineConfig argument to not be used with assets that existed outside of the "/Game/" directory, such as project plugins.

  • Fix a bug that could cause added event functions to not reference parameters since the payload cannot be by reference.

  • Fixed a bug that prevented a hidden Sequencer tab to be brought to the front when the Windows > Cinematic > Sequencer menu option was used.

  • Fixed a bug that prevented stepping through frames from working correctly. Now auto-scrolling will only function if the setting is enabled.

  • Fixed a bug that could cause a Level Sequence blueprint from having invalid characters in its name.

  • Removed an auto-scrubbing behavior which animates the current time to the desired current time. This can be re-enabled through the CVar: Sequencer.AutoScrub.

  • Fixed a bug that could cause an issue when calling AddChildFolder() from python/blueprints which would result in a folder being in two folders.

  • Fixed a bug that could cause shot parsing so that if the current prefix is found at the beginning of the shot name, it will be stripped and the parsing of the shot number and take number will continue from there. This fixes a situation where shot prefixes can collide with parsing shot and take numbers because they are looking for the same separators. For example if the shot name is: sq050_shot0010_01, that should be parsed as shot 10 and take number 1. If the user specifies that the shot prefix is sq050, that portion can be stripped so it doesn't erroneously parse as shot 50.

  • Fixed a tooltip for channel colors so that it refers to key bars instead of track area.

  • Fixed an issue that could cause a crash by checking read-onlyness of level sequence assets before saving in the Take Recorder.

  • Fixed a bug that could cause copy/paste binding's descendant bindings to be pasted multiple times.

  • Fixed a bug that could cause Batch Edit Sections to not work for selected sections and not just the clicked on section.

  • Fixed a bug that could cause Control Rig additive sections for Rotation Controls to not function correctly.

  • Fixed a bug that could cause recorded multi-channel audio to not be separated out to different track rows.

  • Fixed a bug that could cause an FBX export to not be evaluated the start time in display rate, instead it was evaluated in tick resolution.

  • Fixed a bug that could cause the Animation Mode to discard the Advanced Tab if all of its properties were located in other sections.

  • Fixed a bug, to prevent infinite sections from being pasted on top of each other.

  • Fixed a bug that could prevent camera names from being sorted in the Camera Cut Section menu.

  • Fixed a bug to prevent infinite sections from being selectable and movable when hovering over keys.

  • Fixed a bug that could cause quat interpolation for consecutive keyframes in sequencer to not operate correctly at low tick resolutions.

  • Fixed a bug that could cause folders to be renamed when reordering them.

  • Fixed a bug that could start playback twice when using the spacebar and then down arrow. This issue could result in the latter view state being cached incorrectly, already hidden. From there on, the state is reversed, when the sequence is stopped, the viewport UI is hidden, when the sequence is playing, the viewport UI is shown.

  • Fixed a bug that could cause a crash when a null pointer check is activated on a missing or deleted Level Sequence asset. This can happen if you create a new take shot and undo it, or if the asset just goes missing, or is removed.

  • Fixed a bug that could occur when recording with the Timecode clock source, when the user has toggled off Start at Current Timecode, by automatically overriding it. Otherwise, the sequence would end up starting at 0, but the recording is actually at the current timecode.

  • Fixed a bug that could cause the cinematic viewport's transport range to go missing when switching sequences.

  • Fixed a bug that could cause rotation keys to spin irregularly when adding a key through the key editor buttons.

  • Fixed a bug that could prevent the use of a console variable's current priority level when setting a console variable from the Console Variables settings. This will ensure the value always gets set.

  • Fixed a bug that could prevent clamp scrubbing in the Cinematic Viewport from adhering to the playback range, when clamping is enabled.

  • Fixed a bug that could cause keys in collapsed tracks to be erroneously selected.

  • Fixed a bug that could cause a render to fail due to stencil layer names being incorrectly duplicated. Stencil Names are now de-duplicated, for both actor and data layers, before a render begins.

  • Fixed an issue that could occur with the MRQ, that caused an empty v000 directory to be created when clicking on the output directory in the queue.

  • Fixed an issue that could cause a crash when using the Sequencer Event Customization when the blueprint graph is deleted.

  • Fixed a bug that prevented adding a "Deferred Rendering" setting if one of the related settings, such as Deferred Rendering property being set to Lighting Only, is already added.

  • Fixed a bug that could cause asserts to fire during motion vector evaluation.

  • Fix a bug that could cause some UI elements to not correctly display for read-only sequences.

  • Fixed a bug that could cause the Pivot tool's click and shift options from working properly.

  • Fixed a bug that could cause copy and paste functions to not function properly with Procedural Control Rigs, by ensuring the initialize callback setup is not created until initialization happens with a bound skel mesh.

  • Fixed a bug that could occur when adding a constraint channel by ensuring curve and resync selections are recreated.

  • Fixed a bug that could cause scaling options to not operate properly when compensating parent constraints are present on components.

  • Fixed a bug that could occur when keying weighted control rig additive sections.

  • Fixed a bug that could cause a RPC stop event to wait from the server when a replicated sequence is played only on the client.

  • Fixed a bug that could cause overlays to be removed when not checked by all the viewports.

  • Fixed a bug that could display an incorrect index used for matching value composites.

  • Fixed a bug that could cause the First Frame Loop offset to cause animation to go out of range, which could cause errors in Montage playback.

  • Fixed a bug that could cause errors with array property handling in editor by adding property tracks for array elements and autokey.

  • Fixed a bug that could cause the initial value system to not work properly in interrogation linkers.

  • Fixed a bug that could cause a delayed drag on the initial position of the marquee drag to be incorrect by storing the value and ending the operation before the end drag happens. This also fixes an issue that could cause an error with test tangent lines when marquee dragging.

  • Fixed a bug that could cause material parameters to not retain blend channels.

  • Fixed a bug that could cause reversed dissected evaluation ranges when playing sequences backwards.

  • Fixed a bug that could cause value decomposition, which can occur when keying or auto-keying values, to add lots of comments, and add unit tests.

  • Fixed a bug that could occur when baking animations by turning off all constraint keys, removing all -1 keys, and all undoable keys.

  • Fixed a bug by changing the Sequencer's ability to change the Skeletal Mesh asset from a Skeletal Mesh Component in cooked builds.

  • Fixed a bug with the Curve Editor's Shift Drag mechanics so it locks immediately and reliably by using the last position instead of current position when it starts.

  • Fixed a bug that could cause a loophole where non-renameable tracks could be renamed by simply clicking on their label in the sequencer outliner view.

  • Fixed a bug that could cause a channel to be deleted while adding it by not removing a constraint when compensating.

  • Fixed a bug that could cause runtime issues when overriding a single float track channel with a perlin noise channel.

  • Fixed a bug that could cause an incorrect mirrored perlin noise curve preview.

  • Disabled the Add Section, Blending Algorithm, Edit/Batch Edit Sections right click menus if the sequence is read only.

  • Fixed an issue that could cause a crash when opening a new map and there is a Blueprint with an active actor sequence by clearing all references to a sequencer widget when closing.

  • Editing of channel overrides is now properly undoable, and works on multiple channel groups.

  • Fixed a bug that could cause occasional firing of asserts that indicate that an ECS evaluation system will miss a frame

  • Moving a Control without a key will now correctly set the value in Control Rig.

  • Fixed a bug that could cause blending values to be lost when pasting copied tracks and sectors with blending data.

  • Fixed a bug that could cause a sequence to be erroneously marked as dirty by marking the spawn register as being cleaned up.

  • Fixed a bug that could prevent linked Anim Sequence with nested sequences from saving.

  • Fixed a bug that could cause errors by clearing the RF_Transient flag on channel overrides and constraints after a copy and paste operation.

  • Fixed a bug that could cause an infinite loop while trying to add a possessable to a template sequence.

  • Fixed a bug that could occur when recreating shapes by ensuring the shapes need to be recreated, in order to avoid performance issues with dynamically created controls.

  • Fixed a bug that could cause Control Rig shapes to be selectable by tweaking IsSelectable on ControlRigShape components so that it specifies IsSeletactable in the Viewport and the outlines. Controls are also hidden if the hosting component's actor is not visible.

  • Fixed a bug by ignoring any attempt to restore a pre-animated state on objects that have gone away.

  • Fixed a bug with the hierarchical bias of sequences that could cause different active playing sequences to be considered together.

  • Fixed a bug that could cause the duplication of constraints by recreating proper constraint duplicates with the new duplicated objects and adding preanimated state for component constraints.

  • Fixed a bug that could cause errors when using the Match with Previous operation. This includes a root motion performance fix, because transformers are no longer cached and blended on demand instead, this greatly increases performance.


  • Access and the ability to update UMoviePipelineConsoleVariableSetting::ConsoleVariables directly has been deprecated. You can now use the getter/setter methods instead, such as GetConsoleVariables(), or AddOrUpdateConsoleVariable().


  • CameraRig_Rail's Mounted Mesh Orientation has been removed as it is unnecessary.



  • Add a new option to include normals in the ML Defomer's generated morph targets.

  • Added support for masking the ML Deformer using color channels.

  • Added support for joint and curve groups in the ML Deformer's local model.

  • The ML Defomer's Play button in training mode now plays things, but doesn't calculate deltas, in order to make workflows more efficient and less time consuming.

  • The ML Deformer now extracts information about the importance level of each morph target, only in Neural Morph Model.

  • You can now set deformer quality levels when using the ML Deformer, which allows models to opt into. Morph models will disable morph targets based on this quality level.

  • The ML Deformer now dynamically updates and recompress morph targets without having to retrain.

  • The ML Deformer now stores raw deltas in the UAsset, and removes them on cook. This allows recompression even without training first. Also allows visualizing morph targets at any time.

  • Added documentation to the ML Deformer's python code.

  • The ML Deformer now skips saving some properties, like the deformer weight and ground truth lerp, to prevent saving a state where you wouldn't see the deformer being active anymore in your next session.

  • Added new ML Deformer statistics to show performance and memory usage.


  • Moved the Include Normals property in the morph target category out of the compression group.

  • Moved some of the GetModuleChecked functionality to run in LoadModuleChecked.

  • API refactors now require less code to create new models by introducing some new base classes you can inherit from.

  • ML Deformer's tooltips have been updated.

  • The ML Defomer's API has received more documentation.

  • Added a SetWeight and GetWeight blueprint functions to control the weight of the deformer through blueprint.

  • The ML Deformer's python script now shows more digits while logging the learning rate for increased accuracy.

  • The ML Deformer's python code has been refactored, placing shared code into the ML Deformer framework, which plugins can then import and use.

  • Renamed and grouped some ML Deformer properties to make things more intuitive.

  • The ML Deformer plugin is now in Beta.

  • The ML Deformer's API has been improved, making properties protected.

  • The ML Deformer now sets the correct section indices inside the morph targets, rather than just including all sections.

  • The ML Deformer now sorts the morph target deltas by vertex number. Perhaps this could help with some GPU caching.

  • The ML Deformer now detects changes in vertex count, and shows a warning in the morph target section, when dynamic morph updates aren't possible until after retraining.

  • Added progress bars to the ML Deformer when creating and compressing morph targets.

Crash Fix:

  • Fix an issue that could cause a crash related to opening an MLD asset, closing the asset editor, and modifying or reimporting the mesh.

  • Fixed an issue that could cause the ML Deformer asset to be in a bad state, resulting in crashes and weird behavior. This could likely happen when aborting during training, or changing assets after training, and saving.

  • Fixed a bug that could cause a crash by preventing dynamic morph updates when it is not possible.

  • Fixed an issue that could cause a crash when creating a new actor blueprint, with a skeletal mesh and ml deformer component, using the neural morph model set as ML Deformer asset, with the vertex delta model selected as the skeletal mesh component's mesh deformer.

Bug Fix:

  • Fixed a bug that could cause duplicated log messages.

  • Fixed a bug that could cause the UI to close unexpectedly when deleting or editing curves or bones in the include list.

  • Fixed some bugs that could prevent the sampling cache from being invalidated when changing certain properties.

  • Fixed an issue that could cause a crash when the local bone transforms on the skeletal mesh component were empty when using the ML Deformer.

  • Fixed a bug by changing the deformer graph for the morph model to the updated deformer graph path.

  • Fixed a bug that could cause caching issues with the deformer graph.

  • Fixed a bug in the reset to default button of the deformer graph.

  • Fixed an issue that could cause a crash when saving an ML Deformer asset where the source geometry cache asset it uses doesn't exist anymore.




  • Implemented Soft Garbage Collection for the cooker. The command - trigger is a partial garbage collect when available physical memory reaches various thresholds. This significantly reduces the peak memory load of the cook commandlet for large projects, while adding only a small cost due to reloaded packages.



  • Restored the ability to use XGE executor on non-Windows platforms.

  • Added support for early init scripts.

  • An option to allow using clang linker when using clang compiler has been added.

  • Added a GetPlugin method for ModuleRules.

  • Added better Plugin Project Support in generated projects.

  • Added Support msvc analyzer extensions to Unreal Build Tool Enable by setting ModuleRules.bStaticAnalyzerExtensions to true. It is recommended to use ModuleRules.StaticAnalyzerRulesets to filter the warnings that are reported as this will enable a large number of additional warnings. Please see the following links for more details: https://learn.microsoft.com/en-us/cpp/code-quality/using-the-cpp-core-guidelines-checkers https://learn.microsoft.com/en-us/cpp/code-quality/using-rule-sets-to-specify-the-cpp-rules-to-run

  • Unreal Build Tool now features a Cross Platform QMake Generator.

Bug Fix:

  • Fixed the action graph copy action on non-Windows platforms.

  • Added the -Project param to command line build params in generated projects.

  • Added additional debug output for makefile argument changes.

  • Fixes for generating the Rider project model.

  • Fixed an issue for writing make files with UTF8-BOM encoding.

  • Added support for coroutines, these are enabled by the bool variable bEnableCppCoroutinesForEvaluation in the Rider.

  • Moved tool projects into the proper subfolders for generated projects.

  • Made VSCode .ignore entries absolute.

  • Added fixes for metadata of UnrealBuildTool gexf export.

  • Added fixes for when Regex failed to parse AndroidClangBuild.



  • Exposed the source path of DNA Assets to AssetUserData in the Skeletal Mesh Details Panel.

  • Browsing to Assets where the current settings would cause the Asset to be hidden now updates the settings of the active Content Browser to show the Assets. A toast notification displays which settings were updated.

  • OpenEXR: Added support for arm64 architecture on Linux.

  • FileName description field added to DNA Import Window.

  • Added arm64 architecture support for lmath, OpenEXR, OpenVDB and Boost on Linux.

  • Implemented context menu DNA Actions for Skeletal Meshes.

  • When enabling Defer Compression, the Texture Viewer now displays the uncompressed texture right away.

  • Defer Compression is not enabled by default on texture reimport.

  • Added a new TypedElements.EnableViewportSMInstanceSelection CVar, which can be used to enable or disable Instance Selection for Instanced Static Mesh Components in the Level Editor Viewport.

  • The File > Recent Levels submenu now contains a Clear Recent Levels command.

  • The Scalability Menu in the editor now works per Preview Shader Platform.

  • There is now an additional compatibility check between groom cache and groom asset done at import.

  • You can now choose how floating point textures are compressed by default. The legacy default behavior is to always use HDR F16. Two new good options to use are BC6H (for games) or F32 formats when the source is 32-bit (for VFX).

  • When one or more "undone" transactions are removed from the undo stack because a new transaction started, the editor now restores the removed transactions when the newly inserted transaction is removed because it's considered "transient" (it contains no record), similar to what happens in the event of a canceled transaction.

  • The tab manager now saves its layout as soon as you dock or undock a tab.

  • You can now exclude new CVars you define in code from being previewable so they don't change depending on the shader platform you preview in-Editor and remain set to the value set by the Editor shader platform.

  • Texture mip generation filter now clamps (instead of wrapping) at texture edges if the UV address modes are both set to clamp (for new textures with bUseNewMipFilter only). Has no effect on existing textures or simple average 2x2 mip filter.

  • Updated glTF transmission and MX transmission shading for Interchange.

  • Added a new Editor Preferences setting to set the maximum number of auto saves.

  • BMP image import now supports 16 and 32 bit bitmaps and most advanced formats.

  • Detected and deprecated the construction of a subsystem from Python with a message telling the user how to get the already existing subsystem singleton.

  • Textures now provide Blueprint functions to help detect nearly-empty textures: ComputeTextureSourceChannelMinMax and Blueprint_GetTextureSourceDiskAndMemorySize.

  • Disable Preview button is now named after the Editor Shader Platform.

  • Fixed reverting non-packages files from the changelist window that would never revert because they were not packages.

  • Made several optimizations to improve editor start up time.

  • Newly imported Textures now get configurable default properties from the Texture Import Settings in Project Settings.

  • Reimported textures now get their OodleTextureSdkVersion bumped up to latest.

  • Preview Shader Platform using different ShaderMaps and the DDPI/Cvar values of the Previewable Actual Platform NumPlatforms limit changed from 64 to 65536, limited by NumBits

  • The undo buffer will now output its size to the log file so that it is easier to confirm that it has been set to the correct size.

  • Removed check for UField for determining if a UObject is a valid asset for Editor scripting utilities.

  • Updated the Plastic SCM plugin to version 1.8.0 (from 1.6.2).

  • Added optional parameter bApplyComponentTransform to some MeshMergeHelpers::RetrieveMesh variants.

  • The Level Editor now has a new Show Subcomponents option that implements the ability to draw only the root components of the selection set. This option can help reduce visual noise when an Actor has multiple components with complex visualizers.

  • Added an option to the Size Map tool to include or exclude Editor-only dependencies.


  • Optimized in-Editor Geometry Collection component registration. This improves performance of operations like duplication of geometry collection-based objects or in-Blueprint property changes

  • Improved PNG import with simple transparency. The editor now uses better filters to propagate RGB color into transparent regions. Color propagation is only done on PNGs with simple binary transparency, not true alpha channels.

  • Virtual textures, when building, will now reuse the results from another platform as they never tile and can freely share results. This dramatically saves texture build time for multi platform projects.

  • EXR texture import now sanitizes floats to remove inf & nan.

  • Added support for importing Alembic with guides-only groom cache.

  • Optimized the source control changelist widget to handle a reasonably large number of files smoothly (5000-20000).

  • Added shared Linear Encoding. This is disabled by default and can be enabled with the r.SharedLinearTextureEncoding CVar. It allows texture builds for platforms that tile textures to reuse the base encoding if it's already been done by another platform, greatly speeding up texture builds for multi platform projects.

  • Optimized the process of checking if Asset thumbnails need to be dirtied when an object property changes to speed up entering PIE in some projects.

  • OFPA levels are no longer dirtied when copying and pasting Actors that aren't static brushes.

  • Revision Control History now displays file size with the best unit.

Crash Fix:

  • Fixed a crash associated with creating texture arrays in the Editor.

  • Fixed a race condition causing a crash in XBoxCommonDeviceDiscovery on Editor shutdown.

  • Fixed a potential crash when importing Alembic files as skeletal mesh that are too big to be imported.

  • Fixed a crash that happened when deleting more than one folder at a time from the scene outliner.

  • Fixed a potential crash when importing Alembic with completely invisible meshes as geometry cache.

  • Fixed a crash when exiting Paint Mode after deleting a Material that was being painted.

  • Fixed a crash in the ContentBrowser when the -nothreading option was enabled.

  • The import of Assets via the Asset Tools API now validates that the destination path is mounted and avoids crashing if this is not the case.

Bug Fix:

  • Fixed the Perforce source control API returning invalid file paths when the user's client spec root ends with a /or .

  • Fixed Niagara Assets destroying thumbnail data when loaded from a cooked package.

  • You can now import a DNA file with the same name as a Skeletal Mesh.

  • Fixed a bug in the Static Mesh Editor that caused toggling the Show > Vert Colors option to re-enable the environment map background even if Show Background was disabled in the Preview Scene Settings

  • Software cursor now takes into account screen DPI settings and shows the correct size on screen.

  • The 'Preview Rendering Level editor setting now correctly applies the values defined in platform device profiles to the p.RigidBodyNode and p.ClothPhysics CVars.

  • Fix a casting bug that was causing larger values of the config file setting [Undo]UndoBufferSize to be truncated.

  • Fixed an issue where the color curve editor wouldn't update when gradient stops were moved.

  • Fixed a Mesh Merge Utility bug where collisions of ISM components were not merged correctly. The editor now merges the collisions of all the instances in the ISM component, instead of a single collision instance using just the component transform.

  • Texture Viewer mouse wheel zoom is now a multiplicative factor instead of an additive factor. This fixes zoom getting very slow as it gets larger.

  • A Toggle Editable event type is now sent instead of Value Set when the edit condition state of a property changes (when. the inline checkbox is toggled), so that the editor can listen to properties becoming (un)editable

  • Thumbnails can no longer be saved as JPEG files with an incorrect .png extension.

  • Fixed Content Browser class permission list filtering always being recursive

  • Fixed an issue where the preview in the Paper2D Sprite Editor wouldn't update when adjusting the UV Coordinates.

  • Fixed cooked textures returning a size of 0,0 when queried by an editor.

  • Fixed large nonpow2 textures failing to build..

  • The editor now waits until the number of clients set for Play In Editor is committed by the user before saving the config file to improve performance of the Project Settings menu.

  • Fixed property display for ReadOnlyKeys.

  • Fixed the UnsavedAssetsTracker being invoked on a background thread and firing delegates to code that assumes everything happens on the game thread.

  • Copy operations no longer modify world transforms.

  • Fixed a bug where turning off StreamableRenderAsset FResourceSizeNeedsUpdating was causing multi-second hitches in the editor when the camera moved.

  • Fixed possible out-of-memory issue with the FSourceControlFileStatusMonitor reserving -1 items in an array.

  • Removed an ensure that could fail while reading from a valid texture that had no source art.

  • Fixed 6-image array DDS files being imported as cube maps.

  • Fixed Advanced Copy not fixing up external actors reference to packages that were part of the copy.

  • Fixed an issue where diffing files could fail when using Git LFS.

  • Fixed GetDefaultTextureFormatName logic so that a CompressionSettings TC choice of an uncompressed format is preserved and constraints that force use of uncompressed don't cause unnecessary format changes.

  • Undo history now properly cleans up the transaction details view when clearing the undo stack.

  • Fixed a bug that caused changing the filter on a texture not updating materials in the editor.

  • Fixed dragging a texture on a cube when a material already exists, and added some protection against redirects in similar cases.

  • A PreviewPlatformName with NAME_None in MaterialShaderQualitySettings is now correctly considered valid.

  • Fixed packages not being marked as dirty when undoing post-save.

  • The undo buffer is no longer cleared when saving newly added or deleted One File Per Actor (OFPA) actors.

  • Auto-save now includes newly created packages.

  • Geometry collections are now properly rendered in their Blueprint owner thumbnail.

  • Fixed Geometry Collection Asset thumbnails not being properly centered.

  • Fixed an issue that prevented undoing changes after exiting PIE.

  • Fixed an issue in the history window where strings that began with whitespace could show as empty in the description column.

  • Standardized changelist description single line to a helper function to ensure the changelist window and history window have consistency.

  • The number of embedded geometry elements in the Fracture Editor now displays properly when no geometry collection is selected.

  • Fixed an issue with Mode Manager where ActorsDuplicatedNotify was not called in some cases.

  • Fixed cases where bCooked could get mistakenly unset when serializing a Class during reference collection in cooked versions of the Editor.

  • Fixed an error that caused unexpected behavior in the color picker.

  • Fixed the import of UDIMs being broken when using JPEG files and Interchange.

  • Fixed the text alignment in the Automation window so that it doesn't overlap under certain conditions.

  • Fixed a bug where unsaved Assets could fail to open in their associated Editors in certain situations.

  • Fixed Actor meshes vanishing from Editor viewports after building lighting, geometry, or navigation.

  • Fixed an issue where components had inconsistent behavior between their gizmos and the Details panel when the component had absolute location turned on.

  • Fixed a hang that could occur in the Editor when waking the PC from sleep after about an hour.

  • Restored the Make Writable button in PromptToCheckoutPackages when the source control provider didn't use readonly flags.

  • Fixed crash when reloading .umap assets that have a level blueprint using macro graphs or event dispatchers.

  • Fixed an issue where pitch would never lock in the level editor when rotating the perspective camera.

  • Disabled the menu option for viewing the changelists window if changelists are not supported by the current revision control provider.

  • LOD previews now get the correct per-platform screen size.

  • Fixed CanvasText offset causing text to be blurry.


  • Deleted Crunch source code. Crunch is no longer used by Unreal Engine.



  • Boost: upgraded the engine version of the third-party Boost libraries to version 1.80.0.

  • MaterialX: upgraded the engine version of the third-party MaterialX libraries to version 1.38.5.

  • USD: upgraded the engine version of the third-party USD libraries to version v22.08.

  • Solidworks: Optimized export speed.

  • Solidworks: Components suppressed in every configuration are not exported anymore.

  • Solidworks: suppression state of components is not changed during export.

  • [glTF] If dual clear coat normals are disabled in render settings, they are ignored and Unreal Engine issues a warning when clear coat materials are exported to glTF.

  • [glTF] Replaced UGLTFExportOptions::ExportLights (int32) with UGLTFExportOptions::bExportLights (bool)

  • Made the following improvements to the USD Stage Actor C++ interface: C++ code can now set the USD Stage directly, it is now possible to get and set the currently isolated layer, and derived C++ classes can now access and override more functionality.

  • Improved the mechanisms for automatically attaching USD Stage Actors to the USD Stage Editor. For example, the corresponding play-in-editor (PIE) version of the USD Stage Actor is now automatically attached when going into PIE, and the USD Stage Editor now automatically attaches to the correct USD Stage Actor whenever a child actor is selected on the World Outliner and the Selection Sync USD Stage Editor option is enabled.

  • [glTF] The glTF exporter now uses Unreal engine's material analysis.

  • [glTF] Improved reuse of texture samplers in exported glTF files.

  • [glTF] Improved material baking of the following expressions when exporting to glTF: TransformPosition / TransformVector, ObjectScale, and LocalPosition.

  • [Solidworks] Assembly exports variants for Parts with different visual appearance in different configurations.

  • Added the console variable "USD.DiscardUndoBufferOnStageOpenClose". The console variable makes it possible to discard the transaction buffer, and prevent Assets and Actors generated from USD from being recorded into it when opening a USD Stage. This can help when trying to open large scenes with a restricted memory budget.

  • [Solidworks] Display states for configurations are now exported as variants.

  • [glTF] The glTF exporter now uses Unreal engine's material baking.

  • USD Stage Actors now reference an instance of an experimental new Asset type called "USD Asset Cache", which owns all the Assets generated when opening USD Stages. It allows all USD Stage Actors to share the same Assets, and retain those assets (up to configurable limits) even when no USD Stage Actor is currently using them. The USD Asset Cache can be constructed from the Content Browser, like any other Asset.

  • The Details Panel of USD Stage Actors now contains an "Open in USD Stage Editor" button that opens or reveals the USD Stage Actor and automatically attaches to it.

  • When exporting Unreal Engine materials to USD, baked textures with the same color value for all pixels write that color value directly on the exported USD material. There is a new option on the export dialog, called "Constant Color as Single Value", that toggles this behavior. When the option is disabled, the exporter emits the full resolution texture.

  • A new library called "UsdStageEditorLibrary" can now be used from Python or Editor Utility Blueprints in order to interact and interoperate with the currently opened USD Stage Editor.

  • Added support for running export tasks in runtime for formats that allow it. For example, glTF.

  • The USD import options dialog now contains an option to "Import at Specific Time Code". If that is option enabled, you can specify a Time Code at which to sample the stage when importing Assets and Actors. If that option is disabled, the stage is imported at the default (not animated) time code.

  • [3ds Max Exporter] Changes to custom object properties now sync with DirectLink.

  • The USD Importer plugin now parses only materials and textures that are actually used by prims, and the current material purpose, when you open USD Stages. When importing, the advanced option "Import Only Used Materials" toggles this behavior.

  • The "USD.CollapseTopLevelPointInstancers" console variable now controls whether to collapse top-level USD point instancer prims. Previously, this feature was controlled by an import option and USD Stage Actor property.

  • It is now possible to specify custom reference materials to use when spawning material instances while opening or importing an USD Stage. You can configure custom reference materials from the Project Settings, in the "Engine - USD Importer" (search for "USD" to find that section quickly).

  • When editing an USD Stage with multiple sublayers and animations,you no longer have to set the correct layer edit target to unlock the corresponding Level Sequence. Changes to a particular LevelSequence always affect the corresponding layer automatically.

  • It is now possible to set the stage options on the USD Stage Editor window without having any USD Stage Actor attached.

  • It is now possible to collapse Xform hierarchies with a single Mesh prim when opening or importing USD Stages. Previously, at least 2 Mesh prims were required.

  • The USD Stage Actor picker on the top-right of the USD Stage Editor window (Windows > Virtual Production > USD Stage) now displays the USD Stage opened for each Actor, if any.

  • The USD import and export options dialogs now remember the last set sizes.

  • [3ds Max Exporter] Fixed texture sync when multiple texmaps can use the same image file.

  • [3ds Max Exporter] Added more output statistics for baked textures.

  • [3ds Max Exporter] CoronaLegacyMtl opacity is now supported.

  • The USD Importer now generates Two-Sided versions of materials if they are assigned to meshes that are marked as "doubleSided" in USD.

  • The USD Importer plugin now properly assigns material overrides to Components spawned by a USD Stage Actor, and writes those assignments to the USD Stage, even if the Components represent collapsed meshes.

  • Increased the maximum number of skeletal mesh vertex influences that can be parsed from USD Stages from 4 to 8. Unlimited influences can also now be used if that option is enabled in the Unreal project.

  • [glTF] Added a default value of (empty set) to the "SelectedActors" parameter in the "ExportToGLTF" Blueprint function.

Bug Fix:

  • Fixed regression from UE 5.0. Direct Link now reconnects to source for previously imported Asset.

  • [Solidworks] Fixed an issue where a MeshActor loses its mesh on Sync when a Part changes.

  • [3ds Max Exporter] Fixed mesh quality for Body Cutter.

  • Fixed an issue where the collapsing mechanism used to parse USD Stages could consume Light and Camera prims and never generate anything in the Unreal level.

  • Solidworks: Made fixes to MotionStudy animation export.

  • [glTF] Fixed an issue where material baking incorrectly skipped some properties, based on the material's blend mode, when exporting to glTF.

  • [3ds Max Exporter] Fixed DirectLink sync for modifiers that do not send a CHANGE event. For example, Body Cutter.

  • DatasmithDirectLink: Fixed a crash that could occur when receiving a DirectLink message while Unreal Engine is shutting down.

  • Solidworks: Fixed export of animated rotation.

  • [glTF] Fixed a crash that occurred when trying to export Rect Lights to glTF.

  • Fixed an issue where some Level Sequence transform tracks were ignored when exporting Level Sequences to USD.

  • [3ds Max Exporter] Removed the file extension from the scene / DirectLink name.

  • The Unreal Editor now shows an error message when the export of a Level or Asset to USD fails because the target output layer already exists in USD's internal registry of layers.

  • Fixed an issue where some USD Stage import options were not pre-filled in the import options dialog when using the "Actions > Import" command in the USD Stage Editor.

  • [Solidworks] Fixed an issue where the exporter would not install if only the 2023 version of Solidworks was available.

  • [Datasmith Revit Exporter] Fixed Duplicated IDs for Level elements.

  • Fixed an import bug that generated artifacts in texture display.

  • [glTF] Fixed conversion of light intensity from non-candela units when exporting to glTF.

  • [Solidworks] Fixed the export of Part materials in multiple configurations.

  • [Solidworks] Fixed infinite reimport that occurred after deleting a component when auto sync is enabled.

  • [Solidworks] Fixed an issue where material modifications were not detected.

  • [Solidworks] Fixed various plugin stability issues that occurred when disabling / re-enabling the Solidworks plugin, including an issue where the DirectLink source disappeared.

  • Fix an issue where static meshes generated when opening or importing USD Stages did not receive material assignments if the corresponding prims only had material bindings with specific material purposes.

  • [SketchUp] Fixed an issue where textures are not exported when the destination folder doesn't exist.

  • [glTF] Fixed URIs not being percent-encoded and sanitized in glTF exports.

  • [3ds Max Exporter] The Datasmith ribbon toolbar is now available on localized versions of 3ds Max.

  • [glTF] Fixed an issue where incorrect alpha factor was exported to glTF for certain materials.

  • [Solidworks] Removed negative scaling of exported light transformations.

  • [glTF] Fixed detection of all TransformVector and TransformPosition material expressions to determine the necessary baking mode when exporting to glTF.

  • [glTF] Fixed conversion of binormal vector sign in the vertex tangent data exported to glTF.

  • Fixed an issue where editing USD skeletal animations with Control Rigs wouldn't work for rigs that modified their own topology on the "Construct Blueprint" event.

  • Fixed an issue where payloads or references to prims on the USD Stage Editor were not added in some scenarios.


  • [glTF] Removed support for all custom Epic extensions from the glTF exporter (in anticipation of upcoming support for official Khronos extensions).

  • [glTF] Removed UGLTFExportOptions::NoLossyImageFormatFor

  • [glTF] Removed UGLTFExportOptions::bStrictCompliance. It is always enabled now.

  • The actors spawned by an USD Stage Actor no longer have the SequencerActor tag, because the World Outliner can now display transient actors by default.

  • [glTF] Removed UGLTFExportOptions::bIncludeGeneratorVersion. It is always enabled now.

  • [glTF] Removed UGLTFExportOptions::NoLossyImageFormatFor

  • Deprecated the option to "remove Unreal materials" when exporting assets and levels to USD, because it is not for the new method of exporting Unreal material assignments that use dedicated Material prims.



  • The Interactive Tools Framework class UInputRouter now supports updating modifier key states on the active mouse capture when the modifier keys change but the mouse hasn't moved.

  • Synchronized the scrolling between left and right details panels in UE Asset Diffs.

  • UCombinedTransformGizmo now supports both Relative and Absolute (world-space) position and rotation snapping. Previously, it only supported Absolute World-Space grid snapping. Relative is now the default, similar to the standard UE Gizmo.

  • Added an option in FUnrealEdMisc::RestartEditor() that can specify additional commandline arguments when restarting the editor.

  • Extended SGraphActionMenu so that owners can directly provide the action menu source list at refresh time.

  • Added a hook for external sources to override the editor's main window on startup, emulating how the project browser works.

  • Upgraded revision control menu to be more responsive, consistent, and available under the Asset menu in editor windows.

    • Changed behavior of "Checkout" to "Sync and Checkout."

    • Added "Make Writeable" and "Revert Writeable" actions.

    • Only show actions that the current revision control provider can support.

Crash Fix:

  • Fixed a crash that occurred when attempting to duplicate a level blueprint.

Bug Fix:

  • Added __class_getitem__ to PyWrapperArray, PyWrapperFixedArray, PyWrapperSet, and PyWrapperMap. This supports Python type hinting when using unreal.Array, unreal.FixedArray, unreal.Set or unreal.Map to hint a method's input parameters, its return value, or when they are declared globally.

  • Fixed Python GIL deadlocking with reinstancing objects.

  • Fixed python type hinting for unreal.get_editor_subsystem() and unreal.get_engine_subsystem() to hint the correct types.

  • Project Launcher now supports multiple .target.cs Build Target files.

  • Find the best available D3D device for standalone Slate applications. This uses similar options as RHI D3D11.

  • Fixed bad memory access in AssetThumbnail that occurrs when ThumbnailMap is destroyed due to going out of scope.



  • Added a setting to enable distance field lighting for LandscapeGrassTypes.

  • Added a single method in ULandscapeSubsystem to force regenerate the grass at runtime. This can flush all grass on landscape components and update them all (synchronously, optionally), using an optional list of camera locations in case one wants to regenerate grass around another location than the streaming manager's viewpoint location.

  • Implemented a fallback for water surface depth sampling in underwater post process on mobile. It now intersects the camera to pixel ray with a horizontal water surface located at the water Z at the view position.

  • Optimized mip upload by unlocking all mips at once, to avoid recomputing FTextureSource's hash for each mip that is written to (on a landscape with ~256 components : 170ms -> 50ms for reading back heightmaps/weightmaps)

  • Added ability for users to select which Landscape is the target of Landscape Spline Actors.

  • Added the bEnableCullDistanceScale property to Foliage that can be used to scale cull distance per platform.


  • Added cosmetic improvements to water-related Details panels.

  • Landscape Layer Weight/Sample/Switch's title can now be edited directly in the graph, similar to Texture sample material expressions.

Bug Fix:

  • Fixed a crash when using alpha brush/pattern landscape tool and improved support for various cases with the alpha brush texture.

  • Fixed a crash when listing textures (listtextures cmd) after having deleted a landscape actor.

  • Fixed a crash when force deleting a material which has (Landscape) material instances. The UMaterialInstanceConstant's Parent field is force-serialized to null.

  • Fixed important slowdown when using a landscape brush with a large radius

  • Workaround for the D3D12-only bug that randomly generates invalid landscape tiles on global merge.

  • Changed the outer of the Nanite static mesh. Using the package as the outer allows to avoid duplicating the mesh when entering PIE.

  • Made the NaniteComponent TextExportTransient so that copy/pasting doesn't lead to the mesh being shared between actors.

  • Made the NaniteComponent DuplicateTransient so that saving as a map doesn't lead to the mesh being shared between packages.

  • Fixed WaterMesh not being added automatically when adding a water body that doesn't affect landscape into the map.

  • Fixed Undo with Nanite Landscape.

  • Unified all invalidation/update code paths so that we respect landscape.LiveRebuildNaniteOnModification in all modification cases.

  • Made the NaniteComponent non-transactional and made it invalidate the Nanite mesh upon Undo.

  • BuildNanite is now able to build either all proxies or only proxies from a list (including streaming proxies, in the case of a ALandscape).

  • BuildNanite data can now be done per Landscape Proxy Actors, allowing the user to update only a list of select Actors (supports multi-selection).

  • Added Rebuild Data button to Landscape Proxy Actors to force building the Nanite data even if the content has not been detected as having been changed.

  • Landscape Proxy Actor Details now supports multi-selection and can display Landscape details only if all selected proxies are share the same parent ALandscape

  • Fixed Nanite Landscape which would fail to build at 64 components.

  • Fixed NaniteLODIndex, which would show in the Details panel even when Nanite Landscape is not enabled.

  • Added progress bar when building Nanite from the Details panel buttons.

  • Disabled navigation data on Nanite Landscape Static Mesh

  • Fixed various WaterZone actor property changes that would not trigger a proper water info/mesh rebuild.

  • Fixed warning about Landscape thumbnail Material Instance shader caching not being issued when in SM6.0.

  • Prevented UBodySetup's cooked collision data from being generated for Landscape visual-only elements.

  • Removed code that was preventing the SplineEditorMesh to be loaded in commandlets.

  • Fixed crash when using alpha brush/pattern Landscape tool and better support various cases with the alpha brush texture.

  • Landscape tool brushes become red and non-interactive when the alpha brush is invalid.

  • Setting an invalid alpha brush (e.g. a cooked texture in a cooked editor or a virtualized texture with invalid virtualization settings such that the texture source cannot be retrieved) does not crash the UI anymore and now shows as empty in the UI This generates a log error.

  • Alpha brushes now support the same failure conditions as the normal brush (unloaded components, etc.).

  • Alpha brush textures now support all texture formats and are linearized if necessary when reading the texture data.

  • The alpha brush texture channel is auto-corrected if one uses an invalid channel (e.g. Green on a G8 texture).

  • Fixed Landscape Actors becoming dirty on load when using Nanite Landscape.

  • Changed the outer of the Nanite static mesh. Using the package as the outer avoids duplicating the mesh when entering PIE, which saves a lot of time to go into PIE (~40s for a 2k x 2k landscape).

  • Fixed the NaniteComponent TextExportTransient so that copy/pasting doesn't lead to the mesh being shared between Actors.

  • Made the NaniteComponent DuplicateTransient so that saving as a map doesn't lead to the mesh being shared between packages.

  • Fixed r.water.visualizeunderwaterpostprocess, which was showing a misleading material name (the topmost parent).

  • Fixed editor transactions being incorrectly started when using the mouse shortcut (ctrl+shift+right click-drag) to adjust the brush radius/falloff in Landscape mode.

  • Added support for landscape material instances (per-component MICs) for Nanite Landscape.

  • Fixed a rare crash when quickly applying undo and/or redo operations to Landscape sculpting or painting.

  • Fixed issues where Landscape on mobile devices would not have some layer info weightmap textures available when reroute nodes or material functions are used in the Landscape Material.


  • Removed CollisionThickness from Landscape.

Media Framework


  • Added a "just-in-time" option to MediaTexture in the Media Framework. This makes it possible to run a just-in-time render of the media when the MediaTexture creator knows how late in the rendering pipeline it is needed, which can reduce latency for streamed media.



  • Exposed multiple viewport-related editor behaviors to editor utility widgets.

  • Added extended error information for a SyntaxError in Python. This now reports the error line and the offset within it that the error occurred on, which makes it consistent with the error reporting from PyErr_Print().

  • Added Python glue support for structs with an internally mutable state. You can mark a ScriptMethod function taking a struct with ScriptMethodMutable to denote it as needing to copy the input struct back out despite it being marked as const. This supports the function changing internally mutable state within the struct, and is equivalent to passing the struct as UPARAM(ref), but preserves the internal mutability of the struct by the function signature.

  • Added a new experimental system for creating Interactive Tools in the UE Editor using Blueprints, called the Scriptable Tools Framework. You can create subclasses from UEditorScriptableInteractiveTool, as well as subclasses UEditorScriptableSingleClickTool and UEditorScriptableClickDragTool, to create Tools that support functionality such as:

    • Capturing mouse input

    • Creating and listening to 3D Gizmos

    • Per-frame Tick

    • 3D and 2D/HUD debug rendering

    • Custom Property Sets with "watchers" that allow responding to property changes via Delegates/Events.

    • A new ScriptableToolsEditorMode plugin adds a new Editor Mode which automatically displays all UScriptableInteractiveTool types available in the current project in a sidebar Tool Palette, with Tool interaction similar to Modeling Mode.

  • Exposed GetInterpreterExecutablePath through IPythonScriptPlugin.

  • Added a TabDisplayName property to EditorUtilityWidgets. If set, this is used as the tab name instead of the Blueprint asset name.

  • Added an UnregisterTabByID method to the EditorUtilitySubsystem, making it possible to unregister tabs previously registered through the subsystem.

Bug Fix:

  • Updated RandomStream to work in Python.

  • Replaced deprecated functions in FPythonScriptPlugin::EvalString.



  • Added thumbnails for media sources.

  • Dialogs that display a paths tree now also have a collapsible Favorites area.

  • You can now add external objects and hide the object root by specifying an FAddPropertyParams struct.

  • Added right-side extension panel (LevelViewportToolBar.RightExtension) to SLevelViewportToolbar.

  • The tooltips for UFUNCTION(CallInEditor) buttons no longer start with the boilerplate text ("Call an event on the selected object(s)") before custom tooltip text. That default text now only appears if there is no custom tooltip text available.

  • Added button to run / stop Editor Utility Widgets when editing them.

  • Added the ability to filter FPrimaryAssetId by class.

  • The actual current camera speed is now displayed in the viewport toolbar.

  • Added support for multiple thumbnail render frequencies. Previously, thumbnails could only be rendered every frame or on property change.

  • Groups added in details customizations can now be formatted as though they are subcategories.

  • Added an option to ignore editor gamepad navigation actions in slate.

  • Content browser settings have been moved to the editor config system. This makes them more persistent across branches, and less likely to be lost on editor shutdown.

  • You can now specify global, static, and object-local bool UFunctions in edit conditions.

  • Add customizability of BeforeButton alignment for the SCustomDialog widget.

  • Updated Revision Control icon placement on Content Browser tiles to move them to the bottom right of the tile.

    • Added support for multiple columns to the list view.

    • Added a column to show the revision control status to the list and column view.

  • Added an ellipsis at the end of the description when the changelist description is too long to be displayed correctly.

Crash Fix:

  • Fixed an issue in the Content Browser that caused the editor to crash when the user tries to delete a custom filter that is active in multiple Content Browsers.

Bug Fix:

  • Mouse grab cursors in Linux now appear correctly.

  • When removing a tab in UCommonTabListWidgetBase, subsequent tabs' indexes are now decremented.

  • Tooltips are now available for items in StructViewer.

  • Arrays of FTimecode now display the additional property buttons (such as Delete) next to the rows.

  • If a subobject in the details view was marked pending kill, the details view would keep rebuilding itself every frame until the object was GC'd. We now make sure that the object is valid before running the check.

  • Previously, the Profile Editor would allow users to turn on packaging while deploy to device was also turned on. Now, the logic in LauncherWorker.cpp's CreateUATCommand() method ignores the packaging setting if deployment to device is requested. With this change, the Profile Editor's UI will not allow both packaging and deploying to device in the same profile.

  • IPropertyHandle::GetMetaData and related functions now always check the instance metadata as well. This was expected behavior when calling SetInstanceMetaData, but it was only being applied selectively by certain widgets until this change.

  • Ranges now use IPropertyHandle::GetMetaData() instead of FProperty::GetMetaData(), allowing them to function correctly when placed in collections.

  • Updated calculation for determining when SClippingHorizontalBox should add a wrap button. This improves how toolbar overflow options are shown at certain resolutions.

  • Identical warning notification popups are automatically dismissed.

  • The Show Hidden Properties While Playing setting is now respected in the Details view.

  • SPropertyEditorNumeric's ForceUnits metadata now can also be set per property instance.

  • DataTables that used EditConditions with the EditConditionHides metadata no longer trigger a check() after the table is cleared.

  • Fixed all -Winconsistent-missing-override warnings.

  • Fixed an issue where all expanded elements in the details panel would collapse when certain types of properties such as array properties were edited.

  • Fixed an audio memory stomp in the Flite text to speech plugin.



  • Menu items that use custom widgets can now have tooltip overrides.

  • Added right-click menu options to copy the file path and the package path to the clipboard inside the package dialog window.

  • Added 0.1 as a scale grid snap option.

  • Clicking Delete in the Favorites view now removes the favorite instead of deleting the folder.

  • Added tooltips to the button used to find a selected material's textures in the Content Browser.

  • Disabled this button when the material referenced no textures.

  • Added a filter and column in the Outliner to show unsaved Actors.

  • Added a filter and modified the Source Control column in the Outliner to show uncontrolled actors.

  • Removed the Actor type text that shows in the Item Label column while searching in the Outliner.

  • Added alternating colors for rows in the Outliner and Content Browser tile and column view.

  • The Outliner now queries the Level Editor to pick the correct world based on context, preferring PIE over Editor worlds.


  • Generalized property editor metadata so that other systems can use it in the same way and have the same behavior as in the Details Panel. For example, scrubbing Translation values now increments by 1 everywhere, scrubbing Scale values increments by 0.0025 everywhere, and scrubbing Rotation values is clamped between 0 and 359.999 everywhere.

Crash Fix:

  • Fixed a rare crash in the Actor hierarchy when the representing world was invalid.

Bug Fix:

  • Set the color to full brightness/opacity when picking from the color wheel/spectrum if it was previously almost black or transparent.

  • Fixed an issue where you couldn't delete a custom filter that was active in multiple Outliners.

  • Fixed an issue that caused there to be two Virtual Production categories in the filter bar menu.

  • Fixed an issue causing duplicate filters in the Outliner when a layout was loaded.

  • Resolved an issue where light function materials assigned to a light would be removed when switching between static and non-static light mobilities.

  • Fixed a bug where table headers were not rendered directly above their column's row items in tables with many columns, like data tables and Procedural Content Generation (PCG) point data tables.

  • Fixed a bug that prevented copy-pasting materials on mesh components.

  • Fixes selected component being lost when compiling a Blueprint.

  • Fixed height preview mode activation/deactivation and preview mesh cycling.


  • Removed the Starship Gallery test suite from the editor. It was not designed to run inside the editor and could therefore cause crashes.



  • Added various cost amortization optimizations for the ReplicationGraph's dormant Actor cleanup feature.

  • Implemented FAutomationTestBase::IsLatentCommandQueueEmpty() function that returns whether there is no latent command in the queue.

  • Prevented approved reference images from being copied to the html test report for a successful test.

  • Enabled Lumen ray tracing when enabling raytracing.

  • When building you can now specify a "-staged" param which will append a Loose BuildFlag requirement if valid.

  • Replaced an extraneous plugin-load-error popup with a log.

  • A new Console Variable has been added to relax asset compatibility checks: s.SkipChangelistCompatibilityVersionCheck. This variable bypasses P4 changelist comparison checks on asset load.

  • Fixed an issue where the /Config/ directory root paths were not resolving correctly using the FPackageName utility functions.

  • Structured Logging is now used in Gauntlet.


  • UE5.2 CPU minspec is now updated to SSE 4.2.

Bug Fix:

  • FApp::GetInstanceID will now Include instance ID in the automation InstanceName. This adds the value to the instance field in the index.json file as (hostname)-(session ID)-(instance ID).

  • Fixed screenshot path names in test reports for standalone/no editor mode.

  • Fixed inconsistencies in AITests FTestHelpers return functions.

  • Fixed an issue where 'ExplicitlyLoaded' plugins that were enabled-by-default were thought to already be mounted.

  • Fixed the supported version for TCPMessaging.

  • Fixed an issue in scope where a Gauntlet Test was unable to find an explicitly requested part of the preferred namespace.



  • Unreal Build Tool now sets up dependencies between compiled build module dlls so build modules can now use public properties and functions from other modules.

  • Added a Unreal Build Tool mode that profiles different unity sizes and returns the best size for each module.

  • Made several optimizations to how and when unity files are used when building.

  • Added the ability to Unreal Header Tool to throw errors or warnings if the generated header is not properly included or if a regular or namespaced enum does not have an underlying type specified.

  • Added support to Unreal Header Tool to set the underlying type for regular and namespaced enums.

  • TestTarget Resource folders can now exist in any of the module's locations (for example, a platform extension directory)

  • Added support for DefaultGameTarget and DefaultClientTarget in Engine.ini.

  • Added logging to GenerateProjectFiles when writing multiple project formats to indicate what is happening

    • For example, why ""Generating data for project indexing"" is printed twice.

  • Added VSMac as a default project format for Mac so it's easier to manage C# code.

  • Added MultiShelve UAT script that can shelve multiple changelists into a single shelf.

  • Added a Reopen command to P4Utils.cs

  • Added UAT parameters to pass architecture by target type: -editorarchitecture, -clientarchitecture, -serverarchitecture, and -programarchitecture. Keeping -specifiedarchitecture for compat, which sets the other 4 if they are not specified.


  • Overhauled Android architecture management:

    • Changed AndroidToolchain to properly subclass from ClangToolchain.

    • Removed the multi-architecture code in AndroidToolchain to instead use the high-level UnrealArch/UnrealArchitectures system.

  • Refactored Edit and Reopen (that take file list) into a BatchCommand function to split up huge file lists across multiple commands to respect a max command-line length.

  • Increased the max command-line length from 1024 to the ProcessStartInfo max of 32699.

  • Made Architecture a first class concept in UBT with UnrealArch type and some supporting classes. Now, an architecture is always known and supplied in UBT, and architecture is no longer an unverified string, it is an enum-like class (UnrealArch).

  • Similarly, multi-architecture support is now codified in the UnrealArchitectures collection. Some helper Architecture properties are available for the common case when only one architecture could ever be used (on the platforms that do not support multi).

Bug Fix:

  • Fixed location for UHT generated headers to not have architecture in the path, because they are per architecture.

  • Removed path length check for files in the Intermediate directory as these files are not portable.



  • Changed ObjectHandleTracking to use Functions instead of delegates.

  • Added support to low-level tests. These tests validate that ensure and check are executed. The following macros are supported in low-level tests REQUIRE_ENSURE CHECK_ENSURE REQUIRE_CHECK.

    • Added a tls for an ensure handler callback to let the reporting log of ensures become overridden.

  • Added a command line switch '-SkipVirtualized' to the ResavePackages commandlet, which will cause packages that already contain virtualized data to be skipped.

  • Code cleanup of ObjectHandle, changed ObjectPathId to private.

  • Added UE_CALL_ONCE var args support.

  • Added Unreal.TestAdapter to run low-level tests in the text explorer. Added atomfeed.xml to allow for auto updates.

  • Added an option to specify the map name to load on the command line as a named parameter -map=.

  • Added FTopLevelAssetPathFastLess and FTopLevelAssetPathLexicalLess function objects for performing comparisons on the FTopLevelAssetPath class.

  • Added additional FPackageName::ObjectPathToX functions.

  • Added UniqueBy function to remove duplicates from a range from a projection to apply to elements similar to std::ranges::unique.

  • Changed SavePackage to store the extended AssetRegistryTags for the saved AssetData into the global AssetRegistry, instead of the non-extended.

  • Changed updating AssetData when packages are loaded to not remove no-longer-existing tags, since these tags might be present in the extended tags. This change means that AssetRegistryTags will remain on a package until it is resaved, even if the class that added the tags is changed to no longer write the tags.

  • Fixed JSON Reader UTF8 encoding parsing.

  • Added the ability to use JSON Reader with a string view.

  • Updated GetWrappedObjectPropertyValue_InContainer function to allow access to any element of an entire UObject* wrapper array in one call.

  • Improved comments for unusual backwards-searching behavior in FString::Find.

  • Deprecate ISavePackageValidator and replace the feature with list of validation functions for import and exports Add a default save setting object to which validation function can be added.

  • Limited TVariant to 256 types in order to reduce its size.

  • Added the FPackageName::GetContentPathForPackageRoot function to get the filesystem path (D:/Project/Engine/Content) of a given package root (/Engine/).

  • Added GetAllocatedSize functions to delegate classes to aid with memory tracking.

  • Made various changes to TSet to make it faster to compile and simpler to follow.

  • Added TSharedRef::ToWeakPtr, TSharedPtr::ToWeakPtr, and TSharedRef::ToSharedPtr functions.

  • Activated truncation warnings as errors for the following modules: CookOnTheFly, CookOnTheFlyNetServer, PakFile, PakFileUtilities

  • Added more functionality to FScriptArray from TArray and fixed some incorrect usage of const correctness.

  • Made truncation warning fixes for multiple core modules that include: Analytics, AnalyticsET, Cbor, Serialization, XMLParser, DerivedDataEditor, DirectoryWatcher, LogVisualizer, OutputLog, and InputCore.

  • Changed TArray::GetTypeSize and TIndirectArray::GetTypeSize to constexpr and static types.

  • Added prefetch support for mobile platforms and fused all platforms into a single implementation.

  • Added GetAllocatedSize functions to TDeque and TPagedArray to aid with memory tracking.

  • Set Mac ARM cache line size to 128 in order to cater to Apple M1/M2.

  • Added TIsTOptional_V, TIsTUniquePtr_V, TIsTUniqueObj_V, TIsTSharedRef_V, TIsTSharedPtr_V, and TIsTWeakPtr_V traits for determining if a type is a TOptional, TUniquePtr, TUniqueObj, TSharedRef, TSharedPtr, and TWeakPtr respectively.

  • Split TSubclassOf into its own TSubclassOfField, so they can both use forward-declared types.

  • Modified the AES num bytes type to prevent truncation fixes and warnings when it is used.

  • Implemented priority support for the Zen Loader's loader event queue instead of just relying on io request priorities.

  • Added error message when FMessageDialog::Open or FPlatformMisc::MessageBoxExt function fails to create the dialog(such as when missing windows resources).

  • Used bit 55 to distinguish fixes from loosely allocated asset tag values in the AssetDataTagMap .

  • Added truncation warning fixes for multiple core modules: CookOnTheFly, CookOnTheFlyNetServer, PakFileUtilities, PakFile.

  • Made PropertyPathHelpers call setters and getters.

  • Added support for generic structs to be passed to PropertyPathHelpers.

  • Added TIsTEnumAsByte type trait.

  • ZenLoader: Matched the suspend and resume behavior of the legacy loader by using an int32 counter instead of a boolean variable.

  • Inherited Context grouped inherited LLM tag, mem tag and trace metadata into FInheritedContext to simplify their usage.

  • Added FInheritedContext to higher level tasks instead of the low-level tasks to allow batch task launch to capture the inherited context once per batch.

  • Added EnumerateRange(Range) function which allows ranged-for loops over a range while maintaining the index of the current element.

  • Simplified TTuple to aid with compile times.

  • Activated truncation warnings for Analytics, AnalyticsET, Cbor, Serialization, XMLParser, DerivedDataEditor, DirectoryWatcher, LogVisualizer, and InputCore.

  • Simplified the implementation of Cast<>, using std:: traits.

  • Updated SetWrappedObjectPropertyValue_InContainer to allow setting any part of an entire UObject* wrapper array in one call.

  • Changed MiMalloc to call configurable function pointers for the allocation functions so they can be overridden by the library using it to report how much memory it is using.

  • Added an option to return the mount point with its slash key in the FPathViews::GetMountPointNameFromPath Add unit test for that function

  • Changed to Mimalloc support LLM.


  • Overrided mimalloc's call to VirtualAlloc/VirtualFree in order to record the amount committed and decommitted to Low-Level Memory(LLM).

  • Added multi-threaded access detector to delegates in order to detect concurrent access.

  • Implemented thread-safe multicast delegates. These delegates support Broadcast, and Add/Remove functions on different threads concurrently.

  • Added a ConsumeAllQueue which is based on a Stack because the Queues have livelock issues and the Stack provides a robust alternative.

  • Added a class to read zip archives and ZipArchiveWriter using libzip in the ZipArchiveReader.

  • Changed the behavior of FGenericPlatformMemoryStats::GetMemoryPressureStatus on Windows. It now uses the QueryMemoryResourceNotification instead of the generic implementation.

  • AssetManager GetPackageCookRule: Change NeverCook behavior and added new values to the EPrimaryAssetCookRule enum. NeverCook, DevelopmentCook, and DevelopmentAlwaysCook now specify exclusion from the cook only for the assets that are directly referenced from the PrimaryAsset.

  • EPrimaryAssetCookRule::DevelopmentAlwaysProductionUnknownCook represents the new possibility that an asset is always cooked in development because it is referenced from a DevelopmentAlwaysCook PrimaryAsset, but it may still be cooked in production because it is an indirectly referenced asset from that DevelopmentAlwaysCook PrimaryAsset.

  • renamed TDepletableMpscQueue to TDepletableMpmcQueue as it supports multiple concurrent consumers.

  • Updated existing use cases to use the new name or to switch to TConsumeAllMpmcQueue if the order of consumption doesn't matter. Added IsEmpty function to TConsumeAllMpmcQueue class. This concurrent queue will be deprecated in UE 5.3, please use the TConsumeAllMpmcQueue instead.

  • System semaphore is added to all supported platforms and can be used for multithreading synchronization. The main benefit comparing to other synchronization primitives is that on some platforms semaphores can wake up multiple threads faster than using individual system events.

  • Config-related delegates were made thread-safe as they are accessed concurrently during async config loading.

  • Changed FString::Contains, FString::Find, and TCString::Stristr to return success when the Find argument is an EmptyString when called with ESearchCase::IgnoreCase. This change makes the IgnoreCase behavior match the CaseSensitive behavior, and match the behavior of standard library strstr. But this will break call sites that were expecting Contains("") to return false, and those call sites will need to be changed as they are discovered.

  • Made FProperty::ShouldSerializeValue easier to debug.

  • Added -JsonStdOut param to write structured log output to stdout when used with the -StdOut param.

  • Added serialization of Compact Binary to WIDECHAR JSON.

  • Added serialization of Compact Binary fields and arrays to JSON.

  • Added LaunchTaskInThreadPool to the DDC as a replacement for the two existing thread pool task requests.

  • Added FSkinWeightLookupVertexBuffer::GetLookupData function to access raw lookup data.

  • Both OAuthProvider and OAuthProviderIdentifier can now be used in the same configuration for the HttpCacheStore.

  • Added a -DDC-VerifyFix command to overwrite existing records and values that differ from newly generated records and values.

  • Added support for logging structured debug output as a JSON file when the named mutex UE_LOG_JSON exists on Windows, or when -JsonDebugOutput is present on the command line.

  • Added support for Base64URL encoding.

  • Added DerivedDataTool as a new program to work with DDC, initially loading and saving cache replays.

  • Added an API to request compressed data from derived data references.

  • Added a DDC delete-only mode to the file system cache to allow unused caches to be cleaned up over time.

  • Exec APIs have been added to implement exec command handling for development and editor builds only.


  • Improved comments and special member functions in TSubclassOf.

  • Minor improvement to handling first in and first out (FIFO) order of task subsequents.


  • the StreamableManager class OnPreGarbageCollection function has been optimized.

  • Optimized processing of canceled background tasks by skipping the thread priority change.

  • Optimized UE_LOG based on UE_LOGFMT.

Crash Fix:

  • UEngine::CorrectNegativeTimeDelta will no longer crash on negative delta-time.

  • Fixed crash in IoDispatcher when requesting reads of 0 bytes.

  • Fixed a crash when duplicating a component for a copy to the clipboard by not forcing a specific name.

  • Fixed a crash on exit when initialization fails before the command line is set.

Bug Fix:

  • Removed artificial 64B max alignment limit from TAlignedBytes and TTypeCompatibleBytes.

  • Fixed MB3 Realloc from reading out of bounds.

  • Fixed an issue where weak object pointers are invalidated when re-creating a UObject with the same name.

  • Fixed an issue where a UObject intended to replace another UObject in the object array could get a new internal index if other threads were creating objects simultaneously.

  • Fixed LLM method FindTagDisplayName to lookup for the platform and project-specific tag names.

  • Fixed the generation of duplicate bulk data identifiers when creating new levels from templates containing bulk data payloads.

  • Fixed the OriginalObjectPathName variable from not being set if a LabelOverride was provided in the constructor of the FUObjectToken class.

  • Fixed the Editor on Windows to prevent loading all debug symbols and consuming a large amount of memory when resolving a first callstack before a load/unload module.

  • Updated FPaths::Combine function to work with the FStringView type.

  • Fixed StaticFindObject and ResolveName bug when searching for a sub-object in a specified object, and the subobject has the same name as a short script package name.

  • Added flexibility when specifying the project name on the command line. Previously, it was expected to be the first argument, which was difficult to ensure in all launch scenarios.

  • Fixed PropertyPath Not working with TEnumAsByte types.

  • Fixed memory leak located in the DepletableQueue as the last node was never deleted and made an accidental concurrent call to Deplete not catastrophic.

  • Enabled SplineComponent to have accurate bounds calculations on the server in exchange for a minor performance penalty when the bounds are first checked.

  • Replaced complex metaprogramming in FName with TStringView overloads.

  • Fixed TJsonPrintPolicy::WriteString from doing UTF-8-incompatible conversions.

  • Fixed double destruction in Tasks System that was causing repeating "task destroyed" traces in Task Insights.

  • Fixed CPF_HasGetValueTypeHash from not being set on a FBoolProperty.

  • Set a limit on the number of reference gathering when printing invalid references during save to avoid pathologically expensive cases.

  • Fixed CopyTemp from returning a reference instead of a copy when passed an rvalue reference (which can cause dangling references).

  • Fixed piping order to be First-in, first-out(FIFO) in an edge case where multiple piped inline tasks depend on the same prerequisite, so when the prereq is completed they all get piped.

  • Fixed differing behavior between ScriptInterface and when ScriptInterface is not a nullptr in some cases.

  • Fixed %hh* formats in FGenericWidePlatform::GetVarArgs. Added defensive checks against snprintf from returning a failure code.

  • Fixed TIsTSubclassOf for cv-qualified types.

  • Fixed Low-Level Memory(LLM) race condition in MB3 FreeExternal.

  • Improved comments on SerializeBin and SerializeBinEx to clarify that binary serialization of deprecated properties can cause problems.

  • Fixed a deadlock caused by double busy waiting, one in audio pipe suspension and another in the scheduler.

  • Fixed TTuple natvis visualization.

  • Made FBoxes' IsValid flags editable, otherwise editor modifications will not be saved.

  • Ensure that a page in the TPagedArray never shrinks below PageTraits::Capacity in TPagedArray::SetNum.

  • Fixed SelectRandomWeighted algorithms from not working with floating point value weights by initializing the accumulation with the appropriate zero types.

  • Forwarded payload parameters through the delegate API rather than copying to allow non-copyable types like TUniquePtr to be captured.

  • Fixed Clang static analysis false positives in our operator delete overrides.

  • Added a static_assert to stop data loss when constructing a TBox from TVector extents.

  • UClass::TryFindTypeSlow will now properly handle "None" names (NAME_None converted to string.)

  • Added checks to ensure that TArray's bulk-serialized data sizes match expected sizes.

  • Removed TNonNullSubclassOf's dependency on TSubclassOf::TClassType to avoid needing the full type definition for T.

  • Fixed a rounding issue with FDateTime::ParseIso8601.

  • Fixed TStringConversion's broken move constructor by making the class non-movable and non-copyable.

  • Changed OodleDataCompression scratch buffer count and size to match usage by the engine.

  • Added a Target.bAllowExecCommandsInShipping UBT flag to disable execute commands in shipping builds. It currently defaults to false.

  • Fixed DDC untagged allocations by capturing tags in tasks.

  • Fixed AsFieldView() function in CompactBinary to exclude names as expected.

  • Disabled prescanning of ini files for plugins on desktop platforms as it may end up slowly Saved and Cooked.

  • Fixed the DDC file system cache EditorOverrideSetting not handling paths with the ‘\' character in them.

  • Fixed thread safety of Engine.SuppressWarningsInOnScreenDisplay.

  • Fixed a race condition in the DDC cache hierarchy that caused failed assertions.

  • CompactBinary: Fixed LoadCompactBinary to gracefully handle read failures and sizes larger than the archive.

  • Fixed unsafe type cast warnings when moving from an array with a larger size type.

  • Fixed an issue where garbage references from the function UE::GC::RegisterSlowImplementation would report a random UObject as the referencer, rather than the owner of the AddReferencedObject function.



  • Deprecated all global variables of thread-safe delegates from FCoreDelegates and replaced them by functions returning local static singleton. Thread-safe delegates are not zero-initializable and can't be used as global variables because they are vulnerable to a static initialization order.

  • Deprecated the older TDepletableMpscQueue name.

  • Deprecated TIsSame.

  • Deprecated TIsVoidType.

  • Deprecated TAreTypesEqual and ARE_TYPES_EQUAL.

  • Deprecated some stat methods that take a TArray argument and provided a version with TArray64 to handle big stat files.


  • Removed obsolete warning message about old hardware.

  • Dynamic LocalQueue Management.

  • Removed the use of some deprecated intrinsic type traits.

  • Removed TContainerTraits.

  • Removed deprecated alignment-unaware functions from FScriptArray.

  • TAllocatorTraits::SupportsMove function because it is always assumed to be true.

Dev Tools


  • Added the ability to define USE_COMPILED_IN_NATIVES outside of the HACK_HEADER_GENERATOR macro.

  • Added a check in the C# UHT code generator to verify the end of the macro text is as expected.

  • Added support for regression and other column filters in PerfReportTool.

    • Additional column filters can now be created by implementing ISummaryTableColumnFilter and adding it to the list in Program.MakeAdditionalColumnFilters.

    • Moved stat threshold checks into an additional filter.

    • Added a column filter to hide metadata columns.

    • Added a column filter to only show columns where the most recent build has regressed by more than a given threshold.

    • You can now use debugShowFilteredColumns to have columns be grayed out instead of removed. Hovering over them will show the reason they were filtered out (which filter and the reason). This is for debugging purposes and sanity checks to make sure you're not missing important information, especially when iterating on new filters. Some additional settings were added to SummaryTableColumn to support this.

    • Filters can also mark individual cells as 'invalid' to indicate they are not taken into consideration for that filter. These are grayed out with a tooltip when debugShowFilteredColumns is enabled. Currently this does not work in collated views.

    • Added the ability to set tooltips for column headers.

    • Added the ability to add a color modifier for the entire column or individual cells.

  • Added level editor extensibility hooks to Turnkey.

  • Changed eligible platforms to use ANSI for profiler strings to reduce the required amount of additional memory. Profiler strings previously used wide strings because ANSI strings incurred a conversion to a wide-char in order to use the wide API, but the API has since been fixed.

  • Added a new UAT script: SyncPerforceServers. This script helps you to safely mirror a stream on one perforce server with another. See SyncPerforceServers.cs for more information.

  • Added support for packaging of programs with BuildCookRun by way of adding a .uproject file.

    • See SlateUGS.uproject for the format and location for making your own.

    • Use -skipcook when running BuildCookRun to package a project:

    • BuildCookRun ... -build -skipcook -stage [-pak] -package

    • To use .pak files with Programs, you need to add "PakFile" to the program's .Build.cs file dependencies.

  • Added CreateObjectList to StringUtils. This is helpful for refactoring in other code, but it can also be a useful utility function for printing lists of objects.

  • Added FComparableImage::LoadFile and FComparableImage::LoadCompressedData to help compare images that are only in-memory.


  • Improved Live Coding startup time to make starting the console an asynchronous task.

  • Improved detection and logging for circular includes in C# UHT.

  • Updated budget color scheme to match auto for PerfReportTool.

Bug Fix:

  • Fixed an issue in C# UHT where, if a structure referenced itself, it would end up in an infinite loop.

  • Fixed an issue where C# UHT was not generating errors with unsupported blueprint member types.

  • Fixed an issue to enable settings objects to be properly handled by LiveCoding and HotReload.

  • Fixed an issue in C# UHT where circular base class/structs would hang UHT. UHT now generates an error showing the circular bases.

  • Fixed an issue where, if a console variable changes a compilation module during live coding, then the engine will no longer assert.

  • Fixed an issue where UBT failed to detect C# UBT plugins in the game folder.

  • Fixed an issue where the console key would not work on some international keyboard layouts when the Game Features plugin was used.

  • Fixed an issue in C# UHT where it would fail to generate an error when preprocessor lines appeared in an inheritance list.

  • Fixed an issue where the Live Coding Console would fail to properly enable when it is started on demand.

  • Fixed an issue where UHT didn't properly detect circular structure definitions via TArray.

  • Fixed C# UHT issue where a class scoped delegate reference from another class would fail.

  • Fixed Live Coding issue where, if a typo was made in the preloaded module list, the game would hit a breakpoint.

  • Fixed an out-of-bounds exception with the changes command in the UnrealGameSync CLI tool.

  • Fixed performance issue with shadow detection and symbol lookup.

  • Fixed C# UHT to generate errors when UPROPERTIES are located in native interfaces.

  • Fixed C# UHT to properly detect an overridden function when they differ only by case.

  • Fixed issue where a class might not be marked as containing instanced items.

  • Fixed an issue where C# UHT failed to generate an error when a property in a structure referenced a deprecated class and the property had not been marked as deprecated.

  • Stopped creating the accounting job object with JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE. The main job object is already managing those processes and it caused mspdbsrv to be terminated while in use by CL as it is a shared process.


  • Removed HACK_HEADER_GENERATOR #define since C++ UHT has been deprecated and no longer uses engine classes.



  • Added support for load time tracing in the editor.

  • Unreal Insights now implements a diff mode for csv tables.

  • Added raw snapshot export for the MemoryAllocTable.

  • Added ImportTable/DiffTables to the StoreWindow.

  • Added UntypedDiffTable Widget.

  • Added MergeService to merge two tables together.

  • Added support for Unknown-type wildcard name patterns for regions specified to ExportTimerStatisticsAsText API.

  • It is now possible to specify the following export command: TimingInsights.ExportTimerStatistics C:\Out\Region*.CSV -region="SameRegion,Game*,OtherRegion" and it is expected to produce the following files: C:\Out\Region_SameRegion.CSV C:\Out\Region_Game_[...]

  • Added the ability to send a trace snapshot to a server using console command Trace.SnapshotSend. A snapshot is the content of any events in the tail buffer along with the important events needed to analyze them.

  • Improved the CPU timing scopes for module loading. It now uses CPU timing events with name of module as metadata.

  • Created the Insights Status Bar Widget. This widget is displayed in the bottom right corner of the Unreal Editor and provides the user the controls of the trace system. The widget is implemented as a plugin that is enabled by default.

  • API improvements

  • The Trace.Screenshot command can now be called using only the ShowUI parameter.

  • Added CallstackId for all free events including HeapMarkAlloc and HeapUnmarkAlloc events.

  • Increased Memory Trace trace version to 2.

  • Surface error messages from analysis engine to the user. Previously, we relied on the regular log to indicate problems in analysis. We now use MessageLog functionality which is routed to a visual log representation inside the application.

  • Added fake allocations for free events without a matching allocation event in Memory Insights. These allocations will have zero size and the same callstack as the free event.

  • Added support to reset highlights for timing events by double clicking on a highlighted event. Double clicking on an empty space resets the highlight.

  • Implemented analysis for "MetadataStack.ClearScope", MetadataStack.SaveStack" and "MetadataStack.RestoreStack" trace events.

  • Added analysis support for the new trace protocol 7 that provides scoped events with absolute timestamp values.

  • Runtime: Tagged the large memory allocations from FReserveScheduler::StartWorkers with the "EngineMisc" LLM tag. Previously it was tagged randomly by the first system that triggers the initialization.

  • Fixed a trace rename message from displaying the updated name twice in the Session Browser.

  • Changed the scoped trace events with time to use absolute timestamp values.

  • Increased trace protocol to version 7.

  • Implement diff mode for csv tables.

  • Added raw snapshot export for MemoryAllocTable.

  • Added ImportTable/DiffTables to StoreWindow.

  • Added UntypedDiffTable widget.

  • Added MergeService to merge two tables together.


  • Improved note about initial channels in the Connection tab of the Session Browser.

  • Improved performance of OutputBeginDynamicEvent by using a better hash function for dynamic scope named hash maps.

  • Changed the read buffers to increase their size by a power of two steps to Improve trace analysis performance.


  • Refactored UntypedTable to support importing tables without having a tracing session opened.

  • Refactored UntypedTable to support opening without opened session.

Bug Fix:

  • Fixed metadata for a pinned stack of multiple entries (like being added in reverse order).

  • Fixed log spam when filtering the LogView in Animation Insights.

  • Added a workaround for large utrace streams with corrupted serial sync events (detects when too much data is buffered on one thread and stops analysis automatically).

  • Fixed "SameValue" aggregation for string columns.

  • Fixed sorting for string columns to be case insensitive and to sort undefined values first.

  • Fixed sorting by Module Name column and by Symbols column to be case insensitive.

  • Added detection for CPU timing events with metadata with timestamp older than regular cpu timing events. Time needs to increase monotonically for cpu timing events.

  • Cleared metadata stack for ProgramSize allocs in Memory Insights.


  • Removed Insights menu items from the Tools menu as the functionality has been moved to the Insights Status Bar Widget.



  • Media sources can now be previewed in the editor.

  • Added replication support for FInstancedStruct.

  • Added HDR playback capabilities to MediaFrameWork and Electra.

Bug Fix:

  • CommonUI buttons now hide their default input prompt when becoming disabled. This fixes an issue where multiple prompts could appear after buttons are disabled and re-enabled.

  • Fixed Image Sequence frames from being cancelled when they should not be.

  • ProcessEXR now preserves data and display windows.

  • Fixed garbage collection on FInstancedStruct that contains a struct that requires call to the AddStructObjectRefences struct.

  • Fixed an Asset Registry to skip devonly tags. FString::Split retuns false if no delim substring found.


  • Removed deprecated per-chunk SetChunkInstallDelgate and RemoveChunkInstallDelgate functions from the chunk installers.


  • Removed const type from FInstancedStruct mutable getters to prevent mutating const instanced structs.


Bug Fix:

  • Fixed an issue where a null PathFollowingComponent was being created by default for an AI Controller.

  • Fixed an issue where a Behavior Tree decorator with a lower priority abortion type on a subtree was not being reactivated upon exiting the subtree.

  • Fixed an issue with Blueprint base decorators where they would trigger an execution request during a transition. This would return an incorrect answer. Decorators are now using new API methods to request either a RequestBranchActivation or a RequestBranchDeactivation.


  • PawnActions have been deprecated. Users should use GameplayTasks or AITasks starting this release.

AI Behavior Trees


  • Blackboard-based decorators can now use none values, instead of the first key when the referred key no longer exists. To use this behavior by default, add the following line in the configuration file:

    • [/Script/AIModule.AISystem]

    • bBlackboardKeyDecoratorAllowsNoneAsValue=true.

  • Disconnecting the root node of a Behavior Tree will now disable the tree.

  • Modified BTTask_FindAndUseGameplayBehaviorSmartObject to support finding a target Smart Object with an EQS query.


  • Blackboards now support more than 255 entries.

Bug Fix:

  • Fixed an issue where the Behavior Tree component was not redirecting its Visual Logger to the owning AI Controller if the component was dynamically added as part of AAIController::RunBehaviorTree.

  • Fixed an issue where the Blackboard editor was not clearing out the display of all persistent keys when it was parented with an asset that had the same named keys.

AI Debugging

Bug Fix:

  • Fixed an issue where the expanded subcategories in the Visual Logger were not being preserved while scrubbing the timeline.

  • Fixed an issue with Visual Logger not recording world-less UObjects.

  • Fixed an issue where GameplayDebuggerCategory was not replicating correctly for standalone clients.



  • Added a Smart Object EQS generator and a dedicated EQS item type.

Bug Fix:

  • Fixed an issue where UEnvQueryTest_Project's navigation projection was not applying the ProjectionData.PostProjectionVerticalOffset.

AI Navigation


  • Added a warning message when exporting a geometry component with too many vertices. A customizable warning threshold can be specified through the GeometryExportVertexCountWarningThreshold property.

  • UNavigationSystemV1::PerformNavigationBoundsUpdate is now a virtual function.

  • Changed "Navigation data generation finished" log to verbose to avoid repeated log messages when moving a Static Mesh in the automatic navigation update mode.

  • Added a display option to display navmesh tile resolution.

  • The World Partitioned Navigation Mesh now uses the required overlap from the Navigation System instead of using a constant value.

  • The Navigation Mesh now uses the same Oodle compression settings in the Editor to match its usage during gameplay.

  • Reduced the include dependencies for NavigationTypes.h

  • Added Navigation Mesh and Navigation System information to the screen when the Navigation Display is enabled. The following information was added:

    • Added the bDrawTileBuildTimes property to display the last tile build time

    • Added the bDrawTileBuildTimesHeatMap property to display the Navigation Mesh as a colored heat map of tile build time

    • Added draw distance clipping for Navigation Mesh label rendering

    • Added profile tags in the NavMeshRendering Component

    • Allowed DebugLabels to be displayed in 2D on screen

    • Added tile building statistics to the Navigation Display

    • Added partitioning type to the Navigation Display

    • Added Navigation Data count and triangle count to the Navigation Display

    • Added Profile Tags in the tile generation to the Navigation Display

  • Deprecated unused FRecastNavMeshGenerationProperties.

  • Added initial support for a mix of low, default and high resolution tiles on the Navigation Mesh.This update includes the following changes:

    • CellSize is now deprecated in favor of CellSizes, which store the various tile resolutions in the NavMeshResolutionParams array of ARecastNavMesh.

    • Added the NavMeshResolution property to ANavModifierVolume.

    • Removed duplicate data in dtNavMesh.

    • Added a resolution index to dtMeshHeader.

    • Increased the Navigation Mesh version to reflect the updates.

  • Made it possible to configure a project to not instantiate AvoidanceManager at all.


  • Removed unnecessary extra Agent radius tile expansion when computing tile bounds. This avoids unnecessary collision gathering, as well as prevents unnecessary tile dirtiness.

  • FPImplRecastNavMesh::GetNavMeshTilesIn now uses FRcTileBox to find the minimum and maximum tile coordinates.

  • Changed the navigation geometry export warning to be based on triangle count. This avoids repeating the warning multiple times.

Bug Fix:

  • Fixed an issue where the Navigation Mesh was generating incorrectly around Hierarchical Instanced Static Meshes.

  • Fixed an issue where UNavMeshRenderingComponent was not clearing labels when they were turned off.

  • Fixed an issue where a NavModifierVolume would incorrectly dirty a tile below itself if it was within an Agent's radius. Added the console command n.UseTightBoundExpansion to revert to the previous behavior as a fallback.

  • Fixed an issue where navigation bounds were not being updated on load when "Update Navigation Automatically" was disabled. This fixed World Partitioned Navigation Mesh data chunks not being generated for areas covered by NavMeshBoundsVolume that were placed inside Data Layers.

  • Fixed an issue where MassAvoidanceProcessors was producing a static analysis warning.

  • Fixed an issue where FPImplRecastNavMesh::TestPath would crash Lyra if the TileWidth of the loading Navigation Mesh was a mismatch.

  • Fixed an issue where the navigation octree would not fit the navigable world bounds.

  • Fixed an issue where the Navigation Mesh generation was not working for ULandscapeHeightfieldCollisionComponent in Lazy gathering mode. The sample cache was not reset in RecreateCollision.

  • Fixed an issue where the NavigationRelevantData array was being modified during garbage collection leading to a crash.

  • Fixed an issue where a partitioned Navigation Mesh was being created for non-world partitioned worlds.

AI Perception


  • Added the OnTargetPerceptionForgotten delegate to UAIPerceptionComponent.

AI Smart Objects


  • Made the following changes to Smart Objects:

    • Removed the synchronization logic between the ability system component and Smart Object instance tags.

    • The SmartObject subsystem has been added to the SmartObjectWorldConditionSchema.

    • Added support for world conditions to the main Smart Object instance (in addition to those in each slot). Note that slots could be disabled by their parent conditions.

    • Removed the object tags filter from the definition and replaced it by the newly added condition (FWorldCondition_SmartObjectActorTagQuery)

  • Updated the SmartObject blueprint library with the following:

    • Renamed 'K2_SetSmartObjectEnabled' to 'AddOrRemoveSmartObject' since 'Enabled= false' is a concept used when the object is no longer available for queries, but active interactions can finish.

    • Added functions to add and remove Smart Objects from the simulation for one or multiple Actors.

    • Added functions to enable and disable Smart Objects for one or multiple actors.

  • Added the ability to transform Smart Object annotations in the Smart Object editor viewport.

  • Added the custom show flag "SmartObjects" and bound it to the SmartObjectSubsystem rendering (disabled by default).

  • The SmartObjectDefinition validation now reports errors when saving the asset.

  • Made the following changes to Smart Objects:

    • Added per slot Runtime Tags.

    • Added common event handling for Smart Object and slot changes and events.

    • Added slot annotations, which are slot definition data that can have visualization.

    • Changed Smart Object Disable to send an event, instead of calling Unclaim and stopping the behavior.

    • Added more visualization support for the Smart Object editor (canvas, visualize annotations).

    • Changed the Smart Object editor to use the common transform widget for slots.

  • Completed Smart Object Collection rework which includes the following:

    • Introduced a new FSmartObjectContainer type that encapsulates SmartObjectComponent registration and storage.

    • The SmartObjectSubsystem now stores a Container that aggregates all other containers supplied by loaded / streamed in SmartObjectPersistentCollection instances.

    • The SmartObjectCollection got deprecated and there's an auto-update path triggered in SmartObjectCollection::PostLoad.

    • The SmartObjectComponent component can opt out of being part of a collection with bCanBePartOfCollection.

    • SmartObjects can only be registered with a single Collection. This might change in the future if required.

    • SmartObjects keep track of whether they are registered as a part of a collection or as a dynamic Smart Object.

    • Updated the SmartObjectComponent's SOHandle setting and resetting - there's a separate function for invalidating the handle.

    • Added handling for the destruction of a SmartObjectComponent (as opposed to unregistration due to being streamed out, potentially temporarily).

  • The SmartObjectSubsystem no longer instantiates on clients.

  • Added the asset name to the error logging reported by USmartObjectDefinition::Validate.

  • Made SmartObjectDefinition verification execute every time there is a change to the definition and on SmartObjectDefinition load.

  • Extended AITask_UseGameplayBehaviorSmartObject with OnSucceded, OnFailed and OnMoveToFailed delegates. These delegates allow users to better react to movement failures.

  • Deprecated ESmartObjectUnregistrationMode and its use in SmartObjectComponent registration and deregistration. Introduced two explicit paths for Smart Object removal:

    • Unregister - Keeps or deletes the runtime Smart Object information based on SmartObjectComponent.RegistrationType.

    • Remove - Called on the Smart Object's EndPlay. Removes runtime data regardless of the registration type.


  • Made changes to simplify the process of Registering, Unregistering, and Binding of a SmartObjectComponent to a RuntimeInstance.

Bug Fix:

  • Fixed an issue where a misconfigured Smart Object would partially register if it had a SmartObjectDefinition asset set, but the asset was not valid itself. This resulted in an ensure failure while cleaning up the system on world end.

  • Fixed an issue in USmartObjectSubsystem::CleanupRuntime where removing a Smart Object was causing an error.

AI State Tree


  • Made the following improvements to StateTree event handling:

    • Added the option for Tasks to disable ticking, or to be ticked only when there are events.

    • Added new options for Task handles when properties are copied.

    • Added TStateTreeInstanceDataStructRef which can be used to access struct-based instance data in delegates.

  • Added the callback FStateTreeNodeBase::Compile, which is called during compilation when a node and instance data can be checked and adjusted by the node, e.g. to validate data.

  • Added a getter and a delegate to the State Tree Component GetStateTreeRunStatus method.

  • StateTree now uses a hierarchical GameplayTag match when matching event transition tags.

  • When a StateTree subtree returns succeed or failed, it handles it as if the linked state was completed.

  • Added save options to the State Tree editor compile button.

  • Added a setter method for the auto start property in the State Tree component.

  • Improved State Tree transition handling with the following changes:

    • Delayed transitions now trigger N seconds after the first time the conditions pass (old behavior required the conditions to pass for the duration of the delay).

    • Added a random variation setting for the transition delay.

    • Tick and Event transitions have precedence over completion transitions (that is, they are handled before completion transitions).

    • Removed the delay and blocking from completion transitions.

  • Added the ability to request State Tree state transitions via code.

  • Exposed the State Link which allows a user to specify a target state as a property.

  • Completion transitions now trigger at the state where the task that completed is located. E.g. If execution is currently at Root/Guard/Leaf and the task at Guard state completes, transitions on Guard and Root state are handled (skipping Leaf).

Bug Fix:

  • Fixed an issue where calling Start on an already executing State Tree would cause a crash.

  • Fixed issue that limited the number of State Tree tasks to 254.

  • Fixed an issue where BeginPlay in the State Tree Component would cause a crash if it had an empty asset.

  • Added several fixes to the property binding for enum conditions.

  • Fixed an issue where UObject-based State Tree nodes were not copied and pasted correctly.

  • Fixed an issue with StateTreeNodeBlueprintBase::GetWorld to add support for Blueprint nodes that rely on retrieving world from the WorldContextObject.

  • Fixed an issue with the State Tree editor where expanded states were not being preserved when new states were added.



  • Exposed the World Partition grid helper and StreamingGrids member variables from the WorldPartitionRuntimeSpatialHash. This allows classes to derive and create dynamic grids at runtime.



  • Added the Get Modulator Value Blueprint function, which enables you to take values from any modulation source or control bus and use them to drive other game parameters.

  • Added two new Blueprint functions (Get Modulators From Destination and Audio::SetModulationRouting) to improve the UX of changing the Modulation Routing on an Audio Component:

  • Added Listener Orientation and Source Orientation audio parameter interfaces for audio sources.

  • Added the Create Envelope Follower Generator and Create LFO Generator Blueprint functions.

  • [Source Data Override Plugin] Added OnAllSourcesProcessed to enable functions to execute after all of the sources have been processed.

  • Added a MetaSounds unit test helper which builds a graph and operator from node names.

  • Added a debugging MetaSound node that triggers when a NaN is detected, Trigger On Nan.

  • Added a new MetaSounds node, Switch and Ramp, for smoothing out popping audio.

  • Added hard reset capability to the MetaSounds AD and ADSR Envelope nodes.


  • Changes to Modulation Routing now apply immediately to currently playing sounds.

  • Moved all Audio Modulation Blueprint functions to the Audio > Modulation category in the Blueprint Action Menu.

  • Widgets can now be registered at module startup so that specific transformation UIs are instantiated in the Waveform Editor.

  • Transformation widgets in the Waveform Editor now support property handles.

  • Exposed Audio Motor Sim Component data as editor-only blueprint readable data so the state can be queried by Editor widgets.

  • The Audio Component Group parameter subscriptions can now be added from Blueprint.

  • Changed the Audio Modulation Debug console variable prefix from "SoundModulators" to "Modulation" (ex. au.debug.modulation.filter.buses).

  • Added Trigger type to the Audio Parameter type enum so they can be differentiated from Boolean parameters.

  • The FAudioParameter class now has a new constructor that takes an EAudioParameterType enum, which can be used to create Trigger parameters explicitly.

  • Reduced editor load time by lowering the refresh rate of AudioCookOverrides.

Crash Fix:

  • Fixed a crash that could occur when a SoundWave with a Force Inline loading behavior had its SoundCompressionSettings altered during playback.

  • Fixed a crash caused by a missing parameter on FWindowsMMDeviceCache::OnDeviceRemoved.

  • Fixed a crash caused by audio capture components during level transitions.

Bug Fix:

  • Parameter subscriptions fire reliably regardless of the method of setting the parameter.

  • Fixed a bug where importing an Impulse Response asset incorrectly threw an error in the Output Log.

  • Fixed bug causing some MetaSound properties to be unintentionally reset when changing data type or constructor pin state

  • SoundWaves no longer synchronously load during USoundWave::PostLoad on packaged builds.

  • Fixed a playback bug that occurred when bypassing a Source Effect Chain entry in the same game frame the sound is played.

  • Fixed a bug where MetaSounds reroute nodes could have incorrect values when chained and created from node inputs.

  • Fixed a bug where fixed MetaSound ADSR audio multiply nodes could produce NaN values.

  • FindAllMIDIDeviceInfo now behaves as expected.

  • Fixed a bug that caused audio file cooking to produce slightly different data than prior versions.

  • Fixed a bug in MetaSound where Audio Bus Reader nodes might behave unexpectedly when the AudioCallbackBufferFrameSize is set to a value other than the default.

  • Fixed unintended behavior when creating MetaSound variables on a graph that has been converted from a preset.


  • Deprecated CreateCompressedInfo path and GetRuntimeFormat in favor of IAudioInfoFactoryRegistry.


  • AudioThread and StatsThread have been removed after being deprecated in 5.0.



  • Exposed ToHex to Blueprints for LinearColors.

  • Added console variable bp.BlamePrintString to help track down which Blueprint Asset and function is printing messages to the screen.

  • Made latent Blueprint nodes more descriptive in Tooltips.

  • Added Latent Blueprint info to Aync task nodes.

  • Added Implemented Interfaces to asset diffs.

  • Added proper support for null dynamic Blueprint delegates to struct pins and struct default values. This makes it easier to use non-multicast dynamic delegates in blueprint logic for optional bindings

  • Implemented a UPluginBlueprintLibrary for querying info about plugins from Blueprint and Python.

  • The core Unreal math type TRay and FRay is now exposed to Blueprints for use as a UProperty.


  • improved overall stability of the Asset Diff tool.

Bug Fix:

  • Fixed bug where Adding and Renaming collapsed graphs in functions breaks references to local variables.

  • Fixed inefficient memory usage in Blueprint Debugger tooltips.

  • Fixed issue where re-instantiated classes are available in the class reference drop-down.

  • Fixed a bug that occurred in the Blueprint Diff toool when re-linking diffrent pins to the same nodes.

Blueprint Compiler


  • Added a UPARAM(Required) markup for marking function parameters as required This must be linked to another node in a Blueprint.

Crash Fix:

  • Fixed a crash in UKismetSystemLibrary::execSetStructurePropertyByName.

Bug Fix:

  • Fixed promotion operator pins from not being able to find the appropriate promotion.

  • Fixed a Blueprint Compiler Error when compiling ExposeOnSpawn variables with a BlueprintSetter function.

  • Fixes for Vector wildcard that does not cast from integer to float (double-precision) when the vector pin is split or utilized by Promotable operator nodes that permit pin links of mismatched types such as int to float.

  • Subobjects are now uniquely instanced when importing default value terms to non-native class variable properties on the new CDO during a Blueprint compile.

  • Fixed a bug that could cause reinstanced classes to leak onto object literal pins.


  • Deprecated float and double cast nodes in Blueprint.Several single-precision float conversion functions were deprecated in favor of their double counterparts, which we can safely redirect.

  • Deprecated FBlueprintEditorUtils::RegenerateBlueprintClass function, a long unused entrypoint for Blueprint on load compilation.

Blueprint Editor


  • Added Browse to Type to the context menu of a variable in the Blueprint Editor details menu. This is available when the type of a variable is a Blueprint class.

  • Blueprint editor feature (experimental): Non-blocking Blueprint graph context menu invocation:

    • When enabled, invoking the context menu in a Blueprint graph will not block the UI for long periods waiting for its menu content building to be completed.

    • This can improve editor UX for content creators in large projects with significant Blueprint class assets.

    • Disabled by default. To enable, navigate to Editor Preferences->Blueprint Editor Settings->Experimental and set "Enable Non-Blocking Context Menu" to true.

  • In the Blueprint editor pins now consistently sort pin connections where the gateway node is being called when performing "collapse to graph", "collapse to function", or "collapse to macro" operations

  • Fixed a bug where clicking "Find References" on the Custom Event sidebar would search for "None"

  • Blueprint functions can now be marked as Unsafe During Actor Construction. This prevents their use during Actor construction scripts.


  • Improved Blueprint editor startup time by deferring palette/favorites list construction to when the Palette tab is first spawned.

  • Minor improvements have been made to Blueprint graph context menu performance.

  • Improved tooltip on function call nodes when a function cannot be resolved

Crash Fix:

  • Fixed an editor crash caused by reinstancing a transacted Animation Blueprint outered to a reinstanced Actor-based Blueprint with a Skeletal Mesh component.

Bug Fix:

  • Fixed the component hierarchy display in the Actor instance details tab to remain static and deterministic in terms of tree node order after its underlying Blueprint class is compiled and/or Actor reconstruction occurs.

  • We now avoid doing a full Blueprint action database refresh on the next UI tick after incurring one or more dynamic module loads in the editor.

  • Fixed a regression in which duplicate Add Component actions were being shown in the Blueprint graph right-click context menu when Context Sensitive was enabled.

  • Added custom setters to mark an arrow component's render state as dirty when writing to attributes cached by its scene proxy from a Blueprint function.

  • Blocked non-array container pin types from being connected to self pins on node types that support a foreach-style call site expansion. This avoids a runtime editor crash that may otherwise result due to a lack of compile-time expansion support for non-array container types.

  • Updated the Kismet Execution function to skip over pending garbage and unreachable objects.

Blueprint Runtime


  • Added IsPluginMounted function to the PluginBlueprintLibrary.

Bug Fix:

  • Fixed a source of runtime stack corruption while executing a compiled Blueprint graph with one or more direct interface self pin connections on call site nodes for implemented interface functions.

  • FixedInconsistent behavior in root component transform scale values for dynamically-spawned Blueprint Actor instances.

  • Fixed a bug with script Let commands when a custom setter is used on a property. When SetValue_InContainer is called, we need to ensure that we use the property container associated with the l-value in the assignment.



  • Added GameplayTargetingSystem Plugin.

  • Added custom serialization support for GameplayTag Queries.

  • Added support for replicating derived FGameplayEffectContext types.

  • Added an experimental Gameplay Graph plugin. It currently supports creating an undirected graph and running a few fundamental graph algorithms.

  • Added character movement UseBaseRelativeAcceleration option to use base-relative moves when walking on dynamic bases. This greatly reducing corrections while on the base, with higher risk of a correction when jumping on and off.

  • Changed the access level of UConversationInstance::GetCurrentChoiceReference from private to public. This allows conversation task nodes to easily access choice memory. This empowers the user to create one conversation task node that can generate multiple choices with unique data so that each dynamic choice can be processed accordingly.

  • Added overridable tick function to allow server-side functionality on remote autonomous proxy characters.

  • Added UGameplayStatics::IsAnyLocalPlayerCameraWithinRange function to allow Blueprints to prune behavior that is out of range of any local player.

  • Added success / fail return value to Actor's class AttachToComponent and AttachToActor functions.

  • Gameplay Attributes in assets are now registered as searchable names on save, allowing for references to attributes to be seen in the reference viewer.

  • Added a class picker for Input Action and Input Mapping Context factories.

  • Allow changing the evaluation channel of a Gameplay Effect Modifier from code.

  • Added some basic unit tests for the AbilitySystemComponent.

  • Added a slate notification when a gamepad's state changes in the editor. This displays the Platform User, Device ID, and connection state.

  • Users can now specify what Input Trigger events progress/cancel a Combo Trigger.

  • Clamped Input Modifier dead zone values between 0 and 1.

  • Users can now Drag and Drop Input Actions from the Content Browser into the Blueprint Graph to make an Enhanced Input Action in the graph.

  • Added units in milliseconds to the description of the ExactPing variable.

  • Created Default Input Mapping Contexts to the developer setting. This will let users specify a default set of Input mapping contexts without the trouble of getting the Player Controller in Blueprints or C++

  • Added Refresh Blueprint editor functions to the BlueprintEditorLibrary. This will allow you to refresh any open Blueprint editors or only ones for a specific Blueprint asset when making changes to their properties from Editor utility widgets.

  • Created the input device engine subsystem. This subsystem will allow you to set device properties on specific platform users without needing to use any force feedback effects.

  • Created an Enhanced Input World subsystem that allows you to bind input delegates to Actors without an owning Player Controller.

  • Fixed a bug that caused assets that were diffed against depot to revert to their depot state.

  • Exposed Input Device properties as UInputDeviceProperty. This utilizes the existing IInputInterface API to set device specific properties like Light Color, trigger effects, and advanced rumble.

  • Created a new Enhanced Input Combo Key to avoid Combo Triggers being overridden by mappings with the none key.

  • Input Mapping Contexts now display Triggers and Modifiers present on the Input Action for that mapping.

  • Removed an ensure relating to Combo Triggers when the Combo Actions array is empty.

  • Keep track of the most recent hardware Input Device for each platform user. This lets you find out what input device players are using, and get delegates when that changes.

  • Added a data validation error to avoid mixing Combo Triggers with other Input Triggers.

  • Added per-platform input settings that let you specify Hardware Input devices that are available on each platform.

    This allows you to detect any custom hardware that you may be using for your game by adding it to a config file. Then when you send controller events you can give a matching FInputDeviceScope so that the engine can detect the device.

  • Added KISMET_API to several diff related classes so users can create custom diff tools.

  • Added a templated version of GetComponentByClass.


  • Force Feedback mapping clarity and consistency improvements.

Crash Fix:

  • Fixed a crash in the UAbilitySystemBlueprintLibrary::MakeSpecHandle function.

  • Fixed a crash when calling GetBoundActionValue with a null actor. This can happen if you place the node in an Animation Blueprint graph and compile it

  • Blocked dedicated servers from trying to create local players, this would crash later on in startup.

  • Added null check to fix crash in UGameFrameworkComponentManager::CallDelegateForMatchingActors.

Bug Fix:

  • Made the world partition object transactional when the Modify() function is called on it so that the changes are properly added to the Undo/Redo buffer.

  • Fixed bug that occurred during character movement corrections which caused rotations to diverge between the client and server.

  • Fixed a bug where Character movement could desync when using multiple Root Motion Sources with different accumulate modes.

  • Fixed an issue in Network Prediction Examples causing pawns to result in slow movement during low framerate situations.

  • Removed erroneous ensure in UGameFrameworkComponentManager::RemoveComponentRequest function, which would trigger if more than one Actor class was mapped to a single component class.

  • Fixed Level asset from duplicating incorrectly when an Event Dispatcher is in the Level Blueprint.

  • Fixed a bug where Root Motion Source's "move to dynamic" force would not be updated to match a server correction and degrading movement quality.

  • Fixed logic in the Gameplay Ability System where a non-Controlled Pawn would be considered remote, even if it was spawned locally on the server (e.g. Vehicles).

  • Correctly set activation info on predicted instanced abilities that were rejected by the server.

  • Fixed a bug that would cause GameplayCues to get stuck on remote instances.

  • Enabled logging for Shipping/Test in KismetSystemLibrary.cpp when USE_LOGGING_IN_SHIPPING is defined to 1.

  • Added fixes for UInputAction child classes.

  • Fixed changing Action Value Type affected Blueprints toast from incorrectly showing up when modifying an Input Action that no Blueprints were using.

  • Fixed unnecessary copies returned from FGameplayDebuggerAddonManager::GetSlotNames.

  • Fixed a memory stomp when chaining calls to WaitGameplayEvent.

  • Fixed FGameplayTag::ImportTextItem so that Buffer is updated when we read tokens from it.

  • Provided a default console key section for the slovak keyboard layout.

  • Added the bool option bShouldOnlyTriggerLastActionInChord to Enhanced Input. This will track input actions that have Chorded Triggers on them, and allow the filtering of triggered delegates that are fired based on which chorded actions are being triggered this tick.

  • Fixed DPI scaling issues in FGameplayDebuggerCanvasContext::MeasureString.

  • Smart Object Behaviors now Support calling world-dependent nodes (i.e. Async Load Asset).

  • Fixed GameplayDebugger header so it incorporates DPI correctly for displaying time and VLog info at the intended locations.

  • the camera shake previewer will no longer leak the engine callback when closed.

  • Fixed invalid camera animation handle, due to a typo between int16 and uint16.

  • Calling the CreateCombinedHandle() from the FStreamableManager class will no longer trigger an ensure for null handles when SkipNull is passed in.

  • Gameplay Ability System Attributes now respect Core Redirects. This means you can now rename Attribute Sets and their Attributes in code and have them load properly in assets saved with the old names by adding redirect entries to DefaultEngine.ini.

  • Fixed an issue where enhanced input bindings for Actor Components would not register at the correct time causing them to be unbound.

  • Calling the AbilitySystemComponent GetOwnedGameplayTags() function in Blueprint no longer retains the previous call's return values when the same node is executed multiple times.


  • Removed previously unused variable FGameplayModifierInfo::Magnitude from the Gameplay Abilities Plugin.


  • Removed miscellaneous unneeded or deprecated matinee-related code.



  • Simplified the Mass spawning and entity template APIs by removing unused parameters and functionality.

  • Refactored UMassEntityTemplateRegistry into a regular struct, FMassEntityTemplateRegistry.

  • Made the MassDebugger UI tool react to the entity selection via the Mass GameplayDebugger category. The archetype containing the given entity gets selected.

  • Extracted the core of UMassActorSubsystem into a new FMassActorManager struct to support the logic's reuse in other circumstances (like a dedicated editor subsystem).

  • Separated the Add and Set operations in FMassCommandBuffer::Flush for a clearer distinction between the two operations.

  • Added Mass traits tag requirement to help configure some of the MassEntityConfig.

  • Most of the MassEntity unit tests are now decoupled from UWorld.

  • Added two editor-time Mass subsystems:

    • MassEntityEditorSubsystem: Instantiates MassEntityManager and supplies world-independent ticking.

    • MassActorEditorSubsystem: Wraps FMassActorManager for world-less purposes.

  • UMassEntityTemplateRegistry::InitializeEntityTemplate now allows empty-composition entity templates. An empty Archetype is created in this case.

  • Added a multicast delegate to FMassEntityManager that gets triggered upon new Archetype creation.

  • Added a convenience UMassSimulationSubsystem.IsDuringMassProcessing passing the call over to the hosted FMassEntityManager.

  • Added FMassProcessingPhaseManager::TriggerPhase which lets users manually trigger a given phase. This change was needed to support processing phases ticking outside of the world tick.

  • Added a destroy entity debug command.


  • Updated FMassProcessorDependencySolver::CreateNodes to now support having multiple instances of a single processor class. It can now handle dynamic processor instances with each having a different configuration.

  • We made the following improvements to the Mass processor dependency solver:

    • Before solving the dependency, the processor collection is sorted in such a way that it first processes the elements that are blocking the largest number of other nodes.

    • When storing and comparing information regarding used resources, we also compare sets of matching archetypes to fine-tune resource access. Depending on the parameters, the archetypes can be created especially for the purpose of dependency solving (called "virtual archetypes" in code) or queried from the given EntityManager instance.

    • These changes result in the shortest "longest sequence," which in turn, significantly improves processor distribution across threads when running Mass in multithreaded mode.

    • The new approach is utilized by the PhaseManager to rebuild Phases' processing graph whenever a new archetype is created. This resulted in the removal of UMassCompositeProcessor::CopyAndSort and the updating of MassEntitySettings code.

  • Made the following changes to Mass's support for USubsystems:

    • Added new struct type FMassSubsystemAccess which stores bitsets indicating which subsystems are to be accessed and in which mode (RO/WR). It also caches system instances (populated either via the CacheSubsystemRequirements call or iteratively as the subsystems get requested).

    • The new FMassSubsystemAccess is instantiated by FMassExecutionContext. This removes the need for supplying a UWorld instance when fetching subsystems - the value is now fetched from the MassEntityManager being used, and cached.

  • Made FMassRuntimePipeline::Processors private and updated the call sites to use getters and setters.

  • Modified the FMassCommandBuffer.DestroyEntities signature to use an array view, which makes it backwards compatible and more flexible.

  • Turned UMassProcessingPhaseManager into a struct, FMassProcessingPhaseManager.

  • Simplified the phase manager's initialization by using a single function. The caller is now responsible for passing the phase configuration.

  • Moved the code responsible for the MassEntitySettings changes from FMassProcessingPhaseManager over to UMassSimulationSubsystem.

  • Updated the MassDebugger processing graph display to work with single-threaded phases as well.

  • MassAgentComponent now supports an empty MassEntityConfig, this is useful when the actor is a puppet.

Bug Fix:

  • Fixed an issue where the State Tree asset filtering for a State Tree trait was incorrect.

  • Fixed an issue where FMassArchetypeData::BatchMoveEntitiesToAnotherArchetype was modifying the order of entities being added. This was causing the associated payload to get out of sync with the entities being moved around

  • Fixed an issue where FMassArchetypeData::ExecutionFunctionForChunk was failing shared fragment binding.

  • Fixed an issue where the MassEntityConfig validation was always showing an error-style notification after a single failed notification, regardless of the following results.

  • Fixed an issue with UMassCompositeProcessor::Populate where it would side-step the EProcessorExecutionFlags settings of the processors being added.

  • Fixed a bug in the actor pooling logic when entities were destroyed. The code was calling the wrong method to unregister the entity fragments.

  • Fixed an issue with FMassCommandBuffer::Flush where it was not maintaining the order of operations of the same type (i.e. the sorting was not stable, now it is).

  • Fixed a loophole that made it possible to run a MassEntityQuery while its cached data was outdated.


  • Left FMassProcessingPhase.bIsDuringMassProcessing for debugging purposes.



  • Implemented delta compression for PolymorphicStructNetSerializer in Iris.

  • Improved Seamless Travel:

    • The network object info of actors that are seamless traveling is now kept so it can be restored after the full list is reset.

    • Fixed subobject refcounting ensures triggered during Seamless Travel.

  • Added support for overriding net cull distances in Iris.

  • The experimental Iris replication system is now compiled with the engine by default, but will only be used at runtime if it's explicitly enabled.

  • The Destroy and TearOff subobject functions now work in Iris replication.

  • Added console variable to detect subobjects that are not registered using the registered subobjects list.

    • Added the net.SubObjects.DetectDeprecatedReplicatedSubObjects console variable.

    • When enabled, it will ensure if it detects that ReplicateSubObjects() is implemented in a class that switched over to the new registration method

    • This console variable is only available in development builds.

  • Added APIs that allow the authority to tear off or delete a replicated subobject on remote connections.

    • Call DestroyReplicatedSubObjectOnRemotePeers or TearOffReplicatedSubObjectOnRemotePeers via the Actor or ActorComponent.

    • Added a list of subobjects replicated to individual channels and the number of channels they are replicated to in the NetDriver's network object info.

  • Added support for SeamlessTravel and NoSeamlessTravel URL options on game mode to override the default on game mode. If seamless travel is disabled in PIE, it will now fall back to a hard travel instead of failing completely.

  • Added an assert to tell if the netdriver is missing the required DataStreamChannel definition in its config in Iris.

  • Added sample code for network packet encryption to Lyra.

  • Added the possibility to store registered subobjects via a WeakObjectPtr or a regular pointer.

    • Toggled by setting UE_NET_SUBOBJECTLIST_WEAKPTR.

    • Default is to use weak pointers.

    • WeakObjects are useful in a context where some subobjects may get destroyed before getting unregistered which generally occurs on clients and PIE.

    • Regular pointers are useful when you want to speed up the replication code and you know all your subobjects will be unregistered before getting destroyed. This is generally the case on dedicated servers.

  • Changed the engine, game, and replay network versioning to use the custom version system.

  • Refactored dependent actor lists so the child actors are stored by streaming levels in Replication Graph.

    • Now dependent actors are not replicated if the connection does not have the streaming level loaded.

    • Added FLevelBasedActorList struct to RepGraph plugin. Holds actors based on their level (permanent or streaming)

  • Added support for overriding net cull distances without modifying the Actor's NetCullDistanceSquared property in Iris.

  • ReplicationSystemTest unit tests now support NetTrace.

    • Added a new command line option to run a subset of tests by using -TestFilter [filter] to only run tests where the name contains the provided string.

  • Replaced the DormantReplicatorMap with the private DormantReplicatorSet in NetConnection.

    • The new struct holds dormant object replicators grouped by their owning actor.

    • Current public usage of the dormant map has been replaced with equivalent functions in UNetConnection.

  • Updated the Network Prediction plugin readme with architecture and operational flow, technical details, and known issues.

  • Added ability for URLs launched via the Launch URL Blueprint node or the new function FPlatformProcess::LaunchURLFiltered to be filtered by an allowlist that's custom-built by code or defined in config files. The allowlist for the Blueprint node uses the [SystemLibrary.LaunchURLFilter] section in the Engine config file.

  • Added send destruction info for dormant actors from cells that are no longer observed by the network client.

    • TimeToLife for cell to send destruction is configurable and overridable by the game per GridSpatialization2DNode.

    • Exposed ReplicatedDormantDestructionInfosPerFrame CVar to have control over optimization levers.

    • Added Profiler markers to measure impact of enabling dormant actor cleanup.

  • Network Insights now supports capture of demo recordings.

  • [Iris] Implemented support to allow descriptors built for structs derived from FastArraySerializer. Contains additional properties to be handled by using an explicit ReplicationFragment.

  • Added new parameter OldArraySize to FastArraySerializer::FPostReplicatedReceiveParameters containing the size of the fastarray prior to the last receive operation.

  • [Iris] Implemented delta compressed variants of WriteSparseBitArrayDelta and ReadSparseBitArrayDelta.

  • [Iris] Added new trait UseSerializerIsEqual to NetSerializer to indicate whether it should use the serializer's IsEqual method instead of using property comparison. An example of where this is used is GameplayAbilityRepAnimMontageNetSerializer.


  • Improved support for debugging controlled reconciliation and rollbacks in the Network Prediction plugin via command console variables.

  • Improved replicated subobjects:

    • Refactored subobject refcounting so its lifetime is independent of the NetworkObjectInfo.

    • Fixed incorrect refcounts when ActorChannels are still not cleaned up while the NetworkObjectInfo of an actor was destroyed.

Crash Fix:

  • Fixed a crash in ReplicationStateDescriptorBuilder in Iris when building descriptor structs with CustomNetSerializer if compiling with clang.

Bug Fix:

  • Fixed ensures in dormant refcount code that were caused when an invalid replicator in a channel's ReplicationMap was removed.

    • This was caused by a safeguard that tried to remove any dormant replicator of the pointer reused from a now invalid subobject.

    • This safeguard was removed for two reasons:

    • Dormant replicators are always validated before being returned, so there is no need to manually discard them.

    • A dormant replicator cannot be stored in both the ReplicationMap and the connection's dormant list.

  • Fixed a bug in the Network Prediction plugin where a temporary client hitch could result in significant and permanent lag in server-side input consumption.

  • Fixed a bug in Iris where class default objects and archetypes could be destroyed on the client when the server stopped replicating them.

  • Fixed a bug where Network Prediction simulated actors could be invisible on other clients when sim proxy interpolation mode was used.

  • Fixed a case where replays could discard external data saved in the first few frames of recording.

  • Fixed actor tear off behavior to respect the actor channel close reason, even if the final property bunch is dropped.

  • Added ensures in NetGuidCache::Supports and ObjectRefereceCache to prevent replication of references to objects pointers that belong to another PIE instance. Added guards in GameplayDebuggerLocalController to not forward calls to RPCs via delegates from other PIE instances.

  • Fixed a potential freed memory access in partial bunch handling.

  • Iris - Fixed issue where custom property overrides was not properly initialized for iris if set before BeginPlay/BeginReplication

  • Fixed potential buffer overflow in DTLS packet handler.

  • Fixed ensures in dormant refcount code caused when an invalid replicator in a channel's ReplicationMap gets removed. This was caused by a safeguard where the code tried to remove any dormant replicator of the pointer reused from a now invalid sub object.

  • Fixed the network driver IsInTick call for derived classes.

  • Fixed several issues with restoring the state of placed actors during replay scrubs.

  • Fixed an issue with torn off actors in replays where not all modified properties would be recorded.

  • Fixed socket GetLocalHostAddrViaConnect returning the wrong address type on some platforms.

  • Fixed push model fast array tracking to not skip updates if there are unacknowledged property retirements.

  • Fixed several issues with the seamless travel networking code when pending kill is disabled.

  • Fixed race condition where clients would sometimes be sent new actors before seamless travel finished, which broke their replication.

  • Fixed return of temporary string address in network property registration.

  • Fixed bIsQuantizedState flag not being property set in a bunch of NetSerializers in Iris.

  • Fixed issue where AActor::SetReplicates(false) would not stop replication for Iris.

  • Fixed issue with AActor::EndReplication not being forwarded if bReplicates is set to false prior to call even if the object was replicating.

  • Fixed AActor::GetNetMode when called early in PIE/network startup to ask the world if there is no net driver yet, this allows better detection of dedicated servers at the actor level.

  • Changed several debug commands in the save game replay streamer to be asynchronous file operations to avoid large game thread stalls.

  • Replaced several replication graph strong references with weak pointers to prevent garbage collection issues.

  • Changed the Basic Replication Graph's GridSpatialization2D node to use UE_OLD_WORLD_MAX.

  • [Iris] Fixed registering RPC-functions for subobjects with COND_Never so that they can be called even if the subobject does not replicate.

  • [Iris] FastArraySerializer PostReplicatedReceive is now properly called for all relevant paths through FastArrayDeltaSerialize on the receiving side.

  • [Iris] Fixed a few bugs related to tearing off SubObjects:

    • Tearing off objects with no replicated state data.

    • Subobject owner was not marked dirty when we dropped creation info for the subobject which then would not replicate until the next time the owner was marked dirty.

    • Client could get a bitstream error if we got a replicated destroy for a yet to be created subobject.

    • NetTrace not working properly with ReplicationSystemTest.

  • Fixed an issue where handles were sent instead of names for dynamic array properties if the name serialize property type option was enabled.

  • Fixed an issue with GameplayEffectContext replicating a reference to a dynamic object that would never be replicated.

    • This prevented GameplayEffect from calling Owner->HandleDeferredGameplayCues(this) as bHasMoreUnmappedReferences would always be true.

  • Fixed an issue when an attached actor is created, the absolute scaling was sent to the client instead of the relative scale to its parent.

    • This caused issues because the scale would then get treated as the relative scale, causing the scaling to be applied twice.


  • Deprecated the DormantReplicatorMap.


  • Removed hardcoded Iris prioritizer for PlayerState as it is configurable in .ini files.

  • Removed deprecated Replication Graph code.

Level Design and Art Tools

Geometry Core


  • Added a FindAnyInRadius query, which can stop searching as soon as any point within the search distance has been found.

  • The C++ Mesh AABB Tree class now has an IsWithinDistanceSquared method, which can early-out faster than the standard FindNearestTriangle.

  • The C++ TConstrainedDelaunay2 Add function now has an AddWithIntersectionResolution version, which attempts to resolve self-intersections in the input before triangulating.

  • Added GetVerticesBounds function, which computes the bounds of subsets of a mesh's vertices, to the TMeshQueries class.

  • Added GetTrianglesBounds function, which computes the bounds of subsets of a mesh's triangles, to the TMeshQueries class.

  • RecomputeOverlayTriNormals function has been added to the FMeshNormals class, which recomputes normals on a subset of the Normals Attribute Overlay.

  • RecomputeOverlayElementNormals has been added to the FMeshNormals class, which recompute normals on a subset of the Normals Attribute Overlay.

  • Added a FMeshTriOrderedEdgeID type, which represents an integer edge ID of a mesh as a (triangle, triangle-edge-index) pair, where the triangle edge index is the 0/1/2 index into the edges of the triangle. This represents a mesh edge in a way that is stable across mesh edits which may affect edge IDs.

  • ConvertLoopToTriOrderedEdgeLoop utility function has been added.

  • Added a ConvertTriOrderedEdgeLoopToLoop utility function.

  • Added a wrapped version of the fTetWild third party library to the GeometryProcessing Plugin; providing users a way to reliably construct a reasonably good-quality tetrahedral mesh from any triangle mesh input.

  • GrowToConnectedVertices function has been added to the FMeshConnectedComponents class, which behave similar to the existing triangle variant.

  • GrowToConnectedEdges has been added to the FMeshConnectedComponents class, which behave similar to the existing triangle variant.

  • Added a Tetrahedron3 type in TriangleTypes.h, and a new TetUtil.h header with common tet operations.

  • Replaced the deprecated template VectorType versions of the GeometryCore Exact Predicate functions with non-templated inline functions that handle the standard vector types–since we cannot deprecate the fully generic template version. If you need to call these functions with a custom vector type, please use the deprecated versions as reference to convert your call to any of the very similar non-deprecated function calls.


  • The mesh Fast Winding code has been optimized to better re-use cached values and avoid some unneeded square root function calls.

  • FSparseDynamicPointOctree has been significantly optimized and now supports parallel construction from dense point sets, via ParallelInsertDensePointSet.

  • The C++ TPointHashGrid class has been optimized to reduce memory allocations during queries and to early-out faster in common usage patterns by testing the closest grid cell first.

  • Updated the FindPointsInBall method to return the number of points found, not the number of points in the append array on return.

  • Updated the GeometryCore sparse dynamic octree class to now use range iteration to find relevant root cells for point containment and range queries, when there are enough root cells that this is likely to be faster than testing all root cells.

Bug Fix:

  • FDynamicMesh3::EnableMatchingAttributes can now support more granular control over whether existing attributes are cleared or discarded. Various higher-level code that uses this function now have improved behavior around meshes with mismatched attributes.

  • Fixed the UDynamicMeshComponent::SetDynamicMesh function to now change the Outer of the incoming mesh to be the UDynamicMeshComponent. This is necessary to avoid serialization issues easily created in Blueprints which would result in the UDynamicMesh not being saved with the Component after it has been Set.

  • Fixed the BrushToDynamicMesh conversion class to now compact the final FDynamicMesh3 after welding vertices.


  • The GeometryCore Exact Predicate functions are now const-correct, and we have deprecated the template VectorType versions of these functions.

Geometry Script


  • Added Sample Texture Render Target 2D At UV Positions node, which returns a list of colors obtained by sampling a texture render target at a list of UV positions. This node is the render target analog of the existing Sample Texture 2D At UV Positions Geometry Script node.

  • Updated the Geometry Scripting plugin modules that can be used at Runtime, to now load PreDefault to ensure they are loaded before any user plugins that might reference Geometry Scripting.

  • Added a GetMeshHasTangents function.

  • Added a DiscardTangents function.

  • A GetMeshPerVertexTangents function has been added.

  • Added a SetMeshPerVertexTangents function.

  • A SetMeshPerVertexNormals function has been added.

  • Added a UpdateVertexNormal have been added

  • A new function TranslatePivotToLocation has been added to simplify setting the "Pivot Point" / Origin of a UDynamicMesh

  • A new function SetAllMeshVertexPositions has been added to update all the vertex positions of a UDynamicMesh from a list of computed positions

  • A set of utility functions for creating and manipulating Transforms has been added, including MakeTransformFromZAxis, MakeTransformFromAxes, GetTransformAxisVector, GetTransformAxisRay, and GetTransformAxisPlane

  • GetInterpolatedTrianglePosition function has been added for linearly interpolating mesh attributes across triangle faces based on barycentric coordinates.

  • GetInterpolatedTriangleUV function has been added for linearly interpolating mesh attributes across triangle faces based on barycentric coordinates.

  • GetInterpolatedTriangleNormal function has been added for linearly interpolating mesh attributes across triangle faces based on barycentric coordinates.

  • GetInterpolatedTriangleNormalTangents function has been added for linearly interpolating mesh attributes across triangle faces based on barycentric coordinates.

  • GetInterpolatedTriangleVertexColor function has been added for linearly interpolating mesh attributes across triangle faces based on barycentric coordinates.

  • Added a GetHasTriangleNormals function to provide more granular access to mesh normals and vertex colors.

  • GetTriangleNormals function has been added to provide more granular access to mesh normals and vertex colors.

  • Added a GetTriangleNormalTangents function to provide more granular access to mesh normals and vertex colors.

  • GetHasVertexColors function has been added to provide more granular access to mesh normals and vertex colors.

  • GetTriangleVertexColors function has been added to provide more granular access to mesh normals and vertex colors.

  • Added asset creation and binding functionality for skeletal meshes.

Bug Fix:

  • Added a Delete Isolated Triangles input pin to the Fill Options struct of the Fill All Mesh Holes node.

  • Corrected the incorrect handling of textures with source format BGRE8. This correction affected the Sample Texture 2D At UV Positions geometry script node.

Modeling Tools


  • Moved UV Editor 2D viewport behavior targets to EditorInteractiveToolsFramework for reuse in other editors.

  • Merged the codebases of shared tool operations between the UV Editor and Modeling Mode for consistency and improved development.

  • Improved the documentation of options in the SubDiv tool.

  • Updated the PolyCut tool to avoid trying to fix holes by default and provide a warning.

  • Made various settings accessible via the cog icon in Modeling Mode Quick Settings.

  • The TriSel tool now has a By Material (All) selection option, to select triangles by matching material ID across an entire mesh without considering connectivity. The previous By Material option is now named By Material (Connected).

  • Fixed readability issue in mesh statistics display.

  • Created a new MeshTopologySelector base class.

  • Added a new BoundarySelector class which inherits from the MeshTopologySelector base class. The new Boundary classes use FMeshBoundary loops to define selectable loops rather than FGroupTopology.

  • Added new helper methods to determine the count of Actor Components that match Target Requirements and an additional test predicate for specialized scenarios.

  • A couple of helper methods were added to test for Volume components and component classes that support UVs. This is to support and fix the issues surrounding the UV modeling tools that shouldn't be viable for Volume type targets.

  • Fixed incorrect handling of texture source format BGRE8 in UE::AssetUtils::ReadTexture function.


  • Fixed a minor readability issue of the UV field in the Mesh Statistics section of the Simplify tool.

  • Improved the display of options in the SubDiv tool, including updates to tooltips.

  • UpdatedUV Projection Tool to allow the user to change the Initialization mode and have it affect the current instance of the tool, as long as they do it before modifying the transform.

  • The MshMrg tool has been renamed to Merge.

  • The MshDup tool has been renamed Dupe.

  • The Merge tool has been renamed to Union.

  • Updated existing GroupTopologySelector to inherit from the MeshTopologySelector base class.

  • Changed the Hole Fill tool to use BoundarySelectionMechanic instead of GroupTopologySelector.

  • Updated FMeshBoundaryLoops to fail untangling a loop with bowties but still continue processing other loops.

  • The Group Paint tool can now draw numeric IDs of visible PolyGroups, as well as draw the ID of the PolyGroup under the cursor.

  • The Inspector Tool can now draw numeric triangle, edge, vertex, and PolyGroup IDs, and supports picking from the set of available PolyGroups.

  • Expanded the set of override render materials.

  • Added a PolyGroup Layer picker.

  • Updated materials used by the Modeling Mode tools and the UV Editor to make use of the new Switch material node. The update removes any custom nodes currently in use, and generally fixes issues related to material compilation under Restricted mode.

  • Added undo and redo support for actions while in corner mode of the Cube Grid tool.

  • Updated the Cube Grid tool to refresh the Modeling panel when initializing from Actor.

Bug Fix:

  • Fixed the toggle gizmo action in some tools by unbinding it from a default hotkey to prevent users from accidentally pressing it and thinking the tools are broken. Users can still set their own hotkey if their workflow benefits from it.

  • Fixed a crash in the Merge tool when a mesh uses a material ID that is not in its material list.

  • Updated the Subdivide tool by preventing it from running with level 0 specified. For example, if the input mesh is very high resolution and the subd level is automatically capped.

  • Fixed undo and redo when Ctrl + Middle-Clicking in the Cube Grid tool.

  • Fixed old selection being visible when clicking away from everything while using the Cube Grid tool.

  • Fixed a bug where the Trim tool starts a potentially expensive boolean calculation when only the opacity color alpha changes.

  • Updated the MshToVol tool to always attempt to simplify volumes it creates, if those volumes would have more than 200 faces. This helps avoid the creation of volumes that are too large for the BSP processing code to handle, which could otherwise cause the editor to hang.

  • Updated the Subdivide tool to not ensure the subdivision level is zero, since it might have been restored to zero from the previous tool use.

  • Fixed the Pivot tool not working on things with static and stationary mobility.

  • Updated the MatEd tool to prevent the creation of meshes with more materials than material slots.

  • Fixed a bug where the Smooth Borders action in TriSel tool could not be undone.

  • Fixed Triangle Edit tool's Flip Edge operation selecting wrong edges afterward.

  • Resolved Static Mesh's sockets from getting lost when merging Static Meshes by adding a Merge Mesh Sockets option to the Merge tool's settings.

  • Updated packing UVs to avoid relying on the UV area to scale triangles in the UV map, instead, it uses the edges length (perimeter).

  • Fixed invalid array access in FDynamicMeshUVEditor::SetTriangleUVsFromConformal.

UV Editor


  • Adjusted the behavior of the Transform quick rotation buttons to rotate clockwise for positive rotation values and counterclockwise for negative values.

  • Changed axis colors in UV Editor to align with the Level Editor.

Bug Fix:

  • Cleaned up tool tip text in the Transform tool to be more consistent between different buttons.

  • Added support to correctly handle the initiation and termination of Play In Editor (PIE) mode in the UV Editor. This properly restarts the selection tool upon finishing PIE and adds new warning messages indicating that PIE is currently running.

  • Fixed issue where selections for unwrapped meshes were being used for focusing the viewport to the selection in the 3d viewport.

  • Fixed UV Editor to avoid loading content browser items when trying to figure out whether UV editor can be started on them.

World Building


  • Added wp.Runtime.UpdateStreamingOptim.Enable to enable it. This is off by default.

  • Added advanced options to control how aggressive the optimization is when using wp.Runtime.UpdateStreamingOptim.LocationQuantization and wp.Runtime.UpdateStreamingOptim.RotationQuantization.

  • Added support for masked materials with Merge Actors flatten material.

  • Added showing child actors of child Level Instances even when editing a Level Instance.

  • Added World Outliner filter "Only in current Data Layers" similar to "Only in Current Level".

  • Exposed DataLayerLoadingPolicy for licensees to be able to override the default OR behavior of Editor Is Loaded flag.

  • Renamed "Build Minimap" to "Build World Partition Editor Minimap" to remove confusion with in-game or HUD minimap.

  • Removed support on single actor packaging mode for One File Per Actor and Folder Objects.

  • Added events for HLOD registration/unregistration in the world for World Partition - HLODs

  • Added the ability to preview the pivot location when changing it from the Details panel when using the Level Instance Pivot Picker.

  • Pivot Actor Picker is no longer restricted to Level Instance actors.

  • Added editing of the HLOD Layer property for Actors inside Level Instances in World Partition

  • In editor World Partition builds that launch external commandlets are now cancellable.

  • Added scope transactions around WorldPartition EnableStreaming and CanBeUsedByLevelInstance properties so they can be captured as transactions.

  • In WorldPartition: IStreamingSourceProvider can return more than one StreamingSource.

  • Added TargetBehavior so a StreamingSource can be applied on its Targets or on all Targets excluding its targets.

  • Added Destructible HLOD support using HLOD modifiers for World Partition - HLODs

  • Added BugIt menu (prints BugItGo command in console and to clipboard) to WorldPartition Editor

  • Added the -DiffDirtyActorDescs option to World Partition - ResaveActorsBuilder commandlet to compare the old & new Actor descriptors.

  • Added the "-ActorClassesFromFile=" option to the World Partition - ResaveActorsBuilder commandlet to read a list of classes to filter on from a file (one class per line).

  • Added support for runtime HLOD modification to World Partition - HLODs.

  • An HLOD modifier class can be assigned to an HLOD Layer in World Partition - HLODs.

  • HLOD Modifier classes can inject new components during an HLOD build in World Partition - HLODs.


  • Optimized World Partition update streaming state by avoiding computing streaming source spherical sector intersection information when the source is a sphere and avoiding validating cell coordinate when already done. Also optimized FSquare2DGridHelper::ForEachIntersectingCells.

  • Added "Browse to asset" on Data Layer items in Data Layer Outliner.

  • WorldPartitionStreamingPolicy::UpdateStreamingState can now detect if there is nothing relevant to World Partition streaming changed and early-out.

  • Removed Data Layer AccentBlue color for Data Layers used by actor selection so that current editing Data Layers always keep their green color.

  • Double clicking on Data Layers in the Data Layer outliner now adds or removes the Data Layer to/from the editing context.

Bug Fix:

  • Fixed condition for bRenderOpacityMask to be correctly based on the OpacityMask property instead of Opacity property.

  • Fixed loading editor only material in FWorldPartitionRuntimeSpatialHashGridPreviewer when cooking.

  • Fixed when showing Actors and Level Instance content in the Data Layer outliner, not interacting with level instance part of a Data Layer.

  • Removed "Rename Data Layer" menu entry in Data Layer Outliner for maps using Data Layer Assets.

  • UWorld::AddToWorld now only calls FAssetCompilingManager::Get().ProcessAsyncTasks() on a MakingVisible streaming level if its time limit hasn't been reached.

  • Fixed crash when exiting PIE where World Level Instance subsystem is accessed by uninitializing instanced World Partition after world subsystems are deinitialized.

  • Foliage Actor type was not available in the Foliage palette even for non-partitioned worlds.

  • Fixed bad World Partition cell bounds when containing level instance actors.

  • Fixed crash in PIE/Cook in World Partition maps using old/unsupported Foliage Type Actor.

  • Fixed crash when loading Actors with child actor components when AActor::RegisterAllComponents/RerunConstructionScripts would recreate child actors and loading code would process old/destroyed child actors.

  • Fixed an issue with UWorldPartitionRuntimeVirtualTextureBuilder when rebuilding scene primitives after shader compilation completes at start of RVT builder commandlet.

  • Fixed Data Layers Loaded In Editor and Not Loaded in Editor flags not properly read from the EditorPerUserSettings config file.

  • Fixed check when using "Make Current Data Layer" after deleting a Data Layer in the outliner.

  • Fixed crash when stopping PIE and loading instanced partitioned worlds.

  • Fixed unloading of an instanced partitioned level with streaming enabled.

  • Fixed Foliage Replace With option where target foliage type is already used.

  • Fixed crash when opening Data Layer menu after closing/reopening the Data Layer Outliner.

  • Fixed crash when running with -server in map containing Actor Folders and fixup of a folder is necessary.

  • Fixed FWorldPartitionStreamingSource default ctor.

  • Fixed HLOD runtime Data Layers that were not properly assigned on HLOD actors generated for HLODLayers above first level.

  • When looking for the cell that contains a subobject in the World Partition level streaming policy, use the runtime hash in the World Partition as the outer instead of the World Partition itself.

  • Added a check to make sure that HLOD runtime grids that contain net relevant actors are flagged as not bClientOnlyVisible. Multiple HLOD layers can point to the same runtime grid. The runtime grid must be available on the server if any of the layers requires it.

  • The PackedLevelActor Blueprint now recompiles the skeleton class after clearing SimpleConstructionScript to avoid component name clashes when adding the new components.

  • Provides the full set of command line arguments as provided for the editor launch when invoking external commandlets (for HLODs/Minimap) with World Partition.

  • Fixed issue with HLODs being built before construction scripts were fully executed on their source Actors.

  • Reload current map when Build Minimap or Build HLODs commandlet fails

  • Replicate World Partition - HLOD Actors if any of their components needs to be replicated.

  • World Partition - HLOD Actors don't need to be loaded on the server if they have nothing to replicate.

  • Ensure Actors references are loaded when building HLODs. Specifically, parent actors could be missing, causing the HLOD source actors transform to be wrong.


  • Deprecate TargetGrid/TargetHLODLayer in favor of TargetGrids/TargetHLODLayers.



  • Implemented async loading of localization data, and extended dynamic loading to handle explicitly loaded plugins.

    • This change takes the existing async loading that was added for game localization data and expands it to cover all localization data.

    • Async localization tasks are chained together as dependencies to preserve the existing order of operations, and can be waited on at any point (for example, after a loading screen) by calling FTextLocalizationManager::WaitForAsyncTasks.

  • Introduced the keys debug culture.

    • When users switch to this culture, all the localization text that is displayed will instead display the localization key of the UI test.

    • This allows users to easily see the key of the localization text that is localized incorrectly or not localized at all, allowing them to track down the issue faster.

    • Users can change the culture using the command line argument -culture=keys.

    • They can also do the same in the in-game console.

    • If the key is too long, users can use a console variable Slate.LogPaintedText to log all keys painted on screen to match the full key in the output log.

  • Updated Smartling to download translations for files that are both in progress and published. This allows partial translations to still be exported to translated .po files.

  • Updated Smartling localization to use Smartling namespaces to reduce duplicated strings and leverage the string sharing feature for Smartling.


  • UX improvements for the in-editor culture picker.

Bug Fix:

  • Fixed the localization gather failing to gather text from external actor packages.

  • Fixed a localization warning for tvOS.



  • Separated Online Services Session information into constant FSessionInfo and mutable FSessionSettings.

  • Added IsPresenceSession method to Sessions interface.

  • Refactored UpdateSession method into UpdateSessionSettings and UpdateSessionMember.

  • Added auxiliary methods and operators to simplify update data operations.

  • Added ability for types of social users to override which interactions are available for a given user via overriding GetAllAvailableInteractions and HasAnyInteractionsAvailable.

  • Added OnNetworkConnectionStatusChanged event to FCoreDelegates.

  • Added GetNetworkConnectionStatus function to FGenericPlatformMisc.

  • Fixed social toolkit broadcast delegate unbinding.


  • Refactored USocialUser OnNewSocialUserInitialized to not use a global map.

Bug Fix:

  • Fixed order of arguments passed to UE_LOG_ONLINE to match the format types.

  • FWebSocketModule::Get now loads the WebSockets module if it is not loaded.

  • Added ensure and warning log when a local social user is not properly initialized.

  • Fixed bug to let initialization of Cloudkit finish before trying to read anything from it.

  • Fixed a patch check from running and ignoring the result when configured to skip.

Hotfix System


  • Added support for hot-fixing application variants of dedicated server files.



  • Added the FHttpManagerRequestCompletedDelegate delegate to the HTTP manager that is fired when an HTTP request completes. This will allow for games to add analytics around HTTP request completion.

  • Added HttpFwd.h for HTTP and HTTP Retry System forward declares.

Bug Fix:

  • Fixed issues with URL parsing.

    • Added missing bounds check and adjusted existing bounds checks to avoid potentially overflowing an int32

  • Fixed LastReportedBytesSent/Read not being reset on a new request.

Online Subsystem


  • Added GetVoiceChatRoomName method to sessions interface with EOS and EOSPlus implementations.

  • Updated AppleHTTP implementation to use NSURLSession by default instead of deprecated NSURLConnection.

  • Implemented AddRecentPlayers in friends GDK interface when using MPA.

  • Updated Facebook SDK on Android to 15.0.1 in OnlineSubsystemfacebook.

  • Added IUniqueNetIdEOS class to get Epic Account Id and Product User Id from OnlineSubsystemEOS net ids.

  • Upgraded EOS SDK to EOS-SDK-24099393-v1.15.5

  • Use console variable to "choose default gamertag" component for GDK username displaying, so developers can choose different gamertag modes to try out at runtime.

  • Engine plugins have migrated to setting specific API versions in EOS options structs, rather than API latest. Please see the OSS EOS "Upgrading the EOS SDK" documentation for more details.

    • EOS Engine plugins have migrated away from static asserts to catch updates to EOS SDK options structs, towards a deprecation like warning mechanism, which can be silenced by setting "[EOSShared] bEnableApiVersionWarnings=false" in the Engine ini hierarchy.

  • Online-related configuration has moved from Default to Base .ini config files to avoid overriding project settings.

  • Added OnlineExternalUINull OSS interface to allow emulating console/mobile platforms on PC.

    • Moved existing testing config variables to OnlineSubsystemNull.cpp and exposed them as proper console variables so they can be changed at runtime.

    • Added SupportExternalUI, RequireShowLoginUI, and ForceShowLoginUIUserChange options to emulate a platform user change during login.

  • Fixed some deprecations and issues found in OnlineSubsystemFacebook RESTful implementation.

  • Added MPA support for OnlineSessionInterface on GDK.

    • Can be switched on when a game does not rely on hopper matchmaking or playfab netdriver.

  • EOS AuthScopeFlags are now configurable.

  • Output console exe result in console window for Online Services.

  • Extended the OnlineGameActivity interface to allow for querying player's game activities.


  • Improved logging for USocialParty UpdatePartyConfig Completion.

  • Refactored OnlineSubsystemGooglePlay to update Google Billing Library to v5.0.0 and fixed several issues.

  • Updated FacebookSDK for iOS in OnlineSubsystemFacebook to v15.0.0 and removed unsupported functionality.

  • Refactored and cleaned up in app purchases implementation in OnlineSubsystemIOS.

Crash Fix:

  • Fixed crash in OnlineSubsystemGooglePlay for Android in 32 bit architectures when logging purchases information.

  • Fixed a crash when rematch after canceling matchmaking in joining game session state when using MPSD of OnlineSessionInterface by making it not able to cancel in joining session state.

Bug Fix:

  • Fixed OSS EOS CopyLobbyAttributes not updating existing keys.

  • Fixed an issue on GDK that some player names are truncated without reaching the length limit.

  • Steam GetLinkedAccountAuthToken now takes a TokenType parameter so you can ask for a specific token type.

    • For Steam, App and Session are valid options.

    • Passing an empty type defaults to App, but what is the default is also configurable.

    • In 5.0 GetLinkedAccountAuthToken returned APP tokens, and in 5.1 we made the breaking change to return SESSION tokens instead. This change has now been reverted back to APP tokens by default.

  • FUniqueNetIdRepl::ExportTextItem now wraps some net id values in quotes, to ensure they will import correctly with ImportTextItem. Net id types that import correctly without quotes will continue to export without quotes.

  • Fixed bHasVoiceEnabled being loaded from OSSPS5 config, not OSS config.

  • The -EpicSandboxId argument passed by EGS is now handled correctly, and selects the config artifact with the matching EpicApp and SandboxId pair.

  • Fixed iOS GameCenter login flow on OnlineSubsystemIOS that was assuming native login UI can be shown more than once and not triggering OnLoginComplete and OnLoginStatusChanged in cases the user rejected the login or log out/in from the GameCenter device Settings after moving to background

  • Resolved OSS EOS FUniqueNetIdEOS hashes not being stable when the net id mutated (for example, adding or removing PUID or EASID on account link or unlink), leading to broken sets/maps using the net id as a key.

    • OSS EOS and EOS Plus: Resolved OSS EOS and OSS EOS Plus net ids being incompatible, leading to crashes when playing together. OSSEOS will drop the platform id from OSSEOSPlus net ids, but this is recoverable with QueryExternalAccountIdMapping.

    • OSS: CreateUniquePlayerIdWrapper prefers to load a net id with the mapped OSS, if one is configured for the input net id type.

  • Fixed possible loss of precision in OnlineSubsystemGooglePlay when passing currency prices through JNI from GooglePlay Billing Library data.

  • Ensure recreation of XblContextHandle after reconnecting to network to avoid MPSD creating/updating issues on GDK.

  • Fixed online beacon authentication hang which occurs when multiple beacon connections from the same player are handshaking at the same time.

  • Fixed an issue causing non-deterministic OSSv2 SchemaCompatibilityIds.

  • Fixed an issue to set local name in the EOS lobby on create and join.

  • Refactored FOnlineAccountIdRegistryNull to be stable across service restarts.


  • Deprecated of the OnlineSubsystemOculus plugin.

    • Meta is now responsible for building and releasing the OSS Oculus plugin via their OculusPlatform which is available on the UE Marketplace.


  • Owning User Id attribute removed from EOS Sessions and Lobbies logic to prevent misuse.

    • Owning User Id retrieval in EOS Lobbies refactored to use the related EOS SDK logic.

    • The removed functionality in Sessions will be re-added when this same information is made available via EOS SDK.

Pixel Streaming


  • Multiple pixel streaming streamers can now connect to the same signaling server. This requires streamers to have unique IDs and players must now subscribe to an active streamer. Most of this is handled with changes in the Pixel Streaming Infrastructure git. Old behavior with single streamers connected shouldn't be affected and should still behave in the same way.

  • Added a new, experimental, unified framework for video encoding and decoding in Unreal Engine - AVCodecs.

    • Current support is for hardware accelerated H.264/H.265 on NVIDIA and AMD cards.

    • Further documentation and API stability will come in subsequent versions of Unreal Engine.

    • In 5.2 Pixel Streaming now uses AVCodecs for its hardware accelerated video encoding.

  • Added experimental VR Pixel Streaming support.

    • This requires the latest frontend infrastructure from the PixelStreamingInfrastructure repository found on Epic Games Github page.

    • This requires you to disable the OpenXR plugin if your VR headset is connected to the same machine as your Pixel Streaming application.

  • Added new console variables:

    • PixelStreaming.WebRTC.NegotiateCodecs: enables Pixel Streaming and whether Pixel Streaming should send all its codecs during handshake so peers can negotiate or just send a single selected codec.

    • PixelStreaming.ExperimentalAudioInput: enables experimental mixing of arbitrary audio inputs which can be fed in using the Pixel Streaming C++ API.

    • PixelStreaming.CaptureUseFence: enables whether the texture copy we do during image capture should use a fence or not (non-fenced is faster but unsafer).

    • PixelStreaming.DecoupleFramerate: enables whether we should only stream as fast as we render or at some fixed interval (potentially sending duplicate frames or skipping frames). Coupled means only stream what we render.

  • Added the ability to use multiple different video codecs at once.

  • Added debug information to onscreen stats about which codec is selected for encoding.

  • Added module startup logic to PSPlayer to always negotiate codecs. This is a temporary fix until we move to NegotiateCodecs being the new default globally.

  • Input handling moved out of Pixel Streaming into the new PixelStreamingInput module.

  • Added instrumentation to Pixel Streaming so it shows up in Unreal Insights.

  • Added the new IPixelStreamingSignallingConnectionInterface. This allows users to implement their own FPixelStreamingSignallingConnection that can use other protocols e.g. NATS.

  • Added the ability to stream render targets using Pixel Streaming blueprints.

  • Added support for DX11 with AMF.

  • Added support for get_ps_servers.bat and get_ps_servers.sh to pull down a release from Github.

    • Downloaded Pixel Streaming infrastructure now creates a DOWNLOAD_VERSION file that tracks the downloaded version and if the latest release version is mismatched the frontend is redownloaded.

  • Added binary websockets message support to Pixel Streaming streamer.

  • Added support to set custom "command" handlers for datachannel messages that are of type "Command". This is useful if your project needs to run an Unreal Engine command that is not supported out of the box by Pixel Streaming. Or alternatively, if you wish to override existing commands and change what they do.

  • The IPixelStreamingStreamer interface now supports passing arbitrary configuration strings to the streaming client upon establishing a connection. This is now used to inform the Frontend to default to Hovering mouse mode if streaming from the editor.

  • A TextboxEntry command was added to allow support for sending entire strings as opposed to character by character updates.

  • Add support for PixelStreaming VCam to resize UE viewport to match remote device resolution. This is useful when using the LiveLink iOS app with Pixel Streaming VCam as the streamed resolution will now match the iOS device.

  • Extended JSON handling in Pixel Streaming to handle nested JSON objects.

Crash Fix:

  • Editor streaming crash where window hashing function wasn't unique. Hash function has been made unique by incorporating the window title.

  • Pixel Streaming delegates causing a crash when using Linux dedicated server target.

  • Fixed Pixel Streaming AudioInputMixer crashing on shutdown when using -PixelStreamingExperimentalAudioInput.

  • Fixed deadlock issue that would cause Pixel Streaming streams to freeze and crash intermittently.

Bug Fix:

  • Shell version of get_ps_servers script was not copying files/folders beginning with ".".

  • Fixed stat PixelStreaming not working when streaming in editor.

  • Cursor now shows up by default when editor streaming and browser no longer needs url parameters /?hoveringMouse=true.

  • Memory leak in editor streaming that would occur when popups were open.

  • The built-in Signaling Server for Pixel Streaming directly from the editor now defaults to port 8080 when used on Linux. This now allows use of Editor Streaming on Linux without having to launch the editor with elevated permissions.

  • Fixed an issue where the streamer did not provide a port in its PixelStreamingURL.

  • Fixed a deadlock that could happen when using dx11 on AWS instances.

  • Fixed a crash when using -onethread and VPX encoding.

  • Fixed a Pixel Streamed application being unable to scale mouse input due to target window being nullptr at load.

  • Fixed Editor streaming where assumed editor window was always located at (0,0). This resulted in incorrect input when a window was placed to the left of the main editor window or when the editor wasn't maximized.


  • Version M84 of WebRTC.


Bug Fix:

  • Fixed WebSockets to follow Epic's Coding Standard for Inclusive Word Choice.



  • Deprecate half-implemented and unused FPlatformMisc::GetCacheLineSize to get runtime cache line size We currently have no use case for a runtime-queried cache line size and the function only existed on a subset of our supported platforms

  • Added IMediaCaptureSupport for macOS and iOS. This makes it possible to capture audio and video through the media framework.

  • Added a simple replay-based PGO Gauntlet task.

  • Added a TargetRule to remove FixedTimeStep/Deterministic mode from a project.

  • You can now run AutoSDK installation with Turnkey from any copy provider.

  • Added a new callback to staging that allows for finalization of staged files.

  • Added a default implementation of GetCookPlatform, which makes it possible for BuildCookRun to run without needing any platform-specific automation DLLs. Previously, cook and staging could run, but running and packaging till needed the platform automation DLLs.

Bug Fix:

  • CookOnTheFly now correctly applies PluginExtensions.

    • Plugins are now filtered using FPluginReference instead of FPlugin to make PluginExtensions discoverable.

    • Previously, PluginExtension .uplugin files were not added to the file list for NetworkFileServer due to the Plugin Manager searching only for the basedir of each plugin. Now, when the Plugin Manager tries to find plugins, it now caches the basedir of each child plugin belonging to an FPlugin, then merges the children into it. After that, NetworkFileServer can then find these directories, exclude them if they are not for the targeted platform, and make them available to the client. MSP 2/15/2023

  • Previously, installed builds generated without Sony platform support would fail to detect SDKs for other platforms. Now, non-Sony installed builds exclude incorrectly included Sony.Automation.json files.

  • Fixed PerPlatform property customization to list all platforms in editor properties, not just the ones that TargetPlatforms created.

  • Removed the PerObjectConfig flag from TextureLODSettings, because it was causing the class defaults to not be read in from BaseDeviceProfiles.ini. DeviceProfile needs to be PerObjectConfig, but TextureLODSettings does not, as it keeps its defaults in a normal class .ini section.

  • Moved per-user-facing settings from ProjectPackagingSettings into a new class, UPlaformsMenuSettings. This prevents projects from inconsistently writing settings for the same class to both DefaultGame.ini and Saved/Game.ini, which can cause issues where the editor has one value that doesn't match a target platform.

  • StagingDirectory, which is the user's location to store archived builds, is no longer exposed in settings.

  • Targets with names like "Foo_Mac" are no longer treated as platform extensions if they aren't under a "Mac" directory. Platform extensions will always include the Platform's name as part of their name.



  • Added Gauntlet PGO Profiling support on Windows platforms. Include -PGOFastGen to enable /FASTGENPROFILE for a better framerate during PGO Profiling. The profiling system now favors the PGC file that matches the executable when building PGO Optimize builds rather than failing.

Crash Fix:

  • Fixed a crash with Electra player when running DX11 on PC.



  • Moved to the new 15.0.1 LLVM Linux Toolchain

Bug Fix:

  • Fixed a packaging failure on Linux when the project path contains a space character.

  • Fixed Linux touch ID handling.

  • Fixed a bug that would cause UMG Overlay mouse/touch input to fail after launching fullscreen Wayland application.

  • Fixed an issue wherein installed builds on Linux didn't have a stable UUID from machine to machine. This solves problems trying to share projects in a collaborative environment.



  • Input chords on Mac now show Option key instead of Alt.

  • The Mac ARM cache line size is now 128 to improve support for Apple M1/M2.

  • Added handling for safeAreaInsets for monitors with notched screens in fullscreen mode.

  • Remove some unused and unexecutable code around getting the monitor name.

  • Updated minimum macOS requirements to Xcode14.1 & macOS12.5

  • The Mac editor window will no longer move to the front and cover other floating panels. Now it will work similarly to other platforms.

  • Undefine PF_MAX so it can be defined by UE for pixelformat instead of socket.h. This avoids an unnecessary include chain when including Cocoa.h.

  • Re-enabled DatasmithC4DImporter plugin now that it has support for Arm64 Macs.

  • Moved boilerplate program startup code into a shared Obj-C class, MacProgramDelegate, to make GUI programs simpler to create and maintain on Mac.

  • If CommandLineTools is detected as the build tools location (xcode-select -p), throw an exception with instructions on how to fix it, as the full Xcode solution is required for building from the commandline.

  • Stop logging the Xcode-select output every run.

  • Remove Catalina and Metal 2.2 support from Mac.

  • Improved the project generator solution for Xcode 14 requiring plist file for Mac local signing.

    • Removed the "Mac short circuit" blocks of code in the project generator, as it was skipping the code that sets up PLIST and BUNDLE_IDENT settings, which Xcode14 needs.

    • The project generator now directs Xcode towards the temporary plist files that it creates.

    • The project generator now copies the final plist on top of the temp plist file so that Xcode will pull the final plist into the .app at the end.

  • Updated Mac app and .uproject file icons for new Unreal Engine logo.

  • Mac builds now default to compiling for Host architecture, not Intel.

  • Mac now compiles universal binaries by compiling each architecture separately, then using lipo to merge them together.

  • Codesigning frameworks is now allowed under programs without a .uproject.

  • Added OneWorkspacePerPlatform and OneRunTargetPerPlatform modes for modern Xcode projects. These modes are disabled by default, as they are not production-ready.

Crash Fix:

  • Fixed a rare FrontendSession crash on Mac when viewing tooltips.

  • Fixed crash on Mac in Chromium Embedded Framework when pressing keys in Web Views (like Quixel Bridge) that are bound to the main menu.

  • Fixed a crash on shutdown in Mac programs. This was caused by TaskGraph shutting down earlier than some Stats code that uses it.

Bug Fix:

  • Fixed an issue with hostname-to-IP resolution with COTF/Sockets on MacOS.

  • Fixed an issue where Hot Reload would fail on Apple Silicon Macs, as Unreal Build Tool compiles the changed module as x86_64 by default. Now it checks the system architecture to determine what to compile for.

  • Fixed various threading and menu initialization issues with Programs on Mac.

  • Added a warning dialog on macOS (13.0 - 13.3) to ask users to update to avoid dlopen crash.

  • Fixed the Mac linking of all dependent .dylibs when .cpp changes are made that don't require relinking.

  • Fixed the path to engine directory for projects that are under a differently named directory on Mac.

  • Fixed MacPlatformProcess child write pips to block so it doesn't blow the buffer for spammy commands

  • Fixed Mac Perforce exe location discovery code for cases where it finds multiple P4 locations.

  • Rolled back removal of MacOSXVersionCompare, which caused a cook error on Mac.

  • Fixed an issue with Xcode having stale bundle identifiers when codesigning Blueprint projects. Xcode's build cache was caching old data. This change will force the bundle ID to be there so the cache won't cause problems.

  • Fixed symbolication in CrashReportClient on Mac with universal applications.

  • Always codesign Mac builds for new Xcode requirements, so Blueprint projects from InstalledBuilds will be signed correctly.

  • Fixed warning about always running a script phase in Legacy XcodeProjects.

  • Removed FixDylibDependencies on Mac by making "stub .dylibs" to mimic what Windows does with import libs, to solve circular dependencies

  • Fixed executable path for programs under Restricted.

  • Fixed paths when there's an ExeSubDir in the Target.



  • By default, runtime Virtual Textures on iOS and Android use 2 tiles as a maximum number produced per-frame.



  • Hololens: Usernames are no longer logged to align with other platforms on privacy.

  • Added new "Set Environment Blend Mode" node to set the OpenXR Environment Blend Mode. This node is currently experimental.

  • Swapchain format list is now passed to FOpenXRHMD::CreateSwapchain only when a non-sRGB format is requested.

  • Inserted XR Device Visualization Component in VRTemplate. The component is currently disabled but can be activated from its details panel using the Is Visualization Active checkbox. This can also be toggled from blueprints with the new Set Is Visualization Active Blueprint node available on the components.

  • HoloLens: Implemented ComputerName() and GetCurrentProcessId() functions.

  • Added the OpenXR Vive Tracker extension plugin to support Vive Trackers in-game and through LiveLinkXR.

  • Pico-VR version 3 controller model support has been added.

  • Added OpenXR headset connection while the editor is running.

  • Added Instanced Stereo Rendering & Multiview logging at XR runtime initialization.

  • Reintroduced mobile preview support in VR PIE (using mobile multiview fallback).


  • Added implementation of GetReferencerName() as required by FGCObject refactor.

  • OpenXR input is now additionally routed to the Enhanced Input editor subsystem.

  • OpenXR: Refined CopyTexture operations for layer and spectator screen usage.

  • Sped up instanced stereo rendering by avoiding branching in shaders. The view buffer duplicates per-view properties and uses the view id to index into them.

Crash Fix:

  • Hololens SkyAtmosphereComponentCrash fixed.

Bug Fix:

  • Fixed a bug that caused the SetShowDeviceModel function of Motion Controller Component not to refresh the visualization.

  • OpenXR: Fixed an off-by-one error which resulted in a trailing '\0' character embedded in FNames returned by FOpenXRHMDModule::ResolvePathToName.

  • OpenXR: Emulated layers swapchain will not use the prescribed layer format.

  • Removing ARPins now correctly releases corresponding ARKit Anchors.

  • Fixed a bug where an empty project name resulted in the project version being used as the application name for SteamVR.

  • Fixed issues with forward local lighting in mobile multi-view, so spotlights and other similar lights will now show up properly in secondary views (like the right eye).

  • Fixed foveated Variable Rate Shading behavior when not using instanced stereo. Now correctly uses two foveated patterns (one per eye), rather than a single pattern for both eyes.

  • Fixed raytracing shaders being affected by vr.InstancedStereo setting.

  • Fixed Lidar point cloud shader compilation issues in ISR.


  • Deprecated GetViewConfigurations and GetViewLocations in IOpenXRExtensionPlugin.


  • Pico-VR version 2 controller model support has been removed.

  • Removed clip distance method of ISR to reduce code paths (now platforms have to support multi-viewport rendering to support instanced stereo rendering).




Bug Fix:

  • Fixed GPU hangs encountered when utilizing derived PSOs on Lockhart.

Platform Mobile


  • Translucency lighting type is now supported on mobile.

  • The reflection capture's encoded HDR data has been changed to RG11B10 format. It skips reflections for simple translucent materials on both mobile forward and deferred. Translucent materials fall back to single reflection or sky capture on mobile deferred if clustered reflection is disabled.

  • Added TAA pixel shader to use the hardware frame buffer compression on mobile devices.

  • Stationary/movable RectLights now render approximately as SpotLights on mobile. MSP 2/15/2023

  • Added support for GBuffer access in translucent materials with Mobile deferred shading enabled. Not yet supported with OpenGL ES.

  • Addressed lighting scenarios for Reflection Captures for mobile.

  • Added bSupportsClipDistance to DDSPI for mobile shader platforms that support SV_ClipDistance.

  • Improved quality and speed of runtime ETC compression for Virtual Textures on mobile platforms.

  • Improved quality of a certain compressed runtime Virtual Textures on mobile platforms by using sRGB color space where appropriate. OpenGL ES, which does not support texture views, will allocate separate physical spaces for sRGB and Linear data when needed.

  • Added mobile renderer support for thin translucent materials using dual src blending with DXC if there is hardware support. Not all Android devices support dual src blending, and it's disabled on IOS because it doesn't work with MRT.

  • Added a new occlusion culling method based on GPU feedback from occlusion geometry. This method reduces the number of drawcalls compared to traditional occlusion queries. It can be activated with r.OcclusionFeedback.Enable=1. Works only with mobile rendering at the moment.

  • ShadowQuality is now set to 2 for High-quality device profile buckets on Android/iOS to match quality between Forward and Deferred shading.

  • Added Variable Rate Shading support for mobile devices where the VR_KFR_fragment_shading_rate extension supports per-draw VRS, but not image attachment-based VRS (for example, QCOM 6x devices).

  • Mobile deferred shading will use a view combined ShadingModel mask as an optimization for lighting passes.

Crash Fix:

  • Fixed a crash on mobile OpenGL when MSAA is enabled without the GL_EXT_multisampled_render_to_texture2 extension.

  • Fixed a crash that occurred in FShaderCode::GetWriteAccess when r.Shaders.ExtraData=1 on Mac.

  • Fixed a crash on Android 9 Adreno 630 devices that occurred when rendering an image to a render target, sampling that image in a shader at the same time, but using different mips for each application.

Bug Fix:

  • Fixed a bug preventing modulated shadows from appearing in shadow preview mode.

  • Fixed an issue causing GPUScene to incorrectly change velocity on mobile.

  • Added LinearFilter texture capability flag to fix an issue preventing R16G16_UNORM from working with linear filter on some Mali devices.

  • Mobile TAA now processes before BloomSetup to fix bloom flickers.

  • Vertex color support was missing from InstancedStaticMesh on mobile. This issue has been corrected.

  • Fixed a crash on mobile OpenGL when using Retainer Boxes in UMG.

  • Fixed rendering issues with deferred decals on OpenGL.

  • Fixed a bug that caused CustomDepth to fail on mobile OpenGL when not writing to CustomStencil.

  • CSM caching now invalidates if FOV has changed.

  • Translucency for Mobile will now render when Debug View is enabled.

  • Fixed missing Local Lights if overlapping lights are more than 4.

  • Fixed missing per-instance CustomData in material pixel shaders.

  • Fixed issues with reflection environment rendering in projects that use Mobile deferred shading.

  • Fixed an issue where instance-bound extents weren't updating properly when using the mobile renderer.

  • Updated the mobile renderer to render the geometry when using "Sort Triangles".

  • Fixed issues with ASTC HDR texture compression.

  • Addressed overly intense specular lighting with mobile rendering.

  • Fixed Virtual Texture shimmering on mobile platforms. This adds manual Virtual Texture filtering on platforms that do not use TAA by default.

  • ScreenSize updates occur in MobilePreview when you select an LOD.

  • Fixed cases where the World Position Offset material attribute was ignored on Mobile platforms if project uses GPUScene option.

  • Niagara particle lights now work properly with Mobile deferred shading.

  • Fixed a normal map compression mismatch between runtime and streaming Virtual Textures on mobile platforms.

  • Fixed issues with YCoCg compression variants for runtime Virtual Textures on mobile platforms

  • Fixed a typo for "SecondaryUpscale" in a mobile post-processing.

  • Fixed a crash when creating the Vulkan render pass.

  • Mobile Depth of Field now works correctly on D3D11 and Desktop Metal shader platforms.

  • Fixed an issue preventing Android safezones from updating when orientation changed from landscape to reverse landscape.


  • Removed SupportsCopyImage as GL ES 3.2 standard has glcopyImageSubData.



  • Optimized DXC for OpenGL to reduce driver impact when uploading Uniform Buffers.

  • Set Java 1.8 in sourceCompatibility and targetCompatibility on the engine's build.gradle.

  • Added Swappy support for Vulkan RHI.

  • Added AdMob app id and targeted tag/ratings selections to Android project settings.

  • Update Swappy to the latest version from Google AGDK. This implementation is modified to always use the Java DisplayManager and refresh rate selection.

  • Enabled Swappy on Android by default.

  • Added device profile for newly-released Mali-G7xx devices such as the Mali-G715 Immortalis.

Crash Fix:

  • Fixed a crash when playing a mp4 from UMG.

Bug Fix:

  • Fixed a copy-paste issue in Android MediaPlayer14, WebView and CameraPlayer14.

  • Fixed memory leaks on exit in Android applications.

  • Fixed issues throwing truncation warnings for Android modules.

  • Added support to receive multicast packets through the Wi-Fi interface. This is needed for LAN sessions to work on Android. You can enable this by marking a new checkbox in Android project settings under Advanced APK Settings to add the CHANGE_WIFI_MULTICAST_STATE permission and enable support.

  • Made the center of default Android icons opaque to fix issues with black backgrounds.

  • Fixed XBox and Razer wired controllers on Android 12+.

  • Android WebBrowser is now able to handle mouse input. This input is forwarded to webview as touch events.

  • Use an alternative bitmap rendering mode to support the WebBrowser 3D widget on Quest devices.

  • AndroidToolChain now uses the common ClangToolChain, and it will properly escape preprocessor definitions.

  • Allow UPL to use tools schema.

  • Allow "build" as part of project names.

  • Fixed a missing flag on PendingIntent calls (now required for Target SDK 31+).

  • Added key support for Android WebBrowser 3D widget.

  • Added additional Android controller ids for XBox wired controllers and Razer Kishi.

  • Fixed installation of Android NDK through the SetupAndroid.command script on macOS.

  • Fixed AAB archiving issue that occurred by incorrectly adding '-' when architecture was not specified.

  • Fixed a bug that occurred when rendering custom depth on OpenGL.

  • Fixed an issue causing Slate elements to not render correctly on some Android devices with Adreno GPUs.

  • G16 Grayscale textures will fall back to a R16F format, as R16 Unorm format is not universally supported on all Android devices.

  • Updated Google Play Services versions to remove CVE-2022-2390 issue.

  • Added an alternative Android File Server startup method. This solves launch failure and bind listener issues.

  • Fixed an issue with compiling of AFSProject on Mac.

  • Fixed issues causing Linux to fail to start Gradle.

  • WebGL and video playback is now permitted in 3D WebBrowser on Android.

  • Fixed issues with Oculus hardware acceleration.

  • Set buildToolsVersion in subprojects to match the main project for Android packaging.

  • Ignore focus events on Android to fix black screen on start problem with splitscreen mode.

  • Use commandline tools 8.0 instead of Latest for SetupAndroid scripts.

  • Fixed a missing WindowHandle in Swappy Vulkan initialization.

  • Disable Vulkan selection on Adreno 660 devices with driver 0525 or older due to flicker bug.


  • Removed old GoogleGameSDK files that are no longer needed.

  • Removed Java version of MemAdvisor.

iOS, tvOS, and iPadOS


  • Added module to link against Swift libraries. Some external SDKs may need to link against Swift standard library. You can achieve this by adding the following to the module ModuleRules subclass: PrivateDependencyModuleNames.Add("Swift");

  • Add support for XCFrameworks. XCFrameworks can be directly consumed by a module. They can be added like a regular Framework to the module ModuleRules subclass: PublicAdditionalFrameworks.Add(new Framework("FrameworkName","Path/To/Framework/FrameworkName.xcframework"));

  • arm64 is now set as the default architecture for iOS when no explicit argument is passed to UBT.

  • Added tvOS as a compilable target for the Bink Decoder library.

  • Added support to enable Objective-C ARC (Automatic Reference Counting) for individual modules. ARC support is set to off by default to keep previous behavior. You can enable it for an individual module by setting bEnableObjCAutomaticReferenceCounting = true; in its ModuleRules subclass. If ARC support is enabled the module should not consume shared PCHs. The engine won't use ARC extensively in the short term, and using shared PCHs will result in a compile error because shared PCHs were compiled with different flags than expected to be consumed. Avoid exposing public Objective-C interfaces on the module boundaries.

  • Enabled tvOS support for Electra.

  • Added a popup window warning on Metal platforms when no cooked content is found at startup.

  • Rebuilt soundtouch with Xcode 13.2.1 to match bitcode on iOS.

  • Fixed warnings in build health related to iOS 15.

  • Cleaned up Clang check for older Xcode versions.

  • Added bluetooth keyboard support on tvOS.

Bug Fix:

  • Fixed an iOS compile failure when ISPC is enabled.

  • Fixed missing quotes when Gauntlet runs on iOS with automation test command.

  • Fixed iphone packager .sln file.

  • Make sure the certificate chain used to evaluate trust is checked for nil when copied.

  • Fixed an issue with FIOSPlatformApplicationMisc::RequiresVirtualKeyboard that prevented iOS builds.

  • Add a default TVOS DeviceProfile to allow Niagara to correctly cook required content. This allows Niagara CPU Particles to appear on tvOS devices. Niagara GPU Particles are not supported on Apple A8 devices (such as AppleTV HD) due to missing support for IndirectDraw in Metal.


  • Disable bitcode by default due to Apple's removal of bitcode support for Shipping builds being uploaded to the AppStore. Refer to Apple's Xcode14 release notes for more information.

  • Disabled unsupported PixelFormats BC4, BC6H & BC7 for iOS/tvOS and enabled D24.



  • Implemented support for the PixelDepth shading node for Ray Tracing and Path Tracing shaders.

  • Added support to write screenshots in EXR format when HDR is enabled, on platforms not supporting OpenEXR. The color space used is scRGB.

  • ISPCTexcomp fix for inconsistent behavior normalizing normals unlike all other TextureFormats. Maintain legacy behavior for existing textures; new textures with bUseNewFilters do not get normalized by ISPCTexcomp.

  • Added a soft-version of the ISM descriptor that can be used to store templates without loading the resources.

  • Added working color space support when rendering volumetric clouds with conversions from the sRGB gamut.

  • Reconnected the r.LUT.Size console variable for controlling LUT resolution in post-processing.

  • Enabled Virtual Shadow Maps 'Distant Lights' feature by default, significantly reducing the cost of non-moving local lights. Moving lights are automatically exempt from force caching.

  • Changed how the hair binding skeletal mesh scene proxy lookup is done. This fixes cases where the wrong skeletal mesh proxy is used when the skeletal mesh recreates its proxy while being used by the groom instance.

  • Prevented unnecessary ray-traced shadow tracing for hair strands, which saves 25% of the shadow cost in test cases with many lights.

  • Improved per-CV groom color precision from 8/8/8 bits to 11/11/10 bits.

  • Ray tracing instance counter stats now report active instances and total instances separately. Previously only active instances were reported, which is sometimes misleading. The total number of instances affects the TLAS memory allocation, the instance buffer building compute shader, and TLAS build itself.

  • Added "Max World Position Offset Displacement" to materials. It is used to clamp World Position Offset to a fixed distance, and to automatically extend the culling bounds of meshes, including the cluster culling bounds of Nanite clusters. Also added the ability to visualize clamped pixels in the "Out of Bounds Pixels" visualizer.

  • Added the "r.SceneDepthHZBAsyncCompute" console variable to run HZB generation on async compute. This prevents GPU under-utilization in scenes where a very large number of individual occlusion queries are issued. The "r.SceneDepthHZBAsyncCompute" console variable has the following possible values:

    • 0: Don't use async compute (default)

    • 1: Use async compute, start as soon as possible

    • 2: Use async compute, start after ComputeLightGrid.CompactLinks pass

  • Added PrintBool to ShaderPrint.

  • Added support for using a stride to skip marking virtual shadow maps every pixel to improve page marking performance (r.Shadow.Virtual.PageMarkingPixelStrideX|Y).

  • Updated "HairDescriptionBulkData" to use "FEditorBulkData". This prevents loading descriptor data when loading groom assets. It also allows groom assets to be virtualized.

  • Added MeshDeformer support for Groom. This experimental initial iteration allows you to assign a mesh deformer to a groom instance. The mesh deformer has access to most hair control point attributes. It can write out modified positions (moved/trimmed/...).

  • Decreased the number of unique materials for hair in favor of supporting larger/hero groom. This is a short term fix. Primitive IDs should instead reference their material through cluster information.

  • Added diagnostic logging / screen message for showing non-nanite objects overlapping many virtual shadow map pages (r.Shadow.Virtual.NonNanite.NumPageAreaDiagSlots).

  • When a groom component is attached to a skinned mesh, the skinned mesh is now forced to update its dynamic data immediately, instead of (optionally) deferring them. This makes GDME optimization compatible with groom simulation.

  • Added "ClumpID" and "Per-Vertex bake AO" attribute support for groom geometry.

  • Added ShaderPrint zoom.

  • Unify all hair environment lighting integration. Evaluation is now in a common place and is consistent across calling sites. This changes Lumen hair integration which now simplifies evaluation (integration cost is now smaller). This also ensure dual scattering is properly evaluated for the hair pixel requesting it (such as having "use complex transmittance" bit enabled).

  • Enabled curve reordering by default, and fix invalid strand radius computation that occurred during groom building, when curve reordering or curve decimation was enabled.

  • Fixed "FScene::IncrementFrameNumber" to be thread safe (as it is called from the game thread).

  • Static mesh offline ray tracing data is now released immediately if ray tracing is known to be disabled at run-time due to user settings.

  • Added shader print assert.

  • Fixed an issue where RT geometry of hair strands was not visible in the RT debug view mode.

  • Add a groom view mode menu to the level editor. Unified most groom debug rendering to go through the view rather than console variables.

  • Mark a primitive scene proxy as excluded from ray tracing if it has no static meshes. Previously it was only excluded if it has no ray tracing geometries, however it is possible for a primitive to have a RT representation but no static meshes. For example, this may happen in the editor when trying to isolate a mesh section with no triangles.

  • Fixed issue in Global SDF that occurred when multiple objects with Mesh SDF that extended outside the bounding box overlapped.

  • Screen Space Reflections, Light Functions, Post Process Deferred Decals, and Nanite rendering passes are now affected by Variable Rate Shading.

  • Changed attribute storage for hair strands. All attributes are now stored in a single ByteAddress buffer, which simplifies adding new or optional attributes. All attributes can now be optional, which saves memory. Attributes which are at per-curve frequency are now stored once per curve instead of once per vertex. This saves memory with an indirection cost. Move vertex to curve mapping into the groom resource rather than the groom resources. GroomAsset size shrink by 5/6% and binding asset size shrink by 45% in simple case.

  • Compute and sample Global SDF in Translated World Space.

  • Updated the Variable Rate Shading manager to support using shading rate images from multiple sources. The currently available methods are "Foveated Shading (XR only)" and "Contrast Adaptive Shading". If more than one shading rate source is active, the manager uses the roughest provided shading rate for each pixel.


  • Improved the quality of mips for normal maps with the new bNormalizeNormals option, which is on by default for new textures.

    • Normal Maps were not renormalizing normal vectors after generating mips, which caused reduced length normals in the mips, which then bends them when we drop components for compression in BC5 or ASTC.

    • This will not change existing content, but will only normalize when the new option bNormalizeNormals is enabled.

  • Volumetric Fog is now a lot more stable under Dynamic Resolution.

  • Implemented changes to avoid calling GetPrimitiveData() redundantly. This function is large and contributes significantly to the shader compilation cost.

  • Improved memory management of Nanite Ray Tracing, which prevents out-of-memory (OOM) crashes in large projects.

Crash Fix:

  • Fixed crashes when importing groom only guide cache or having zero size radius.

  • Fixed several crashes in the Editor by removing "FLandscapeComponentSceneProxy"'s direct usage of a "UMaterialInterface" on the render thread.

  • Fixed invalid assert in groom component causing crash when deleting a groom LOD while ray tracing is enabled.

  • Fixed issues in HeightField object management which caused crashes and issues with height fields missing from the Global Distance Field.

Bug Fix:

  • Fixed a Materials issue where the InstanceToWorld node was not working correctly in some cases due to incorrect values in the transform matrix.

  • Implemented a fix to allow the UCableComponent to render to the CustomDepth buffer.

  • Fixed an incorrect Large World Coordinates error tolerance assert in TLargeWorldRenderScalar.

  • Fixed a use-after-free bug on Cascaded Shadow Maps (CSM) render target DebugName. Render target names are not copied, and so must be statically allocated to survive the function scope.

  • Corrected color display of grayscale compression with virtual textures when previewing textures.

  • Fixed a bug that caused the Virtual Shadow Map (VSM) cache to be invalidated, by adding a separate VSM cache for the views of each Scene Capture component. The memory management of the various page tables will be improved in future versions.

  • Fixed a bug where the custom culling query was being provided with the wrong VisibilityId value.

  • Fixed the offset of labels in the Nanite and Lumen overview visualization modes.

  • Fixed an inaccuracy in comparison of Instanced Static Mesh (ISM) descriptors if either did not have its hash computed.

  • Ensured that Sky Atmosphere coefficients are properly converted to the working color space.

  • Fixed an incorrect instance local to world matrix in Materials due to NEEDS_INSTANCE_LOCAL_TO_WORLD_PS being overwritten by a vertex property after a pixel property enabled it.

  • Fixed an ensure failure in the Dynamic Resolution code where a console variable was being read using the wrong accessor function.

  • Fixed a use-after-free bug on the Cascaded Shadow Maps RenderTarget debug name.

  • Fixed an overflow issue in morph target blending that could cause visible cracks in the geometry when blending many large morphs.

  • Fixed ‘ambiguous type for bit shift' shader compiler spam from "OcclusionMask |= bIsBentNormalOccluded ? (1 << TracingRayIndex) : 0;"

  • Fixed the LightingOnly view mode so that it works correctly on Static Meshes when Nanite is disabled.

  • Fixed astcenc swapping RB in TextureFormatASTC. astcenc is off by default.

  • Fixed a bug so that Mip Gen filters on cube map faces clamp instead of wrap. This could have caused visible seams at cubemap face edges in mip-maps. This has no effect on 2x2 or angular mip filters.

  • Implemented changes to ensure that the light component color temperature is based on the working color space instead of sRGB.

  • Implemented changes so that opaque extension rendering occurs after FX rendering. Previously, opaque extension point rendering occurred after hair. This previous order was problematic when opaque geometry was rendered behind hair, as it caused a haloing effect around the hair.

  • Fixed missing interpolation pass of cards/meshes instance being outside of view. This was causing invalid shadow when the groom was visible in shadow, but in primary view.

  • Fixed non-determinism in Groom builder.

  • Run UpdateDeferredCachedUniformExpressions() before BuildRayTracingMeshCommands() Uniform expression cache explicit update may not run for objects that are off-screen, but it must be done before objects are added to the ray tracing scene. Normally this work is done through FMaterialRenderProxy::UpdateUniformExpressionCacheIfNeeded, however ray tracing material processing (FMaterialShader::GetShaderBindings, which accesses UniformExpressionCache) is done on task threads, therefore all work must be done here up-front as UpdateUniformExpressionCacheIfNeeded is not free-threaded.

  • Fixed an issue where Variable Rate Shading caused artifacts on materials with Opacity Mask blend mode when Multi-Sample Anti-Aliasing (MSAA) was enabled.

  • Fix loading all binding assets when opening a groom asset.

  • Add explicit unsigned uint8 storage annotation for EMeshPass::Type enum. Fixes FCachedMeshDrawCommandInfo::MeshPass bitfield when EMeshPass::Num is exactly 1 << EMeshPass::NumBits and current compiler uses signed default enum storage. Improved error message in FPrimitiveSceneInfo::CacheMeshDrawCommands that checks FCachedMeshDrawCommandInfo::MeshPass field.

  • Fixed an issue where groom binding failed to project hair on coarser skeletal meshes.

  • Fixed an issue where hair scene scattering did not run when the scene did not have a sky component.

  • Fixed crash in groom builder that occurred when using the hair rigging feature.

  • Enabled GPU scene view for hair strands vertex factory. This fixes missing lighting channel support for hair strands geometry with path tracing.

  • Fixed hair strands rendering with stereo rendering. Hair tile rendering not taking into account View.MinRect and hair voxelization had incorrect traversing for the second view. This was due to voxelization being expressed relative to the view origin (for precision purpose), and the offset correct was incorrect for the secondary view.

  • Fixed a crash that occurred when running hair in the Forward Renderer with anti-aliasing set to Multi-Sample Anti-Aliasing (MSAA).

  • Fixed invalid indirect arg reading and writing in groom systems on platforms that require 16 bytes alignment.

  • Fixed an issue where the shadow mask texture was incorrectly marked as used due to the preview shadows indicator, when the preview indicator was not actually rendered because of a missing Material (for example, in cooked builds).

  • Fixed a hair crash with nDisplay.

  • Fixed an invalid binding warning that occurred when a skeletal mesh did not have skin cache or mesh deformer enabled, while groom required skinning binding.

  • Fixed a bug where static mesh dynamic ray tracing instances were using cached Materials with the incorrect LOD.


  • Deprecated RHISupportsComputeShaders(). The minimum supported feature level (ERHIFeatureLevel) supports compute shaders.

  • Support for Multi-GPU Alternate Frame Rendering (AFR) was removed. Many features added in UE5 cannot be made to function with AFR, and no known projects are using it. AFR command line options have no effect, and related interfaces have been marked deprecated.

  • The bForceAllBC23ToBC7 option was removed from TextureFormatOodle.

Known Issue:

  • The Light Mixer may not initially display the intended property columns and/or any properties at all. You can restore the column defaults by right-clicking on the column header and selecting "Attenuation", "Intensity", "Light Color", and "Light Channels" from the list. You should only need to do this once for it to work across all instances of the engine.



  • Non-blocking Ray Tracing Pipeline State Object (RTPSO) creation is now enabled by default.

  • For Ray Tracing, the maximum payload size is now computed from the shader's payload type.

  • Added a new method to register payload types so that plugins can more easily describe custom payloads they may be using.

  • For multi-GPU, it is no longer necessary to set the r.AllowMultiGPUInEditor console variable. The command line option -MaxGPUCount=N is now the only requirement. In the editor, multi-GPU is supported by GPU Lightmass and the Path Tracer (the latter also requires the console variable r.PathTracing.MultiGPU=1).

  • Defer SkinnedMeshComponent Force/ClearMotionVector updates until the end-of-frame to be processed together with regular dynamic data update. This reduces the number of times the bone buffer, morph buffer, and cloth sim buffer are written into, to just once per frame.

  • Implemented an optional UAV access to render targets created by the Kismet Rendering Library for compute shader access.

  • Added logging if tpause support is enabled.

  • Make RenderDocPlugin always load. Now we need to use "-AttachRenderDoc" on the command line to use the plugin. This unifies behavior with the PIX plugin. Also added a plugin setting to the Project Settings to auto attach without the command line for people who want to have RenderDoc always on. See the Unreal Engine RenderDoc plugin documentation for more details.

  • Added a force dynamic data update flag to the SkinnedMeshComponent. When set to true, it is the equivalent of r.DeferSkeletalDynamicDataUpdateUntilGDME=0 and r.RHICmdDeferSkeletalLockAndFillToRHIThread=0. This allows skeletal mesh component to bypass "r.DeferSkeletalDynamicDataUpdateUntilGDME=1" and update during the end-of-frame skin cache batch update.

  • Added video memory tracking in Unreal Insights for the Direct3D 12 buffer.

  • Fixed Tpause feature on certain mainboards where WaitPKG is returning true even though some virtualization settings in the Bios can disable Tpause.

  • Moved FRayTracingInstance from Engine module to the Renderer module.

  • Enabled ComputeFramework on Vulkan for PC.

  • Added a Render Resource Viewer under the Tools menu in the Editor. This viewer lists tracked RHI resources, with filtering ability by resource flags and search by keyword.


  • SendAllEndOfFrameUpdates is called less aggressively by Reflections.

Crash Fix:

  • Fixed an Editor crash that occurred when a Blueprint is open, and the user right-clicked on the Content folder and selected Sync.

Bug Fix:

  • Conditionally generate Material platform stats for GPUSkinVertexFactory only when the UsedWithSkeletalMesh, UsedWithMorphTarget, UsedWithCloth boxes are enabled. This fixes an issue with GPUSkinVertexFactory throwing shader errors when the Material is not used with a Skeletal Mesh.

  • Fixed a bug during shutdown where some static render resources were cleaned up late, and in unpredictable order. This caused them to get stuck in the queue, which prevented the concurrent linear allocator from being properly cleaned up.

  • Fixed skeletal mesh LOD flickering when opening multiple Editor viewports.

  • Fixed an issue where the bone transform revision number did not update when a lead pose component could not render, and therefore did not have a valid mesh object.



  • Added SetAffectDistanceFieldLighting as a Blueprint callable function to UPrimitiveComponent.

  • Implemented subsurface shadowing with Virtual Shadow Map one pass projection for local lights. A dither noise is used to approximate the subsurface shadow falloff in the bits provided by the one pass projection shadow mask. This can produce some minor banding in motion. If necessary, disabling one pass projection will work around this limitation.

  • Added the ability to adjust the adaptive ray count heuristic to be less aggressive by setting the console variable "r.Shadow.Virtual.SMRT.AdaptiveRayCount" to larger numbers.

  • Added the console variable "r.ReflectionCapture.EnableDeferredReflectionsAndSkyLighting" to disable reflections and sky contribution in reflection captures.

  • Moved Distance Field Ambient Occlusion (DFAO) out of ShadowQuality and into the GlobalIlluminationQuality scalability group, so that Medium GI gives DFAO.

  • Moved Screen Space Reflections out of EffectsQuality and into the ReflectionsQuality scalability group, so that Medium Reflections gives SSR.

  • Added an Illuminance meter on the skylight for debugging.

  • Added the console variable "r.Shadow.Virtual.Clipmap.MinCameraViewportWidth" to enable clamping of the camera viewport size when computing Virtual Shadow Maps clipmap resolution. This can be important for avoiding artifacts due to excessively low shadow resolutions if the dynamic resolution falls too low.

  • Added support for floating-point (FP32) sky lights when the specified cubemap is High Dynamic Range.

  • Added "Rough Diffuse Material" support in the subsurface profile shading model. When "Rough Diffuse Material" is enabled in the project setting, Chan's diffuse model will be used by the Subsurface Profile Shading Model. This will correct the shading at the edge of human skin, better matching the ground truth than Burley's diffuse model.

  • Added IES atlas texture manager. This persistent atlas holds IES texture in a unique texture array which is used by all systems (raster/RT/PT/Lumen), and unify IES profile rendering.

  • Add Virtual Shadow Map high quality shadow filtering for translucent surface for Substrate and legacy path. This is a global opt-in feature.

  • Added optional rect light support for translucent lit surface.This is enabled with the console variable "r.rectlightatlas.translucent". There is currently a limitation on DX11 due to the limited number of texture samplers (max 16).


  • Improved ray-traced RectLight shadow. Now we sample from a spherical rect instead of the RectLight plane. This matches closer to path tracing.


  • Blue noise is now used for Virtual Shadow Maps (VSM) local light projection to improve performance.

Crash Fix:

  • Fixed a crash in the Editor when baking new reflection captures.

Bug Fix:

  • Fixed an issue with Virtual Shadow Map one pass projection attempting to clear a null screen shadow mask.

  • Fixed a bug that occurred when rebuilding many reflection captures.

  • Fixed a general Ray Tracing dark shadow issue caused by an unmatched square for the encoding of the shadow. It affects several mismatches between ray-traced shadows and path tracing.

  • Fixed an artifact when Virtual Shadow Map (VSM) Shadow Map Ray Tracing (SMRT) crosses a clipmap boundary and the new sample depth is outside the Z range of the original clipmap. This occurred most commonly when sampling against the clear value with a shadow being cast on a non-shadow-casting receiver.

  • Fixed a bug where Subsurface Scattering caused an orange rim when using ray-traced lighting at certain angles. The issue was caused by not enough penalty to the depth in the bilateral filtering.

  • In volumetric clouds, fixed ground contribution to work all around the globe.

  • Fixed incorrect ambient occlusion when using screen space global illumination.

  • Fixed incorrect artifacts in distance field ambient occlusion..

  • Fixed a NaN with cloth shading and rect lighting.

  • Fixed an issue in ground truth ambient occlusion (GTAO) when there's a camera cut.

  • Fixed incorrect atlas packing when textures are streamed in/out and require a full atlas refit. Also fixed a crash when rect light atlas force update is enabled and light gets toggled on and off. The incorrect packing was causing rect light textures to become blurrier as the light got toggled on/off.



  • Lumen Software Ray Tracing now uses feedback to request higher resolution surface cache pages and update visible pages faster.

  • Lumen async compute for software tracing, which greatly improves performance on consoles.

  • Lumen Hit Lighting improvements with approximate secondary specular bounds based on surface cache, added support for two-sided foliage mode, and fixed surface cache artifacts when using hit lighting.

  • Added "r.Lumen.Reflections.MaxRoughnessToTraceForFoliage" which allows to control the dedicated reflection ray roughness cutoff point only for foliage. Dedicated reflection rays are now also disabled by default on High scalability settings.

  • Lumen character lighting improvements

    • Fixed ScreenProbeGather Screen Traces missing nearby features, which was happening due to the bias needed for downsampled HZB tracing. ScreenProbeGather Screen Traces now use full res HZB tracing.

    • Hair Voxel Occlusion is now traced for the full resolution Bent Normal, Lumen Reflection HWRT, and Lumen Visualize HWRT.

    • Added a HWRT version of ScreenSpaceBentNormal, which is too slow to use (.12ms ScreenSpace vs 1.75ms HWRT) but still useful as a reference.

    • Renamed ScreenSpaceBentNormal feature to ShortRangeAO, now that it's no longer just screen traces (r.Lumen.ScreenProbeGather.ShortRangeAO) .

    • Enabled ShortRangeAO on GI High settings by default (60fps mode)

    • Clamp albedo used for the AO Multibounce approximation (DistantIlluminationRescale) to increase the amount of occlusion when a very light surface is next to a very dark surface (r.Lumen.ScreenProbeGather.ShortRangeAO.MaxMultibounceAlbedo).

    • Disabled HairScreenTrace on both ScreenProbeGather and ShortRangeAO as it causes over-occlusion and costs too much.

  • Lumen Reflections now samples SceneColor on hit, to cover over the regions where Screen Traces gave up where they went behind an object. Reduces vertical streaking under foreground objects where Screen Traces were interrupted.

  • Mesh distance fields are now always generated from highest poly mesh data in order to match Nanite.

  • Increased surface cache bias on all foliage. This improves surface cache projection on trees, which have a pretty inaccurate SDF and BVH representation.

  • Lumen visualization overview mode now specifies currently used tracing method

  • When SSR is the reflection method, Lumen rough reflections are now calculated for the whole roughness range to provide a fallback when SSR fails to find a hit.

  • Periodically refresh surface cache on all scalability levels.

  • Lumen reflection on translucent surfaces now account for roughness and go through the process of denoising.

  • Split reflection outputs into separate render targets in order to speed up denoising passes.

  • Reduced the strength of Lumen AO on foliage by default to .7, to emulate subsurface scattering. Controlled by "r.Lumen.ScreenProbeGather.ScreenSpaceBentNormal.FoliageOcclusionStrength".

  • Removed shadow map reuse from HWRT surface cache lighting path, as it was causing too many view dependent artifacts and anyway isn't compatible with the future looking async compute path. Balanced out performance regression by decreasing direct lighting update rate (r.LumenScene.DirectLighting.UpdateFactor 32).

  • Only run FSpanAllocator::Consolidate when no free space is immediately available It is possible for there to be freed spans that are pending consolidation, however no consolidation can actually occur. In this case every Allocate() will still pay the cost of looking for blocks to consolidate, making it much more expensive. Simple solution is to only run consolidation if there is no available space otherwise. The downside is that this can theoretically result in worse fragmentation over time. Significantly improves FLumenSceneData::ProcessLumenSurfaceCacheRequests performance in some situations.

  • Added bAllowFrontLayerTranslucency to material, which allows to control whether given material should write Front Layer Translucency. This is useful to disable small particles or solve sorting issues.

  • Lumen can now sample height fog contribution on meshes in reflections, not only through the sky light capture.

  • Enabled Hardware Ray Tracing culling by default in order to simplify initial Lumen setup. Also disabled culling when using path tracer, as it doesn't make much sense there.


  • Improved indirect specular approximation when using hit lighting. Metallic surfaces were too dark, as they were completely ignoring specular color in reflections. Now every surface is approximated as if it would be fully rough in order to conserve energy.

  • Optimized water reflection performance by building spatially coherent water reflection tile list.

  • Improved Lumen Scene filtering. Now Lumen only tracks primitives if they can be traced by a currently selected tracing method in order to minimize CPU and surface cache overhead.

  • Disabled surface cache on objects without a valid distance field, as those can't ever be hit by a ray.

Crash Fix:

  • Fixed a crash when changing preview levels in the editor.

Bug Fix:

  • Disable bright green visual assert when radiance cache overflows.

  • Added Lumen mesh card shader filtering in order to skip unused permutations like Skeletal Meshes, which removes up to 10% of shader permutations.

  • Reuse alpha from the other side of the height field so that Landscape masked opacity works correctly when viewed from the other side.

  • Replaced cone skylight evaluation with a ray sample in SWRT radiosity pass in order to prevent leaking.

  • Disabled automatic instance merging. It's no longer required for performance, but can cause unexpected surface cache behavior.

  • Don't capture Static Meshes into surface cache if they are still streaming.

  • Fixed light functions which use CameraPosition nodes.

  • Fixed random radiosity texels exploding due to an un-normalized normal used to construct radiosity probes.

  • Fixed GI and reflections not working far away from the camera. Now skylight will be always applied even if rays don't hit anything far in the distance.

  • Fixed incorrect interpolation of secondary bounces in surface cache.

  • Found an issue with potential GPU hang from Lumen direct lighting when no lights are gathered on a frame due to InitializeLightTileIndirectArgs failing to write to the indirect arg buffer and leaving uninitialized memory for the indirect args of the following dispatch. Fixed this by forcing a minimum group size of one for the InitializeLightTileIndirectArgs pass which ensures we properly write the indirect args for the following dispatch.

  • Fixed HWRT reflection compaction causing random reflection corruption.

  • Fixed screen space reflections and foliage hit skipping when Substrate is enabled.

  • Added MinTraceDistanceToSampleSurface to ScreenProbeGather. It's used to skip surface cache sampling if ray hits too close to the origin in order to prevent leaking or GI feedback loop when reading radiance from source surface cache texel.

  • Fixed conditions for when to use wave ops in shaders. They were incorrect for GPUs supporting only Wave64 causing crashes or rendering artifacts.

Materials and Shaders


  • Added support for Per Instance Random Material Expression in ray tracing shaders and in the Path Tracer.

  • Added the ability to do Unreal Insights traces of the Shader Compiler Worker process. This can be enabled by modifying UnrealEngine\Engine\Saved\UnrealBuildTool\BuildConfiguration.xml like so: true

    • Added a build configuration xml value, bShaderCompilerWorkerTrace.

    • Turning this on will set USE_SHADER_COMPILER_WORKER_TRACE=1

    • Moved the parameter -nothreading to be set when we launch the process instead of internally as an extra cmd line arg.

    • Unreal Insights uses a separate thread to send events so threading support is needed for the program. When USE_SHADER_COMPILER_WORKER_TRACE is enabled we need to turn off -nothreading.

    • When USE_SHADER_COMPILER_WORKER_TRACE is enabled we pass in -trace=default to get CPU event markers.

    • The SCW program needs to turn on the following defines to be able to perform CPU and memory traces:




    • Instrument Shader Compiler Worker with TRACE_CPUPROFILER_EVENT_SCOPE. These are no-ops when this is turned off.

  • Added a CompileShadersTest build script.

    • Right now it is hardcoded to run CitySample and cook just the shaders in the Audit_InCook collection.

    • In the future this build script can be made general to run any commandlet since there is a lot of copy/paste to what is in ShadeTypeRegressionTest.xml.

  • Build machines will now output shader debug info for failed shaders as a build artifact.

    • Due to size limits, this output is limited to ten items. The number of debug info outputs is tracked and incremented when we dump a debug info (which happens on a worker thread), and is read on the main thread so the value is atomic.

    • Removed old code for dumping the debug info to the log.

  • A warning message will be logged if the GUID of a Material Function is regenerated, indicating that the function should be resaved.

    • Regenerating the GUID causes any Material using that Material Function to have a dirty DDC key which changes each time the Material is loaded.

    • This in turn will always cause the Material to recompile shaders on load until the Material Function is resaved.

  • A new debug dump option for shader compilation was added — (r.ShaderCompiler.DebugDumpWorkerInputs)

    • When enabled, it will output a DebugSCW.in file for each executed pipeline job, along with an associated DebugCompileArgs.txt file.

    • The .txt file gives arguments that can be passed to ShaderCompileWorker in order to manually re-run and debug the full compilation (including pre-processing) of a single shader compile job.

    • These files are written within the existing debug dump folders (i.e. where preprocessed .usf files are exported when r.DumpShaderDebugInfo is enabled).

  • Log the total time spent compiling each shader job in seconds. This represents roughly how long it would take If we compiled all shaders serially on a single thread.

  • Added a small helper function to improve readability when formatting numbers.

  • Added support to log an error message (along with the associated callstack) when an exception is encountered in one of the compilation functions within a shader format DLL. This is a step toward unification of error handling in the various shader compilation backends.

  • Added r.MaterialLogErrorOnFailure, which will emit an Error when a Material fails to compile instead of a warning. This defaults to false, which was the original behavior. It can be enabled from the command line with -dpcvars="r.MaterialLogErrorOnFailure=1".

  • Implemented a Static Switch Commandlet that runs fast and can give a detailed HTML report on what shaders with permutations are being used.

  • Implemented a double-click on Material Editor errors to jump to the Material Expression (if any) that caused the error.

  • The aging MCPP preprocessor for shader code was replaced with a newer, faster, multi-threadable preprocessing library.

    • Performance testing results on various projects show that the new library is approximately 2.5x faster, which results in a non-trivial savings in overall shader compilation time.

    • In addition this gives us the option to run multi-threaded pre-processing in the editor/cooker process, which itself unlocks future more significant options for reducing shader compilation times.

  • A console variable has been provided as a fallback option. In the event bugs are encountered you can set "r.Shaders.UseLegacyPreprocessor=true" to revert to the old library. Note however that this option will be removed for UE 5.3 so please report any bugs found in the new library to us as soon as possible.

  • Updated DirectX Shader Compiler (DXC) to release-1.7.2212 (January 2023).

    • Updated SPIRV-Headers to rev. c16439f (Jan 3, 2023)

    • Updated SPIRV-Tools to rev. d87f616 (Dev 22, 2022)

    • Updated SPIRV-Cross to rev. a89dea3 (Dec 13, 2022)

    • Updated DirectXShaderCompiler to rev. 83f8c6c; release-1.7.2212 (Jan 6, 2023)

    • Added DirectX-Headers rev. 980971e (Jan 31, 2022)

  • Added outputs to the WorldPosition material expression to directly access XY and Z components. These are commonly used output combinations, so it can save time and simplify Material Graph logic to extract them.

  • Fixed the DeriveNormalZ Material Expression that saturates the input to the square root to avoid negative values. This could be caused by extreme normals combined with texture compression.

  • Added a flag for enabling feedback for a Runtime Virtual Texture sample. This setting is enabled by default. Most of the time this should remain true, but it might be useful to disable this flag for landscape grass, which can rely on the underlying landscape providing the feedback. In that case disabling feedback and requesting mip level 0 will return the mip to match landscape color, and it will reduce cost of mip calculation and feedback writing from the grass base pass shader.

  • The Runtime Virtual Texture (RVT) page rendering is now compressed directly to the virtual texture's physical texture when unordered access view (UAV) aliasing is supported. This saves GPU time in transition and copy when rendering an RVT page.

  • The Distortion Material Expression has a new mode to explicitly use a specified 2d offset.

  • Added per pixel tracing support for volumetric clouds in the translucent Blend Mode. The console variable r.VolumetricRenderTarget.Mode 3 is the new high quality cinematic mode: tracing is done at full resolution in a volume render target.

  • Added Material Functions to wrap float 2, 3, or 4 values in a [0, WrapValue[interval]. This is similar to the FMod Material expression but with support for negative floats, meaning it returns a value between 0 and WrapValue in all cases.

  • Added support for height and volumetric fog onto Ray Tracing Translucency.

  • Updated the volumetric cloud render target target mode 1 to not do any temporal reconstruction. It now traces at half resolution and then upsamples at full resolution, leveraging checkerboarded MinMax depth.

  • Added support for the new Switch Material Expression. This node implements the functionality of a switch, or discrete selector/multiplexer, for the Material graph. This allows more compact graphs where multiple paths or inputs need to be decided on either through constant or uniform parameters. It also provides a potential replacement for custom nodes, unusable in Restricted mode, or complex If/Else graphs.

  • Added a button in the Material properties list in the Details Panel to browse to the Nanite override Material. This only shows if a Nanite override Material is set. It uses a duplicate of the existing Material content browser icon until a new icon is created.

  • For the ShaderPlatformInfo Material Expression, limited the scope to just 3 properties (isMobile, isConsole, isPc), and created a compile-time link between the properties and the Material in case they are removed or renamed.

  • Added an option to sample landscape height per pixel when rendering to Runtime Virtual Texture. When we do this we only need a single quad to render each landscape component subsection. This reduces the vertex shader cost, which can sometimes dominate Runtime Virtual Texture rendering.

  • Refactored the DeriveNormalZ_Function to use the DeriveNormalZ built-in function instead of duplicating its logic.

  • Implemented dynamic bool parameters to enable dynamic branching in static switches. This can cut shader permutation counts at the cost of larger more generalized shaders. This might or might not have a performance penalty based on the use case.

  • Added a Virtual Heightfield Mesh (VHM) Component flag to locally set whether World Position Offset (WPO) Materials should trigger velocity rendering. This behavior is off by default, since the anticipated usage of any WPO on a VHM is for displacement, rather than an animated surface. This then avoids the unnecessary cost of velocity calculation on the VHM.

  • ScalabilityCVarsSinkCallback now leverages On Demand Shader Compilation (ODSC) and only compiles visible shaders instead of all remaining shaders.

    • If the Material quality level changes new Material resources may still need to be created for that quality level.

    • When AllMaterialsCacheResourceShadersForRendering is called, compile jobs should not be submitted. This way render resources are only created if they haven't been made yet.

    • ODSC handles compiling for any missing shaders.

  • The FMaterialShaderMap::GetShaderSource function (used by Material stats in the editor) was not accounting for permutation IDs, and didn't correctly handle the case of a null vertex factory. As such, the returned source wasn't always exactly what was requested. Permutation ID is now a required parameter for function to account for this; the previous API was deprecated.

  • Some additions and changes were made to Material shader map logging aimed at improving debugging when encountering issues serializing shader maps to the Derived Data Cache (DDC):

    • Modified the log outputs when Material shader maps are saved to the DDC to print the actual DDC key hash (rather than an unrelated FSHA1 hash); this is now the same key hash that is printed by DDC log messages (for example, in the case of encountering non-deterministic DDC contents).

    • Enabled "VeryVerbose" logging for the LogMaterial channel, and added new log outputs to this channel for the full string DDC key (prior to hashing) for Materials/Material instances (this is the source string which is hashed to generate the key used to query shader map contents from the DDC).

  • A new debug utility was added, which is controlled by the "r.Material.ShaderMapDump" console variable. This utility generates a textual representation of the shader map for a specified Material or Material instance, identified by the full path to the corresponding asset. For example: "r.Material.ShaderMapDump="Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial". This utility is helpful for examining the contents of a shader map in a more user-friendly format.

  • Volumetric Cloud Material shaders are now compiled optionally for Materials belonging to the Volumetric Domain. This is now opt-in using bUseWithVolumetricCloud.

  • Added a Material stats permutation for Runtime Virtual Texture output. This is useful for understanding basic performance stats of any Materials that write to Runtime Virtual Textures.

  • Added ‘UMaterialInterface::AnalyzeMaterialPropertyEx' and ‘UMaterialInterface::AnalyzeMaterialCustomOutput'for extended Material analysis. These are useful for analyzing which texture coordinates are being used, lightmap UVs, custom outputs, and which Shading Models are possible.

  • To reduce lock contention, the GShaderHashCache is now protected using a RW lock instead of a critical section. In case of a cache miss, a critical section is still utilized to prevent redundant calculations, while the cache remains accessible for readers.

  • Added the function FMaterialBakingModule::IsLinearBake which determines whether a Material property is/will be baked in linear or sRGB.

  • A high-level wrapper called UE::ShaderCompilerCommon::RemoveDeadCode() was added for the shader minifier, to be used consistently across all shader compiler back-ends.

  • To reduce lock contention, a read-write lock is now used to protect GShaderFileCache instead of a critical section.

  • Added Material baking support for the custom output Transmittance Color.

  • Added in-engine support for converting shader hashes back to their human-readable names (non-Shipping builds only).

  • Queries on Materials to retrieve the set of expressions for a given property now have the option to recurse into Material Functions and return expressions located inside.

  • To ensure that assert reporting works correctly on both AMD and NVIDIA GPUs, UEReportAssertWithPayload now uses an infinite loop to trigger a timeout instead of attempting to trigger a page fault through out-of-band (OOB) buffer access.

  • Added Material baking support for the Refraction Material property.

  • Support for controlling Blend Mode and Background Color when baking materials was added through FMaterialData and FMaterialDataEx.

  • Shader creation can now happen in parallel on multiple threads.

  • Material baking support for the Shading Model property was added.

  • Added a built-in Material Expression ObjectLocalBounds, which is meant to replace the Material Function with the same name.

  • Added Material baking support for expressions that rely on primitive data.

  • Replaced OpCompositeConstruct with OpAccessChain for OpenGL for array creation.


  • Adjusted logic to make Thin Translucent Materials more consistent when using the Path Tracer.

    • Previously the specular color was only using Spec and not Metallic. This limited the effective IOR range of Thin Translucent Materials to 1.8 at most. Now metallic is no longer scaled by opacity, which allows the user to create surfaces made of higher IORs, like diamond for example.

    • Ray Traced Translucency was updated to match the Path Tracer behavior better, and now implements all blend modes.

  • Made improvements to Material Graph comments to reach feature parity with Blueprints.

    • Ability to hide comment bubbles.

    • Improved selection tools and node group movements.

    • Ability to create colored comment bubbles.

  • Improved formatting of large numbers and memory when printing shader statistics for readability purposes.

    • Cleaned up memory formatting code and let FText handle that.

  • In volumetric clouds, improved mode 0 with sharper edges and reconstruction.

  • A source of non-determinism in shader map DDC contents has been resolved. The optional array of shader sources was previously sorted by a hash created from the vertex factory type and shader type, but this hash did not account for permutation IDs. As a result, shader sources with multiple permutations could be serialized in an unstable order. The hash now includes this data to ensure stable serialization.

  • Volumetric cloud rendering now accounts for camera cut transitions.


  • Removed a redundant allocation and copy of DDC data which occurred when the DDC shader job cache was enabled and results for a single job were found in, and pulled from, the DDC. This results in a minor performance improvement.

Crash Fix:

  • Added a check to make sure GraphNode is not null in UMaterialExpression::PostEditChangeProperty(). This prevents a rare crash from occurring.

  • Fixed a crash that could occur when a user force deletes an asset (for example, a Material) used by a mesh with an instance in the active level.

  • Fixed an intermittent crash when building streaming virtual texture mips. This crash occurred when null request handles from a Runtime Virtual Texture were being sent to the FUploadingVirtualTexture, where they hit an assertion.

  • Fixed a crash which occurred in UEFN when the user created a MaterialLayer or a MaterialFunction and opened it in the Material Editor.

  • Fixed a crash which occurred when the user created a Constant4Vector in a MaterialFunction and hit undo.

  • Added a check that reports errors if a parameter is added in a Material bound to different values. This should not be allowed. This was causing a crash when two Material functions containing the same parameter bound to different values (for example, different textures) are used in the same Material. The code now checks for these occurrences and reports an error message instead of silently trying to compile the Material anyway. This check is disabled by default but can be enabled with the console variable "r.Material.PedanticErrorChecksEnabled".

  • Removed a duplicate PropertyRow call to make a custom reset to default option for labeled Texture Parameters. This fixes a potential crash due to competing behaviors.

  • Added an input type check to LinearInterpolation that fixes a crash in the Material Editor when the input vector dimensions differ.

  • Fixed a crash caused when renaming a Material graph node with a name 1024 characters or longer.

  • Fixed a crash which occurred when the user selected multiple Material Parameter Collection nodes belonging to different collections.

  • Fixed mesh/amp shader support in the manual Pipeline State Object cache.

Bug Fix:

  • Fixed a bug which could cause creation of duplicate shader maps when multiple Materials/Material instances sharing a shader map are encountered in a single tick. This was causing both redundant shader job creation and spurious DDC non-determinism warnings when the redundant shader maps were completed and uploaded to the DDC.

  • Implemented fixes to the code that handles closing and reopening open Editor windows when any of their assets is force-reloaded. This fixes potential crashes due to editors not being correctly detected and closed when dependent assets are reloaded.

  • ShaderMap now serializes the ShaderPlatform name instead of ShaderPlatform enum.

  • Fixed a bug causing Derived Data Cache (DDC) keys for pre-compiled shaders included in DDC pak files to not match those generated by an engine build containing signed DLLs. This resulted in long shader compile times when first launching a build/project on a signed engine build. The shader compiler version hash now excludes certificate/signature information from the shader compiler DLLs so the same version hash will be reported before and after DLL signing.

  • Fixed UMaterial to properly populate the ShaderId with StaticParameters to allow merging them with Instances that use the default Parameter Set.

  • Fixed bug in SMaterialParametersOverviewTree, which caused the Material Editor to crash when the user created a Parameter node and viewed the UI panel containing the Material parameters.

  • Fixed an issue causing shader maps containing shaders which encountered compiler warnings to emit spurious warnings due to Derived Data Cache contents not being deterministic. This was caused by the fact that all warnings for shaders in the map were flattened into a single array. They are now instead stored individually for each shader entry in a struct (alongside the platform debug info for that shader).

  • Implemented changes so Runtime Virtual Texture (RVT) resources are not created for the Class Default Object (CDO) or on server platform.

  • Fixed an issue where a Virtual Heightfield Mesh with a World Position Offset Material would fail to render correctly when velocity was being written in the depth pass.

  • Fixed a bug with RecursiveGetExpressionChain for Make and Set Material Attributes, which occurred when looking for the MP_MaterialAttributes property. This property needs to be followed up since it's a group of several properties.

  • Fixed potential issues with mobile Material expressions not being properly filtered.

  • Implemented a fix in LandscapeRender to read whether WorldPositionOffset is enabled in the Material from the correct source (shader map) instead of the old, approximate source (asking the Material if the property is connected).

  • Implemented a fix for height fog on volumetric clouds not working when start distance is greater than or equal to 1.

  • The Vulkan RHI now correctly applies per-Material Variable Rate Shading (VRS).

  • Fixed a long-standing bug in the Material debug dumps folder for the console variable r.DumpShaderDebugInfo.

    • Materials or Material Instances with varying static parameter values (or other data that can vary across instances of the same Material) would end up colliding and writing to the same folder, causing a race condition where different runs would potentially output a different set of debug information.

    • To fix this, a new "GetUniqueAssetName" function was added to the FMaterial class, which appends a hash of all the information that can potentially differ across instances and result in different shaders being generated. This function is used to construct the debug info path for Materials. As a result a full cook of a project with r.DumpShaderDebugInfo set to 1 will now output a full and stable set of debug info for all shaders in that project.

  • Fixed SceneTextures (CustomStencil) node not taking into account UV offset.

  • Implemented code to get Derived Data Cache Request Name from ShaderPlatformName instead of ShaderFormatName.

  • Made changes so that ProceduralComponent honors the bReceivesDecals setting.

  • Fixed a bug so that the bReceivesDecal flag is honored when doing manual DBuffer samples in a Material.

  • Fixed an internal compilation error in GLSL based shader compiler toolchains due to a bitwise operator being used for a bool expression.

  • Implemented support for virtual texture feedback for pixels behind a single layer water Material so that content beneath the surface is not overwritten.

  • Fixed incorrect results when Material baking some material properties in a translucent Material.

  • Fixed a missing switch case for Runtime Virtual Texture blend state.

  • Fixed lack of ShaderDebugInfo when retrying after an SCW crash.

  • Fixed shadermap resources not being deleted when the shader library is closed at run-time. For example, after unloading a plugin.

  • Fixed deadlock which can happen when one plugin is closing the shader library (on unload) while another is being loaded.

  • Fixed pacing of Pipeline State Object (PSO) precompilation from the manual cache to avoid it causing hitching during the background compilation.

  • Fixed a bug with PSO cache expansion filtering out valid Pipeline State Objects.

  • Fixed Pipeline State Objects (PSO) with ‘FDeferredLightVS' being filtered out from PSO cache.



  • Implemented Nanite support for per mesh/material section rasterizer visibility. This includes support for the "Isolate" feature in the Static Mesh Editor, and future improvements to graceful material error handling, mixing Nanite and non-Nanite together, and so on.

  • Added new "Normal Precision" setting to Nanite mesh importing that lets you override the default trade-off between storage space and quality for mesh normals.

  • Implemented "stat renderscaling" to show current status of the dynamic resolution heuristics

  • Optimized Nanite visibility buffer clear. This is more efficient compared to the built in RHI clear, only clears the active portion of the screen according to dynamic resolution scaling, and batches up the debug view clears when view modes are active (2x faster for the retail game case, much more for the view mode case). Also fixed the "Nanite VisBuffer" stat gpu timer to exclude emit depth targets, and the unrelated HZB build.

  • Added support for the Global Clipping Plane to Nanite, and enabled Nanite rendering in planar reflection captures.

  • Added support for Nanite meshes in the Custom Depth Stencil pass.

  • Add explicit WANT_PIXEL_DEPTH_OFFSET || MATERIALBLENDING_MASKED preprocessor condition to more accurately remove unused code.

  • Support Nanite material visibility culling for virtual shadow maps. Controlled with "r.Shadow.Virtual.Nanite.MaterialVisibility". This is off by default.

  • Added "SetForceDisableNanite" on Static Mesh Component to force disable Nanite (and render its fallback mesh instead) on an object at run-time.

  • Added logging and on-screen message to show potentially expensive Nanite materials in use (r.Nanite.EmitMaterialPerformanceWarnings).

  • Always use NANITE_MULTI_VIEW=1 in FMicropolyRasterizeCS, FHWRasterizeVS, FHWRasterizeMS and FHWRasterizePS, removing the permutation dimension.


  • Removed previous transform hack (decreasing compressed per instance data from 5 -> 3 floats4s, and uncompressed per instance data from 7 -> 4 float4s. Also saves a lot of ALU).

  • Improved the Virtual Shadow Map HZB culling efficiency by allowing the cluster culling stage to test the whole page-space footprint.

Bug Fix:

  • Fixed a rendering issue with masked materials on Nanite meshes with reversed winding order.

  • Cleaned up DX12 empty dispatch spam with Nanite initializing material CS when the material count is 0.

  • Fixed console variable NaniteAllowWPODistanceDisable declaration. Previously this was referencing GNaniteMaterialSortMode instead of GNaniteAllowWPODistanceDisable.

  • Fixed issues where a Nanite object's custom primitive data would not update on the GPU if it was not visible in the main view, but was visible in shadow.

  • Fixed an issue where the WorldPosition material node in Nanite materials could not exclude material offsets.

  • Fixed an issue where reading custom data in a Nanite material to calculate World Position Offset would always result in using the default value.

  • Fixed an issue where "World Position Offset Disable Distance" wouldn't cause WPO to be disabled in shadow, and would cause VSM pages to always be invalidated.



  • NiagaraParameterMap pins are now editable upon creation.

  • Niagara simulation caches are now integrated into Take Recorder.

  • Niagara renderers can now be moved via context action.

  • Added helper functions to the camera data interface to use the translated view matrices with large world coordinate positions.

  • Added a collapse option for custom HLSL nodes.

  • Exposed warmup time settings on the Niagara component.

  • Added data interface auto-completion to custom HLSL nodes.

  • We now display the version number on inherited modules.

  • Improved the geometry cache default asset.

  • When pasting an emitter from one system to another, it will add referenced User Parameters automatically, or reference existing ones if they already exist.

  • TickInfo that is exposed in a NiagaraSystemSimulation now contains information about sub-frame ticking. This is typically derived from fixed delta time. Exposes Engine.WorldDeltaTime, System.NumTimeSteps, System.CurrentTimeStep, and System.TimeFraction to emitters.

  • Exposes warmup time settings on the Niagara component.

  • New function AddParticle has been added to the Neighborgrid module.

  • Extended the python API for module versioning.

  • Added a preview viewport to the Niagara Sim Cache Editor.

  • We now compute attribute indices during HLSL generation for 2d grids.

  • Added context menu capabilities to the Hierarchy Editor. There is now a section named Base for renaming and deleting, and a section called Dynamic to add custom actions.

  • There is a new flag ClearBeforeNonIterationStage on all grid data interfaces. Grid2D will not allocate a second buffer when we have write only grids.

  • Added the ability to capture a temporary Niagara Sim cache for debugging from the Niagara component's Details panel.

  • Added new Niagara System and Emitter asset icons. Changed the System asset color from red to blue for consistency.

  • We now pack grid 3d collections into rgba textures, instead of tiled attributes, in a single channel float texture. This is much faster for retrieving vector attributes from a grid (ie: velocity, color, etc). There is also far less overhead for common cases where grids have 1 attribute. Usage is controlled via the cvar fx.Niagara.Grid3D.UseRGBAGrid. Set to 1 to enable. Only used for grids that have 1 attribute with 1 to 4 channels.

  • Added overview tab for Niagara Sim Cache editor, to improve filtering and buffer selection UX.

  • Added user parameter setting option for attenuation and sound concurrency to the audio player data interface.

  • Niagara Data Channels are an experimental new system for communication between Niagara Systems and with game code or Blueprints. This system is currently very experimental and subject to large changes.

    • DataChannel - Data Definition for a named channel of data. New types can be added to deal with the channel differently.

    • DataChannelHander - Runtime counterpart for DataChannels. Each Channel Type will have a handler that uses the data definition to manage the channel data accordingly.

    • DataChannelDefinitions - Asset class containing one or more Data Channel.

    • DataChannelManager - Manger class containing and providing access to all currently loaded Data Channels and their Handlers.

    • DataChannelAccessor - Temporary initial Blueprint API allowing Blueprints to read and write to Data Channels.

    • Data Channel Global - Initial simple Data Channel Type. Stores all data globally.

    • Data Interface Data Channel Read - New data interface that allows Niagara Systems to read data from a Data Channel.

    • Data Interface Data Channel Write - New data interface that allows Niagara Systems to write data to a Data Channel.

    • Data Interface Data Channel Spawn - Specialization of the Read data interface which allows for easy spawning based on the contents of a Data Channel.

    • Data Channels can be enabled or disabled via FX.Niagara.DataChannels.Enabled = 0. Initially this defaults to off.

    • Created new data interface node action providers to enable actions on the Data Channel data interface nodes.

    • Customized the reference class for data channels to avoid any typing the available channel names.

    • Data interfaces now have a post-compile step that can be used to cache certain data at compile time.

    • NiagaraDataInterfaceUtilities now has an optional SearchOptions parameter that allows us to include internal data interfaces. This is required to support the above PostCompile step.

    • Niagara Type Definitions now optionally allow large world coordinate types. Previously, any large world coordinate types would be auto-converted to standard world coordinates on load.

    • The Asset Registry now tracks standard world coordinate simulation types. This prevents duplicated entires in several places of the UI due to confusion between large world coordinate and standard world coordinate types.

  • Heterogeneous volumes are enabled by default for Niagara Fluids.

  • Optimization to Legacy VM for reducing work for shuffled outputs.

  • You can now select the Static Mesh Data Interface LOD on a user parameter.

  • Refactored the stack function input cache. It now stores the inputs as variables, rather than storing pointers to the pins themselves, since their lifetime can be unpredictable.

  • Updated the CitySampleSensorGrid to use both Render Graph-based shader parameter bindings, and also Render Graph (RDG) for its internal shader passes.

  • Added entries in Visual Studio natvis to the NiagaraEditor module to provide Niagara types when debugging.

  • Tweaked the Outliner so that it clears any stored sim caches when the outliner changes or is updated.

  • Added Static Mesh Data Interface LOD support.

    • Added LODIndex to the Static Mesh Data Interface. -ve values indicate we index backwards from NumLODs. If the desired LOD is unavailable, we fall back to the next available LOD.

    • Added an optional override allowing Data Interfaces to choose whether they can sample from streaming LODs.

Bug Fix:

  • Fixed a bug when saving an emitter over an existing asset.

  • Fixed a crash when using large world coordinate structs.

  • Fixed a bug where closing a newly created Niagara system could lead to a crash.

  • Fixed a bug where the component renderer could no longer bind to float properties created in Blueprints.

  • Fixed a bug where newly created Component Renderers used the wrong type for the position attributes.

  • Fixed a bug where disabled modules could generate compile warnings.

  • Fixed a crash when changing the name of the sampled region in the Skeletal Mesh Editor.

  • Fixed Niagara performance widget layout. Improved the display of large numbers.

  • Fixed a crash when trying to set uobject-attributes in the stack.

  • Fixed an issue in the system parameter panel where it was selecting parameters in the scratch pad via name instead of via guid. This caused wrong variables to be displayed.

  • You can now only add Object type parameters in User Parameters as they don't work in any other context currently.

  • Fixed a crash when dragging an array data interface element below the lowest index.

  • Fixed a bug where Component Renderers were still visible when another emitter was running isolated.

  • Niagara Stack Search now only lists one result per row maximum. The selected search result now also stays intact when changing a property.

  • We now properly search for a parameter collection override on Niagara systems.

  • Fixed an issue where emitters were opening up the parameter panel to Active Module instead of Active Overview.

  • Fixed parameter for node UI, and generated code bugs.

  • Fixed an error where HLSL compile errors were not correctly shown in the stack.

  • Fixed output and transient parameters appearing outside their own stage when attempting to link values on inputs via a menu.

  • Fixed the Niagara system node being deselected after changing a value in the System Properties.

  • Parameter Map and Get nodes now factor in existing parameters when renaming a parameter pin.

  • When copy-pasting modules, nested static switch values now copy over properly.

  • Fixed not being able to copy-paste Data Interfaces in the new User Parameters panel. This works also from the stack to User Parameters and vice versa.

  • Fixed enums appearing as ints in the Niagara User Parameters tab and Component Details tab.

  • Fixed scrubbing in the Sim Cache Editor's timeline near frame boundaries.

  • Modules that are currently used and selected in an emitter or system will no longer get deselected when hitting Apply.

  • Fixed the check around GetNumMipLevel for Texture Sample Data Interface.

  • Fixed low latency translucency (LLT) being used when underwater (using single layer water). If used, it resulted in translucency being rendered before the opaque, preventing LLT from working properly.

  • Fixed NiagaraScript's data derived cache (DDC) content to be non-deterministic.

    • Cleaned up some of the data written into the payload, removing compile times and writing out zeroes for unneeded non-deterministic pointers.

    • Incorporated the AssetPath of the script to the DDC key to prevent identical scripts from sharing the same DDC, as we still have some data in the DDC value (node GUIs & emitter names, etc).

  • Fixed a stalled cook when multiple shader formats were being generated at a time, and a portion of them were not supported (because ShouldCompile() returns false).

  • Fixed issues when cooking Niagara systems with bad data resulted in a crash (in this case variables with invalid types because dependent enums are missing).

  • Fixed a bug when deleting a system or emitter parameter that's not referenced anywhere wouldn't create an Undo/Redo transaction.

  • Fixed an issue with changing fx.Niagara.QualityLevel at runtime.

  • Fix for motion blur on Niagara ribbons caused by not using the right PreViewTranslation when constructing the world position.

  • If you set a script asset from Value mode to Custom on an input parameter pin that isn't connected to a parameter set, it will now correctly show the custom pin. Additionally, when you select an input parameter in a script asset and drag it onto a parameter get node, the default value will become editable right away with no need for you to reselect the parameter to edit its default value.

  • Made sure the RendererEnabled binding gets updated with changes to the emitter, for example when renaming.

  • Variety of fixes for RigidBody Data Interface.

    • Pushed the instance tick to be post simulate so that we are sure to have results from FindActor in time for the GPU simulation.

    • Deprecated the global search path and provides feedback warnings if it's in use (along with if the FindActors is missing).

    • Removed the optimization of disabling the actor search if there weren't any GPU functions being called, because of the difficulty in finding bound functions for non-user parameter Data Interfaces

  • Fixed the selection changing in the Parameters panel whenever you would trigger a Parameter panel refresh while searching. For example, if you search for MyFloat, and you have MyFloat and MyFloat2, and you edit the MyFloat2 default value, it would cause a refresh that would then cause MyFloat to be selected.

  • We now handle renaming cached default data interfaces when we rename an emitter. This avoids having to recompile a shader to get all the data up to date.

  • Fixed a bug in Niagara's custom frustum culling.

  • Fixed an issue with the Landscape Data Interface when huge system bounds exceeding limits of int32 for number of potential landscape components.

  • Removed incorrect default pins on Parameter Map get nodes that would show up as 'None'.

  • We now guard against integer overflow with integer divide within VectorVM.

  • We now prevent re-entrant shader compiling by making sure that we don't try to fully load a system just because it shows up in a TObjectIterator resulting from an UpdateContext.

  • Couple of fixes/improvements for the rigid body Data Interface.

    • Made the actor name text more legible.

    • We now use the actor label if one exists.

    • Fixed a crash when an acquired actor goes away (is deleted in the editor).

  • We now invalidate script data for a simulation stage when it is disabled in the UI (this prevents previous error messages from being reported).

  • Fixed emitter assets not dirtying when disabling a simulation stage.

  • Drag operations that aren't compatible with the Hierarchy Editor will no longer crash the engine when hovering over it.

  • Updated the graph cache to incorporate the top level change IDs to know if the cache is valid. Ensures that emitters (post merge) will not try to use an out of date set of cached static variables. Also includes two optimizations to try to offset the cost of having to collect static variables more often, especially for merging:

    • Map builder can now be in 'static variable only' mode where we skip recursion into functions if the function graph doesn't have any static variables.

    • We now defer updating the override pins during merging until after all the modules have been merged.

  • Fixed a crash when adding a new user parameter while a custom section is selected in the User Parameters panel. We now select the All section when a new user parameter is added.

  • Fixed renaming static switch variable names, when renaming resulted in overlapping VariableGuids in the graph's NiagaraScriptVariables.

  • Fixed NiagaraVariable serialization in object replacement archives.

  • Resolved issues when loading the UNiagaraEmitter or UNiagaraScript by ensuring that the UNiagaraEmitter is fully loaded during PostLoad() through a call to Preload.

  • Fixed a crash when systems with warmups could be reset and activated when they need to be recompiled first.

  • Fixed attribute trimming with Niagara particle scripts:

    • Fixed when Particles.Module.AttributeName attributes were getting incorrectly culled.

    • Fixed dependency search to start with the most recent write rather than the first read.

  • Fixed an issue with some stats listeners exiting early. Some are meant to allow fire and forget behavior, but a recent change meant that orphaned listeners would be cleaned up immediately. Also fixed an issue with stats listeners when they were running without a rendering thread.

  • Fixed an issue with non-determinism in version guids of NiagaraScript and NiagaraEmitter assets.

  • Renderer bindings now no longer show emitter attributes of other emitters in the UI.

Path Tracer


  • Added a ray-type switch Material Expression, which allows creative control over the indirect lighting response in Materials. Note that this is not intended for optimization purposes as the current implementation will evaluate all branches of the switch before picking one.

  • Refactored Material evaluation/sample API to provide independent control over diffuse vs. specular scattering, and implemented a "Specular Scale" control on lights.

  • Implemented a holdout flag on primitives so that users can mark certain objects as being holdouts without having to touch the Material.

    • When a holdout primitive is shaded by a camera ray, the regular shading is ignored and the object becomes unlit/holdout instead.

    • All other ray types see the object as normal. The logic takes into account the blend mode, so partially transparent objects will become partial holdouts and any masking is maintained.

  • Exposed a Blueprint command to toggle the Path Tracer show flag on or off. This gives end users a way to enable the Path Tracer without requiring the console, including in shipping builds.

  • Implemented diffuse/specular color overrides in the Path Tracer, which are useful for evaluating lighting similarly to the detail lighting mode. The colors are only overridden on camera rays, allowing indirect lighting to remain the same. The following ShowFlag commands are now supported in the Path Tracer:

    • OverrideDiffuseAndSpecular

    • LightingOnlyOverride

    • ReflectionOverride

  • Added support for Eye Adaptation nodes in the Path Tracing Materials.

  • Added Primary/Indirect ray visibility, and Hidden Shadow toggle for path tracing. Now ray tracing and path tracing use different instance masks.

  • Added anisotropic subsurface scattering for path tracing.

    • Add a new node "Subsurface Medium" with two inputs: MeanFreePath and ScatteringDistribution. If MeanFreePath is not connected, fallback to the old behavior (for example, use the derived MFP for subsurface profile shading model), If Scattering Distribution is not connected, fallback to zero for isotropic scattering. It can be used by Subsurface, eye and subsurface Profile / Preintegrated shading models.


  • Lowered the ray bias value for shadows in the Path Tracer. This results in more accurate contact shadows, and can prevent artifacts in digital humans, specifically around the lips. Very low polygon meshes may show more faceting artifacts around the shadow terminator as a result.

Crash Fix:

  • Fixed a crash in Path Tracer state invalidation when building Nanite.

  • Fixed a crash when using Per Instance Custom Data in deferred decals.

Bug Fix:

  • Fixed an issue with emissive Materials not respecting the two-sided flag when using the Path Tracer.

  • Improved the accuracy of surface normal encoding in the Path Tracer to prevent quantization artifacts on smooth surfaces.

  • Fixed the interpretation of the Clear Coat parameter in the Path Tracer, so that the coating will correctly fade out when the Clear Coat parameter is set to 0.

  • Fixed an issue with incorrect geometric normals on Nanite instances with negative scale.

  • Reduced the possibility of random Path Tracer image invalidations, which were possible due to the use of a timer to detect changes. This was problematic in longer lookdev sessions.

  • Fixed potential NaN results when rendering solid glass with the Path Tracer.

  • Fixed the behavior of the ThinTranslucent shading model in the Path Tracer where Opacity=1.The expected behavior was for shading to behave as Default Lit, where Opacity=1, but it was reverting to Diffuse shading due to a missing case statement in eval/sample.

  • Corrected a bug that could potentially produce artifacts in transparent shadows.

  • Implemented a fix for dark reflections with SingleLayerWater Materials in the Path Tracer.

  • Fixed a bug in the Path Tracer for Materials using the AlphaHoldout Blend Mode.

  • Fixed an issue in the Path Tracer with the rendering of transparent surfaces when viewed over a visible skylight.



  • Extended Luminance Range is now enabled in new projects by default. Templates were also updated to use this setting.


  • Improved the EyeAdaptationInverse node to support any float numeric parameter type.

Bug Fix:

  • Misplaced elements in VisualizeHDR were fixed. DPIScale is now applied when using ‘Canvas.DrawShadowedString'. Additionally, ResolutionFractionAndInv is applied when rendering illuminance meter square.

  • Fixed a bug with incorrect sampling of the Local Exposure bilateral grid which caused artifacts in Bloom. The bilateral grid must be sampled using viewport UVs.

  • Implemented fixes for Temporal Super Resolution (TSR) ghosting in the alpha channel.


  • Removed the pixel shader version of BasicEyeAdaptation as the compute shader is used by default.



  • Validate ThreadGroupCountX/Y/Z in RHIDispatchComputeShader and RHIDispatchMeshShader.

  • Fix security vulnerabilities in FBatchedElements::DrawPointElements, FBatchedElements::Draw, and DynamicRHIResourceArray::GetResourceDataSize() by disallowing integer overflow when calculating how much memory to allocate for a vertex buffer.

  • Added manual LLM tracking to D3D12TextureStats and the backing heap of the D3D12TransientAllocator so that stat LLMPlatform shows memory usage for the Graphics tag comparable to that of D3D11.

  • Validate size of indirect buffer args in RHIDispatchIndirectComputeShader, RHIDrawPrimitiveIndirect, RHIDrawIndexedIndirect, RHIDrawIndexedPrimitiveIndirect, RHIDispatchIndirectMeshShader, and RHIRayTraceDispatchIndirect.

  • With VulkanRHI, use VkImageViewUsageCreateInfo on some views created for framebuffer to specify they will only be used with COLOR_ATTACHMENT_BIT.

  • With VulkanRHI, the SDK has been upgraded from to This adds mesh_shader, descriptor_buffer, device_fault, ray_tracing_maintenance1, and so on.

  • With VulkanRHI, added VK_EXT_descriptor_buffer extension. It adds all necessary functions to the loader and wrap layers. Note that Vulkan Bindless work is in-progress.

  • With VulkanRHI, added support for VK_KHR_synchronization2 and VK_KHR_separate_depth_stencil_layouts. This reduces reliance on image layout tracking, and moves layout tracking to CmdBuf and added layout tracking to Queue and submitted CmdBuf transfers their layout to the queue. Changed layout tracking to track depth and stencil separately and to use new VK_KHR_synchronization2 structs and layouts for all of tracking (like VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL/VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL). If Sync2 is not supported, they are converted back before being submitted. Added 'r.Vulkan.AllowSynchronization2' to disable Sync2 on systems that support it. Fixed barrier errors on RHIRead*SurfaceFloatData functions when reading a mip or layer index different than 0.

  • With VulkanRHI, added support for WAVESIZE.

  • Fixed issues with Shader Generation with ShaderModelID being incorrectly determined because of rounding rules in EncodeGBufferToMRT.

  • Enabled linking against debug binaries with Intel Metrics Discovery.

  • With AMD AGS, added debug CRT lib variant Also, deleted the 32-bit lib since Win32 support has been removed. This was sourced from https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK/releases/tag/v6.0.1.

  • Reset size of scene textures after drawing a material to a render target from Blueprint. This prevents a user from keeping too much memory allocated for a large, one-off render target and this BP function shouldn't be altering this state anyway.

  • Enabled the D3D12 submission thread when not running with multi-GPU. This thread offloads the calls to execute GPU command lists from the RHI thread. Also added a console variable to control this at boot time: "rhi.UseSubmissionThread"

  • Unified code that binds shader resources from uniform buffers across platform RHIs.

  • Add the console variable "r.RayTracing.RequireSM6" (default=0) to explicitly control when ray tracing shaders/features should be available, instead of relying on project target platform shader model settings. This is required because target platform settings are not available when running a packaged game. The engine uses GRayTracingPlaformMask to compute ShouldCompilePermutation() for shaders. This is filled based on platform settings and capabilities when running the editor. When running a standalone game, the mask is filled purely based on whether ray tracing is enabled for the project (r.RayTracing) and the current runtime environment supports it (GRHISupportsRayTracing). The new variable is meant to be consistent between the cook time and run time. This is achieved by setting GRHISupportsRayTracing=false when running on SM5 if r.RayTracing.RequireSM6 is 1.


  • Improved performance of RHI GPU draw call / num primitive stats. The old code relied on atomic increments in the RHI_DRAW_CALL_INC / RHI_DRAW_CALL_STATS macros, which is expensive, particularly on platforms with poor atomic performance. The new system replaces the atomic writes with a context-specific stats structure, which is accumulated by the RHI thread into the global structure. Also, moved Begin/EndFrame, Begin/EndScene, Begin/EndDrawingViewport into the immediate RHICmdList. They were already immediate-only functions due to a check() they contain.

Crash Fix:

  • Fixed initialization order crash with csv profiler and draw call category stats.

  • Applied a fix for the editor crashing after executing the command r.DisplayInternals 1 or r.DisplayInternals = 1. Also added an RDGEventName to UpdateAllPrimitiveSceneInfos pass.

  • Fixed a possible crash at boot when running a packaged version with the Small Font of the engine configured to use an offline font.

  • Fix crash when running D3D12 with "-nothreading" by skipping the creation of the interrupt thread and falling back to polling mode.

Bug Fix:

  • LLM was tracking all buffer types as "Meshes" in D3D11. Removed that tracking so the "Meshes" tag shows a comparable amount of memory usage as it does in D3D12.

  • Fixed FRHIGPUTextureReadback returning incorrect results when reading back a subrect of the source texture.

  • Fixed output of the High Res Screenshot and LDR buffer visualizations.

  • With VulkanRHI, Vulkan RHICopyTexture was not using SourcePosition, causing an engine test failure on 3D texture copies when Z offsets were used.

  • With VulkanRHI, we don't assume SRGB formats are supported and create a forwarding table and fill it by checking VkFormatProperties. Fixed up PrintVulkanPixelFormatMappings to also print the SRGB mapping when there is one (and use VK_TYPE_TO_STRING on formats for readable output).

  • With VulkanRHI, FVulkanGPUTiming: Non-blocking queries were reset right after copying the result, without knowing the availability of the results. Added a retry (and eventually a discard) for non-blocking queries. This makes it less likely to hit the code path that flushes everything. Cache the MappedPointer for Query result buffers to avoid the return trip (and lock) in VulkanMemory since they never change. Fix the return value of GetTiming that would return a sum if multiple results are available instead of only the latest one (as per function description). Add support for VK_EXT_calibrated_timestamps to fix assert with RADV on startup by reading the calibration value instead of a query result (that might not be available). NOTE: will add matching CPU timestamp from VK_EXT_calibrated_timestamps in a follow up changelist.

  • With VulkanRHI, fixed a hole in the locking of the FVulkanShaderFactory. This reduces lock contention by having one lock per map.

  • Pass nullptr instead of a name to CreateEvent because it isn't clear if adding the "Local" prefix makes it process-local, or just session-local. Passing nullptr will create an anonymous object that no other process can manipulate.

  • Fixed an issue with so that Vulkan RHI now properly invalidates cached memory before buffer readback

  • Applied a fix for standalone PIE when "Use Less CPU when in Background" (bThrottleCPUWhenNotForeground) is enabled that would cause some slow downs. Also reenabled RHIInterrupt thread since CreateEvent was being passed the same name for both the parent (editor) and child (game) processes when creating the interrupt and submission threads. Also that name was in the Global kernel object namespace, both the editor and LyraGame.exe were sharing the same Event. adding the "Local\" prefix to the Event name, each process gets its own event, so the editor can no longer throttle the game's interrupt and submission threads.

  • Applied a proper fix for the livelock. The old fix used a queue which was leaking and still had the livelock problem. Now uses a stack-base queue which should resolve the remaining issues.

  • Only compare the relevant bits of render target flags when comparing FGraphicsPipelineStateInitializer-s. This fixes PSO cache lookup when the only difference is some miscellaneous flag, such as TexCreate_FastVRAM, TexCreate_Transient, etc, and fixes pipeline sort key calculation in BuildNaniteMaterialPassCommands().

  • Fixed calculation of temporary texture upload resource in D3D12 RHI RowSizesInBytes was used to compute sizes of the first mip and the tail and to allocate upload resource memory. This can result in under-estimation, as the row size in bytes (i.e. valid data range) may be smaller than the row pitch (i.e. number of bytes between rows). The pitch is what's used inside MemcpySubresource (called from D3DX12 UpdateSubresources) to compute the destination address. Since the smaller memory footprint was previously computed, smaller buffer range is sub-allocated from FD3D12FastAllocator and adjacent sub-allocations could be corrupted by MemcpySubresource. The solution is to just use the total size of the resource (including all mips) returned by GetCopyableFootprints() and the offset of mip1 to compute the size of mip0 and the total size of the tail.

  • Fixed texture array resolve in D3D11.

  • Fixed mip tail buffer size validation condition in FD3D12DynamicRHI::RHIAsyncCreateTexture2D Mip copy footprint size was computed incorrectly in the check(), assuming that RowPitch worth of data will be accessed for every row. This is wrong for the last row, where only RowSize bytes will be accessed.

  • Suppress some verbose logging related to RTPSO creation when non-blocking mode is used. Long PSO creation time typically does not cause a frame time spike when background compilation is used. Log events are still emitted if a PSO is created in a blocking mode (this can happen if non-blocking mode is enabled in some cases, such as when adding a new ray generation shader).

  • Fixed calculation of temporary texture upload resource in D3D12 RHI RowSizesInBytes was used to compute sizes of the first mip and the tail and to allocate upload resource memory. This can result in under-estimation, as the row size in bytes (such as valid data range) may be smaller than the row pitch (such as number of bytes between rows). The pitch is what's used inside MemcpySubresource (called from D3DX12 UpdateSubresources) to compute the destination address. Since the smaller memory footprint was previously computed, smaller buffer range is sub-allocated from FD3D12FastAllocator and adjacent sub-allocations could be corrupted by MemcpySubresource. The solution is to just use the total size of the resource (including all mips) returned by GetCopyableFootprints() and the offset of mip1 to compute the size of mip0 and the total size of the tail.


  • Removed RHICopySharedMips function and replaced it with a common UE::RHICore::CopySharedMips function that relies on RHICopyTexture. Global scope and command list versions of RHICopySharedMips are deprecated, and forward to the new implementation. Please update code to use UE::RHICore::CopySharedMips instead.


  • Removed use of GetContextSyncPoint in FD3D12OnlineDescriptorManager, and replaced with pipelined cleanup of used descriptor blocks. Context sync points cause command lists to split and extra ExecuteCommandList plus Signal calls on the submission thread, which results in lower GPU utilization.

  • Removed use of FRHIBoundShaderState resources in D3D12RHI. These were no longer necessary since they were only used to find or create root signatures, which can be implemented directly in the adapter class.

  • Remove deprecated RHIRayTraceOcclusion and RHIRayTraceIntersection methods. They are replaced with equivalent new high-level functions in RayTracingBasicShaders.cpp.



  • Rough refraction now accounts for transmittance in Substrate.

  • Added high quality normal in Substrate, according to GBuffer format.

  • Fixed forward shading ambient lighting so that it works with Lumen Global Illumination in Substrate.

  • It is now possible to have an acyclic graph instead of a tree, meaning a node can be linked to multiple pins in the Material Graph.

  • Added support for Substrate as a pin type when adding inputs to Material Functions.

  • Added better positioning of Material nodes when converting to Substrate from legacy Materials.

  • Separated Sky Mie and Rayleigh atmosphere LUTs for better control over the look of the cloud including start distance and fade region.

  • Rough refraction now accounts for depth in Substrate.

  • Added a Temporal Anti-Aliasing (TAA) pass to stabilize rough refractions.

  • In Substrate Rough Refraction, added a max pre-exposed illuminance console variable to reduce flickering.

  • Improved the Console Variable documentation in Substrate's debug view mode.

  • Mean Free Path (MFP) is no longer clamped for forward materials, resulting in transmittance closer to 1.

  • Substrate now properly accounts for the Allow Negative Color setting.

Bug Fix:

  • Fixed Oct encoding in Substrate, which was causing visual issues with normals.

  • Fixed a shader compilation failure in Substrate when the output 0 of a Material Function is not 0.

  • Fixed a bug with previewing the regular Material root node while Substrate is enabled.

  • Implemented a fix for top layer roughness affecting the bottom layer roughness when it should not. This occurred when coverage is 0, or when coverage is 1 but transmittance is 0.

  • Fixed a bug with Simple Clear Coat throughput being applied twice on the specular of the bottom layer.

  • Implemented a fix for slabs to work with the legacy Additive Blend Mode.

  • Fixed a bug that produced artifacts with Rect lights when Forward Rendering is in use.

  • Made changes so that the ‘IsThin' property is only editable when Substrate is enabled.

  • Deferred shading now handles light SpecularScale correctly in Substrate.

  • Fixed opacity clipping in Substrate for translucent writing in VelocityShader.

  • Fixed a bug to prevent blur in refraction when roughness equals 0.

  • Implemented fixes so that emissive Materials in Substrate are consistent with legacy Materials.

  • Fixed an issue with opacity clipping not happening on Lumen front translucency.



  • Added an option to use dual quaternion delta in MLDeformer from the Nearest Neighbor Model. This option improves network prediction accuracy.

  • Added an automatic tool to generate a nearest neighbor dataset in ML Deformer from the Nearest Neighbor Model editor.

  • Optimized the network for the Nearest Neighbor Model using ISPC for improved performance.



  • Significantly reduced the amount of work done on the CPU for geometry collections that have not yet been broken.

  • Added additional ways to tune the collision behavior of geometry collection components as they crumble using the new Collision Profile Per Level and Abandoned Collision Profile Name properties.

  • Introducing a new physics object API that allows you to interact with both rigid bodies and geometry collections using a single interface.

  • Joint constraints can now attach to geometry collections.

  • Added missing functions relating to AutoDisable and Collision to Physics Control Component.

  • The Fracture Mode now can optionally show precise, live previews of the cutting shapes that will be used in Voronoi-based fractures. This is especially useful for tuning the noise settings on a fracture.

  • Default proximity generation settings for Geometry Collections are now exposed in the Fracture Mode project settings. These settings will be applied to any newly-created Geometry Collection in the project.

  • Added a new Proximity tool in Fracture Mode, which allows users to visualize and change generation settings for the Geometry Collection bone proximity graph. This proximity graph is used for clustering, neighbor selection, and some collision generation features.

  • Added aConvex Hull distance method to the Proximity tool for computing the proximity, allowing for a more approximate notion of proximity where bones are connected as long as their convex hulls are within a user-specified distance.

  • Added the option to the Proximity too to use the proximity graph as a connectivity support graph for simulation, giving more control over how a Geometry Collection breaks apart.

  • Added the option to enable or disable collision between the controlled objects when creating controls using the Physics Control Component.

  • Removed contention on lock in TRwFifoLock when there are significantly more readers than writers.

  • Fixed crash occurring when enabling simulate physics on a Geometry Collection with no rest collection assigned.

  • Added an option to enable disable playback on individual components in a Chaos cache manager.

  • Added an island computation node and point triangle position target node.

  • Add missing guards to Physics Control Component to avoid crashes when using a Skeletal Mesh Component.

  • Exposed Poisson ratio and J term coefficient for XPBD corotated constraints.

  • Added variable damping and mass support for materials.

  • Fixed potential crash when adding a Geometry Collection to a sequencer and adding components as the track followed by adding a Geometry Collection track to it.

  • Added XPBD position targets and related nodes

  • Grouped the various geometry collection notification settings into a separate Events category in the editor.

  • Added an option to use level sets when running Generate All Bodies for the Skeletal Mesh Editor.

  • Implemented CopyWithScale for instanced implicit objects and scaled implicit objects which allows support for non-identity scalings on geometry collections using those objects as collision shapes.

  • Geometry collections can now be used in the ComponentSweepMulti and ComponentOverlapMulti functions.

  • The Fracture Mode plane cut tool can now show a live preview of the shape of the cutting surface with noise applied, giving a better pre-visualization of exactly what the cut will look like.

  • Improved runtime performance of render state creation.

  • Added a new base 3d gas shader.

  • The cluster's Level Up button in Fracture Mode can now operate on clusters.

  • Removed data flow data from cooked Geometry Collection Assets.

  • Added VDB sim cache support with optional CVARs.

  • Added an Enable Damage from Collision flag that, when turned off, prevents physics collisions from breaking the geometry collection. This gives gameplay more control over the geometry collection's destruction.

  • Added an option to strip geometry data on cook even when nanite is disabled.

  • Added an extents property for breaking events in geometry collections.

  • Added the ability to know if the geometry collections' breaking event originates from a crumble event.

  • Added a GetLocalBounds Blueprint function.

  • Added a GetDebugInfo Blueprint function.

  • SetAnchoredByIndex and SetAnchoredBybox have now a new bAnchored option.

  • Improved debug draw of geometry collection connection graphs by showing the nodes and their physics states using colors ( blue: kinematic/anchored, yellow: dynamic, red static).

  • Optimized several runtime code paths for geometry collections.


  • Added a flag to geometry collections to prevent them from crumbling when applying forces to them to allow gameplay to dictate their destruction.

  • Removed IsBetaVersion from the Chaos Cloth plugin, and updated version name to 1.0.

  • Updated geometry collection to make sure to only recreate convex hulls if necessary when resetting a collection from another.

  • Updated the output grid resolution to better match the specified input resolution for PhysicsAsset/SkeletalMesh level set collision objects.

  • Updated PhysicsAsset/SkeletalMesh level set collision objects to avoid rendering the grid if resolution is too high (debug rendering can really start to slow things down).

  • Updated the box projection in Fracture Mode's AutoUV tool to have more options to control how it is laid out in texture space, and it now defaults the box projection UV origin to (.5, .5) so the layout fits in a standard 0-1 range.

  • Made bImportCollisionFromSource writeable for blueprints.

  • Updated Fracture Mode's cluster Merge tool to work on leaf nodes, so users can easily merge a leaf node into a cluster.

  • Updated the Radial Fracture tool in Fracture Mode to have more options for controlling the layout of the radial Voronoi sites, including separate controls over angle vs radial noise, and control of the radial spacing.

  • UpdatedGeometry Collection to not create render state when ISMPool is in use and not in Editor.

  • Updated the Fracture Mode's Proximity tool to allow the user to specify a Contact Threshold to filter out proximity connections that have insufficient contact. Currently, we define contact as the maximum overlap of the 2D bounds as projected to each major axis, so this primarily helps filter out corner and edge connections between bricks.

  • Updated break events to filter out in the clustering code if the proxy does not opt for it.

Bug Fix:

  • Fixed the USkeletalMeshComponent::GetTeleportRotationThreshold method that was returning the distance instead of the rotation threshold.

  • Fixed a potential crash when loading into a level with geometry collections in a Play In Editor (PIE) session.

  • Fixed backstop when the Chaos Cloth component is scaled.

  • Fixed tether scale clamp that should happen before the mesh scale was applied that was deforming cloths using higher than 10 times scales.

  • Fixed the cloth collision thickness when the component is scaled.

  • Fixed fictitious forces to use the cloth reference bone as rotation center instead of the simulation space location.

  • Fixed a bug generating a mesh for solid rendering of the level set cells.

  • Fixed an issue where the geometry collection would move to an incorrect location if its world transform is changed prior to initialization on the physics thread.

  • Fixed a geometry collection crash that could happen if replicated data is processed on the client before it is initialized.

  • Corrected SkinnedBoneTriangleCache error of getting the wrong bone-vertex influence. Weights are now using uint16 but one variable was still uint8.

  • Fixed rare compilation error related to variable shadowing in Chaos.

  • Fixed solver velocity scale when a reset is needed, which was causing the garment to flip over a character on the first few frames.

  • Chaos MassProperties.cpp's CalculateVolumeAndCenterOfMassImpl and CalculateInertiaAndRotationOfMassImpl are now consistent. Both now compute their result in double precision, and handle surfaces with more than three vertices by implicitly fan-triangulating them

  • Protected a call to IsStatic in the physics interface matching previous behavior (protects against crashes when setting up body instance parameters in component constructors).

  • Fixed potential crash when a Geometry Collection is deleted at runtime while removal events are still being processed.

  • Updated the geometry collection statistic window to display information properly when selecting a geometry collection embedded in a Blueprint.

  • Updated the C++ TransformNormalUnsafe function in Chaos/Transform.h to apply scale and rotation in the correct order, there is a new safe TransformNormal method in the same file.

  • Fixed a physics constraint component crash when it unregisters after the components it is attached to.

  • Fixed MTD computation in Overlap_GeomInternal to take the maximum distance instead of accepting the first overlap as the correct MTD.

  • Fixed an issue on large maps where geometry collections would not add or remove themselves from the gameplay acceleration structure in a timely fashion causing player movement to collide against them longer than they should.

  • Fixed potential crash in FClothVisualization when the debug materials are loaded.

  • Updated the GeometryCore TConvexHull3 class with a GetFace method to directly extract polygonal faces. The Chaos convex hull builder now uses this method instead of a triangle-based method, which avoids some robustness issues.

  • Fixed error where removing a geometry collection anchor would cause disabled particles to start simulating.

  • Fixed an issue where geometry collection crumble events would get spammed even after everything has finished crumbling.

  • Updated Geometry Collection creation from Static Meshes to respect Static Mesh build settings when computing normals and tangents, either computing them with the same settings or not re-computing them if the build settings do not request it.

  • Fixed crash when undoing a mask target change in Chaos Cloth.

  • Fixed issues with kinematically driven Geometry collection not updating properly in the following situations:

    • When internal clusters are becoming kinematically driven roots.

    • When all pieces are broken and sleeping , preventing the rendering from properly updating the rendering matrices.


  • Removed support for the legacy Apex collisions.

  • Deprecated an unused bLocalSpaceSimulation property on the SkeletalMeshComponent.

  • The UV channels in Geometry Collections are now structured so that each active UV channel is under a separate attribute, and is handled as a TManagedArray of FVector2f. This is more efficient to work with than the previous array-of-arrays structure, and also makes it impossible to accidentally create a Geometry Collection where some vertices have more UV channels than others. This means that UVs cannot be accessed via a UVs attribute on the Geometry Collection, and must instead be accessed via the GetUV, ModifyUV, and FindUVLayer methods, or the many new helper methods provided in the new FCollectionUVFacade class.



Bug Fix:

  • Added ensure to use the specified unreal executable instead of a hard coded development one when launching the cook on the fly server.



  • When running the QueryTargets commandlet, Unreal Build Tool will only write out the default targets, if one is specified for a given target type.



  • Improved game console keyboard shortcuts. Using left, right, backspace, or delete with the CTRL key now behaves similarly to common text editors.

  • Windows dialog boxes now have the following improvements:

    • Dialog boxes are now resizable and can auto-fit to screen.

    • The scrollbar has been implemented.

    • Text is now selectable.

    • Dialog boxes now use proper layout with DPI scale.

Bug Fix:

  • Fixed Common UI Actions not being visible on the navigation bar inside paused menus in cooked games.

  • Fixed an issue where UI input configs could unintentionally apply multiple input locks.



  • Added a plugin to refresh the main frame and Slate widgets when Live Coding is completed. This makes it possible to conveniently iterate on Slate UI using Live Coding.

  • Added new bool attribute to SDropTarget to stop AllowDrop function call from executing every frame for overlay visibility. This will make the drop target highlight only appear when hovering above it.

  • Added support for configurable minimum and maximum fractional digit to display in the spin box for SNumericEntryBox.

  • SPropertyEditorNumeric now supports MaxFractionalDigits metadata, which makes it possible for properties to specify that they don't need 6 digits of fractional precision. This can be useful for properties with large ranges.

  • Optimized the tooltip system to avoid frame rate drop when moving the mouse over Widgets displaying different tooltip.

  • Improved the SScrollbox slot to support the same settings as the Vertical/Horizontal/Stack box, such as fill size and auto size. Those new settings are now also available in the slot from the Scrollbox widget in UMG.

  • Added cache functionality to SDropTarget for expensive AllowDrop operations. This is turned off by default. Normally, OnAllowDrop is called every frame, which is user bound. Setting bUseAllowDropCache to true will cache off AllowDrop the first time it is called. The cache is cleared whenever a drag & drop operation starts.

  • Added a Cvar to adjust the software cursor's scale: Slate.SoftwareCursorScale This can be used with 4k device profiles to make the cursor more visible. Requires a cursor widget that is scale-aware.

  • Deprecated protected access to SListView::ItemsSource. This will allow us to use other container types.

  • Added the ObservableArray container to Slate.

  • Added support for specifying which file type is initially selected when creating a Slate file dialog window.

Bug Fix:

  • Fixed an issue that caused Slate trace selection to fail to update under Timing Insights. This required clicking on Asset Loading Insights to update.

  • Previously, SlateRect calculated its area with SizeSquared instead of GetArea. This has been corrected, and GetArea will return the correct value.

  • Fixed Slate clipping against incorrect Windows rects.

  • Fixed error handling when creating a Slate vertex shader (FSlateD3DVS::Create).

  • Fixed an issue where gamepad focus would not set correctly due to default synthetic cursor position generating widgets under the mouse when fullscreen.


  • Slate's core use of FVector2D has been deprecated in favor of FVector2f.

    • Nearly all of the public surface area of SlateCore has been modified to use deprecation tooling that transitions towards FVector2f. Virtual functions and some members remain using FVector2D due to the difficulty in gracefully deprecating such APIs.

    • FDeprecateSlateVector2D, FDeprecateSlateVector2DParameter and FDeprecateSlateVector2DResult are now used extensively and support a range of conversion operators for interoperability with both single and double precision types while the transition is in progress.

    • Some legacy FGeometry::ToPaintGeometry and MakeChild overloads have been explicitly deprecated since they cause ambiguous overloads with FSlateLayoutTransform if it were to support implicit construction.

    • Deprecation is reported for any consuming module that enables UE_REPORT_SLATE_VECTOR_DEPRECATION as part of its build.cs file. By default this is not enabled, but the default will change in due course as deprecation progresses.

    • Make sure to add PrivateDefinitions.Add("UE_REPORT_SLATE_VECTOR_DEPRECATION=1"); to your .Build.cs definitions for any module that consumes slate APIs in correct any deprecation warnings as soon as possible. This will become mandatory in the near future.

    • A small number of very rarely used APIs that returned double precision types by const T& have been changed to return their single precision counterpart by-value. This has the potential to cause a build error in your project in some circumstances (for instance, where that return value is also returned by-reference or pointer).



  • Added a CVar to enable the platform cursor when using gamepad.

  • Added mobile-specific properties to WBP_UIKit_CTAButton_Base.

  • Added capability for ActionRouter child classes to have control of Mouse Position in CommonUI.

  • Created an option in UE TextLayout for text flow to be set by culture. This makes it possible to predictably handle text that might include names from other cultures but should still be read the same as the set culture.

  • Auto-cast the result of User Widget Extension utilities in Blueprints.

  • Added a new CVar called CommonUI.bDumpInputTypeChangeCallstack to log when the input type changes to CommonUI.

  • Added a BlueprintAssignable delegate called BP_OnListViewScrolled to UListView. This is broadcast from UListView::OnListViewScrolledInternal.

  • Added a Getter and Setter for MobileFontSizeMultiplier in UCommonTextBLock.

  • When creating a new Widget, the Is Variable property of the Widget is now set according to the Authorize Automatic Widget Variable Creation project setting, which you can find in the User Interface category. If automatic widget variable creation is disabled, the Is Variable property will be set to false. If automatic widget variable creation is enabled, it will use the internal setting of the widget. The setting is set to true for existing projects in order to keep the current behavior, and it will be set to false for new projects. It can be changed any time, and will only affect new widgets, not previously-created widgets.

  • Updated the CircularThrobber with getter functions for Period, Radius, and Number of Pieces, as well as a Getter and Setter function for the throbber Image.

  • Added a debugging interface for Viewmodels.

  • Added an interface (IBlueprintWidgetCustomizationExtender) to customize widgets in UMG designer.

  • When a UserWidget uses a Viewmodel, it now adds the Viewmodel's information to the widget's asset metadata.

  • Added OnWidgetAdded and OnWidgetRemoved events to GameViewportSubsystem when a widget is added and removed.

Crash Fix:

  • Fixed a potential crash in UCommonUIVisibilitySubsystem when GameInstance isn't initialized.

Bug Fix:

  • Fixed a bug where a 1-frame flickering occurred when using rich text to create a new text sub-element within another rich text. This was due to scale not being taken into account at creation time.

  • Fixed a bug that prevented changing the style of an editable text from a Blueprint graph.

  • WidgetSwitcher now properly sets the Slate ActiveWidget Index even if it did not change.

  • Fixed analog navigation input not working properly in the CommonUI AnalogSlider widget.

  • Fixed the flow direction that was not handled properly by InvalidationRoot (typically used in RetainerBox) when configured to Inherit. This was overwriting the RightToLeft setting from parent with LeftToRight.

  • Fixed all EditableTexts in order to prevent ModelViewViewModel notifications from being called too often, and to ensure MVVM notifications are called when the text is edited from the SWidget.

  • Fixed the MultiLineEditableTextBox to enable MVVM notification on Text property change, to be on par with other members of the MultiLine EditableText Box family.

  • Fixed an issue in UEditableText and UEditableTextBox where the IsReadOnly and IsPassword parameters weren't being set when MyEditableText is created.

  • The UMG Blueprint widget editor now initializes according to the same non-defaults-only workflow as a non-UMG Blueprint.

  • Fixed an issue where UMG widgets wouldn't check if SWidget exists before attempting to synchronize.

  • Middle mouse inputs now work with CommonUI.

  • CommonUI now checks for an empty gamepad widget rect using GetArea instead of SizeSquared.

  • UPanelWidget::ReplaceChildAt is now editor-only. This function won't work at runtime without rebuilding the widget. This can cause errors due to the fact that it uses virtual functions to add and remove children. Changing it to an editor-only function was deemed the safest way to address this issue.

  • EditorUtilityWidget is now only enabled when Unreal Editor is not in Play-In-Editor mode or Blueprint debugging mode.

  • Ingame widgets are not painted/ticked when their Blueprints are in Debugging mode.

  • Fixed an issue in drag-and-drop operations that kept extraneous resources alive.

  • Changed GameViewportSubsystem from a GameInstance subysstem to an Engine subsystem. This fixes an issue where widgets created in the loading screen are removed when the game instance changes.

  • Offscreen widgets with animations are no longer tracked by the tick manager.

Virtual Production


  • Added the experimental XRCreativeFramework plugin. XR Creative Framework provides a foundation for users to build tools for Unreal Editor which utilize head mounted display rendering and motion controller poses via OpenXR.

  • Switchboard: Added option to not retrieve logs. Useful for faster iteration when log and trace transfers are not desired.

  • Switchboard: Added LiveLink dropdown for Unreal and nDisplay devices. Now users will be able to select the LiveLink preset for Unreal and nDisplay devices directly from Switchboard.

  • Created CineSplineComponent to store camera data and custom parameterization. Created CineCameraRigRail actor to drive attachment with custom parameterization

  • Added additional attachment control on CineCameraRigRail, including camera parameters Added SplineMeshMaterial and SplineMeshTexture parameters to visualize spline parameters Added POC widget as an example showcase of new spline/CineCameraRigRail functionalities

  • Switchboard: Added option to disable slate throttling (defaults to no throttling). This is typically desired on Virtual Production stages since the Editor is used by the operators that prefer to see real time updates on the viewports as they change object properties, such as color grading on LED walls.

  • Switchboard: Users can now select the media profile in Switchboard for Unreal and nDisplay devices.

Bug Fix:

  • Fixed WebMMedia runtime crashing when trying to play media, and cleaned up WebMMedia.build.cs.



  • Support for GPUDirect for both input and output Added support for low latency input using just-in-time render. Added support for a frame creation output mode to reduce latency between rendered frame and frame sent out. Rivermax clock now supports system time. Rivermax SDK updated to 1.20.

  • Added a Display Unit setting when adding focal length and image center data to a Lens File asset, allowing users to specify the units of their input data (millimeters, pixels, or normalized).

  • Added support for an anamorphic distortion model (based on 3D Equalizer's Standard Degree 4 model) that can be used to apply an anamorphic post-process look to a cinematic camera.

  • Added a Camera Feed Info property to the Lens Information tab of the Lens File Asset Editor. This allows you to specify the rectangular region within the selected Media Source that represents the actual camera feed, so you can compensate for arbitrary cropping and masks.

  • nDisplay[SharedMemoryMedia]: Added media source modes of operation for non-nDisplay usage.

    • Framelocked: Matches source and local frame numbers. Always use this mode in nDisplay.

    • Genlocked: It doesn't match frame numbers, but it also doesn't skip frames, so will hold back the sender (up to a timeout) if it is faster than the receiver.

    • Freerun: It always grabs the latest frame. It may skip frames if they arrive too fast.

  • Remote Control: Added a setting to enforce remote clients to provide a passphrase. If a remote request (not made by the local user) does not contain a passphrase, a prompt will appear in the editor to decide how to handle the request:

    • Deny request

    • Create a passphrase

    • Put the client in an allow list.

  • Remote Control: Added a setting to control allowed origin (used to block potential scripting attacks). Added setting to validate the IP of the incoming requests. These settings can be modified in the Remote Control project settings under the Security category.

  • Highlight property in detail panels when clicking it in a Remote Control panel.

  • In Remote Control Preset:

    • Added owner actor name column.

    • Simplified exposed property label.

    • Display last valid bindings in the details section if its invalid.

Crash Fix:

  • Fixed crash when running in multi user with Remote Control in -game

  • Fixed crash when using Remote Control in a packaged project with NDisplay

Bug Fix:

  • The Lens Component now properly displays the names of the distortion model parameters in its details panel.

  • Fixed the Lens Component track in recorded Level Sequences to properly display its channels for distortion parameters and camera intrinsics.

  • The Simulcam Viewport in the Lens File Asset Editor now automatically adjusts its output resolution to match the resolution of the Media Source selected by the user.

  • Fixed distortion ST maps whose pixel origin was in the bottom left of the image to be correctly flipped vertically.

  • Improved time for opening Remote Control preset in huge maps or when it has a lot of exposed properties. Reduce OnObjectPropertyChanged callback time. Fixed hang when recompiling materials with remote control preset open.

  • Fixed functions without parameters not working when running in a display cluster. When running in a display cluster context, remote control requests get intercepted by the Display Cluster interceptor to improve performance, but requests going through that system are sent in a "fire and forget" fashion, therefore we cannot fetch the returned values from the intercepted payloads. This fix works around this by disabling interception when dealing with functions that return data.

  • Fixed some property change notifications not being sent by Remote Control when running in a packaged or standalone project

  • Reduced audio delay and improved audio quality when doing media capture with AJA.



  • Light Cards can now stay flush with the stage actor when you change their positional properties in the details panel.

  • nDisplay now supports Color Correction Windows in the Light Card editor.

  • Switchboard: Updated to PresentMon 1.8.0, which adds support for Win11.

  • nDisplay: Added shared cross-GPU media IO. This allows for sharing viewports between render nodes with zero or 1 frame latency, cross GPU. This is an alternative to mGPU that in some cases can be more efficient. It should be used without SLI enabled. Two nDisplay nodes would run on the same PC, one with r.GraphicsAdapter 0 and the other with r.GraphicsAdapter 1, which can be set in the nDisplay config, and overridden from a newly added option in Switchboard.

  • nDisplay: Preview now supported in PIE and SIE.

  • The PostEditChange message is now prevented when interacting with a subobject of the CurrentConfigData. This helps improve performance of the ICFVX panel when manipulating color settings.

  • nDisplay: Renamed operator panel name to 'In-Camera VFX' and added icon.

  • nDisplay: UV and 3D Lightcards now support OCIO.

    This makes it so even with PQ enabled, exposure stops use the correct units. By default it will inherit the OCIO of the relevant nDisplay viewport.

  • nDisplay: Added an option to set the Graphics Adapter used to launch a given nDisplay node. This is particularly useful when in non-sli multi-gpu system.

  • DMX - Implemented DMX controls for Light Cards.

  • Added the ability to rename and delete color grading groups from the ICVFX panel color grading drawer through a right-click context menu. Unnamed color grading groups now show up as "Unnamed" in the drawer, and hovering over the group name now shows a text edit beam cursor.

Bug Fix:

  • Fixed an issue where opening multiple nDisplay config editors would generate duplicates. Added buttons for each of them in the component panel.

  • nDisplay config actors in the level no longer display a preview when the ICVFX panel is open if Enable Preview is disabled.

  • Fixed issues with Light Cards that prevented them from staying flush on screen components. Also added a higher vertex screen mesh, which gives light cards more accurate results when rendered in the Dome projection of the ICVX panel.

  • Light Cards now stay in place when the viewpoint component they orbit around is moved.

  • nDisplay: Fix MediaInput for the sRGB input case. When playing back recorded image sequences, they appeared darker than the original, and it was because the saved images are sRGB encoded and the reader was not converting it back to linear.

  • Fixed issue where attempting to change the ICVFX camera component's chromakey color using the color picker window would cause the details panel to immediately become empty, as well as causing the color picker in the ICVFX panel's color grading drawer to stop working.

  • Fixed issue in the ICVFX panel color grading drawer where the details panel for the last per-viewport and per-node color grading group was displaying the entire cluster properties instead.



  • Updated the OpenColorIO library to v2.2 with a minor patch to disallow texture 1D resources.

  • Added optional support for inverted display-view transforms in the OpenColorIO plugin settings.

  • Added additional color space metadata to written EXRs such as chromaticity coordinates, and/or transforms source, or destination names.

  • Merged OpenColorIO render pass into a single accessible/public-facing function.

  • Added ANSI E1.54 PLASA color space definition to the engine for DMX users.

  • Correctly exposed OpenColorIO color space properties to Blueprint since their absence hindered python script users.

  • Added OpenColorIO support for built-in config via URI such as ocio://default.

  • Added an invalid fallback render pass to OpenColorIO as a graceful failure mode for invalid color transforms.



  • Virtual Scouting now has the Add Walk mode.

  • Changed the default for transact sources.

  • Sequencer Playlists: Additional playback options.

    • Invoking play again before previous section(s) have completed now enqueues additional sections on the same row (instead of playing concurrently).

    • Replaced "hold" with "pause."

    • Added "play backwards."

  • Added ISO, Exposure Bias, and Near Clip Plane to values transferred over Multi-User stream.

  • Moved VPSettings and VPRoles into their own modules / plugins.

  • Switchboard: sbl_helper.py now supports the UnrealGameSync "AdditionalPathsToSync" directive, which can be configured to sync additional depot paths to the same changelist as the project.

  • Switchboard: generalized mechanism for exposing plugin contents for use in UI This enables specifying plugins that Switchboard should search for content not just by plugin name but also by relative or absolute file path to the plugin directory.

  • Added support for environment variables for Virtual Production in film pipelines.

  • Switchboard: Added the ability to redeploy remote Listeners on demand via the Tools > Listener Redeployer menu item. The redeploy flow now also allows users to include or exclude individual devices via a checkbox.

Bug Fix:

  • Bumped the version for TcpMessaging. It was not bumped for 5.1 but should have been.

  • Virtual Scouting: Fixed interactor laser spline meshes recomputing physics-derived data every frame, as well as an analogous issue in the multi-user VR presence.

  • Virtual Scouting: Added a toast/notification if Virtual Scouting is unable to launch because the r.PostProcessing.PropagateAlpha cvar was set to an unsupported value.

  • Switchboard: sbl_helper.py now correctly handles p4 print returning multiple text records for a single file.

  • Added an overflow buffer for reliably sent messages so that fully sent segments waiting for ack do not block new messages from being sent.

  • Fixed a bug in Switchboard Listener that would cause child processes to have an invalid handle passed for stdin.

  • VR Editor Mode: Screen Percentage support

    • If VREM is enabled, Preview Screen Percentage no longer automatically disables.

  • Switchboard: Fixed an intermittent crash on multi-user launch/shutdown. Also, the running server is now correctly validated in more scenarios, such as if the server name contains hyphens, or uses a hostname instead of an IP address.

  • Virtual Scouting: Fixed a bug where attempting to enter Virtual Scouting with a Cinematic viewport active would lead to the view rendering as completely black. Entering Virtual Scouting now changes the active viewport back to Default.

  • Switchboard: Fixed an issue where focusing then unfocusing a class setting could reset all device overrides of that setting.

  • Sequencer Playlists: Initiating playback of an item while the Sequencer tab is closed no longer causes an existing pending take to get replaced (and configured Take Recorder sources to be lost).

  • Virtual Scouting: Users will no longer be unable to deselect actors if both hands are holding an interact tool. Second tool now falls back to navigation tool if context menu is activated.

  • UdpMessaging: Fixed a potential crash if the multicast socket wasn't created successfully.

  • Virtual Scouting: Fixed an issue where the VR transform gizmo was not centered on grouped objects.

  • Virtual Scouting: corrected naming on listed cameras in main menu UI and appearance of camera mark icons

Upgrade Notes


API Change:

  • Added ECVF_Scalability flag to p.RigidBodyNode and p.ClothPhysics CVars so that the scalability system is aware of them.

  • USplineMeshComponent::GetAxisValue() was renamed to USplineMeshComponent::GetAxisValueRef() to better reflect that a reference to the value is returned instead of a copy of the value. USplineMeshComponent::GetAxisValue() has been deprecated, and it will be removed in a future version. Please update any code to use USplineMeshComponent::GetAxisValueRef() instead.


API Change:

  • Changed the landscape.OutputDiffBitmap and turns it into landscape.DumpHeightmapDiff and landscape.DumpWeightmapDiff (0 = no dump, 1 = mip 0 diff, 2 = all mips diff). Both of these output to the Saved/LandscapeLayers folder, with a sub-folder named after the current frame's date/time, under a sub-folder named after the landscape actor being updated.



API Change:

  • Object handle API changed from using delegates to TFunction for performance. This upgrade replaces FObjectHandleReadDelegate::CreateStatic by passing in the function directly.

  • added the following macros to REQUIRE_ENSURE CHECK_ENSURE REQUIRE_CHECK for use in unit tests.

  • ObjectPathId was moved to private to hide implementation details.

  • FPackageName::ObjectPathToObjectName will now always return the leaf-most object name within the path (e.g., "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "AnotherObject"). Any code that relied on the old behavior should use FPackageName::ObjectPathToSubObjectPath instead.

  • A FSavePackageContext::ExternalImportValidationFunc function needs to be added to the FSavePackageContext instead of specifying a validator.

  • Use of the UE_LOG macro requires format strings that are constant at compile time. This requirement was only partially enforced in past releases, and code that compiled before may now produce errors.

Upgrade Notes:

  • Added support for structured and localized logging via UE_LOGFMT, UE_LOGFMT_LOC, and UE_LOGFMT_NS_LOC. The new FOutputDevice:SerializeRecord receives structured log records. Update any implementations of FOutputDevice that would benefit from structured logging.


API Change:

  • Added GetName() to ITimingViewSession public interface. The Timing View widgets from TimingInsights, MemoryInsights and AssetLoadingInsights will have this name initialized with the corresponding FInsightsManagerTabs::*ProfilerTabId.


AI Behavior Trees

API Change:

  • Fixed an issue where BlackboardComponent::IsValidKey was returning false negatives when called from a child Blackboard.

  • Made the OnTreeFinished function virtual.


API Change:

  • Added the following functions to FEnvQueryResult:

    • GetItemRawMemory: Returns the item's raw (byte) memory pointer.

    • GetItemAsTypeChecked: Converts query results to the type used by the query's generator to extract type-specific data from an item.


Upgrade Notes:

  • Soundscape Palettes without playback conditions will now automatically activate upon load and deactivate upon unload.

Blueprint Compiler

API Change:

  • For Blueprint content, we already redirect the functions to the double variants. However, C++ code that calls any of these deprecated functions will result in a warning that indicates the replacement function to use.

Blueprint Editor

API Change:

  • Added FReplaceInstancesOfClassParameters::bReplaceReferencesToOldCDOs and deprecated FBatchReplaceInstancesOfClassParameters. The FReplaceInstancesOfClassParameters::bClassObjectReplaced flag is legacy and not currently in use outside of the old hot reload path; it remains in place for backwards-compatibility, but an ensure() has now been added to guard against it being used incorrectly outside of that context.


API Change:

  • You can call GetInputDeviceHardwareIdentifier and GetMostRecentlyUsedHardwareDevice on the UInputDeviceSubsystem to get the most recently used hardware device for a given user.


API Change:

  • Removed FMassProcessingPhase.IsDuringMassProcessing and FMassProcessingPhaseManager.IsDuringMassProcessing in favor of FMassEntityManager.IsProcessing.

  • Use FMassRuntimePipeline::GetProcessors and FMassRuntimePipeline::GetMutableProcessors to access FMassRuntimePipeline::Processors

  • Modified Mass Dependency Solver to remove some of the fine-tuning tests when MASS_DO_PARALLEL == 0. No parallel execution of processors will take place.


API Change:

  • Overriding an Actor's NetCullDistanceSquared property:

    • Previously the NetObjectGridFilter would detect changes to an Actor's NetCullDistanceSquared property and act on that.

    • It is now also possible to override this property using new methods in the FReplicationSystemUtil API, these methods are:

    • SetCullDistanceSqrOverride

    • ClearCullDistanceSqrOverride

  • If you are using Iris and have a NetObjectPrioritizerDefinition for a prioritizer named PlayerState, make sure to add the following to your project's DefaultEngine.ini file:

    • [/Script/IrisCore.ObjectReplicationBridgeConfig] +PrioritizerConfigs=(ClassName=/Script/Engine.PlayerState, PrioritizerName=PlayerState)

  • Previously the NetObjectGridFilter would detect changes to the Actor's NetCullDistanceSquared property and act on that. Now you can override the value of that property via FReplicationSystemUtil::SetCullDistanceSqrOverride/ClearCullDistanceSqrOverride. This will affect the calculations in NetObjectGridFilter.

Level Design and Art Tools

Geometry Core

API Change:

  • The updated UDynamicMeshComponent::SetDynamicMesh function prevents sharing a UDynamicMesh between multiple UDynamicMeshComponents via the SetDynamicMesh function.

Geometry Script

API Change:

  • A UPROPERTY macro was added on to the FGeometryScriptFillHolesOptions::bDeleteIsolatedTriangles member.

UV Editor

API Change:

  • Dynamic Mesh Overlay now supports merging elements, providing a method to merge one element to another, if they share the same parent, collapsing any references from the first element into references to the second.

  • Dynamic Mesh UV Editor now supports removing seams from edges, providing a method to remove (via the new Dynamic Mesh Overlay functionality) seams from an edge collection by iteratively merging elements together.

  • Refactored selection in UV Editor.


API Change:

  • Split the FText comparison API out of FText so that it can be used for FString.

    • FTextComparison now exists to provide static access to the collated comparison functions of FText, without needing to actually create an FText to do the comparison.

  • Implemented async loading of localization data.

    • BeginInitGameTextLocalization and EndInitGameTextLocalization have been removed as part of this change.

    • Now use InitGameTextLocalization (which is async) followed by FTextLocalizationManager::WaitForAsyncTasks.


API Change:

  • The OnNetworkConnectionStatusChanged event was added to EOSSDKManager. Bindings for it have been added to the Switch, GDK, and Sony platform implementations.

Upgrade Notes:

  • Added the ability to set SocketSubsystemEOS Relay mode via config. Users can now configure which EOS P2P Socket relay mode they want to use by adding the following to a .ini configuration file: [SocketSubsystemEOS] RelayControl=NoRelays / AllowRelays / ForceRelays

  • Added forwarding capability for EOSSDK Network and application status events.


Upgrade Notes:

  • Changed the default HTTP Manager type in GDK to WinHttp. XCurl can still be used by adding the -UseCurlGDK command line parameter.

Online Subsystem

API Change:

  • Previous implementation based in NSURLConnection can be still selected passing the command line flag UseNSUrlConnection.

  • Fixed redirection parsing to properly handle errors.

    • Removed deprecated permissions.

    • Config settings:

    • [OnlineSubsystemFacebook] Updated APIVer to 15.0.

    • [OnlineSubsystemFacebook.OnlineIdentityFacebook] Changed default value for bUsePopup to true since otherwise was very easy to break the login flow.

  • Only receipts for non-completed transactions are kept and duplicates are discarded.

    • Once a purchase is consumed the receipt will be removed so if you need some data from the receipt you should cache it before consuming the purchase Added support for "Pending Purchases".

    • Their receipts won't contain validation information until they get completed (it is not possible to validate them nor consume them before completed).

  • Made threaded calls consistent and kept only receipts for transactions still in progress. Discarded all previously kept duplicates stored after requesting transactions

  • GetLinkedAccountAuthToken changed from returning APP to SESSION tokens in 5.1. This change has been reverted and it returns APP tokens again. SESSION tokens can be asked for explicitly by passing "Session" in the TokenType parameter.

  • This is the stub in the public interface only. Actual implementation would be per platform.

  • Deprecated the OnSessionParticipantsChanged and OnSessionParticipantRemoved events and added new events OnSessionParticipantJoined and OnSessionParticipantLeft. It is advised to reference the new events to avoid breaking changes in future releases.

Upgrade Notes:

  • Removed Product Name from EOS BucketId and added logic to enforce the 60 character limit. The default BucketId for EOS Sessions will change in a future update, which will cause incompatibilities when performing EOS session searches with builds using previous versions.

  • Renamed EncryptionKey config key to ClientEncryptionKey due to an issue with reserved keywords. Existing configs using EncryptionKey will continue to load correctly in unpackages builds but users should migrate to fix packaged builds. It is not recommended to remove EncryptionKey from IniKeyDenyList or you will leak keys from other config sections in packaged builds.

  • WriteAchievements now supports calling UnlockAchievements to directly unlock achievements by name, matching the behavior of other OSS implementations. The old behavior is still present, but will be removed in 5.3. You can select the new behavior with the following config entry in Engine.ini hierarchy: [OnlineSubsystemEOS] bUseUnlockAchievements=true

  • Moved IpNetDriver dependency from OnlineSubsystemGDK into its own plugin. To reduce executable size on GDK platforms, use GDKNetDriver instead.

Pixel Streaming

API Change:

  • With the upgrade to AVCodecs, PixelStreaming Player functionality has regressed, and playback isn't functional. This will be resolved in UE 5.3.

  • Exposed Pixel Streaming JSON parsing API.

  • A temporary d3d device is created before calling AMD AGS as it will not check the DriverStore without an initialized device when agsDriverExtensionsDX11_CreateDevice is called. The temporary device is then destroyed. According to AMD this requirement is currently by design.

  • For users wishing to have custom handlers for responding to Pixel Streaming "command" messages, this is now possible through the IPixelStreamingInputHandler::SetCommandHandler method.

  • ConfigOptions consist of a pair of strings, they can be set using IPixelStreamingStreamer::SetConfigOption. Upon having a client connect, all ConfigOptions are converted to JSON and passed to the client in the "ConfigOptions" field of the "InitialSettings" message. Setting a ConfigOption to an empty string will clear it and cause it to not be sent. At present this is used to pass the "DefaultToHover" message as "true" if streaming from the Editor.

  • Main fix is to the VideoInputBackBufferComposited where we now have a target input rectangle instead of a point. This allows for a minimum point that's not (0,0).

Upgrade Notes:

  • Improved E2E latency on VCam + PixelStreaming. Added FPixelCaptureRHINoCopy when the provided texture is copy-safe.



Upgrade Notes:

  • Implemented additional VRNotificationsComponent callbacks in the OpenXR plugin. Applications can now be notified when the interaction profile changes which will signal when the controllers become available, when the user has switched to different controllers, or when they've been disconnected.

Platform Mobile

Upgrade Notes:

  • Fixed a crash when using the VK_EXT_fragment_density_map Vulkan extension.


API Change:

  • SSAO support has also been added, but currently causes artifacts and is disabled by default. Fixes are planned for future releases.

  • Fixed a bug where GetCachedLODBias could be stale. The cached variable is now computed as needed so it's always correct. Remove calls to UpdateCachedLODBias as it is deprecated and now does nothing. Remove direct use of the CachedCombinedLODBias variable and call GetCachedLODBias instead.

Upgrade Notes:

  • Added ray and path tracing support for SplineMesh components. The new console variable r.RayTracing.Geometry.SplineMeshes can be used to quickly enable or disable support.

  • Added the r.DumpGPU.FrameCount console variable to specify a number of frames to dump when using the DumpGPU command.

  • Added the r.Translucency.AutoBeforeDOF console variable to automatically render PostDOF translucency before DOF when their component location is behind DOF's focus distance.

  • Added the r.DumpGPU.Delay console variable to allow for specifying a wait time between the DumpGPU command and the frame dump.


API Change:

  • Removed the need to call BuildInstanceMaskAndFlags and BuildRayTracingInstanceMaskAndFlags functions manually in GetXXRayTracingInstance. They will be called in the renderer module. All functions manually called have been removed. Removed the RENDER_API public API for those functions in RayTracingInstance.h.


Upgrade Notes:

  • Enabled virtual shadow map one pass projection by default. This can be a significant performance improvement for scenes with many shadowed local lights. Subsurface materials may need some tweaks to opacity or similar with these changes.

Materials and Shaders

API Change:

  • FMaterialShaderMap::GetShaderSource now accepts a permutation ID parameter; this can be 0 if the requested shader/vertex factory has no permutations.

  • This change necessitated removing the exposed AddShaderEntry and AddPlatformDebugData functions from the FShaderMapResourceCode class; with the change all of the shader code, debug data, and any warnings encountered for the shader are automatically appended to the shader map data via the AddShaderCompilerOutput function.

Upgrade Notes:

  • Reworked distortion to use material F0=>IOR by default. Use the root note refraction pin input to override IOR for art direction. Refraction is now disabled using the None mode. This data is converted automatically.

Path Tracer

Upgrade Notes:

  • A new set of controls has been added to the post-process volume to allow selective inclusion of direct vs. indirect lighting on diffuse, specular, and volume paths. This provides greater control over how the image is decomposed and enables rendering of specular only or volume only passes for greater control in external compositing applications. The Diffuse and Specular ShowFlags as well as the DirectLighting and GlobalIllumination ShowFlags are also now mapped to the same mechanism.

  • The old "Enable Emissive" checkbox has been removed as the new "Indirect Emissive" checkbox has the same behavior.

  • Decoupled IOR from specularity for solid and thin glass models.In the solid case, IOR now only affects ray bending, while SpecularColor controls the fresnel effect. Refraction must be enabled in the material to get a refractive event. Disabling refraction means the surface is simply transparent. When refraction is enabled but nothing is connected to the Refraction port in the material, the IOR is inferred from the material's specularity. In the thin case, IORnow affects the transmitted roughness, so that rough refraction is progressively disabled as Ior is reduced toward 1.0 as would happen in a real slab. When not using refraction, ThinTranslucent materials are rendered using transparency, while with refraction they are rendered with an actual bounce (to allow for roughness, and for consistency with the solid case). SpecularColor controls the fresnel effect.

  • Rendering performance with decals has been improved by only evaluating them when the path roughness is sufficiently low (for camera rays and sharp reflections/refractions). This behavior can be fine tuned with the following console variables:r.PathTracing.DecalRoughnessCutoff and r.PathTracing.MeshDecalRoughnessCutoff


API Change:

  • Moved GPixelRenderCounters to RenderCounters.h.

Upgrade Notes:

  • Updated Epic TSR scalability settings with higher resolution history to better maintain image sharpness and stability under motion by default.

  • Moved optional TSR statistics from stat unit to stat tsr.

  • Fixed a bug in TSR cinematic scalability settings where the output image could diverge from the desired result.


Upgrade Notes:

  • [Substrate] Removed legacy metalness workflow without data conversion. This will invalidate a few Substrate materials.



Upgrade Notes:

  • Added a Physics Control Actor and additional functions to manage Physics Control Components. This includes adding support for named sets of controls and body modifiers. Renamed functions in Physics Control Component for clarity. These renames should be mostly handled by a redirect. However, blueprints/code using the control multiplier functions may need to be fixed manually due to the nature of the renames.



Upgrade Notes:

  • Visual Studio 2022 is now the default generated solution and compiler if all available platforms are supported.This may require updating to the latest Microsoft Visual C++ Redistributable.



Upgrade Notes:

  • Added ApplyDisabledEffectOnWidgets console variable to control widgets' disabled visual. If enabled, the alpha of the widget will be set to 0.75 when disabled. The console variable is set to 1 by default and can be initialized in the DefaultEngine.ini project file.

Virtual Production


Upgrade Notes:

  • Disabled python function calls when using Remote Control by default. Accessing Remote Control Settings remotely is also disabled. This behavior can be changed in the Remote Control Project Settings under "Allow remote python execution."


Upgrade Notes:

  • Added logic to Virtual Scouting to prevent the zoom lens from being selected in VR Viewfinder. Only the prime lens will be selectable.

  • Added validation to check if lens options are changed during editor sessions by editing Project Preference > Cinematic Camera.

Help shape the future of Unreal Engine documentation! Tell us how we're doing so we can serve you better.
Take our survey