Unreal Engine 5.3 Release Notes

Overview of new and updated features in Unreal Engine 5.3

What's New?

Unreal Engine 5.3 brings further improvement to the core UE5 toolset. This release delivers improvements in a wide variety of areas, including Rendering, Worldbuilding, Procedural Content Generation (PCG), Animation and Modeling tools, Virtual Production, Simulation, and more.

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.3:

909185693, 34Pibo, aaronmjacobs, Acren, aijkoopmans, AishaBrown-SMG, aknarts, alexey-pelykh, alwintom, AndreaCatania, AndTikhomirov, ArcEcho, astutejoe, avudnez, baronpumpky, BenVlodgi, BinaerBoy, Bioliquid, BlenderSleuth, bretternst, brycehutchings, c4augustus, CaptainHoke, chalonverse, chrismcr, Cleroth, cneumann, crobertson-d3t, crssnky, David-Vodhanel, dbsigurd, Deathrey, DecoyRS, djethernet1, DomCurry, dorgonman, Drakynfly, DreikaEru, drichardson, dulanw, Dumbeldor, dyanikoglu, Edstub207, erebel55, error454, fieldsJacksonG, FineRedMist, flibitijibibo, foobit, freezernick, gbxAlx, gonfva, hellokenlee, hkzhugc, HSeo, Ilddor, ilkeraktug, ImaginaryBlend, iniside, jackatamazon, JakobLarsson-Embark, jammm, janurbanech13, jcb936, JDCruise, jfgoulet-gearbox, jimsimonz, Johnsel, JonasKjellstrom, jorgenpt, KacperKenjiLesniak, KaosSpectrum, KasumiL5x, KeithRare, kimixuchen, kissSimple, kniteli, KristofMorva, ldisthebest, LennardF1989, Levil0229, lflecunneen, lightbringer, lijenicol, lijie, liuhao0620, loening, LtRandolph, lucyainsworth, MalikuMane, mamoniem, manugulus, marcussvensson92, mariuz, mattiascibien, MaximeDup, microsoftman, MikBou123, mkotlikov, muit, OskarHolmkratz, pepsiandmilk, PhilBax, Phyronnaz, pirskij, praisesolek, projectgheist, QRare, qwe321, RandomInEqualities, Rareden, robert-wallis, RobertVater, roidanton, ryanjon2040, samhocevar, satoshi-iwaki, scorpio20t, Skylonxe, slackba, slonopotamus, Sn-a-ke, SRombauts, steelixb, stlnkm, teessider, tehpola, TheJamsh, TheoHay, Thomasleeee, tianyu2202, tommybear, tonetechnician, ToniSeifert, tuxerr, ukustra, Ultrahead, ungalyant, user37337, Vaei, velvet22, vorixo, Voulz, vsrc, WarmWar, WillmsBenjamin, WinsonSS, xiexbmu, yaakuro, yatagarasu25, yehaike, ZioYuri78, zompi2




Explicit Tangents

Nanite now supports explicit tangents in the data format and runtime. Until now, Nanite has relied on a tangent space that is implicitly derived in the material, based on the screen-space positions and UV gradients. This is computationally convenient, makes tangents free in terms of memory and disk footprint, and works well in practice for many types of meshes, especially highly tessellated ones. However, there have always been cases, especially for low-poly models, where the implicit tangents are too imprecise and custom per-vertex tangents are needed to reach target quality. To support these cases, users can now opt to store and use the original model tangents on a per-asset basis. Enabling this comes at a modest cost of an additional ~10% increase in memory and disk footprint for the asset.

Nanite Spline Meshes (Experimental)

We introduced an initial implementation of the spline mesh component for Nanite meshes. This feature can be enabled by setting r.Nanite.AllowSplineMeshes=1 in a settings .ini file. WARNING: Enabling this feature currently comes with a performance cost that affects culling performance of all of Nanite, and there are currently known issues with incorrect culling under extreme deformation.

Performance improvements for masked materials and Pixel Depth Offset (PDO)

A new sliding window vertex cache for programmable raster results in faster masked materials and PDO. Initial tests show a 20% speed improvement for rasterization of masked foliage.

Nanite Selection Outline

Nanite object selections no longer flicker with TSR/TAA enabled, nor get occluded by other objects, and they render at final resolution.

Nanite Instanced Static Mesh (ISM) / Foliage Instance Selection

We fixed several issues in the editor related to selecting, modifying, or deleting instances of an instanced static mesh or foliage actors that had Nanite enabled.

Fallback Target Setting

We added a Fallback Target setting to Nanite static meshes. This is a menu option that provides more explicit control over which target to reduce to for the fallback mesh: Relative Error or Percent Triangles.



  • Lumen Reflections support more than one bounce when hardware ray tracing (HWRT) is enabled with Hit Lighting, and the Max Reflection Bounces setting in the post process volume is set to 2 or greater. This can prevent black areas in reflections when there is enough performance budget to allow it.

  • Lumen Reflections can now be used without Lumen GI, for games and applications which use static lighting but wish to scale up in reflection quality beyond reflection captures. Standalone Lumen Reflections only work when HWRT is enabled, and it will enable Hit Lighting automatically, as Lumen's surface cache optimization is not available when Lumen GI is disabled.

  • We made significant Lumen HWRT optimizations, including enabling async compute for HWRT by default on consoles.

  • The Lumen Overview visualization mode now includes a view of the geometry normals of the Lumen Scene, making it easier to spot issues with the global distance field (in the case of software ray tracing) or Nanite fallback meshes (in the case of HWRT).

  • We added r.Lumen.Reflections.VisualizeTraces for visualizing and debugging reflection rays.

  • We fixed Material AO - it was previously applied on top of emissive and direct lighting.

Orthographic Rendering (Experimental)

Orthographic Rendering

Orthographic rendering is a very common way to visualize projects in architecture and manufacturing, and is also used in games as a stylistic camera choice. It has long been available as a camera option in UE, but many rendering features were not supported, making it impractical to use.

Starting in 5.3, orthographic rendering is now supported as experimental. We fixed multiple areas of the engine to achieve parity between perspective and orthographic projections. Most modern features of UE5 should now work, including Lumen, Nanite, and Shadows. This represents ongoing work and we are interested in hearing your feedback trying to use it in your projects.

Sparse Volume Textures (Experimental)

Sparse Volume Textures

With UE 5.3, we introduce a new asset type: the sparse volume texture (SVT). SVTs store baked simulation data representing volumetric media such as smoke, fire, and water. SVTs can be created by importing OpenVDB (.vdb) files created in other 3D applications—single files and animated sequences are supported. Additionally, Niagara fluids are now cached internally to SVTs resulting in significant performance and memory improvements.

An SVT is similar to a 3D texture / volume texture in that it stores texels (voxels) in a 3D data structure and can be indexed with three-dimensional UV coordinates. Unlike regular (dense) volume textures, SVTs only need to spend memory on regions of the volume with "interesting" data, allowing for much larger volumes compared to dense volume textures—or alternatively volumes with the same extent, but using less memory.

Deferred rendering techniques such as heterogeneous volumes, volumetric cloud, and volumetric fog can leverage SVTs by incorporating the suite of sparse volume texture material nodes in their volume-domain materials. Assets rendered with heterogeneous volumes must make use of the new heterogeneous volume component. Deferred rendering features are still limited to the existing feature set of real-time volumes. More complete support for rendering volumes is now available as experimental in the Path Tracer, which can accurately simulate scattering, shadows, and GI. There is also a very simple sparse volume texture viewer component that is mostly used for debugging and works with the Deferred Renderer.

Path Tracer

Path Tracer

  • (Experimental) The Path Tracer now has initial support for tracing heterogenous volumes such as smoke, fire, and clouds. A heterogeneous volume can be created with the Niagara Fluids plug-in or by instantiating a heterogeneous volume actor, with data driven by a sparse volume texture. VDB files may be imported as sparse volume textures, and can thus be rendered in the Path Tracer. Note: this system is not yet compatible with Sky Atmosphere clouds.

  • (Experimental) Substrate materials are now supported in the Path Tracer.

  • Subsurface scattering sampling efficiency has been improved, resulting in less noise in subsurface materials for the same number of ray samples.

  • The Path Tracer now renders its own depth pass rather than using the one generated by the rasterizer. This results in a more accurate match between the depth and RGB results, improving post-processing passes that rely on depth such as Depth of Field. (This change does not affect 'Reference Depth of Field'.)

  • DBuffer Decal shading nodes in material graphs are now supported. These nodes have been available since 5.0 and greatly expand the functionality of decals in materials. (Documentation about DBuffer Decal shading nodes will be available upon the release of UE 5.3.)

  • Post-process material buffers now have additional outputs for use specifically with the Path Tracer. These buffers are accessible through a new node in the material graph called 'Path Tracing Buffer Texture', and provide data for Radiance, Denoised Radiance, Albedo, Normal, and Variance.

Substrate (Experimental)


Substrate, released as experimental in 5.2, replaces the fixed suite of shading models such as Default Lit and Clearcoat 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 to before.

Substrate is still experimental in 5.3. It should not be used for production scenes, but we encourage testing it and are seeking feedback during this phase of development.

UE 5.3 contains many improvements in Substrate's capability, stability, and performance. Some of the changes include:

  • New Glints and Specular Profile features, primarily useful for automotive applications.

  • Improved DBuffer shading node support.

  • A new Fuzz model for high-spec platforms.

  • We updated the Substrate Material Information tab in the Material Editor to better display material performance and topology information.

  • We added many bug fixes and performance improvements.

Virtual Shadow Maps

Virtual Shadow Maps

  • We are removing the beta designation for virtual shadow maps in UE 5.3—we now consider them production-ready. There is still a long development path ahead for VSMs, but the designation reflects the stability and viability of the current working feature set.

  • VSMs now respect the Nanite cull distance even when shadow caching is enabled. Previously, the cull distance was ignored in shadows if caching was enabled, as it could cause inconsistencies between the primary render and shadow maps. However, this can have a large impact on performance if the content was tuned for heavy culling. Scenes reliant on culling will now have faster shadows but might see shadow artifacts if the cull distances are short enough to see popping in the primary render.

  • We added a per-primitive flag that gives the user control over shadow invalidation behavior. This provides users with a way to prevent invalidation, for example in cases where the primitive is known to use the World Position Offset setting statically—our systems cannot deduce this automatically at present. The default setting is 'Auto', which retains current behavior unless explicitly changed.

  • We made additional bug fixes and performance improvements.



We added groom streaming support for groom and groom binding assets. This allows faster loading time in editor and in game by loading only what is needed, lowering CPU and GPU memory pressure of groom assets.

We added Continuous LOD for scaling/improving performance when there are a lot of grooms covering a smaller portion of the screen. This setting is off by default and can be enabled with r.HairStrands.ContinuousLOD.

We added experimental support for hair strands in the Deformer graph, including support for writing custom attributes. This is still early in the development process, but will open the door to making groom changes at runtime in the Deformer graph.

We reworked groom attributes to be more flexible and to make it easier to add new optional attributes. We added two new optional attributes (clumpID / AO). Numerical values of groom attributes can now be visualized in the groom editor for easier inspection.

During asset import, point/curve limits are now reported to users, and data is trimmed accordingly. In addition, imported attributes are now clearly displayed at import time, as well as in the groom editor, to visualize what is available for a particular groom asset.

We made many additional bug fixes and performance improvements.

Temporal Super Resolution (TSR)

Temporal Super Resolution

We introduced new functionality for more automated control of the screen percentage in games when dynamic resolution is disabled (primarily on PC platforms). The default heuristic sets the screen percentage based on the optimal TSR convergence rate for the number of pixels displayed. This should result in end users requiring less experimentation to find the best settings for their device.

The editor has several new UX features to aid in understanding and controlling the behavior of the screen percentage in editor and PIE viewports.

We added initial support for 16-bit operations on desktop GPUs where backed by hardware support, including on Radeon RX 5000 series (RDNA) cards and newer.

We fixed an inconsistency between TAA and TSR regarding Lumen screen-space traces of emissive surfaces.

We made numerous optimizations and bug fixes.

Render Resource Viewer

Render Resource Viewer

The Render Resource Viewer, introduced in UE 5.2, is a tool that gives full visibility into GPU memory allocations and 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.

New in UE 5.3:

  • You can now select a render buffer/texture and jump to the source asset in the Content Browser.

  • Insight Memory Trace now tracks DX12 resources, and Insight Metadata Trace tracks resource owner paths like Render Resource Viewer. These features complement the Render Resource Viewer, which works only in the editor, and allows tracking of the owning asset path, debug name of the render resource, and its owner render class name in packaged builds.



  • Lights with ray-traced shadows can now optionally shadow volumetric fog. You can enable this with the console variable r.VolumetricFog.InjectRaytracedLights, which is off by default due to performance costs.

  • Spot, Point, and Rect lights can now set their intensity units to 'EV' (exposure value), which means you can set intensities in relative "stops", or power-of-two increments.


Level Instance Actor Filters

Level Instance Actor Filters

Actor filters allow for per-level-instance variants within World Partition levels. They consist of data layer instances and/or local data layers that are set to support actor filtering with a user-defined default filter inclusion. All actors associated with these pre-configured filters will be included or excluded on streaming generation, depending on the filters default, override, and activation states set within each level instance. Filtered out data is removed from in-game entirely.

Level Streaming Persistence (Experimental)

Level Streaming Persistence is a plugin that manages saving and restoring of specific marked properties on objects contained within a streamed-out/streamed-in level. These properties are defined within the engine configuration (.ini) file.

This provides persistence of properties during gameplay from the in-memory snapshot, as well as across sessions, if implemented through the provided API.

Nanite Landscape

Nanite Landscape

Nanite can now be enabled in landscape actors, at parity with normal landscape rendering. Nanite Landscape meshes are rebuilt in the background in order not to disrupt user workflow while in the editor. Nanite Landscape does not improve landscape resolution, but it allows the user to leverage Nanite runtime features such as GPU culling, automatic geometry streaming, and LODs, and it generally boosts runtime performance, especially for demanding features such as VSM.

Large Landscape Import / Export

We updated landscape import/export to support very large landscapes/resolutions by leveraging World Partition and splitting the import operation into several successive batches.

Landscape Physical Materials Display

Landscape physical materials can now be displayed when showing collisions by using the new CVar landscape.CollisionMesh.ShowPhysicalMaterial. When enabled, it helps users to debug how physical materials are exported, especially when using the Landscape Physical Material Output node.

Landscape LOD Groups

We added LOD groups to enable seamless LOD transition across multiple landscape actors in the same group.

Procedural Content Generation (PCG)

Hierarchical Generation

Hierarchical Generation

Hierarchical Generation allows for execution of different grid sizes within the same PCG graph.

After setting a default grid size in the PCG graph settings, users can start adding Grid Size nodes to define the granularity at which the downstream elements should execute. Data processed at higher grid size can be used at any smaller level.

This hierarchical logic enables users to achieve more optimal procedural generation, especially over large worlds at runtime.

Rule Processing From External Data

Rule Processing From External Data

We now support rule processing from external data, providing feature parity with the City Sample project Rule Processor plugin to manage external data, process it, and produce artifacts on target actors.

This includes:

  • External data support for Alembic point clouds and data tables

  • A utility for converting Alembic files to PCG Settings assets

Subgraph Inspection

Subgraph Inspection

We added support for debugging and inspecting PCG subgraphs through the Attribute List view within a parent graph.

Graph Instances Parameters

Graph Instance Parameters

We are introducing a Blueprint API to get and set PCG graph user parameters. Other additions include UX improvements and filtering for supported types.

Custom PCG Elements

Custom PCG Elements

To improve the creation workflows and readability for custom PCG elements, we renamed PCG-specific Blueprint loop functions. We also added new functions to set up and output PCG data collections in order.

Developer Iteration

Multi-Process Cook (Beta)

Multi-Process Cook helps reduce the total time it takes to get a cooked output from a build farm server or on your local workstation by leveraging available CPU cores and memory resources.

Multi-process cook is a beta feature for UE 5.3. Performance gains may vary, depending on the size of the project and how the data is separated. For best results, we recommend you test different CookProcessCount values depending on the project and available hardware specs.

Virtual Assets

Virtual Assets are now production-ready for UE 5.3 and recommended for teams using Perforce version control and a shared Unreal DDC (Derived Data Cache) for best performance.

To recap, virtual assets drastically reduce the size of local project data and sync faster by only synchronizing core asset metadata, and then pulling down the bulk data on demand if needed.

Virtual assets are supported for textures, audio data, and static meshes (including Nanite). Bulk data is compressed using Oodle for additional data size savings.

Should you need to go offline, you can run a precache commandlet when launching your project that will cache virtualized data locally on your machine. There is also an 'Auto fix / re-virtualize assets' check-in script available in the Unreal Automation Tool (UAT) that will catch any assets mistakenly un-virtualized project-wide.

C++20 Default Version

UE 5.3 is now compiled with the latest C++20 standard, and the version is supported in your development environment.

We added C++20 support to the Unreal Build Tool (UBT), and it is controllable with a target or module setting; C++14 is marked deprecated and no longer supported.

All engine modules are compiled by default with C++20, regardless of the target C++ standard. Other modules still support C++17 but can be opted-in to C++20 if desired.

C++ Unreal Header Tool

We removed the C++ Unreal Header Tool from Unreal Engine. Please use the C# Unreal Header Tool.




Gaze-Tracked Foveated Variable Rate Shading (Experimental)

Performance is of utmost importance when developing XR applications. This experimental feature enables gaze-tracked foveated image generation with OpenXR, reducing the number of total pixels drawn.

  • Make sure the OpenXR and OpenXR EyeTracking plugins are enabled, and set:

    • xr.VRS.FoveationLevel 1-3 to enable foveation.

    • xr.VRS.GazeTrackedFoveation 1 to enable Gaze-Tracked Foveation.

    • xr.VRS.FoveationPreview 1 to enable preview of the foveation mask.

Single-Pass Stereo Rendering for Nanite

Nanite can now render both stereo views in a single pass when Instanced Stereo Rendering is enabled.

  • Nanite rendering is a multi-step process, and executing these steps for each eye separately is not optimal. Projects with ISR enabled can now have each step of the Nanite pipeline process both eyes at once, reducing the overall rendering time.

  • You can use r.Nanite.MultipleSceneViewsInOnePass=0 to disable this technique in case you suspect it of introducing a problem.

Stereo Improvements for Lumen Global Illumination

Lumen GI has a number of per-view caches. Since stereo views are so close to each other in terms of position and direction, we can reuse some of the cache between the views.

  • You can use r.Lumen.StereoOptimizations=0 to disable this in case of any problems.

Handheld AR Improvements

  • ARCore SDK has been updated to 1.37

  • ARCore plugin cleanups:

    • Removed deprecated camera metadata API usage.

    • Updated to new Cloud Anchor Async API.

    • Updated to new front/back camera configuration API.

    • Removed deprecated ARCore-specific Blueprint functions that have cross-platform equivalents.

    • Fixed ARCore and ARKit ARPins when the tracking to World Transform or World Scale changes.

XRScribe Plugin (Experimental)

This new experimental plugin enables the use of the OpenXR plugin and related code without needing an OpenXR device. The plugin captures OpenXR API interactions between Unreal Engine and the runtime, and can use that capture to emulate devices.

  • A limited set of OpenXR extensions currently supported by XRScribe OpenXR surface. Hand tracking, gaze tracking, depth layer, and Vive Trackers are not yet supported.

  • Currently available for Win64 only, but other platforms will be supported in the future.

  • Emulation currently handles replay of HMD plus device poses, but no input yet.

  • Plugin built-in captures can be used for quick emulation using CLI (-xremu=mq1 or -xremu=vi).

XRBase Refactor

We refactored the implementation of many XR-related interfaces from the core engine into an XRBase plugin to reduce executable size and memory overhead in non-XR projects. Some XR-related plugins may need to add XRBase as a dependency as a result.

XR_FB_Foveation support (Experimental)

Fixed and dynamic foveation for Meta Quest devices can now be enabled in Project Settings->OpenXR Settings. You can use the following CVars to configure it:

  • xr.OpenXRFBFoveationLevel (Default=0)

    • 0=None, 1=Low, 2=Medium, 3= High

  • xr.OpenXRFBFoveationDynamic (Default=False)

    • True/False

  • xr.OpenXRFBFoveationVerticalOffset (Default=0)

Other Improvements

  • Mobile Preview on Vulkan RHI is now using multi-view extension natively instead of Mobile Multi-View emulation.

  • Packaging for all Meta devices can be achieved by enabling the Package for Meta Quest devices checkbox in the project settings.

  • Extension plugins to the OpenXR plugin can now access the Layer List.

Mobile Development Requirements and Compatible Hardware

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


UE 5.3 supports iOS, iPadOS, and tvOS devices with OS that support version target SDK 15 or later. UE 5.3 supports:

  • A8 AppleTV devices

  • A8X iPads

  • A9 devices or newer

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)


UE 5.3 supports Android devices meeting the following specifications:

  • Android 8 or higher

  • 64-bit Arm-based CPU

  • Compatible GPUs:

    • Mali T8xx, G71, G72, G76, G77, G78 and G71x series

    • Adreno 5xx, 6xx or 7xx series

    • PowerVR GM9xxx series

    • Xclipse 920

  • Compatible Graphics APIs:

    • OpenGL ES 3.2

    • Vulkan 1.1 on Android 10 or later devices with compatible drivers

Android SDK and JDK Updates

We have streamlined our Android SDK requirements by moving to Android Studio Flamingo 2022.2.1 and using OpenJDK 17.0.6 as our JDK version. Baseline Android support for UE and AGDE now both target the same JDK version, and users do not need separate JAVA_HOME and AGDE_JAVA_HOME environment variables to point at separate JDK installations. Note that with this update, UE now targets the jbr directory for JDK rather than jre.

If you need to support earlier versions of UE than 5.3, but also need to set up UE 5.3 for Android, we recommend the following:

  • Before you uninstall your previous version of Android Studio, copy the contents of the jre directory to somewhere outside your Android Studio installation to keep them from being overwritten.

  • Make sure your Android environment variables do not target the SDKs used by earlier versions of UE.

  • For older versions of UE, use BaseEngine.ini or your Project Settings to manually target your SDKs. In particular, set your JDK directory to the copied jre directory.

See the documentation on setting up Android Studio for UE 5.3 for more details and instructions.

Modernized Xcode Projects

We have updated the way UE handles Xcode projects and workspaces, making it more consistent with modern Xcode workflow conventions. This includes the following changes:

Improved Xcode Project Organization

  • UE now uses one Xcode workspace per platform.

    • For example: UnrealGame (Mac) and UnrealGame (IOS).

  • UE now uses separate projects for each build target type within its workspace.

    • For example: UnrealGame (Mac), UnrealGameEditor (Mac), and UnrealGame Server (Mac) each would be separate projects under the Mac workspace.

    • Each project only allows the build configurations it supports. For example, Editor projects do not show the Test or Shipping configurations.

  • Frameworks are now handled using standard Xcode methods.

    • Whereas previous versions required developers to manually copy and codesign Frameworks, the build system now automatically discovers and codesigns them.

Improved Packaging and Distribution Process

  • All data needed to run is bundled inside self-contained .app files for each of Apple's platforms.

    • This includes macOS, which did not use this paradigm in previous versions of UE.

  • Automatic codesigning is now the preferred method for handling codesigning in development/debugging builds for both macOS and iOS/iPadOS/tvOS.

  • You can use Xcode to manage and distribute apps with Xcode archives, which are now the preferred way of creating shipping builds.

    • Shipping builds create an .xarchive file and a .dSYM file for this purpose.

  • Improved management of Entitlements and .plist files. Developers can now use templates or customized files for both of these assets.

For more details about these improvements, see our documentation on the modernized Xcode workflow.

iOS Workflows

iOS Workflows

UE 5.3 brings several improvements to development workflows for the iOS platform:

  • MallocBinned2 memory allocator can be used if your App ID contains the Extended Virtual Addressing entitlement.

  • Improved packaging and app signing thanks to a modernized XCode projects integration (see Modernized Xcode Projects above).

  • The Prepare for Debugging command, which streamlines the debugging pipeline, now offers Windows remote (experimental) and secondary Mac workflows. See the documentation on debugging in Xcode and using remote Macs for more details.

  • The iOS simulator is now supported on Apple Silicon Macs, allowing faster development iteration without devices (experimental).

Mobile Ray Tracing Support on Android (Experimental)

UE 5.3 supports ray tracing for high-end Android devices running the Mobile Desktop Renderer. Supported mobile GPUs include:

  • Adreno 740

  • Immortalis-G715

  • Xclipse 930

To enable mobile ray tracing:

  • Enable the desktop renderer for your project.

  • Enable ray tracing.

  • Add the following to your device profiles:

[Android_Vulkan_SM5 DeviceProfile] 


This update also includes mobile indline shadow support for ray traced shadows, which only works with deferred shading.

This support is experimental and should not be used for production purposes at this time. However, we welcome feedback from users trying it out!

Mobile Renderer

Mobile Renderer

The mobile renderer now includes several performance and visual quality improvements, notably:

  • Compute-based landscape vertex culling.

  • Fog volume support.

  • Global distance field generation on mobile forward.

  • Instance rendering improvements (GPU Scene).

  • Virtual texturing support.

Support for Nanite on Apple M2 Devices (Beta)

Nanite on Apple M2 Devices

Unreal Engine 5.3 brings beta support for Nanite rendering technology on Apple Silicon M2 devices running macOS. This support is enabled by default, with shader model SM6, in the UE macOS binaries downloadable from the Epic Games launcher, whereas the Experimental 5.2 support was only available when building from GitHub sources.

Character and Animation

Dynamic Workflows for Runtime and Non-Linear Cinematics

Dynamic Workflows for Runtime and Non-Linear Cinematics

This release focuses on improvements to runtime workflows and nonlinear organization.

User-Defined Dynamic Bindings

Use the Level Sequence Director Blueprint to define different objects, such as the player pawn, to either be dynamically possessed or spawned by Sequencer during runtime.

Material Section Blending

Similar to other track types, material typed sections can be added to tracks that support materials. This includes material parameter collections and UI animations in UMG.

Takes for Subsequences

Similar to the Shots track, takes for Subsequences can be created and set within Sequencer.

Comments for Takes

Add/edit/view comments to Shot/Subsequence Takes within Sequencer.

Text Track

Text properties can now have tracks in Sequencer, where users can change the value of a text field over time and key it.

Animation Retargeting

Animation Retargeting

This release focuses on quality-of-life improvements for Retargeting.

  • Toolbar in the Retarget Editor - This provides easy access to Global and Root settings along with the Retarget phases. Makes available mode switches between the Running the Retarget, editing the Retarget Pose, and viewing the Retarget Pose options.

  • Retarget Poses - Edit a bone's local space to zero out bone rotations.

  • Create IK rig/IK retargeter assets from a selected skeletal mesh/IK rig in the right mouse context menu.

  • Thumbnails for IK Rig and IK Retargeter assets.

Animation Authoring

Animation Authoring

Further improvements for animation authoring in this release include:

Smart Bake

  • Now allows you to target only baking keyframes.

  • Constraint baking

  • Space switch baking

  • Snapper

  • Collapse sections

  • Baking transforms

Smart Auto Tangent

  • New auto tangent that better maintains the curve shape.

Curve Editor Improvements

  • Improved normalized view

  • Improved performance with lots of keys

  • Better handle selection

  • More accurate marquee select

  • Fixes to zoom levels when auto frame is off

Motion Blending Improvements

  • Swap Root Bone works on animations with Root Motion Preview using AnimBP.

  • Skeletal animation sections can be extended backwards.

Export Improvements

  • Export control rig animations as a FBX file.

Skeletal Editor (Experimental)

Skeletal Editor

The Skeletal Editor provides a way for users to create skeletons and edit mesh skin weights directly in the Unreal Editor. This tool offers faster iterations by means of the addition of bones to your assets, the deformation of static meshes, and converting them to skeletal meshes, all in one place without the need for importing skeleton data.

  • Convert static meshes to skeletal meshes

  • Create and edit skeletons

    • Add bones

    • Remove bones

    • Orient and edit bones

    • Mirror bones

  • Create skin weights

    • Paint Weights brush tool

    • Edit weights on vertex selection

    • Flood / Relax / Prune / Average / Normalize operations

    • Mirror weights

  • Paint maps

  • Python API support for bones and weights

Machine Learning (ML) Deformer

Machine Learning Deformer

ML Deformer provides users a way to approximate a complex rig, nonlinear deformers, or any arbitrary deformation by training a machine learning model that runs in real time in UE.

Improvements in UE 5.3 include:

  • The addition of a masking system for Local Neural Morph Model, which improves the ability of users to work with structured data.

  • Improvements to the Nearest Neighbor model UI and workflow.

  • The removal of dependency on the NNI framework.

  • The ability to create training masks, and visualize the masks per bone / bone group / curve in the viewport.

  • There is no longer any need to take any manual steps (for instance, installing a Python package) for the Nearest Neighbor and Neural Morph models to train correctly on Windows.

  • The ability to run trained Neural Morph and Nearest Neighbor models on Linux and macOS (although training errors may be encountered).

Build Control Rigs from Data

We further extended the procedural toolset of Control Rig by providing a way for you to use data outside of the Control Rig graph to procedurally create and modify the rig. This includes:

  • The ability to query and use external data such as transforms, floats, skeletons, and more to build control rigs procedurally.

  • A new 'GetUserData' node that will query incoming data.

  • A new 'Set Shape Library from User Data' node that will swap the shape library currently being referenced.

Virtual Production

SMPTE 2110 for ICVFX

SMPTE 2110 for ICVFX

The Unreal Engine 5.3 release completes the implementation of a next-generation ICVFX stage deployment using an end-to-end SMPTE 2110-based IP video signal flow with nDisplay. SMPTE 2110 support enables productions to maximize the available hardware resources on stage, with this increased efficiency empowering the potential for higher-resolution inner frustums and lower latency.

With a SMPTE 2110-based configuration, productions will be able to:

  • Render the inner frustum once and share it with the other render nodes in the cluster, avoiding the redundancy of each node re-rendering the inner frustum for determinism.

  • Dedicate the resources of an entire render node to the inner frustum to leverage all available resources to display the highest-possible quality on the pixels seen in camera.

  • Framelock each render node with a native SMPTE 2110 sync policy that ensures Unreal Engine output remaining in phase with the camera.

  • Output the resulting renders to the LED processors using SMPTE 2110, eliminating the need for a display port and/or HDMI converters.

Virtual Camera

Virtual Camera

Takes Browser

We added the ability to browse for level sequences from the virtual camera and load them for review or as the base for your next recording, as well as to star, flag, or NG sequences to filter the list.

Multiple HUDs from a Single VCam

You can now add multiple output providers to a single VCamComponent each with its own HUD and stream. You can stream an operator's view, a simple burn-in, and a clean plate from one VCam, at the same time.

Time-Scaled Playback and Record

You can now play back and record at non-1:1 speeds. Record at a custom rate and your move will be sped up or slowed down when played back at full speed.

Initial macOS Support (Experimental)

VCamActor now supports streaming from macOS through legacy Remote Session. Virtual Camera Core, VCamComponent, VCamModifier, and VCamOutputProvider are available for use to create custom VCams on macOS versions of UE5. Development remains ongoing to bring Pixel Streaming and full VCam support to macOS.

CineCamera Rig Rail (Beta)

CineCamera Rig Rail

We've added a new rig rail actor tailored towards advanced cinematic and virtual camera workflows.

Plan your Composition

Store camera focus, iris, and zoom in rail points, allowing the rail to drive more complex aspects of your composition.

Drive the Rail

Automate your moves using a number of drive modes:

  • Manual: Drive your rail position from Sequencer or external input.

  • Duration: Drive your rail position to complete your move in a set amount of time.

  • Speed: Drive your rail position at a set speed.

Work with Sequencer

Points are stored by absolute value and can be safely keyed in Sequencer. As a result, the position value of a given point cannot change unless you directly modify the point. If you keyframe a particular position to occur at a given framing, it will not change regardless of how many new points are added before or after.

Visualize Your Speed

See your speed along any point of the rail through a heat map applied to the rail mesh and avoid any surprises when recording a layered move.

Choose your Axis Inheritance

Choose to only inherit subsets of axes from the rig rail. Drive position from the rail while refining rotation or choose to remove the Z axis for a steadier ride.

CineCamera Scene Capture Component (Beta)

CineCamera Scene Capture Component

We've added a Scene Capture component for CineCameras. You can accurately capture a CineCamera component to a render target for use in materials, UMG, and beyond. The feature supports lens distortion, together with CineCamera-specific properties and post-processing.

Anamorphic Lens Calibration Solver (Experimental)

Anamorphic Lens Calibration Solver

We've added an anamorphic lens model and solver to the lens tool to be used with lens assets, making it possible to solve anamorphic lens distortion. Using the lens component, you will also be able to add anamorphic lens model distortion to CineCamera actors to render distortion effects within the engine, making it possible to visualize shots using profiled anamorphic lenses. Manual parameters for the anamorphic lens model can also be adjusted to create anamorphic distortion looks.

OCIO for Texture Conversions

OCIO for Texture Conversions

The introduction of Working Color Space established a foundation for robust color management in Unreal Engine for critical operations such as configuring the input color space for textures, helping to ensure assets look correct regardless of where they may have been authored. Unreal Engine 5.3 expands upon this support with the ability to leverage OpenColorIO for these texture conversions. With this, Unreal Engine adopts an industry-standard framework to maximize consistency across the color pipeline for textures.

nDisplay Multiplayer Actor Replication

nDisplay Multiplayer Actor Replication

We've revised the nDisplay low-level networking architecture so that it can support actor replication in a multiplayer game context.

  • Transparent to the end user:

    • The feature can be activated in nDisplay Project Settings using the Cluster Replication Enabled option.

    • We've added a Multiplayer Server option to Switchboard.

  • Each nDisplay node becomes a networking client when joining a multiplayer session or game.

In the future, we hope to enable nDisplay Clusters to join a multiplayer session as opposed to individual nodes.

nDisplay Fill Derived Data Cache

nDisplay Fill Derived Data Cache

We've added the ability to "prime" nDisplay systems (stand-alone shaders) before first use by filling the derived data cache in advance. This feature can be triggered locally using the Build Menu or using Switchboard on all cluster Nodes.

The nDisplay cluster is then ready to be started without requiring any further shader compilation. You can schedule this operation offline at a time convenient to you, since it is exposed to Unreal Engine using a command line argument and can be triggered externally.

DMX Control Console UX

DMX Control Console UX

We are improving the new Control Console UI and UX with the following additions:

  • Two main layout modes:

    • Default, where only selected patches are visible

    • Manual, where you can define the fader group positions

  • A revised search mechanism for quicker DMX fader access

  • The ability to change fader values using relative or absolute controls

  • The ability to select which patches are actively sending DMX data

DMX Pixel Mapping UX

DMX Pixel Mapping UX

The DMX Pixel Mapping tool has received a significant facelift and now offers an improved UI and UX, among other fixes:

  • A new input filter section enables you to downscale, blur, and perform material-based logic on the incoming pixels.

  • DMX library manipulation is consistent with the new UX provided by the Control Console. This works hand-in-hand with the hierarchy view so that you can see which patches have been added and which remain.

Media IO Media Plate Material System

Media IO Media Plate Material System

We've improved the current media plate actor material system, giving you the ability to:

  • Pick a material directly from the Media Plate Plugin Content directory using the new auto-populated dropdown.

  • Browse to the Media Plate Plugin Content directory for quick access.

Also, we enabled the Output Depth and Velocity flag in the default media plate materials for increased TSR/TAA image stability when there is camera movement relative to the media plate actor(s).


Chaos Cloth Editor Foundation (Experimental)

Chaos Cloth Editor Foundation

Chaos Cloth for UE 5.3 includes the addition of an experimental Cloth Editor.

The new Cloth Editor enables having multiple garments per character and the same garment across multiple characters in the future. It also provides panel-based workflows which will make it easier to set up and modify clothing setups. It includes the following features:

  • New base class editor for character physics (cloth/flesh).

  • First phase of panel-based editor with the Dataflow graph.

  • Non-destructive workflow.

  • Cloth is extracted from the skeletal mesh as a separate component.

  • Extra collision support.

  • New Skin Weight Transfer tool.

  • Masks are now replaced by reusable weight maps.

  • Multiple Materials can be driven by single sim mesh support.

See the Panel Cloth Editor Overview for more information about this feature.

Chaos ML Cloth (Experimental)

Chaos ML Cloth

Cloth simulation can be too expensive for many use cases. Artists, engineers, and game designers need alternative, less-expensive runtime solutions to mimic cloth simulation, especially for tighter fitting clothes. Currently, this requires a tedious process of hopping back and forth between DCC to simulate and importing results back into the engine.

For UE 5.3, artists can now simulate and train cloth in engine using the experimental Chaos Cloth Generator plugin.

See the Machine Learning Cloth Simulation Overview for more information about this feature.

Chaos Rigid Bodies and Scene Queries

We made several updates and optimizations to Chaos Physics to give artists, developers, and programmers better simulation results, notably on rigid body simulation and scene queries.

The continual focus on rigid bodies is low-level optimization including SIMD, cache coherency, functional removal, reduction in data copying, and so on.

Scene queries implement a dynamic acceleration structure that is now quicker to update and query.

Chaos Destruction

Fracture editor updates

A new material has been added, to help with fine control when managing and assigning material for a geometry collection.

Fracture Editor Material

The proximity tool has been improved with better visualization control and new contact method for generating the connection graph.

Fracture Editor Proximity Tool

The level statistic now shows aggregate convex information, which is useful when optimizing your geometry collection collisions.

Fracture Editor Level Statistic

Runtime Optimizations

  • The geometry collection component no longer ticks by default and will only tick after the geometry collection has been damaged. The runtime cost of the tick function has been also reduced.

  • Data types optimizations at the solver and attributes level have been made, reducing the cost of geometry collection assets on disk as well as the runtime memory cost of their instance.

  • Numerous optimization have been also done to reduce the overall CPU cost of geometry collection instances allowing for using destruction at larger scales.

A new experimental damage model has been introduce leveraging the physical properties of material and internal topology and connectivity of geometry collections.

Niagara Fluids

Niagara Fluids

  • We added the ability to transform Niagara Fluid sims after they are cached. This opens up the capability to duplicate a cache multiple times, and to offset the duplicates in time/space to get more complex effects from a single cached sim.

  • We added data channel support to the 3D Gas simulations. It is an experimental feature that provides a way to source fluid from any CPU system in the level. On the master emitter, the particle source now has two modes: Emitter and Data Channel. Emitter mode reads data from an emitter in the same system. Data Channel mode reads data from a predefined Niagara data channel. That data channel can be written to from the existing Set Fluid Source Attributes module.

  • Path Tracer now supports heterogeneous volumes, which means fluids can be rendered directly in it.

  • We added experimental support for SVTs (sparse volume textures); caching fluids now writes directly to SVT, which is an order of magnitude faster.

Niagara Summary View Editor

Niagara Summary View Editor

The Summary View Editor provides a way for users to create custom views of Niagara emitters. Using this, it is possible to expose only the most important settings and inputs for an emitter to end users. One heavy use case for this are the Niagara fluid emitters, which make it easier to make tweaks to achieve desired effects by looking at only a well-organized subset of settings. Users can rearrange and set up categories, sections, individual module inputs, or entire modules, as well as specific properties such as the Sprite material for Sprite renderers.

See the Summary View Quick Start for more information about this feature.


MetaSound Builder API

The MetaSound Builder API makes it possible to create and change a MetaSound graph through C++ or Blueprint APIs while the game is running in real time. This opens up the possibility of adding/removing MetaSound nodes and modifying connections during gameplay.

Audio Bus Writing

You can now take data from one MetaSound and send it to another MetaSound or to another source bus through a new MetaSound node.

MetaSound Output Watching (Experimental)

MetaSound Output Watching

MetaSound Output Watching provides a way for Blueprint or C++ to watch for changes in the MetaSound graph. This means users can match gameplay and visuals to events happening in MetaSounds. As an example, you can affect gameplay elements and visuals according to a musical beat, or change in audio.

This supports the ability to:

  • Fire an event when there are value changes on the provided MetaSound output of types float, int32, Bool, and fstring types.

  • Fire an event when the envelope follower on an audio output changes.

UI Systems

Common UI (Beta)

Common UI

Common UI provides a toolbox for creating rich, multi-layered user interfaces with cross-platform support. It includes:

  • An input action system specific to UI.

  • An input-routing system that makes it easier to selectively exclude menus from capturing input.

  • A styling system that provides style assets for commonly used text/fonts, borders, and buttons.

  • A library of other commonly used widgets.

Improvements in this release include:

  • Integration with enhanced inputs

  • Input debugging

  • Documentation and content examples

Font DPI Matching in UMG

Font DPI Matching in UMG

Designers can now match their font sizes seamlessly when they convert UI mockups into UMG screens, without worrying about DPI mismatch.

  • Newly created projects will have the DPI setting defaults to 72 DPI.

  • Existing projects will remain at 96 DPI.

  • Switching back and forth between different DPI settings will not affect how fonts are rendered.

See the documentation on Font DPI Scaling for more details.

Viewmodels in Blueprints

Viewmodels in Blueprints

Whereas previous versions of Unreal required designers to create Viewmodels in C++, in UE 5.3 you can now create Viewmodels in Blueprint. This update streamlines the process of creating and binding Viewmodels in various ways.

  • Extend the MVVMViewmodelBase class to create a new Viewmodel Blueprint.

  • Create variables as you normally would with Blueprint, then designate them as FieldNotify variables by clicking the bell icon next to their names.

  • Create FieldNotify functions to handle operations that don't need dedicated variables, then use your FieldNotify variables to trigger them.

  • Add your Viewmodel to your widget class using the Viewmodels panel.

  • New click-and-drag functionality makes binding Viewmodels to UI fields quicker and easier.

See the Viewmodel documentation for full instructions on how to use Blueprint-based Viewmodels in your project.


Modeling Workflows (Beta)

Modeling Workflows

Artists developing assets require efficient modeling, sculpting, UV editing, and texturing workflows. These workflows are more than just a couple of different tools clicked in a certain order. Every type of interaction needs to be considered in order to reduce the number of mouse clicks, minimize the cursor movement, and provide accurate feedback for the artist.

With this aim in mind, improvements in UE 5.3 include:

New UI

Modeling Mode's main menu, tools palettes, and properties panels have been redesigned. The new UI is more compact, allowing for more efficient and consistent workflows. The new menu also contains a new favorites option, providing a top-level custom menu that can be defined per user.

Tool Presets

Creators and developers can now make custom presets for modeling tools. The custom presets provide a way for artists to store multiple options for tools, and access them quickly from the tool icon.

Element Selection

Direct mesh element selection provides for a more consistent and optimized workflow. The existing method of selection requires the artist to select the mesh first, then the specific tool, and finally the element before invoking the operation. The new element selection workflow enables artists to select the mesh, select the element, and then invoke an operation without any need to use an intermediate tool like PolyEdit or TriEdit.

Modeling Tools (Beta)

Modeling Tools

The Modeling Mode's toolset continues to develop. For UE 5.3, we added some requested enhancements to the toolset, in addition to new tools that use splines. The new element selection mode is also supported with a set of dedicated tools.

Spline Tools

We've added new tools to the Create menu that provide creators with a way to draw new splines, and use them for revolves and flat mesh operations.

Element Selection Tools

The Element Selection workflow leverages a new menu of tools that work directly with the selection. The palette includes common tools such as Extrude, Bevel, Offset, Inset, and Insert Loops. There is also quick access to PolyGroup and Triangle Edit.

LOD Support

The Bake Transform and Edit Pivot tools can now optionally update all LODs with the new transform or pivot.

Vertex Color Paint

We added a new tool for painting vertex color. The new tool enables users to paint, fill, and blend colors to multiple or specific channels.

Other Improvements

We made additional improvements to the Edit Normals, Weld, Bake Texture, and Generate PolyGroups tools.

To learn more about the available tools see Modeling Tools.

UV Tool (Beta)

UV Tool

UVs are a critical component when working with meshes, not only for final rendering but also as a vital part of level design. For UE 5.3, we added two important new features to the UV Editor:

UV Editor Distortion Display

The UV Editor now has optional display modes for distortion. This provides for an interactive representation of the level of texel stretch or density.

UV Auto Layout

The tool now has support for texel density normalization. This option attempts to resize individual islands to maintain a constant, average density over the entire layout.

To learn more about UV tools see, UV Editor.

Geometry Scripting (Beta)

Geometry Scripting provides technical artists a toolkit for creating custom modeling tools and workflows. In 5.3 Geometry Scripting is now beta and continues to expand with the following additions and improvements:

Enhanced skeletal mesh interoperability provided by several new nodes:

  • CopyBonesFromMesh

  • TransferBoneWeightsFromMesh

  • GetRootBoneName

  • GetBoneChildren

  • GetAllBonesInfo

  • GetBonesInfo

  • DiscardBonesFromMesh

New functions for managing 2D polygons and paths, including computing offsets and their booleans:

  • Polygons Difference

  • Polygons Union

  • Polygon Intersection

  • And many more, there is a large library of functions.

Delaunay triangulation to create a mesh that interpolates points:

  • Append Delaunay Triangulation 2d

Geodesics on mesh surfaces:

  • GetShortestSurfacePath

  • GetShortestVertexPath

To learn more about Geometry Scripting and the available functions, see Geometry Scripting User Guide and Geometry Scripting Reference.

Content Pipeline

Interchange Import / Re-Import

Interchange Import / Re-Import

In this release, the Interchange Framework includes the following improvements:

  • We added a new custom asset type to provide a way to re-import whole scenes.

  • The Interchange UI now supports overrides of pipeline stack per translator. This provides an extra layer of configurability and is used in default settings: for example, the glTF asset pipeline stack will override the default asset pipeline stack (used for FBX and OBJ).

  • For glTF import, you can now choose to have the editor either generate materials or use predefined material instances. You can also override those instances for more user control over glTF rendering.

USD MaterialX (Experimental)

USD MaterialX

Unreal Engine 5.3 offers the ability to use USD with MaterialX for streamlined workflows and content creation between DCCs and Unreal Engine. It is now possible to import a USD file with MaterialX shading networks directly in the engine.

Additionally, you can now open USD files with MaterialX shading networks in the USD Stage Editor while interacting directly with the contents of the USD file.

MaterialX support in Unreal Engine was introduced with 5.1 and is still experimental.

USD Materials and Textures

USD Materials and Textures

For Unreal Engine 5.3, there have been a few changes to how textures and materials are handled to improve the display of USD assets:

  • We added support for multiple UV sets on the same material.

  • We added support for simple UV transforms on preview surface materials. If you are loading a preview surface using any math nodes to transform the texture, it will now display correctly.

  • We added the ability to interactively change USD materials in the USD stage editor Details panel and see the result live in the viewport. Previously, the user would be required to save the USD file and reopen it in order to see any changes.

USD Animation

USD Animation

Direct Geometry Cache Import

We added the ability to directly import cached geometry into UE from a USD file. Prior to this, you could only load the USD file on the stage and play back the geometry cache animation from there.

Support for Transient Actors in Sequencer

We added support for transient actors in Sequencer. This provides a way for you to add elements from the USD stage actor to Sequencer, reload the USD file or to close and reopen Unreal Engine, and Sequencer will remain connected to the elements being animated from the USD stage actor. This also means you can now maintain sparse key animation curves that will drive the elements from the USD stage actor being animated, and the baked animation can be exported to a new USD file. USD stage actors can now be exported as well, so animation of their elements can be exported as overrides on the referenced stages.


Smart Objects - World Partition Support

Smart Objects and World Partition

Smart Objects now work seamlessly with World Partition, data layers, and persistent levels. We also improved Smart Objects to support using navmesh and physics for slots availability.

Blueprint Type Change Auto-Casting

Blueprint Type Change Auto-Casting

Deprecating code-based Blueprint-visible properties and changing the type of the properties can include challenges such as failures when rewiring old pins. This leads to orphaned pins and compilation errors.

In UE 5.3, if both types have an auto-cast function available, a cast node will automatically be created and added into the graph. Additionally, notes will be created whenever a new cast node was added, which serves as a notice that users might want to update their API to use the new type change.

Data Asset Merging

Data Asset Merging

As a first step towards adding functionality beyond what the Diff tool offers, we started investigating a data merge solution. This first version provides support for manually merging data assets when conflicts cannot be auto-resolved.

Currently only data assets are supported, but we hope to support more types of data in the future.

Review Tool Swarm Comments

Review Tool Swarm Comments

The Review Tool introduced in 5.2 now has direct Swarm integration when using P4 as source control, so the diffs you perform from there will directly show the comments in the editor. You can have comments for each change made, but also leave global review notes. We use simple metadata tagging in Swarm to link the comment to the right section of the diff.

Engine Content and Templates

Collaborative Viewer Templates Using Enhanced Input

The collaborative viewer template

The Collab Viewer templates join multiple users together in a shared experience of the same 3D content. We intended them to make it easier and quicker for your team to review and communicate about designs in real time, so that you can identify problems and iterate on the content more efficiently.

In UE 5.1, we released OpenXR support for enhanced input and made it the recommended input system for XR applications. In UE 5.3, we updated the templates to take advantage of the abstractions and flexibility that enhanced input enables.

Platform SDK Upgrades

Logos for Platform SDKs

  • Windows

    • Visual Studio 2022 v17.4 or newer

    • Windows SDK 10.0.18362 or newer

    • LLVM clang 14.0.1

    • .NET 4.6.2 Targeting Pack

    • .NET 6.0

  • 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

    • Minimum Windows SDK: 10.0.19041.0

    • GDK: March 2023 Update 5 GDK

    • Firmware Version: Recovery June 2023 (10.0.22621.4819) *Supported IDE: Visual Studio 2022

  • Linux

    • Native Linux Development

    • Recommended OS: Ubuntu 22.04 or CentOS 7

    • Compiler: clang 16.0.6

    • Cross-Platform Development

    • Cross-Compile Toolchain: v22 clang-6.0.6-based (CentOS 7)

  • macOS

    • Recommended

      • Latest macOS 13 Ventura

      • Latest Xcode 14.1 or newer

    • Minimum

      • macOS 12.5 Monterey

      • Xcode 14.1


    • 1.16 binaries with 1.15 headers

      • Provides 1.15 feature set.

      • 1.16 binaries for recent platform SDK support and WebRTC fixes.

  • Steam

    • 1.53

  • 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 Flamingo 2022.2.1 Patch 2 May 24, 2023

    • Android NDK r25b

    • Android SDK

      • Recommended: SDK 33

      • Minimum for compiling UE: SDK 30

      • Minimum target SDK for running on device: SDK 26

    • AGDE v22.2.69+ required if you are using AGDE debugging.

    • Build-tools: 33.0.1

    • Java runtime: OpenJDK 17.0.6 2023-01-17

  • Switch

    • SDK 16.2.0

    • Minimum Firmware Version: 16.0.3

    • Nintendo Dev Interface 2.5.5

    • Supported IDE: Visual Studio 2022 (SDK version 16.2.0)

  • PS4

    • Orbis SDK 10.508.001

    • System software 10.508.011

    • Supported IDE: Visual Studio 2022

  • PS5

    • Prospero SDK

      • UE5Main has a patch updating to This is recommended for shader compiler fixes.

    • System Software

    • Supported IDE: Visual Studio 2022

  • ARCore

    • 1.37

  • ARKit

    • 4.0

  • OpenXR

    • 1.0.22

Release Notes


API Change:

  • Added the first version of Mutable extension API.


  • Added a new LOD threshold property to rig logic anim graph nodes in order to compute facial animation earlier than other skeletal post-processing, which might be part of the same post-processing AnimBP.

  • Added the ability to disable or skip post-process AnimBPs at lower LOD levels. You can set the post-processing AnimBP LOD threshold similarly to how you can set LOD thresholds for some anim graph nodes. Additionally you can skip the post processing anim BP graph during set points entirely, to improve performance. The speed improvements scale with the complexity of the post-processing AnimBP and as well as the amount of nodes that do not support LOD thresholds or have setup node-based LOD thresholds.

  • Added the option to filter by Sync Marker to the Animation Sequence Browser.

  • Add new output warnings when the LegIK node is missing definitions or contains references to invalid bones.

  • IK Rig and IK Retargeter now available in UEFN.

  • IK Retarget poses can now be zeroed in local space to instantly straighten limbs for more accurate retargeting.

  • Added 0.75 and custom speed to Animation Viewport ToolBar, for Animation Speed and TurnTable speed.

Bug Fix:

  • Fixed an issue that could prevent the MeshBoneReduction module from loading as soon as the MeshUtilities module starts up, as it could be needed at any time from a background thread

  • Fixed an issue by adding a guard against the use of an invalid actor pointer in the Skeletal Mesh editors.

  • Fixed incorrect localized text in the LegIK Animation Blueprint node.

  • Fixed an issue occurring when creating animation assets overriding existing assets, by enabling replacing existing animation in the options to create new assets.

  • Fixed an issue occurring when pasting anim notifies from multiple tracks to a location that did not contain the same tracks.


  • Removed null links from Mutable graphs on load. This prevents incorrect behavior and editor instability when a node saved into a graph can't be loaded.

Animating in Engine

API Change:

  • Fix inverted tangents on Y axis for 2D controls.


  • Added a new ControlRig.Sequencer.AutoGenerateTrack console variable to toggle whether control rig tracks should automatically be created for new components.

  • Control Rig FBX animations can now be exported and exported between Unreal


  • Curve Editor filters have been improved and can now be set using ranges rather than individual selections, so you can now bake a range of frames or times.

  • Curve proximities can now be updated when there is a drag operation so that the curve tooltips show the proper time and value.

  • Curve Editor selections are now synchronized whenever new items are added to the editor.

Bug Fix:

  • Fixed an issue that could occur by delaying a level sequence asset's creation until the tick proceeding the tick the control rig actor is dropped into the viewport. This prevents the level sequence asset creation to be in the same transaction as the create actors transaction. Previously, the movie scene could be collected as garbage when undoing the action, because its creation took place during another transaction.

  • Fixed an issue that could cause a memory leak with the backbuffer Render Target not being released at the end of a render.

  • Constraints: propagate offset change so that local transform animations are synchronized.



  • You can now use the new experimental Dead Blending AnimGraph node. This node is designed as a drop-in replacement to the Inertialization node but uses the new robust "Dead Blending" algorithm which is more equipped to handle multiple simultaneous Inertilization requests or when the Inertialization transition is between two very different poses.

  • Exposed a new method to blueprints that you can use to get the weight of a montage playing on a specified animation slot.

  • Added the following AnimNode functions: On State Exit, On State Entry, On State Fully Blended In, and On State Fully Blended Out. These are located in any Animation State Graph's Result Node.

  • Added support for AnimNodes to show any bound functions and not have them hardcoded.

  • Added a way for users to specify the string for the default binding name of a function member reference in a blueprint by using the "DefaultBindingName" metadata tag.

  • Added support for animation sync groups when using initialization for a state machine transition.

  • Added support for explicitly specifying the transitions trigger time when using state machine automatic transition rules.

  • Added a context menu option to Animation Blueprints to create an Animation Template from the blueprint that can be used to override animations using Child Blueprints.


  • The PlayMontageCallbackProxy can now be derived from, in order to support plugins that want to provide customized versions.

Bug Fix:

  • Fixed an issue that could cause a crash when using the Inertialization AnimGraph node when re-parenting the Animation Blueprint.

  • Fixed standard blending not working as expected with sync groups.

  • Improved stuck detection in Distance Matching

  • Disabled option to duplicate a state from the animation blueprint editor's tree view.

Movie Render Queue


  • Fixed issue where default settings would get added to a job that already exists when clicking on the Render Movie button from Sequencer.

  • Exposed UMoviePipelineImageSequenceOutput_EXR so C++ plugins can reference it.

  • When using the Render all Cameras feature, Spawnable cameras are now skipped if their default spawn track value is false.

  • Added support for camera rotation to be preserved during a Panoramic Render.

  • Updated the Console Variables setting to display the cvars contained within each cvar preset.


  • Added a workaround for the UI Renderer setting having issues with some Layout Widgets not liking the 720p PIE preview window.


  • Optimized the multi-sample accumulator for RGBA images on machines with many cores.

Bug Fix:

  • Fixed issue where canceling a job reporting as a successful job for some callbacks.

  • Fixed issue where UWorldSettings::Min/MaxUndilatedFrameTime were being modified and not restored after a render.

  • Fixed UI warning about losing unsaved changes to Queues when there weren't actually any changes.

  • Fixed issue where {camera_name} resolved into main_camera when not using the Render All Cameras feature is animating onto this.

  • Fixed data type issue when exporting ProRes with OpenColorIO enabled.


API Change:

  • Creation of buffers is all done within the data interface at runtime.


  • Added output bone transfer list for anim node. You can now limit the bones being driven by a Control Rig AnimNode in the Animation Blueprint Graph.

  • Added half edge connectivity data interface.

  • Added unit node to check if a shape is available in the shape libraries.

  • Added support for uint32 types.

  • Added Int32 to Name node (IntToName)

  • Added feature to update the Reference pose of a bone directly in the Control Rig Editor.

  • Added LocalChainDynamics function which creates simple chain dynamics for the given chain.

  • New skin weight editing tool enabled editing weights by painting or directly on selected vertices.

  • IK Rig/Retarget assets can now be created directly from Skeletal Meshes in the right-click menu.

  • Performance improvement to retrieve a template from its arguments.

  • IK Retargeter toolbar redesigned for instant access to common retarget settings.

  • Improved physics constraint editing in the Physics Asset Editor viewport.

  • Extracted all instance data from Control Rig virtual machine and moved it to the context data struct, as a step for stateless virtual machine.

  • FBIK solver now supports animated translation at runtime. Squashing and stretching limbs can use FBIK.

  • RigVM context now has to be passed as a parameter to the virtual machine functions, rather than being located in the virtual machine itself (a step towards stateless virtual machine).


  • Skin weights on skeletal meshes can now be edited through a new API in BP or Python.

Bug Fix:

  • Fixed issue when adding curves to the output skeleton from USkeletalMergingLibrary::MergeSkeletons.

  • Fixed Control Rig Blueprint compilation error related to missing function definition after a Control Rig Blueprint containing function references is duplicated or renamed.

  • Fixed issue caused by Control Rig Editor Details panel when exiting PIE while debugging a Control Rig instance.

  • Fixed an issue where sometimes the constraint viewport widget would be drawn relative to the wrong body.

  • Fixed an issue where pressing the keyboard modifier for editing the constraint's child frame (Alt + Shift) also activated the keyboard modifier for the Lock camera to widget feature (Shift) which caused the translation widget to move erratically when editing the child frame.

  • Fix for Control Rig Editor issue when adding comments and using undo / redo.

  • Fixed Control Rig compiler issue occurring when a specific function parameter usage is found on a rig, due to invalid remapping of inline function parameters.

  • Fixed an issue in the RigVM compiler when a rig function has more than 255 operands.

  • Fix IK Retarget automatic chain mapping mode "exact all"; now it does not reset non-exact matches to none.

  • FBIK solver will now dynamically reinitialize if the number of input bones changes dynamically at runtime.

  • Cleaned up Control Rig Python files to remove mixed tab/space error in runtime.

  • RigVMController: Added an array upgrade to reroute nodes with no source or target links where the value is an array, so it can load some deprecated rigs.

  • FBIK solver now works correctly with only one effector (regression from 5.2).

  • Fix for issue when adding a pin on Sequence Node in Control Rig graph.

  • Fixed memory leak in FBIK solver (regression from 5.2).

  • Spherical Pose Reader node in Control Rig fixed so it no longer flips when the activation region fills the whole sphere.

  • RigVM plugin now has a custom serialization object version.

  • Fix for Control Rig Gizmos not working properly; after a changing the asset references to Soft Object Pointers.


  • Deprecated all Execution data interfaces. To set the execution domain of a custom compute kernel, use the Execution Domain field in the details panels of the kernel node. Valid domains should appear in the dropdown menu after connecting either a data interface to the kernel's primary group or a component binding node directly to the primary group pin.


API Change:

  • Extended the ImmediatePhysics_Chaos API so that you can now create Immediate Physics Constraints without copying values from Constraint Instances using a new CreateJoint function that accepts a JointSettings object instead of a FConstraintInstance.


  • Added a new dedicated track for Inertializations to the Rewind Debugger.

  • You can now click on Animation node tracks in the Rewind Debugger and the node will be highlighted in the corresponding Animation Blueprint to improve debugging workflows.

  • Added missing tooltips for animation state machine schemas.

  • Animation Blueprint runtime errors are now logged in the PIE log, if they were found during a game session.

  • Anim blueprint logging can now use tokenized messages to hyperlink an error to the node it came from.

  • UAnimInstance::IsSlotActive() is now thread safe.

  • Player nodes in blendspace graphs are now added to GraphAssetPlayerInformation.

  • Reinstated some anim blueprint library methods which now use the Anim Pose API.

  • New colors to distinguish state aliases and conduits.

  • Some LOD bone generation functions from the SkeletalMeshComponent have been extracted so they can be used from plugins.

    • Updated the ComputeRequiredBones function to use the extracted functions.

  • Added a delegate to the SkeletalMeshComponent, so external systems can be notified when the RequiredBones get recalculated for a LOD.

  • Moved the SkeletionRemapping.h and SkeletonRemappingRegistry from private to public, to allow including these files in plugins

  • AnimBoneCompressionCodec now has a new DecompressPose function taking a FAnimBoneDecompressionData parameter, with the decompression data in the following separate array formats: translations, rotations, scales3D.

  • Added the ability to DoubleClick AnimSegmentsPanel, in order to jump to the target asset. You can also shift + DoubleClick to open it a in new window.

  • Added a new compiler note and visual warnings to state machine transitions if the transition rule has logic but the flag for automatic rule based condition is set


  • Added a new helper function to find all external saveable packages.

  • Added current time accessors and library functions to Anim Notify events to allow for easy access to relative times and ratios.

  • Sync markers can now be managed in the same way as notifies.

  • Neural network mask curves are forwarded to RigLogic from both the Animation Blueprint node and Control Rig implementations.

Crash Fix:

  • Fixed an issue that could cause a crash when reloading a Control Rig Animation Blueprint.

  • Fixed an issue that could cause a crash when undoing or redoing an Animation Sequence edit while an async task is in flight.

  • Fixed an issue that could cause a reinstancing crash when using a custom Anim Instance proxy as a linked AnimGraph.

  • Fixed an issue that could cause a crash when calling UAnimInstance::GetAllCurveNames from worker threads.

  • Fixed an issue that could cause a crash when compiling an Animation Blueprint during automated tests.

  • Fixed an issue that could cause a crash when right-clicking a modified curve node in a template Animation Blueprint.

  • Fixed an issue that could cause a crash when unloading animation assets in a game feature plugin that are referenced by editor thumbnails.

  • Fixed an issue that could cause a speculative crash during automated tests.

Bug Fix:

  • Fixed an issue that could cause a regression with curve inertial blending due to the curve refactor.

  • Fixed an issue that could cause the start position to be ignored when using sync groups.

  • Fixed an issue that could cause an ASan issue when unregistering property type customizations on shutdown.

  • Fixed an issue that could prevent the creation of a child Animation Blueprint in the Content Browser.

  • Fixed an issue that could cause a crash when opening a template Animation Blueprint with the Curves tab open.

  • Fixed an issue that could cause meshes to be distorted when the Leader Pose nod.

  • Fixed an issue that could cause blending to incorrectly skip blending in and out when using inertial blending curve filtering.

  • Fixed an issue that could cause Anim Node Functions to not be called in versioned builds when multiple are bound to the same Animation Blueprint node.

  • Fixed an issue that could cause cached poses to be invalid on subsequent evaluations of an AnimGraph.

  • Fixed an issue that could cause stack corruption caused by calling an Anim Node Function with an altered signature.

  • Fixed an issue that could cause out-of-bounds access in Control Rig curve I/O.

  • Fixed an issue that could cause distorted meshes when assigning assets using skeleton compatibility.

  • Fixed an issue that could cause curves to be missed intermittently in cooked content.

  • Fixed an issue that could cause bone LOD filtering to display incorrect results during automated tests.

  • Fixed an issue that could cause the Layered Blend per bone node to not work correctly with per-bone curve filtering.

  • Fixed an issue that could cause out-of-bounds access in PoseAssets that have additional poses with their respective curves.

  • Fixed an issue that could cause fired notifies to not be reached when looping by clamping remaining time.

  • Fixed an issue that could cause the virtual bone menus to not appear when adding additional virtual bones.

  • Fixed an issue with the Control Rig Anim Node that could cause the Rigid Body Anim Node in a post process AnimBP to stop working.

  • Fixed an issue that could cause OOM issue on consoles by reducing default alignment requirement of memory allocations in RigLogic.

  • Fixed an issue that could cause performance problems when multiple faces (DNAs) are loaded during gameplay.

  • Fixed issue when attempting to collect sync markers in a montage with an invalid slot track index.

  • Fixed bCanUseMarkerSync to default to true even when the animation asset did not have any sync markers.

  • Fixed bCanUseMarkerSync being true for followers when all valid markers were filtered out.

  • Fixed issue when linking/unlinking anim layers from UGameplayAbility::EndAbility.

  • Animation editor now correctly applies preview mesh from a compatible skeleton.

  • Fixed issue when filtering preview mesh on template anim BPs.

  • Fixed Anim BP asset definition correctly displays option to create child Anim BP.

  • Fixed issue when adding curves to anim sequences and immediately getting the bone pose.

  • Fixed issue in UBlendSpace::TickFollowerSamples due to hard coded bLooping flag.

  • Fixed NaN crash in FAnimNode_LinkedInputPose::Evaluate_AnyThread.

  • Ensure a clamped normalized time stays within the 0-1 range in the Blend Space Evaluator.

  • Fixed "Start" animation notify event for state machine transitions not being fired when bSkipFirstUpdateTransitions flag is set to false.

  • Fixed an issue that could cause a reinstancing crash in linked anim layers or graphs.

  • Fixed an issue that could cause use-after free when duplicating animation attributes.

  • Fixed an issue that could cause a crash when deleting a sync marker at the SyncMarkers Window, when finding an AnimMontage during the process.

  • Fixed a but that would only look at player controllers, and not something like AI controllers, when considering viewpoints for auto significance calculation.

  • Fixed an issue that could cause the GetLinkedAnimLayerInstanceByGroup tp not work for non-implemented layers with no instance assigned.

  • Fixed an issue that could cause the Details panel to disappear when making curve metadata edits.

  • Fixed an issue that could cause the preview instance from not being re-selecteable after selecting an external anim instance to debug.

  • Added some missing definitions for the UAnimInstance's function GetRelevantAssetPlayerInterfaceFromState.

  • Fixed an issue that could cause a crash in FMirrorSyncScope.

  • Fixed an issue that could cause blendspace sample entries from expanding when a sample animation is changed.

  • Fixed an issue that could cause a crash on loading an anim BP with pose hander nodes that require skeleton updates to their animations.

  • Added a missing ENGINE_API tag to SkeletetonRemappingRegistry, as it is required to use it from outside of the engine

  • Fixed an issue that could cause a crash when using an incorrect bone index type usage in UAnimationSequencerDataModel::GeneratePoseData.

  • Fixed an issue that could occur by ensure when transforming bone indices during animation compression.

  • Fixed an issue that could cause an issue with the SkeletalMeshComponent ComponentIsTouchingSelectionFrustum, as it was returning false positives due to missing check.

  • Fixed an issue that could cause issues with the FBX Import due to a name restriction not allowing bone names to start with a number at RigVM hierarchies.

  • Fixed an issue that could prevent the Animation Sequencer from triggering notifies repeatedly when using an animation mode track set to Use Anim Blueprint in a Level Sequence, by adding a parameter to the SkeletalMeshComponent SetAnimationMode function that allows not re-initializing the AnimationScriptInstance.

  • Fixed an issue that could cause a crash when using the PoseableMeshComponent, when the component is being incrementally unregistered and the unregistering process takes longer than the time limit set in the component.

  • Fixed an issue that could cause a crash when using one of the Animation editors when closing one viewport while additional viewports are open.

  • Fixed an issue that could prevent the BlueprintEditor from being refreshed after adding an animation layer node into an animation graph.

  • Fixed an issue that could cause an issue during an AnimComposite animation notify extraction when playing in reverse order.


  • Added a deprecation warning for AnimNode_StateResult.h located in AnimGraphRuntime module since the file got moved to Engine/Animation.

  • Removed the deprecated mirroring functionality from SkeletalMesh.



  • Added the ability to create Takes for Subsequences.

  • You can now add comments for shots and Sequencer sections.

  • Added support for tags when bindings are copied and pasted in Sequencer.

  • Added the option to select the material parameter collection asset from the track in Sequencer.

  • Reassigned the LevelSequenceEditorSettings.h to public.

  • Added command bindings for composition overlays to the Cinematic Viewport.

  • Exposed the ability to access setters and getters for audio section looping, suppress subtitles, and attenuation functions.

  • The Sequencer's Key editor now edits selected keys if they are selected. Otherwise, it edits at the current time as usual.

  • Bound recording commands in the Take Recorder now play in world space so that they work in Editor and in PIE.

  • The Clock Source menu is now always visible even in SubSequences, but is only editable when the Sequence Editor is focused on the root sequence.

  • Several improvements have been made to the Sequencer's Import EDL:

    • Added the support of KEY CLIP NAME

    • Sequencer now parses the timecodes from the end of the line.

    • If the EDL contains a shot multiple times, subsequent shots will be created in Sequencer when importing, corresponding to the EDL shots.

  • You can now change the Sequencer folder color of multiple folders by multi-selecting.

  • Sequencer Track filters are now saved in preferences.

  • Added a new transaction for toggling Show Marked Frames Globally.

  • Added support for a start offset to camera animations.

  • Upgrade audio track to use the new ECS evaluation.

  • Moved level-sequencer-specific editor code to the LevelSequenceEditor plugin.

  • Moved sequencer customizations to the editor view-model.

  • Add the following improved edge interaction for sections:

    • You can now use draw easing handles as rounded triangles sized to match the grip size, instead of the previous bitmap.

    • Easing handles are bigger, with bigger hit-testing area to make selection easier.

    • Exposed key size through the section interface in addition to grip size.

  • Added support for blend types and multiple rows for material parameter tracks (widget and MPC).

  • Exposed camera animation parameter to detail views.

  • String properties and String tracks now use the new ECS evaluation.

  • Add ability to lock marked frames on the time slider.

  • Register/unregister the camera animation stand-in object from its own module.

  • Added new user-defined bindings to Sequencer. This change adds the ability to define custom logic, using the directory blueprint, for object bindings. Instead of binding to the usual possessable or spawnable, this will optionally run arbitrary BP logic defined by the user to resolve the bound object. This makes it possible, for instance, to bind to the player pawn, or any other actor that might not exist at edit time. The UI is similar to that of the event track, and therefore reuses the director blueprint endpoint picker. There is however a new blueprint extension to compile these functions into the spawnables and possessables, and of course a spot to call these functions when appropriate.

  • Added a new key that you can use to allow the player to be closed.

  • You can now expand skeletal animation sections back to the left.

  • Added new feature: Smart Auto Key.

  • Smart Baking for Constraint Baking, Space Baking, Snapper, Control Rig collapsing and Baking Transforms.

  • Swap Root Bone on Track.

  • Animation Mode: Disable selection when clicking on an axis, avoids losing selection when manipulating.

  • Curve Editor: Make normalized mode scrollable and panable. This makes sure that if you frame to the normalized mode now it doesn't use the max/min values but defaults.

  • Control Rig: Shift now moves camera to stay with Control Rig when moving.

  • Curve Editor: Keep Output bounds the same even if curves are destroyed so you can select/deselect and keep their curve bounds.

  • Take Recorder now supports up to eight audio input sources for multi-track audio recording.

  • Added time scrubbing to Sequencer and Curve Editor to match Viewport behavior.

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

  • Curve Editor: Added option to show constraint/space bars.

  • Linked Anim Sequences are now editor only.


  • Take Recorder Timecode setting names now default to the same as Anim Sequence so that aligning works.

  • Removed the Sequencer's Add (+) button text rollover visibility. Now the text is a tooltip so that there's no overlap with key editor buttons.

  • Added the Sequencer's Browse to Actor property back to the actor's right-click context menu.

  • Control Rig Controls filter is no longer enabled by default in Sequencer. You can optionally enable it, and your preference will be saved between sessions.

  • Trim and Preserve now calculate the correct transform when the attached component isn't the root component.

Crash Fix:

  • Fixed an issue that could cause a crash when sorting sections on load.

Bug Fix:

  • Fixed an issue that could prevented the ability to toggle on or off tags inside of shots and subsequences.

  • Fixed an issue that could cause new keys to be added when attempting to update an existing key.

  • Fixed an issue that could cause the group manager to not refresh when performing an undo or redo command.

  • Fixed an issue that could prevent the group manager selection to not function properly with folder paths.

  • Fixed an issue with path track evaluations that could cause component velocity to not be set properly when an object is moved by the path track.

  • Fixed an issue that could cause regenerating waveforms during playback to not function correctly by adding a slight delay to eliminate hitches.

  • Fixed an issue that could cause duplicate entries in the property menu.

  • Fixed an issue that could cause Show Marked Frames Globally to not be marked as a UPROPERTY so that it gets serialized.

  • Take Recorder: Fixed range for camera cut section so that it works for subsequences when recording cameras.

  • Remove unnecessary creation of camera cut track and section because they're already created when a camera is added.

  • Fixed an issue that could cause animation sequence to be marked dirty, due to the spawnable being modified, if the sequence is evaluating.

  • Fixed mute/solo nodes when hierarchy changes by tracking old and new nodes paths.

  • Fixed issue when the widget is replaced and no longer valid.

  • Fixed issue where duplicating keys is not undoable and doesn't update the UI properly.

  • Fixed an issue by keying the material parameter collection instance's current value if it exists, rather than always just the default value.

  • Fixed an issue by compensating for transform origin when adding an object's transform to Sequencer.

  • Fixed track row names when row indices have been remapped or a new row has been added.

  • Fixed an issue that could occur when pasting a possessable, by only parenting it to the pasted target if the possessable's class is not an actor, such as a component. This fixes an issue where an actor could be pasted into another actor.

  • Fixed an issue by ensuring the CineCamera actor's name is unique when creating as possessable. Normally this is done in the actor factory but here we spawn the actor directly.

  • Check for valid animation on skeletal animation FBX export.

  • Fixed issue where calling scripting functions (AddKeyInChannel, RemoveKeyFromChannel, SetDefaultInChannel, ReoveDefaultFromChannel, SetTimeInChannel, SetValueInChannel) is not undoable and doesn't update the UI properly.

  • Fixed an issue by initializing layers for spawned actors. This fixes issues where if you add a spawnable to a layer, hide the layer, and then reopen the sequence in a new level, the spawnable won't be visible and won't respond to layers in the new level.

  • Fixed an issue that could prevent Snap Sections in the Timeline by using the Source Timecode so that it takes tick resolution into account

  • Fixed an issue by preventing all camera actors from being selected in the camera cuts menu even if it is hidden.

  • Fixed an issue that could cause small sections to result in negative time-to-pixel conversion.

  • Fixed an issue by carrying over the previous view target from a previously playing level sequence, if any, so that the last sequence played restores the actual original view target, and not the previous sequence's camera. This fixes issues with stuck cameras when some sequences are played on top of each other.

  • Fixed an issue that could cause a crash when using the context menu in the Camera Cuts track to try and select an unspawned spawnable.

  • Fixed an issue by preventing global custom accessors from being unregistered on shutdown.

  • Fixed an issue that could cause recycling of view-models when track layouts are rebuilt. This fixes some UI issues with keys and sections being moved between track rows.

  • Fixed an issue that could cause a crash when shakes are previewed in Sequencer or in the Camera Shake Previewer tool.

  • Fixed an issue that prevented initial material parameter values to be cached correctly.

  • Fixed an issue that could cause a crash when recompiling a user widget while Sequencer is open.

  • Fixed an issue that could cause the Snap to Interval tool to not function when Snap to Keys and Sections was not selected.

  • Fixed an issue by restoring aspect ratio axis constraint directly on the player if the level has changed during sequence playback.

  • Fixed an issue by correctly restoring the Sequencer editor playback speed on stop and pause operations.

  • Fixed an issue that could cause the key editor widget to not be cleaned up correctly when a track goes from 1 to 2 or more rows.

  • Fixed an issue that could cause a crash when dragging an item from the Place Actor menu over a sub-scene section.

  • Fixed a UI issue where the preview for the section length shown was only as long as the first sub-sequence asset, not the longest asset in your drag or drop selection.

  • Fixed an issue that could cause Sequencer runners to detach and attach to linkers in interwoven ways.

  • Fixed an issue that could cause the Additive From Base blend type to be missing an icon in the UE5 style.

  • Fixed an issue by taking play-rate into account for blend times between blending camera cuts.

  • Fixed an issue that could cause a Control Rig Component to be constantly reinitialized when used in Sequencer.

  • Fixed an issue that could cause incorrect blending out of sequencer camera shake patterns.

  • Fixed an issue by not calling the NotifyMovieSceneDataChanged() function when pasting tracks. This fixes an issue with Niagara not setting up its data correctly after pasting a track.

  • Fixed an issue that could cause interactions to be incorrectly handled between the normal track area and the pinned track area.

  • Fixed an NVVM refresh issue that could cause view-models who already have a recycle list would not recycle their children. This meant that a re-used track-row view-model would not get its children cleared out before it is rebuilt with new underlying data.

  • Fixed an issue with the Channel Curve Models in Sequencer Curve Editor that could cause the tracking interpolation type of neighboring keys to not operate properly when a new key was added.

  • Fixed an issue that could cause the MovieSceneSequenceExtensions::GetBindingId to not be properly exposed to python scripting.

  • Fixed an issue that could cause ease-in curves to not show properly when a section starts at time 0 that also does not have an ease-out.

  • Fixed an issue by not caching pre-animated state on entities that are being torn down.

  • Fixed an issue that could cause BOOL and INT curves to not be drawn past left or right-most key value in Curve Editor.

  • Fixed an issue that could cause a null check in Movie Scene playback.

  • Fixed an issue that could cause autosizing of subsections, audio sections, and skeletal animation sections, to not function properly, as they were all missing taking into account start or end offsets.

  • Fixed an issue that could cause a spawnable binding to be overridden during the sequencer, the spawned actor will get left behind, creating duplicate characters. Now, when a binding is invalidated, and we detect an overridden binding, Sequencer checks if a spawnable is registered, and if so, destroys that spawnable.

  • Fixed an issue by setting a zero value on an additive Control Rig section, so it doesn't always add and uses default interpolation.

  • Fixed an issue by adding the sequencer ability to change the SkeletalMesh asset from a Skeletal Mesh Component in cooked builds.

  • Snapper: Use default key type when setting keys.

  • When changing time via translate hotkeys get all changes first, then apply them to avoid double transforms with space/constraint keys.

  • Control Rig: When looking for a binding that constrains a Control Rig, it takes into account the Control Rig so it picks the correct Actor or its component. For certain setups the face and body rig both bind to the same component on the Control Rig, but bind differently on the Sequencer side.

  • Fix for missing or incorrect timecode values being stored in audio assets when recording with Take Recorder.

  • Constraints baking: changed the tangent type to the default for the keys at compensation to avoid inserting keys that may have flat tangents.

  • Control Rig: Fix keying weighted additive sections.

  • Fix copying actors in Sequencer that live in sublevels, you can end up selecting the wrong Actor.

  • Only sync curve selection when updating the tree if we have no curves, otherwise this will blow away what the animator is working on.

  • Fixed silent failure case in Sequencer when scrubbing audio at low frame rates.

  • Fixed an issue that occurred when applying an FFT filter with insufficient number of keyframes selected in Curve Editor.

  • Calling PasteBindings() from Blueprints or Python correctly returns the newly created bindings.

  • Linked Anim Sequences work with nested sequences.

  • Curve Editor: Don't show the space or constraint key bar spaces unless there is a space.

  • Snapper: Do not include controls without shapes when snapping to avoid issues.

  • Animation Mode: Restore Gizmo Scale when leaving/entering Animation Mode.

  • Linked Anim Sequence: Only dirty if the data is changed, not if refreshing or changing sequences.

  • Control Rig: Make sure it is on game thread when handling initialize events, fix possible issues with procedural rigs.

  • Fixed Sequencer player playback replication synchronization to only happen once per tick.


  • Deprecated the GetBoundObjects as it is incompatible with Spawnables. It is recommended to use ULevelSequenceEditorBlueprintLibrary::GetBoundObjects because it operates on the currently opened sequence in Editor and can return valid spawnable objects.

  • Remove Matinee's PostInterpChange, as it is not often used or compatible with projects.



  • Added progress bars when creating and compressing Morph Targets.

  • Added support for using Physics Blend Weight alongside Physics Control Component.

  • Added a new UpdateKinematicFromSimulation flag to BodyInstances. This allows kinematics to be treated the same as dynamic objects when simulating with async physics. The flag defaults to false, so there is no change in the default behavior, unless using the Physics Control Component, which sets the flag by default.

  • You can now get the current or target transforms with Physics Control Component.

  • You can now set the Physics Control Component to use manual updates.

  • The Physics Control Component damping ratio in the PhysicsControlMultiplier struct has now been exposed.

  • You can now bulk edit Physics Control Component settings, such as the target positions and orientations.

  • You can now reset the physics transforms to the cached targets when using a Physics Control Component.

  • Added the ability to use profiling mark up when using a Physics Control Component.

  • Removed the NNI from ML Deformer VertexDeltaModel and NearestNeighborModel.

  • Fixed an issue that could cause a crash when initializing the ML Deformer on Linux operating systems.


  • Improved ML Deformer reconstruction quality:

    • The ML Deformer reconstruction method now uses a smoothed L1 loss function, adding a new beta Smoothing Loss property to the training settings.

    • The reconstruction method also now uses cosine annealing learning rate scheduler, which removes the Learning Rate Decay setting.

  • The ML Deformer now displays a warning when using the Vertex Delta Model, that it should not be used in production.

  • The ML Deformer now uses extra Get functions to get private members.

  • Verbose logging has been added where non-verbose logging wasn't needed.

  • Added additional null safety checks to the ML Deformer.

  • The ML Deformer now prevents sampler reinit when not needed.

  • ML Deformer models can now specify the number of floats per bone.

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

  • Improvement the cleanup of the external Morph Targets, which also clears out the weight data.

  • Improved the component reinits by reducing the number of units.

  • Improved the rendering of bones inside the ML Deformer asset editor.

  • The Initialise Physics Control Component control strengths are now set to 0 by default, instead of 1.

Crash Fix:

  • Fixed an issue that could cause a crash by preventing the ML Deformer from updating dynamic Morph Targets when it is not possible

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

  • Fixed an issue that could cause a crash when creating a new actor blueprint, adding the blueprint to a skeletal mesh and ml deformer component, then setting a neural morph model as ML Deformer asset, and selecting the vertex delta model mesh deformer in the skeletal mesh component.

Bug Fix:

  • Fixed an issue that could cause the ML Deformer asset to behave incorrectly. This could likely happen when aborting during training, or changing assets after training, and saving. Now, the editor correctly sets section indices inside the Morph Targets, rather than just including all sections and sorts the Morph Target deltas by vertex number.

  • Fixed an issue that could cause unexpected behavior when using curves in the Local Model.

  • Fixed an issue that could cause the ML Deformer editor to enter a state where the timeline does not function properly after changing the input of an asset, such as a property on a skeletal mesh.

  • Fixed an issue that could cause compatibility checks to fail after training.

  • Fixed an issue that could cause a check to fail in debug mode.

  • Fixed an issue by setting the Physics Blend Weight property to 1 by default when using a Physics Control Component to simulate physics. This ensures that using a mixture of kinematic and dynamic bodies works with skeletal meshes.

  • Fixed an issue that could occur where the ML Deformer time sampling was incorrect.

  • Fixed an issue that could occur when render graph errors in ML Deformer Vertex Delta Model.

  • Fixed some issues that could occur with ML Deformer Vertex Delta Model inferences.

  • Fixed an issue that could occur with the VertexDeltaModel which caused animation to appear frozen.

  • Fixed an issue that could cause a module in ML Deformer to be missing.

  • Fixed an issue that could cause an incorrect mismatched vertex error in MLDeformer.


  • Removed a substring redirect from the ML Deformer, which wasn't needed anymore and triggered a warning in the log.


API Change:

  • There is no support for OpenGL on Linux, so the imaging and usdImaging USD libraries that depend on OpenGL are excluded on that platform.


  • Added editor performance setting to control r.VSyncEditor.

  • Added support for overriding enum value display names on a per-property basis.

    • This can be specified by the Enum Value Display Name Overrides meta-data, and is a semi-colon separated list of Name=DisplayName pairs where the Display Name can be a raw string or a NS/LOCTEXT style localized value.

  • Added Source Code Access plugin for the 10X editor.

  • Added a Copy References and Copy Paths button to the editor asset menu.

  • Disabled real-time viewports when the editor process is in the background and bThrottleCPUWhenNotForeground.

  • Optimized advanced copy by running its consolidate step less frequently.

  • Added new option for PNG import to fill RGB into transparent neighbors always, even on complex alpha channels. Previously was only doing RGB fill on simple binary transparency. This is configurable in Texture Import Settings.

  • Added a Fixup Group Actors function.

  • Added support for Windows ARM64, Linux, and Mac.

  • Changed floating point textures to default to BC6H compressed texture format on import, rather than RGBA16F. Existing textures are not changed. The format chosen by default can be set in the Texture Import Settings config; for VFX users may set it to default to 32 bit texture formats.

  • Added support for automatically wiring inputs when creating a node from a specific output.

  • Enabled easy command line override of shared linear encoding ( -ForceSharedLinearTextureEncoding=True/False ).

  • Fixed 32-bit size limits and bugs that prevented use of very large images (such as file sizes over 2 GB). Unreal should now be able to import very large images, only limited by memory use and the target platform or VT size limits, which is currently 16k x 16k for non-VT and 4 GB built size for VT.

  • Added button to Media Plate to browse to the material asset.

  • Updated the Fracture editor with a display of imported collision shapes in the convex tool if they are available and enabled. The display supports convex, box, sphere and capsule imported shapes.

  • Sound Cue Nodes now obey Class Viewer Filters.

  • Updated the Plastic SCM plugin to version 1.8.0.

  • Modified advanced color space transformations and source encoding overrides on textures to utilize the OpenColorIO library.

  • Added basic SCC support to Content Browser file data sources. This is enough to support the basic operations (on add, delete, move, rename), as well as the revision control file menu (to allow sync, revert, check-in, history, and diffing).

  • Added a context menu entry to perform asset validation on specific actors.

  • Upgraded OpenEXR version to 3.1.6.

  • Included the imaging and usdImaging libraries in the engine's build of USD.

  • Exposed SetIgnoreBoundsForEditorFocus as Blueprint callable and added GetIgnoreBoundsForEditorFocus.

  • Exposed single click action within SGraphPanel to allow hooking custom logic.

  • Adding a new Cook Metadata file that gets generated adjacent to the development asset registry. This will be the home for metadata about the cook that is unrelated to assets moving forward. Currently this contains dependency information regarding the enabled plugins at cook time, as well as plugin size information that gets written to the cook metadata file during staging, if enabled.

  • Upgraded USD version to v23.02.

  • Properties Menus drawn from the Sequencer now obey the Property Editor Permissions List.

  • Updated icons for Check-in Changes and Sync Latest status bar buttons.

  • Added ability to revert conflicted files in the Submit Files window.

  • Added the -AssetRegistryCacheRootFolder= commandline option to allow you to choose where to write the asset registry cache files.

  • Added number of convex to the statistics widget in the Fracture editor.

  • Made the histogram Set Inspected Attribute method in the Fracture editor to be more resilient to ill formed geometry collections.

  • Triggered an autosave if there are any unsaved changes when a user clicks check-in changes.

  • Updated the debug focus plane bounds to not be taken into account anymore when focusing on a cine camera in the editor, making the viewport focus on the actual camera itself.

  • Improved editor startup performance related to populating FAutocastFunctionMap entries.

  • Improved editor asset scan performance.

  • Updated the Variant manager properties list to include static mesh and overlay material properties.

  • Updated SyncBrowserToObjects use const arrays and add SyncBrowserToObject.

  • Added Blueprint Display Name to Blueprint Generated Class editor tags to permit aliased class names in cooked editor.

  • Added a tooltip to the toggle visibility button in the scene outliner and the Pin button in the scene outliner.

  • Renamed Mobile Preview ES3.1 (PIE) to Standalone Game Mobile.

  • Renamed Vulkan Mobile Preview (PIE) to Standalone Game Vulkan Mobile.

  • Renamed Mobile Preview (PIE) to Standalone Game Target Device Mobile.

  • Renamed Preview Rendering Level to Preview Platform.

  • Rename DebugText in EditorViewport from Feature level: to Preview Platform:.

  • Added a callback to get notified when the UObject garbage collection finishes purging objects.

  • Loaded components ( including the one in blueprints ) are now properly updated when using Dataflow to generate a Geometry Collection asset.

  • Added parameter to enforce the cluster number when using the connectivity data in the Fracture editor.

  • Prevented non-server standalone instances from using Server Map Name Override.

  • Added the ability for objects to have alternate selection outline colors picked from a palette.

  • Added support for statically and dynamically registering documentation redirects to allow licensees to override engine level documentation links without duplication / adding boilerplate menu overrides. Documentation redirects can be registered statically through INI editor config files or dynamically in code through the IDocumentation interface.


  • Updated the asset registry exporter to output to CSV to facilitate import into common database frontends. Additionally, support outputting dependency information based on a set of primary asset type roots for help in analyzing the source of build size.

  • Updated the function `UContentBrowserAssetDataSource::CreateAssetFilter`to improve performance. For a large project with a lot of paths using a recursive search on all the folders, the change reduced the time it took to create the filter by about 86%.

  • Improved the backend filter compilations of the asset views by adding a system to cache some part of the filter compilation.

  • Improved connectivity tool visualization in the Fracture editor:

    • Centers are now displayed.

    • Added controls for line thickness, point size, and colors.

Bug Fix:

  • Fixed a crash accessing null pointer on shutdown of editor.

  • Corrected Clear Thumbnail not working if asset is not already loaded into memory.

  • Fixed it so Additional Server Game Options in the Play in Editor options applies to externally launched dedicated servers as well as listen servers.

  • Corrected the clear on pie checkbox to work by putting in the correct path.

  • Fixed editor ensure startup when stats is not defined.

  • Fixed crash on exit in stall detector thread when editor closed by call to RequestEngineExit().

  • Updated Ability System Component function to check the Spec's ability pointer before use.

  • Fixed crash on shutdown if a web browser window was open.

  • Fixed nested virtual roots (from aliases) failing to resolve correctly in the Content Browser.

  • Fixed regressions when undoing a deleted one-file-per-actor post-save.

  • Fixed the details panel failing to restore expansion state when running deferred actions.

  • Fixed an issue with the content browser not always showing the path filters. The SLATE_ARGUMENT to determine if it should be shown was not initialized.

  • Fixed a crash bug with Advanced Copy, where two asset dependencies with the same name would flatten down to overwrite each other.

  • Fixed crash when creating a parameter from a datatable asset or any asset.

  • Fixed a couple of issues where packages were aggressively dirtied:

    • Call cancel on the transaction if it is actually a camera movement input.

    • Reset package dirty state when a widget drag is canceled (for example with escape key).

  • Made FBoxes IsValid flags editable, otherwise editor-modified boxes will compare equal to the CDO and so not be saved.

  • Usee FLinearColor for screen fades so that extreme values behave consistently between the editor and the runtime.

  • Fixed Variant Manager opening an extra empty window.

  • Fixed Unreal Editor's crash when using Unreal Remote.

  • Fixed a crash where a Thumbnail Pool could be deleted while it is ticking because the asset view that owned it was destroyed while generating a thumbnail.

  • Fixed a crash on editor shutdown where the transactors for ISM typed element handles were cleaned up too aggressively.

  • Reworked component visualizer visibility to key off draw debug variable. When this is disabled, the component visualizer will still draw if the component is directly selected, and will allow editing this way. Supports helper splines for PCG workflows that are intended to be hidden by default to the user.

  • Fixed a memory leak caused by a circular dependency from the delete asset window. This also fixed a general performance degradation of the editor when deleting assets because of the leaking assets pickers widget.

  • Fixed an issue where the gizmo would rotate on an axis from keybinds, even if the user had selected a valid axis on the gizmo.

  • Fixed a crash when prtining typed element debug ID.

    • Speculative fix for seen once crashes in typed element debug ID printing.

  • Fixed duplicates being wrongly reported when adding elements to map or set properties in the editor, where the key type is a UClass* key and the class name is a subset of a name which already exists as a key.

  • Fixed an issue where the hovered/active gizmo hit proxy is incorrect when mouse tracking restarts This was causing the indirect manipulation axis to persist as new buttons were pressed, which would result in the wrong axis getting manipulated.

  • Updated the level editor place actors menu to respect Class DisplayName overrides.

  • Fixed an issue where an invalid FName could cause category path look up to assert.

  • Fixed the Convert to Static Mesh actor's tool to now handle Instanced Static Mesh Components (and HISM components) properly.

  • Fixed the inability to revert level file deletion in Check-in Window.

  • Fixed an issue that prevented the use of the property matrix on textures.

  • In the Subversion settings, only the path of the Executable Location setting will be used and any executable name after the path will be ignored.

  • Fixed a bug where the asset registry cache would not be written in certain situations related to synchronous scanning.

  • Implemented auto-save on check-in.

  • Fixed issue that prevented deleted objects from being restored on Revert All.

  • Fixed issue that caused not saving deleted files during Delete workflow to result in errors after sync.

  • Fixed issue that caused added and saved files to disappear after Sync Latest.

  • Fixed a bug where the class redirector of a renamed Blueprint asset would not be applied until the asset was loaded, causing the new class type to be missing from UI selection.

  • Modified CleanupAfterSuccessfulDelete() to check if deleting a package is supported by source control first, and only if that is not the case, mark it for local deletion. This fixes an issue where deleting a file checked out by someone else (when working offline) and choosing only to save locally resulted in the file not being deleted on the local file system.

  • The packages Core Redirect are no longer case sensitive (regression introduced in a previous version). Since package names are stored in case insensitive FNames, the redirectors should be case insensitive as well.

  • Fixed a memory corruption issue related to UK2Node_EvaluateProxy.

  • Fixed an issue where when moving multiple directories at the same time in the content browser, the asset references weren't always being updated correctly, leaving some assets pointing to invalid asset paths.

  • Fixed a crash that could occur during the static mesh build step.

  • Fixed an issue where the asset registry state of an cooked plugin would remove some of the needed development tags from an asset that already exist in the Editor Client Asset Registry.

  • Fixed a crash for the Cloth editor that occurred during shutdown due to SharedPtr cycle.

  • Updated Approximate Actors method of Merge Actors to properly detect and return an error if the occlusion method removes all triangles in the approximation mesh.


  • Deleted DDS Loader and HDR Loader functions which were previously deprecated.

Content Pipeline


  • Fixed many image importers to gracefully handle malformed files instead of crashing.

  • OBJ translator distinguishes multiple polygon groups with different materials within a group.

  • Virtual textures no longer allow the NoMips MipGenSetting, as VTs require mips in all cases. LeaveExistingMips is only allowed if the entire mip chain is provided. This generates a texture build warning, and the texture is forced to generate mips.

  • PSD loader support has been made more robust, and support for RLE compressed 16 bit PSDs has been added.

  • Optimized I/O usage when utilizing the reference chunk database for packaging.

  • When CADKernel mesher is the default mesher, if a failure occurs, the process of the file is relaunched with TechSoft mesher.

  • A post process of the static mesh during the import has been disabled. It can be reactivated by setting the CVar ds.CADTranslator.SewMeshIfNeeded = true

  • Added CVar ds.CADTranslator.EnableUnsupportedCADFormats to enable all unsupported CAD formats.

  • Improved quality of OBJ format material translator. Most of the basic and extended sets of parameters(and corresponding maps) are now supported. Illumination modes are extrapolated.

  • Added a CVar USD.SkipMeshTangentComputation to skip computation of tangents for static meshes. This can help import performance when the tangents are not needed.

  • USD: Baked mesh deformations can now be imported as GeometryCache assets.

  • Files with geometry caches loaded on the stage will now have associated tracks in the USD level sequence.

  • GeometryCache track section parameters in level sequence are now exposed to Blueprint.

  • AUsdStageActor can now be derived in C++ from other plugins than USDImporter.

  • Alembic: Face set names, when available, are now used as material slot names on geometry cache (and static and skeletal mesh) and can be used with SetMaterialByName in Blueprint.

  • Added support for extracting RootUV values from the Alembic UVsParam instead of the groom_root_uv attribute.

Bug Fix:

  • The import of assets via the asset tools now validates that the destination path is mounted and avoids crashing if this is not the case.

  • Fixed issue caused by updating a texture via a render target while it is being built/compiled.

  • Removed redundant data from telemetry of USD/AxF/MDL/Datasmith importers, Dataprep.

  • Fixed issue importing obj/gltf/datasmith/mtlx when a texture is missing.

  • Fixed matrix issue for Autodesk Alias format (.wire).

  • Fixed issue for longlat textures with LeaveExistingMips set.

  • Importing partial mip chains generates output to a full mip chain.

  • Made the paper2D on object reimported safe to use in a cooked editor and made the existing code more robust by not having issues if you are missing the SourceTexture metadata.

  • Made the Blueprint node for the function MigratePackages of the AssetTools non pure. This adds the missing execution pin this node should have.

  • Fixed possible issue when streaming multiple instances of the same GroomCache at the same time.

  • Alembic: Fixed possible computation error when composing hierarchy of transforms.

  • Fixed GeometryCache ignoring "Receive Decals" setting with Deferred Decal materials.

  • Alembic: Fixed import generating no animation when importing GeometryCache with "Flatten Tracks" and skipping the import of the first track.

  • Alembic: Fixed frame time computation error at import that could cause timing issue.



  • Added a USD Stage import option to enable/disable the import of Groom and Groom Binding assets.

  • [USD Importer] Added UnrealUSDWrapper functions for registering USD plugins by path.

  • [USD Importer] Added UE wrapping for UsdPayloads, UsdReferences, and UsdVariantSets from USD API.

  • Added resource size tracking for Geometry Cache assets stored in the USD Asset Cache.

  • Added support for using Interchange's MaterialX translator when opening or importing USD Stages with references to MaterialX files.

  • [USD Importer] Added config setting and API for setting the default search path for USD's default resolver.

  • [USD Importer] Added a file format arguments parameter to find/create/export functions of SdfLayer wrapper.

  • Added support for exporting LevelSequences with animation constraints to USD.

  • Added support for UV transform shader nodes connected to primvar readers, when opening or importing USD Stages.

  • [USD Importer] Added wrapping for token-based API schema functions (CanApplyAPI(), ApplyAPI(), and RemoveAPI()) on UsdPrim from the USD API.

  • Added support for geolocation to Datasmith API.

  • Added new C++ events to the Usd Stage Actor: OnStageLoaded and OnStageUnloaded.

  • Implemented automatic regeneration of UAssets whenever the source USD prims were updated on the opened USD Stage.

  • [USD Importer] Added optional EUsdLoadPolicy parameter to FUsdPrim::Load() to mirror the USD API, allowing the underlying prim to optionally be loaded without loading any of its descendants.

  • Added support for parsing USD Materials that use multiple UV sets (primvars).


  • The USD Stage Editor's right panel can now display prim relationships, metadata, and attribute metadata (once an attribute is selected).

  • [USD Importer] Exposed UsdStage::CreateClassPrim() on the UE FUsdStage wrapper.

  • [Solidworks] Components made from identical parts now reuse exported meshes.

  • When opening USD Stages, only materials bound by at least one prim will be parsed by default.

  • [3ds Max Exporter] Shared exported meshes for RailClone or ForestPack entities now use the same mesh.

  • You can now cancel loading the USD Stage by clicking the "X" on the dialog to pick the default USD Asset Cache for the project.

  • StaticMesh, SkeletalMesh and GeometryCache assets generated from USD Stages will now have the default material instead as a fallback, instead of fully unassigned material slots.

  • You can now create LevelSequence bindings to transient actors and generated components when opening USD Stages, from any LevelSequence. Those bindings will use the new Sequencer Dynamic Bindings feature to automatically repair themselves whenever they are broken due to the stage being closed or reloaded.

  • Importing skin weight profiles is now significantly faster.

  • [Solidworks] Exploded Views now export for each of configurations as additional variants

  • Changed the translucency lighting mode used by the USD preview surface reference materials to "Surface ForwardShading", to improve behavior in scenes with multiple translucent objects.

  • [Sketchup] Geolocation information is now exported.

  • Expanded the USD Asset Cache to support persisting Materials, Skeletal Meshes and Static Meshes to disk.

  • [Solidworks] Greatly improved AutoSync reaction time to material changes for bigger models.

  • [Solidworks] Model Tab is now toggled after exporting animation.

  • [Solidworks] Added plugin prerequisites to the installer to support installation on clean machines.

  • The USD Stage Editor now shows internal prim references when selecting a prim.

  • When baking materials to USD, diffuseColor will now bake as black as a fallback to retain the same visual appearance as in UE.

Crash Fix:

  • [Solidworks] Fixed crashes caused by enabling AutoSync.

  • Fixed a crash that would occur when changing collapsing rules on the USD Stage Editor in some scenarios.

  • [Solidworks] Fixed a bug that could cause an infinite reimport after deleting a component.

  • Fixed a crash that could occur when importing materials from USD which overrode previously imported materials.

  • [Solidworks] Fixed a crash that could occur when re-enabling DirectLink source.

  • Fixed an crash that could occur when trying to open or import USD Stages with skeleton prims that have more than one root bone.

  • Fix crashes related to Skeletal Mesh Components when importing USD Stages over previously imported actors and assets.

  • Fixed a crash that could occur when exiting the engine during the process of saving USD Stage changes.

  • Fixed a crash that occurred when undoing the addition of transform track keys in some scenarios, such as when manipulating the LevelSequence generated by opening an USD Stage.

  • Fixed a crash that occurred when importing USD files via automated tasks (like Python scripts) with no specified import options.

  • [Rhino] Fixed an export crash that occurred when exporting meshes with multiple UV sets.

  • Fixed a crash that occurred when translating USD point instancer prims with unexpected prims inside their prototypes, when opening or importing USD Stages.

Bug Fix:

  • [Solidworks] Actor visibility is now set appropriately in the Datasmith scene tree on export if it's suppressed in the selected config.

  • [Solidworks] Unused materials are now handled correctly in exported scenes.

  • Fixed USD Stage import options that weren't being autofilled from the currently opened stage actor when using the Actions → Import option on the USD Stage Editor.

  • HierarchicalInstancedStaticMeshComponents spawned when translating USD Point Instancer prims will no longer be missing their StaticMesh assets, if the source prototypes were being shared via the USD Asset Cache.

  • USD prim kinds will no longer be ignored when deciding if a prim subtree collapses or not.

  • [Solidworks] Exporter will now install as expected if only version 2023 is available.

  • Fixed an issue that would cause missing Static Mesh Components when importing some types of USD Stages generated by exporting Unreal levels with StaticMesh assets with multiple LODS.

  • Fixed visibility handling issues that occurred when traversing Mesh prims in order to generate Geometry Cache assets when opening or importing USD stages.

  • Switching render context (or other similar options) on the USD Stage Editor options will now update the Static Mesh Components on the level with new material assignments as expected.

  • Exporting levels to USD without any levels selected will no longer generate files.

  • AnimSequence assets generated from USD will no longer fail to drive morph target (blend shape) animations.

  • Setting material overrides on spawned components will no longer write to unexpected USD prims if the Static/SkeletalMesh/GeometryCache asset is shared via an USD Asset Cache.

  • [Revit] Fixed duplicated IDs for Level elements.

  • USD Stage Control Rig integration will no longer fail when using Control Rigs that modify their own topology in their construction scripts.

  • Fixed an issue related to material overrides on components that spawned when opening USD Stages with collapsible subtrees.

  • The mesh vertex count and Nanite material collapsing limits are now checked when collapsing large meshes from USD.

  • Direct link now works when offline.

  • The USD Stage Editor will no longer generate invalid reference or payload paths when adding references or payloads if the target file is near the engine binary.

  • [DatasmithImporter] Fixed a bug that would occur when reimporting DirectLink static mesh with changed material ordering.

  • Fixed an issue related to how material names were being used for texture assets when fully importing stages from USD.

  • [Sketchup] Available SketchUp versions will no longer be disabled in the installer.

  • [Solidworks] Fixed an issue which prevented proper shutdown of Solidworks.

  • Chosen material purpose will now be used when parsing material assignments directly for the generated mesh assets when opening an USD Stage.

  • Fixed a slowdown which occurred when trying to display array attributes with many entries in the USD Stage Editor.

  • [Solidworks] Removed the -1 on spot light scale.

  • UDIM textures will now be parsed from USD Stages as expected.

  • [Solidworks] Fixed a sync/export bug that occurred when the plugin was enabled manually (not on startup).

  • Fixed a bug that could cause the material overrides layer to be empty in some scenarios when exporting levels to USD.

  • Adding and removing USD layers will now automatically reload animations on the generated LevelSequence as expected.

  • Fixed issues related to handling the export of levels to USD with Static or SkeletalMesh assets with multiple LODs, leading to broken references or missing material assignments in some cases.

  • The "Save USD Layers" dialog will no longer be shown when switching Stage options on the USD Stage Editor.

  • Mesh prims without the SkelBindingAPI will no longer be incorporated into the generated SkeletalMesh assets when opening or importing USD Stages.

  • Groom and Groom Binding assets now import from USD Stages as expected.

  • Using the Actions → Import option to import an opened USD Stage will no longer lead to unexpected results if the chosen import options differ from the options used by the currently attached USD Stage Actor.

  • [Navisworks] Tooltips now appear as expected when docking/undocking plugin UI.

  • Fixed an issue that occurred when exporting Unreal levels to USD. The exporter will no longer fail to retrieve actors when exporting "only selected", if those actors belong to a sublevel.

  • [Solidworks] Deleted sub-assemblies are now removed from the Datasmith scene on sync.

  • Fixed an issue which could corrupt imported textures settings.

  • GroomBinding assets will now be set on the Groom components when opening USD Stages with Grooms as expected.

  • Animations on the generated LevelSequence will now be refreshed when adding or removing USD sublayers from an opened USD Stage.

  • The landscape material baking process will now generate consistent textures when exporting levels to USD.

  • [Solidworks] Fixed an issue involving Part materials exporting inconsistently in multiple configurations.

  • [Revit] Fixed a Direct Link error associated with the Datasmith Exporter for Revit 2018.3.

  • [Solidworks] Fixed an issue involving the deleting a sub-component of a sub-assembly.

  • USD Stages with animated meshes (that led to Geometry Cache assets being generated) will no longer be left permanently opened in some scenarios.

  • [Solidworks] Fixed a miscalculation involving child components variant transforms.

  • Fixed broken baked material references when exporting USD stages on Linux.

  • The USD Stage Actor will no longer write to the USD Stage when updating component properties on the level even if those properties are bound as tracks on the currently opened Sequencer.

  • Fixed an issue which could cause missing StaticMeshes on HISM components generated when opening or importing USD Stages with point instancer prims with LOD prototypes.

  • Fixed an issue which could cause missing static mesh components when opening or importing USD Stages with Light prims that have child Mesh prims.

  • UsdTransform2d UV transform shader nodes when opening or importing USD stages on Linux will now parse as expected.

  • Actors spawned when importing USD stages via the Actions → Import button on the USD Stage Editor will no longer be marked as transient and disappear when loading into PIE or reloading the level.

  • The USD Stage Editor and UsdStageActor will no longer use an old generated UAsset when a stage option is changed.


  • The FUsdPrim::HasPayload() function was deprecated in favor of HasAuthoredPayloads() to mirror the USD API.

  • [USD Importer] Deprecated the HasAPI() function that takes an optional instance name parameter and replaces it with one- and two-FName parameter overloads that match the one- and two-token counterparts on UsdPrim from the USD API.



  • Limited the number of paths reported in changelist descriptions generated by editor collection checkins to 1000. You can control this by setting the Cvar Collections.MaxCLDescriptionPathCount.

  • Added ability to change the importing behavior for assets so that if you import on top of a redirector, you'll instead import on top of the asset that redirector points to. Set the CVar AssetTools.FollowRedirectorsWhenImporting to 1 for this behavior.

  • Added an optional integration with Helix Swarm that provides a way for users to view/post comments from the UE changelist review tool.

Crash Fix:

  • Fixed a crash that occurred when copying actors in an editor from before 5.1 and then pasting the actors in a editor newer then 5.1.

  • Fixed crash when duplicating levels that contain a Level Blueprint.

  • Fixed intermittent editor crash when loading certain changes in the changelist review tool.

Bug Fix:

  • Fixed missing '#changelist validated' tag when submitting without editing the changelist text.

  • Added bIgnoreEditorOnlyReferences to AssetReferencingPolicySettings in the Asset Reference Restrictions editor plugin. When true (which is the new default), the reference checker will ignore editor-only references to things like editor utility components.

  • Input axis events now forward to the Editor World extension collection and give extensions an opportunity to consume input.


API Change:

  • FMaterialCachedHLSLTree was not updated but already doesn't support the same features as the legacy HLSL material translator (e.g. AllowMultipleCustomOutputs).

  • Code accessing the Landscape GUID identifiers on instanced Landscapes now needs to take into account that instanced Landscapes modify their Landscape GUIDs. If you need the original value from the landscape asset, access it via GetOriginalLandscapeGuid().


  • Added command to dump a report of all landscape grass data currently used on landscape components: grass.DumpGrassData [optional: -csv -fullnames -showempty -detailed -byproxy -bycomponent -bygrasstype -full]

  • Added possibility for UMaterialExpressionCustomOutput to limit the max number of outputs. Displays an error when the material is using more than the max allowed number.

  • Added threshold to dirty landscape textures detection (CVars "landscape.DirtyHeightmapThreshold" / "landscape.DirtyWeightmapThreshold")

  • Added CVar landscape.DumpDiffDetails (to be used in conjunction with landscape.DumpHeightmapDiff and landscape.DumpWeightmapDiff) to dump additional details about the diff introduced on a given heightmap/weightmap.

  • Added Include Border to the landscape tool's component brush. Since the border is shared with neighbors, oftentimes the user wants to paint within the bounds of the component but not on the border.

  • Added blueprint getter and setter to WaterMeshOverride.

  • Added a new collision heightfield visualization mode to visualize the chaos material per-vertex.

  • Added the ability to synchronize LOD levels and eliminate geometry seams across adjacent Landscapes, by setting their LOD Group Keys to matching non-zero values.

  • Reworked landscape property sharing and override.

  • Added LandscapeInherited and LandscapeOverridable meta tag to mark shared properties.

  • Enforced synchronicity between shared properties when editing and loading ALandscape and LandscapeStreamingProxy.

  • Created textures with no mipchhain if used in as a layer height or weight.

  • Prevented computing the landscape texture hash twice when it has changed.

  • Multithreaded building of nanite meshes from Landscape geometry

  • Added the ability to store landscape heightmaps in a compressed representation to save disk space, at the expense of slower loading. Enable using landscape.ShowCompressHeightMapsOption to show this option.

  • Build Physical Materials command rebuilds all physical materials

  • Added new CVar to control heightmap detailed change tracking. Split landscape.DirtyHeightmapThreshold into landscape.DirtyHeightmapHeightThreshold and landscape.DirtyHeightmapNormalThreshold.

  • Added a gamma function to the paint tools strength to make more of the slider range useful for painting.

  • Adds Landscape BP Brush visibility layer editing.

  • Added FLandscapeBrushParameters struct that should be used to pass arguments when rendering a layer.

  • Added BP Brush visibility layer toggle in Landscape Editor.

  • Added visibility layer editing for LandscapeCircleHeightPatches and LandscapeTexturePatches.

  • Added helper method to determine if a layer info object name is a visibility layer.

  • Added ability to create multiple nanite components per Landscape Proxy if it has more than 64 components.

  • Added the ability to create multiple copies of a Landscape via Level Instancing.

  • Updated M_ProcGrid material to have nanite enabled.


  • Increased the maximum landscape grass type outputs from 18 to 32.

  • Save Modified Landscapes now acts as a way to fix every landscape actor that needs to be updated because of discrepancies.

  • Added viewport message for when Nanite meshes need to be regenerated. The message now indicates the number of landscape proxy actors needing updating.

  • Landscape heightfield now uses unlit vertex color material to better visualize physical materials.

  • Prevented updating water info until after a landscape painting operation is finished.

  • Modified ALandscapeProxy detail panel to reflect how the properties are shared.

  • Modified ELandscapeToolTargetType to be an enum class, usable by blueprints.

Bug Fix:

  • Fixed Open World map landscape normals.

  • Prevented all Runtime Virtual Textures from being invalidated when entering landscape mode just because we build a thumbnail material.

  • Disabled Save Modified Landscapes hyperlink in the map check after the action has been executed by the user.

  • Fixed Nanite landscape mesh object names, which were not guaranteed to be unique anymore.

  • Removed RF_Transactional flag from the static mesh since this data is not meant to be transactional.

  • Fixed bad tangent space computations for various landscape utilities.

  • Factorized redundant code in landscape for accessing weightmap/heightmap data.

  • Added CPU traces to LandscapeTrace.

  • Fixed important slowdown when using a landscape brush with a large radius.

  • Fixed Inactive world types interacting with Runtime Virtual Texture that caused changelist validation to create a new virtual texture producer.

  • Fixed visibility weightmaps being generated when using landscape patches. They are now only generated when a patch actually writes visibility.

  • Fixed missing landscape actor in landscape tools for debug visual log.

  • Fixed undo of Nanite-enabled landscape proxy deletion that didn't properly invalidate the Nanite component on redo.

  • Made bEnableNanite and NaniteLODIndex shared properties for landscape proxies so at cook time there is no ambiguity over whether Nanite is enabled or not on a given proxy.

  • Added map checks for when shared properties on proxies are not up-to-date.

  • Fixed ModifiedPackages system in ULandscapeInfo.

  • Changed outer of the Nanite static mesh.

  • Made the NaniteComponent TextExportTransient. Copy and pasting no longer leads to the mesh being shared between actors.

  • Made the NaniteComponent DuplicateTransient. Saving as a map no longer leads to the mesh being shared between packages.

  • Fixed crash when listing textures using the listtextures console command after having deleted a landscape actor.

  • Fixed Landscape Nanite Content Id taking into account the landscape material's StateId, leading to landscape actors being invalidated on 2 branches where the landscape material were not at the same version.

  • Fixed Landscape Nanite static meshes having a non-hash based Guid, leading to new DDC keys being generated when the meshes are invalidated.

  • Fixed navigation data being generated for nothing and being invalidated right after generation when building landscape Nanite meshes.

  • Corrected nanite mesh build not being cancellable when started from Build All Landscape.

  • Fixed rare case of desynchronization between CachedLocalBox and heightmap data.

  • Removed incorrect ULandscapeNaniteComponent from ALandscapeProxy's OwnedComponents upon copy/pasting.

  • Fixed performance issues related to landscape heightfield in show collision mode by using static draw commands.

  • Prevented landscape heightfield collision components being invalidated because of editor throttling.

  • Fixed a crash when copying a water body component in isolation. Spline component was not valid and crashed in PostDuplicate.

  • Fixed landscape component count display in editor when selecting streaming proxies.

  • Corrected water bodies which do not affect the landscape to still search for a landscape.

  • Corrected an issue where newly streamed in water bodies would not render into water info texture. Newly streamed in actors are forcibly hidden until all streaming is complete.

  • Fixed a crash in landscape when it contains null entries in LandscapeComponents.

  • Fixed landscape getting dirty even when the detected difference is lesser than the detection threshold.

  • Fixed landscape heights being incorrect after Sculpt Undo operation.

  • Override PostActorCreated to build WaterInfoMesh properly when spawning an actor using the UWorld::SpawnActor method.

  • Fixed an issue where Landscape Resize was not preserving all relevant landscape settings.

  • Fixed a rare crash when using the Landscape Editing modes.

  • Fixed a crash when alt-dragging or duplicating the landscape gizmo actor.

  • Fixed a crash when updating property permissions outside landscape mode

  • Fixed a crash when adding spline control points to a hidden landscape.

  • Fixed an issue with landscape LOD calculation that sometimes caused Landscape edges to have a higher-than-expected LOD.

  • Fixed a potential overflow security issue importing landscape PNG files.

  • Landscape Streaming Proxies were not being unloaded correctly if painted or sculpted in landscape mode.

  • Fixed a crash when creating multiple landscapes with regions

  • Fixed crashes and other unexpected behavior on Undo after adding a new LayerInfo to a Landscape Layer.

  • Fixed incorrect water velocities with some scalability settings.

  • Fixed an issue with large Instanced Foliage paint brushes taking a very long time when the Radius option is used.

  • Fixed an issue with normal calculations along the edges of landscapes.

  • Fixed a rare crash when double clicking a landscape spline control point tangent box.

  • Fixed a crash when undoing the creation of a landscape.

  • Fixed texture corruption when undoing mask painting back to the first mask paint operation.


  • Removed the baked landscape GI texture system.

  • Removed Render method for BP Brushes, RenderLayer should now be used.



  • Added blueprint functions to convert from classes and soft class references to the TopLevelAssetPath struct used by asset utility functions.

  • Exposed GetClassPathName, GetStructPathName, and GetEnumPathName to Editor Scripting, which return a TopLevelAssetPath containing the type info. For example:

    • unreal.MyClass.static_class().get_class_path_name()

    • unreal.MyStruct.static_struct().get_struct_path_name()

    • unreal.MyEnum.static_enum().get_enum_path_name()

  • Exposed FPlatformTime::Seconds() to scripts in Unreal Editor.

  • Added a function to convert a normal widget blueprint to an editor utility widget.

  • Custom icons can now be configured for Scriptable Tool Blueprints in the Class Settings.

  • The UScriptableInteractiveTool class now exposes a Blueprint-overrideable OnGizmoTransformStateChange event, which is called when a user starts and ends a Gizmo transform interaction, or on undo/redo of such an interaction.

Crash Fix:

  • Fixed a crash that would occur when using an Editor Blueprint as the root of another Editor Widget Blueprint.

Bug Fix:

  • UE now only generates Python stub code when running full editor.

  • Changed Python remote execution to bind to localhost as the default multicast adapter.



  • In the Place Actor Window, Volume objects and recently-placed elements are now properly localized.

  • Implemented deep copy for sets in CopySinglePropertyRecursive.

  • Added an Icon extension point to the content browser path view that allows icons to be placed to the right of the item text.

  • The asset auditor now shows the staged sizes of assets if they are present in the asset registry, and also makes sure that tags show the data from the selected asset registry rather than the one in memory. Previously, the size displayed in the asset auditor would be uncompressed data estimated by looking at how much data the cooker output to disk. With the introduction of asset registry writeback (in the project packaging settings), the compressed sizes can be written back to the development asset registry. When viewing such development asset registries, those sizes are now displayed.

  • Added a Browse button to the Level Editor Toolbar.

  • Improved UX around unsupported assets in the Content Browser by removing unnecessary menu options and adding an indicator to the tooltip.

  • SBlueprintActionMenu checkbox text is no longer cut off.

  • Changed the sorting of names in the scene outliner and changelist window to be in natural order, similar to OS file menus.

  • The Content Browser immediately flushes the config on adding/removing a folder from favorites to make sure the action is saved if the editor crashes.

  • In the DataflowGraphEditor, you can press the F key to zoom to fit either the selected nodes or the entire graph.

Bug Fix:

  • Opening a texture in the texture viewer now always shows Final encoding.

  • Fixed an issue where the color curve editor wouldn't update when gradient stops were moved.

  • Fixed the gradient preview in the Color Curve Editor.

  • Fixed an issue in the Reference Viewer preventing users from typing the address of non-package paths into the address bar.

  • In the Actor details view, archetype edits that occur while archetype instances are actively selected will now correctly sync the "reset to default" state.

  • Fixed a typo in FMessageDialog remark.

  • Folder names in the Content Browser now wrap properly with ellipses similar to asset names.

  • Fixed an issue where it was not possible to drag-and-drop below rows that have expanded items.

  • Fixed a drag-and-drop issue for Input Mapping Context that was not moving the element at the desired position.

  • Fixed tooltips that could appear on top of foreground programs.


API Change:

  • Changed message log action token so it doesn't disappear when the action has been executed, it becomes disabled instead. Visibility is only tied to the action's Execute callback validity now. This affects all actions where CanExecuteAction can return false.


  • Added the ability for different verbosities in the Output Log to ignore category filter and always display.

  • Added option to auto select items in revision control revert window to reduce redundant actions for users.

  • Set the asset filter in UAssetToolsImpl::CreateAssetWithDialog. This uses the Factory supported class as a filter for assets in the Save Asset As dialog.

  • Migrated most main menu entries under Edit, Window, and Tools to the newer ToolMenus system.

  • Fixed a typo in the tool for importing glTF files.

  • Removed the Starship Gallery test suite from the editor. It was not designed to run inside the editor and can therefore cause crashes.

  • Sorted the viewport's Perspective > Placed Cameras menu by name to make it easier to use.

  • Improved overflow behavior of text on Notifications by adding ellipses and showing the full text on hover.

  • Reskined the Property Matrix to bring it up to standards with the UE5 style.

  • UX Improvements for the Restore Open Asset Tabs notification that shows up when you launch the editor. These include the notification staying active until you make a choice and the ability to remember your selection in the future.

  • Added a Recent Assets menu to the level editor and all asset editors for quick access to any assets you recently opened.

  • Added an option to the Outliner context menu to bulk edit components in the Property Matrix.

  • Modeling Mode favorites are now saved across editor sessions.

  • Added the ability for modes to add a secondary toolbar below the level editor toolbar to house mode specific tools.

  • Removed user-visible ES31 editor references and replace it with Mobile.


  • Closed the suggestion box when using the keyboard shortcut (tilde key, usually) to switch between status bar console input to Output Log console input.

  • Auto-adjusted the editable text box size so the content for long console command is more visible.

  • Optimized a variety of hotspots during the texture build path not associated with encoding the actual image, including decoding of source image and metadata generation.

  • Updated text overflow behavior of the Window > Save Layout > Save Layout As panel.

Bug Fix:

  • Adjusted the color to full brightness or opacity when picking from the color wheel/spectrum if it was previously almost black or transparent.

  • Fixed a bug in some tables where header text could drift horizontally relative to row text of the same column.

  • The viewport toolbar now correctly collapses its buttons as needed even on displays that use DPI scaling.

  • Fixed an issue where tab headers would appear to be wiggling when a tab was being closed.

  • Updated tabs in windows separate from the main editor from no longer getting lost when Dock in sidebar is clicked.

  • Fixed a crash on shutdown in the Outliner when an item tried to unregister from the Uncontrolled Changelists module in its destructor after the module was unloaded.



  • Allowed UBT to build individual plugins as though they were local.

  • Introduced Network component to CQ Test.

  • Prevented approved reference images to be copied to html test report for successful test.

  • Introducing Code Quality Test plugin. Extension of the Unreal Engine FAutomationTestBase to provide test fixtures and common automation testing commands.

  • Avoided displaying missing reference when image comparison was successful.

  • Allowed levels to turn off garbage collection clustering so that actors can be deleted.


  • UAT addcmdline (RunCommandline) is now passed during launching of application on all platforms, where previously it could be embedded in UECommandLine.txt. It improves iteration times on some platforms as final bundle doesn't need to be rebuilt every time.

Crash Fix:

  • Fixed crash when using Automation Wait node in BP when AutomationController is not loaded.

Bug Fix:

  • Avoided a crash with Screenshot Functional Tests in PIE client net mode.



  • Added "UnrealInsightsBuildConfiguration" option to the BuildAndTestProject build graph so the CompileTools step can build Shipping, Debug, or Development configurations of Unreal Insights.

  • Added the option to throw exception when plugin in DisablePlugins list is enabled by another plugin's dependency.

  • Added EngineIncludeOrderVersion for UE5.3

  • Made the AutomationTool emit an error code when it terminates on an exception. This will result in failing the operation instead of reporting a false success.

  • BuildUAT.bat\BuildUBT.bat will suppress all messages from file compare.

  • Added support for Clang PCH chaining: https://clang.llvm.org/docs/PCHInternals.html#chained-precompiled-headers.

  • Added support to compile separate files in VisualStudio using the "Compile" menu item when you right click on the files.

  • Added flags to CSV metadata for LTO and PG_Instrumentation. LTO will be true if Link Time Optimisation is enabled. PG_Instrumentation will be true if Profile Guided Optimisation is currently in Instrumentation mode for gathering PGO profiling data. This change can be used to show if a particular build was running under these parameters when looking at CSV performance reports.

  • Broke several hidden circular dependencies between engine modules.


  • Tweaked the engine PCHs to improve compile times.

  • Improved overall Visual Studio project generation time by updating the UBT code to be thread safe and run in parallel.

Bug Fix:

  • Previously the "-ini:" command line argument may have been ignored when sent to UBT. These will now be applied.

  • Previously when multiple "Target" command line arguments were passed to UBT, ConfigCache::ReadHierarchy could read arguments from other Target arguments. It will now only read from the intended "Target" command line argument.

  • Fixed an issue where the public dependencies weren't being added to the include path list.

  • Fixed some random intellisense compile issues.


  • Deprecated TragetInfo::bUseMallocProfiler toggle. It is no longer used as MallocProfiler2 and FMallocProfiler runtime is removed in favor of UnrealInsights.


API Change:

  • This breaks backward compatibility where WriteToString is used as a type or in a context where it would be copied.

  • Deprecated the FMessageDialog overloads that take the title by-pointer; use the overloads that pass it by-value instead.

  • Rename FInterpCurve::InaccurateFindNearest into FInterpCurve::FindNearest.


  • Added additional FPackageName::ObjectPathToX functions:

    • ObjectPathToPathWithinPackage, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "MyAsset:SubObject.AnotherObject"

    • ObjectPathToOuterPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "/Game/MyAsset.MyAsset:SubObject"

    • ObjectPathToSubObjectPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "SubObject.AnotherObject"

  • The behavior of ObjectPathToObjectName has been fixed to always return the leaf-most object name within the path (eg, "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "AnotherObject"). Any code that relied on the old behavior should use ObjectPathToSubObjectPath instead.

  • Added FParkingLot, a framework for building locks and other synchronization primitives, based on WTF::ParkingLot from WebKit Added FMutex, a 1-byte mutex that is neither fair nor recursive, based on WTF::Lock from WebKit Added TUniqueLock and TDynamicUniqueLock, based on std::unique_lock.

  • Added UE_LIFETIMEBOUND macro to TStringBuilder to catch some cases where pointers are kept into temporary string builders.

  • Added -DDC-VerifyFix command to overwrite existing records and values that differ from newly generated records and values when using -DDC-Verify.

  • Added AppendV to TStringBuilder.

  • Converted WriteToString for TStringBuilder from a type to a function.

  • Added FMonotonicTimePoint and FMonotonicTimeSpan as an API for the monotonic clock exposed by FPlatformTime::Cycles64.

  • The PackageStore backend is now used to resolve dependencies for MemQuery requests.

  • ReplicationGraph amortize the cost of dormant Actor cleanup by allowing gathering Actor lists for one connection at a time.

  • Added FManualResetEvent, a 1-byte manual-reset event that is more efficient than FEvent.

  • Added FRecursiveMutex, an 8-byte unfair recursive mutex built on top of ParkingLot, as a drop-in replacement for FCriticalSection.

  • Added MemoryTrace implementation for Linux platform.

  • Added EnvOAuthSecretOverride parameter to Unreal Cloud DDC to allow providing an auth secret in the environment.

  • Refactored ListTexture command to output more data about UTexture derived classes.

  • When AGGRESSIVE_MEMORY_SAVING define is enabled, array slack growth factor will be set to 1.25x factor instead of an old ~1.375x This helps to save memory on platforms with no memory commit on a page fault for large arrays that are allocated directly by a page allocator and it saves memory on all platforms for smaller arrays (typically up to 64KB in size) that are allocated by a higher level allocator like MallocBinned.

  • Added TInstancedStruct to provide a type-safe wrapper for using FInstancedStruct in C++.

  • Added parallel decoding of FCompressedBuffer for targets with editor-only data.

  • Added FEventCount, an event type that provides a mechanism for avoiding a race between waiting and signaling through the use of a signal count token, and that is more efficient than FEvent.

  • Added -ExportBuildOutput command to include outputs in exported derived data builds.

  • Added partial implementation of GetResourceSizeEx for NiagaraComponent and NiagaraSystem.

  • Added a public API for structured log formatting in Logging/StructuredLogFormat.h

  • Added a way to upgrade existing sparse class data. Objects using sparse data can now override the ConformSparseClassDataStruct function to perform a custom upgrade step when loading a BPGC using a sparse data struct that no longer matches its archetype.

  • Added a new setting to CppStandardEngine so this can be controlled separately from the engine module.

  • Made AssetManager require engine use. The engine startup will give a fatal error if the AssetManager is not present.

  • Added ReverseIterate range adapter for reverse-iteration over ranges.

  • Adding ISaveGameSystemModule module, comparable to the platform chunk install module. Example usage added to Windows platform, allowing projects and Windows platform extensions to override the default save system. [PlatformFeatures] SaveGameSystemModule=MySaveModule

  • Replaced enable-if/disable-if overloads with if constexpr blocks.

  • Allow any engine module to access Internal include paths from other modules.

  • Added a CBaseStructureProvider concept for detecting if a type is supported by TBaseStructure. Deleted the concept-checking second template parameter from TStructOnScope, which doesn't work so well with forward-declared types.

  • Added TCallTraits::ConstPointerType overrides for common smart pointer types so that they you can look up a TSmartPtr in a map or set with a TSmartPtr key. Fixed some const incorrectness caused as a fallout.

  • Cooker and SavePackage: Move calls to BeginCacheForCookedPlatformData and ClearCachedCookedPlatformData from SavePackage into the cooker to satisfy the contract that objects do not have Clear called until the Save is completed.

  • Added lifetime-bound annotation to TOptional::Get parameter to catch dangling references when an rvalue argument is bound to an lvalue reference.

  • Upgraded to PROJ 9.1.1 and VS 2022

  • Added SupportedTargetTypes attribute, allowing for ModuleRules to be marked as supported for only specific TargetTypes (Editor, Game, Client, Server).

  • Added SupportedPlatformGroup attribute, which will resolve to a SupportedPlatform attribute that contains all the platforms in that group.

  • Allow SupportedConfigurations attribute on ModuleRules.

  • Enabled tvOS support for Electra Media Player.

  • Added Engine.ini:[AssetRegistry]:CommandletsUsingAR to identify commandlets that should load the AssetRegistry at startup.

  • Removed legacy hash table locks when collecting garbage as they are no longer used.

  • Added range support for Algo::Partition.

  • Updated MFW's PlayerFacade with reworked handling for playback control and timing for "v2 timing" players like Electra.

  • Added a UE_REQUIRES macro which replaces the UE_CONSTRAINT* macros and is concept-compatible.

  • Support for project-specific BuildConfiguration.xml and Programs during project file generation.

  • Allow overriding bWarningsAsErrors on a per module basis for Unreal Build Tool.

  • Option to write MSVC SARIF files for any errors and warnings when compiling or analyzing for Unreal Build Tool.

  • Added Fwd.h headers for WeakObjectPtrs.

  • Limited Fastbuild process count.

  • Added support for intrusive TOptional null states. Added intrusive TOptional null states to TFunctionRef and TSharedRef as examples.

  • Moved untracked memory coming from the third party Eigen library into the UE allocators, making it trackable.

  • FInterpCurve::InaccurateFindNearest has been improved. According to the accuracy of the new algorithm result, it has been rename into FInterpCurve::FindNearest.

  • Added Max display to containers in .natvis.

  • Improved comments for UE_DEPRECATED examples, adding examples for class templates and function templates.

  • Added the ability to implement a function override that can decide to force garbage collection if the engine is close to reaching UObject count limit.

  • Allow overriding windows application icon with TargetRules.WindowsPlatform.ApplicationIcon for Unreal Build Tool.

  • UE_FNAME_OUTLINE_NUMBER memory optimization.

  • Added TargetRules.bWarnAboutMonolithicHeadersIncluded to control UE_IS_?.

  • Changed [Get|Set]WrappedUObjectPtrValues to take a flag which says whether the pointer is 'in container' or not.

  • Allow usage of incredibuild on macOS.

  • Allowed TFunction's debugger visualiser to be set at a global level via UE_ENABLE_TFUNCTIONREF_VISUALIZATION.

  • Added FMRSWRecursiveAccessDetector that is zero-initializable, supports upgrading a reader access to a writer access recursively, and destruction from inside an access

  • Added override to the temp directory to a subfolder, and allow specifying a directory to use instead of the default %TMP% in BuildConfiguration.xml for UnrealBuildTool.

  • Added WindowsTargetRules setting to control Inline Function Expansion Level for UnrealBuildTool.

  • Updated support for minimum cpu arch for x64 platforms. Replaces ModuleRules.bUseAVX. MinimumCpuArchitectureX64, valid values are None, AVX, AVX2, & AVX512.

  • Allowed OpenVDB to be enabled via a macro in the .Build.cs rather than hardcoded at a platform level.

  • Shared common THIRD_PARTY_INCLUDES* macro definitions between compilers rather than between platforms.

  • Upgraded msvc preferred version to 17.6-14.36.

  • Allow multiple DPCVars processed in a loop to allow for multiple entries form the command line.

  • Added the option to dump per class UObject counts to log when the maximum number of UObjects limit is reached.

  • Implemented -CookIncludeClass=Class1+Class2+. This allows cooking only packages containing an instance of the given class or classes. This relies on assetregistry dependencies to find all packages that would ordinarily be cooked. Packages found through dependencies that are discovered only during load of their referencer are not guaranteed to be cooked.

  • Used a release channel enum instead of a boolean to check if a toolchain is preview or not, so we can support additional release channels for Unreal Build Tool.

  • Added debugger member expansion to FString, TStringView and FName to allow individual character indexing, and allows the raw char buffer to be accessed from a Referenced String or Name array.

  • Enable deterministic msvc compiles by default for shipping configuration for UnrealBuildTool.

  • Added move semantics and removed other unnecessary TSharedPtr reference count churn to TSlotBase::operator[] declarative syntax.

  • Added ExecuteOnGameThread as a wrapper for FTSTicker::GetCoreTicker.

  • Added UE::Tasks::MakeCompletedTask method that produces an already completed task with given result value.

  • Updated RiderSourceCodeAccess.

  • Added operator to TMap's key iterators.

  • Added key iterator tests.

  • Added UE_LIFETIMEBOUND to bit iterators and bit references to warn when lifetime issues occur (like holding onto an iterator to a temporary bitarray).

  • Added UniqueBy to remove duplicates from a range from a projection to apply to the elements, similar to std::ranges::unique.

  • Added FStringFormatArg to natvis.

  • Added FindFrom function to TBitArray to allow a user to provide a start index when searching for a value.

  • Allow cheat extensions to add bugit logging.

  • Added FTopLevelAssetPathFastLess and FTopLevelAssetPathLexicalLess function objects for performing comparisons on FTopLevelAssetPath.

  • Added serializers for TPagedArray.

  • Added Algo::Includes, based on std::includes.

  • Allow MallocStomp2 allocator to be used in the windows editor.

  • Oodle is now updated to version 2.9.10b

  • Added a checkbox option for PriamryAssetLabels to not include/follow redirectors.

  • Added FCoreDelegates::OnCommandletPreMain and FCoreDelegates::OnCommandletPostMain This allows things to hook in to provide additional initialization or shutdown logic for any commandlet that may be run.

  • Added a way for objects to specify property overrides local to the save context of a package.

  • Added two new commands to UAT:

    • VirtualizeProject - Used to run the virtualization process on an entire project.

    • RehydrateProject - Used to reverse the process on an entire project.

  • Replaced FInstancedStruct versioning implementation to use archive custom versioning.

  • Make serialization symmetrical so struct serialized in cooked builds can be loaded in Editor builds.

  • Added a new Settings parameter to a new FPlatformProcess::GetApplicationSettingsDir function for getting %appdata% in Windows, and $HOME in macOS and Linux.

  • Moved #includes around in the shared Engine PCHs so the PCHs are hierarchal. This fixes issues where removing or adding a private module dependency would drastically change compile times because the includes in the PCHs were different.

  • StaticMesh Asset Validation now verifies that an uncooked StaticMesh Asset has valid a LOD0 SourceModel.

  • The virtualize and rehydrate project commandlets now accept the command line parameter '-PackageDir=' limiting the operation to the given directory.

  • FEditorBulkData is now thread safe.

  • Added a new commandline parameter '-LocalOnly' to the 'GeneratePayloadManifest ' commandlet. This new parameter should be used to generate a manifest containing only payloads that are stored locally on disk.

  • Added FindComponentByTag method to Actor class, which returns the first component in an Actor with a given type and tag name.

  • Added support to give actions in UBT "weight". "Weight" is an average measurement of how many cores and memory an action uses. Using one core with a normal amount of memory for an action would be a value of 1.

  • Added a simple S3 HTTP client.

  • A new error flow has been introduced. If a payload fails to pull we now block the editor and show the user a dialog allowing them to retry the operation or quit the editor. We no longer allow the editor to continue with missing data due to the danger of corrupting existing packages on disk.

  • A warning is now logged when attempting to virtualize a package with a package version older thanUE 5.0, as the package would need to be re-saved in order for virtualization to work with it.

  • Enabled virtualization on static meshes and audio assets by default rather than being opt in.

  • The commandlet 'ValidateVirtualizedContent' now validates that all virtualized payloads in a project can be found in persistent storage. The previous functionality has been moved to a new commandlet 'CheckForVirtualizedContent'.

  • Updated the logic that determines which dependencies a shared PCH has. This new logic goes through all the includes of the pch header and finds the actual headers and modules used. This creates a smaller list of dependencies than before, which is later used to determine whether it is safe or not for the PCH to be used by other modules.

  • Enabled profile guided optimization support when using Intel ICX compiler 2023.1.

  • Enabled msvc strict conformance mode by default for projects set to BuildSettingsVersion.V4.

  • Added GetPropertyInstanceWithin to CPPStructOps so that classes like FInstancedStruct can have their internal properties reflected by property paths.


  • Improved multi-edit behavior of instanced struct instances

    • Editing multiple instanced struct instances will now edit the properties of the common struct of all instances (like object editing), rather than only editing instanced struct instances using the same struct type as the first instance being edited.

  • Always compile engine modules with C++20, unless the platform doesn't support it. Any module that sets bTreatAsEngineModule will be upgraded to c++20 unless it has already overridden it to c++17

  • Optimized StreamableManager::OnPreGarbageCollection.

  • Optimized TFunctionRef calling, as it can never be null. .

  • Removed FullLoadAndSave; it has been replaced in efficiency by MPCook, and further optimizations (concurrent save, async load) will also exceed it even without MPCook or Incremental Cook.

  • Improved deprecation comments surrounding the use of string conversion types and macros.

  • Improved comments on TBox and TIntRect to indicate how their Intersect, Contains, and IsInside Of functions handle overlaps on their borders. Fixed FVector parameter in TBox::IsInsideOrOnXY.

  • Optimized TChunkedArray::Add for speed.

  • Improved Clamp codegen.

  • Improved Swap codegen.

  • Optimized FScriptMapHelper::FindInternalIndex

    • FScriptSetHelper::FindInternalIndex now returns INDEX_NONE when the user provided index is out of bounds.

Crash Fix:

  • Fixed crashes and errors when using OIDC functionality from DesktopPlatform.

  • Fixed a crash after a failed request lookup in the CotF server.

  • Fixed a crash when shutting down the media player.

  • Fixed a crash when duplicating object with a within class in component instance data cache.

  • Fixed crash when doing recursive async loading in the legacy loader.

Bug Fix:

  • Updated FPaths::Combine method to work with FStringView.

  • Sparse data properties will be favored if they match the name of a deprecated object property. This allows Blueprints to function when object data is moved to sparse data, and the original object property deprecated.

  • Added a few missing definitions that were preventing "Debug Editor" builds of projects that disable GC from linking.

  • Fixed structured logging to work with Live Coding.

  • Added ElementType to TSubclassOf.

  • Fixed alignment and thread safety issues in FMallocStomp and TConcurrentLinearAllocator.

  • Fixed error reporting during execution of static destructors to avoid crashing on a destroyed lock.

  • Fixed merging and filtering of partial records in the derived data cache hierarchy.

  • Fixed vtable constructor to UAssetRegistryImpl to invoke the proper base class constructor. Code would asset during a Live Coding session. However, the asset registry does not support live coding.

  • Fixed using the TMap element after removal.

  • Fixed mismatch string formatting argument in SavePackage2.

  • Fixed assert firing in Debug mode when calling FScriptArrayHelper::MoveAssign.

  • Fixed FName == C string bug and added string view comparisons.

  • Fixed FStringView's operator!= which could result in circular overload resolution.

  • Added perfect forwarding of delegate Execute arguments.

  • Added a static assert when casting a non-UObject to an IInterface.

  • Set the chunks of the generated package equal to the chunks of its generator.

  • Fixed a mismatched user-defined copy constructor/assignment operators and their associated bugs.

  • Fixed a potential invalid quote count in CSV parser and added overloaded constructors for move semantics.

  • Fixed TSortedMap's key iterators which didn't compile.

  • Fixed issue where Electra Media Player would return incorrect HDR information after seeks.

  • Made FPlatformProcess::WritePipe use proper UTF-8 conversion rather than truncation.

  • When collecting objects referenced by properties, the property owner object will no longer be excluded and instead the owner of the reference list will be excluded to make sure all references are property exposed to the Garbage Collector.

  • Changed a texture on a material instance will now add the new texture to the material's Garbage Collector cluster.

  • Fixed JsonSerializer output where data loss occured when NumberStrings were being written as numbers, instead of strings.

  • Made ensure conditions likely when !DO_ENSURE.

  • Fixed inverted logic in FBindingObject::IsA<>.

  • Updated GenerateTLH to build and touch the output file with one command, to prevent cases where the .tlh doesn't exist and isn't created. Allow typelib headers to be generated when using the clang compiler, by using the toolchain's compiler to generate them instead.

  • Fixed TBitArray being implicitly constructible from a TBitArray of another allocator to stop accidental dangling references when constructing a const bit iterator with the wrong allocator type.

  • Fixed implicit conversions when comparing or doing bitwise operations between bit arrays with different allocators.

  • Removed 1 extra virtual function call (or more if ArrayDim > 1) from object-based Copy*ScriptVM property functions by having an implementation per property type instead of a top level override, also removing the need for the FSoftObjectPtrProperty::Copy*ScriptVM overloads.

  • Fixed invalid string length handling in FCborReader::ReadNext.

  • Allow AdditionalPlugins for use in multiple projects.

  • Fixed inverted assert conditions in Algo::Heap method.

  • Fixed FThreadSafeCounter64's copy constructor taking FThreadSafeCounter.

  • Automation Tool will now respect specified error level for commandlets.

  • Added a check for invalid counts in FScriptArrayHelper::Resize.

  • Fixed THIRD_PARTY_INCLUDES_END for Clang on Windows.

  • UnrealBuildTool will not pass /Zm unless specifically overridden.

  • Added a check for invalid reserves in TSet.

  • Fixed TMap::FilterByPredicate discarding template arguments in return type.

  • Fixed Clang static analysis false positives in our operator delete overrides by disabling them.

  • Removed redundant Unbind call from TDelegate's destructor.

  • Added guards to stop property size calculation overflowing.

  • Fixed Unreal.natvis to allow container indexing in the debugger.

  • Made FHeightField::FData::Serialize avoid using TArray>, as FBoxFloat3 is immovable and shouldn't be used by movable allocators.

  • Object Handles will be initialized with the actual global UObject array capacity instead of the max UObject count value from ini since the actual array capacity may be larger.

  • Fixed broken bAddDefaultIncludePaths UBT setting.

  • Fixed a GeoReferencing issue where the data files were not found in a sandboxed environment.

  • Fixed incorrect size being reported by TArray's overflow checker. Fixed negative int32 sizes being reported as large uint64 sizes..

  • Fixed EnumAddFlags and EnumRemoveFlags to not require operators on the enum.

  • Made TIsCharType work with cv-qualified types.

  • Made sure running out of available UObject slots crashes regardless of checks being enabled or not otherwise it will silently result in stomps or out of memory crashes.

  • Added weak pointer to archetype cache to prevent returning stale pointers.

  • FProperty references resolved in PostLoad will now properly add their referenced objects to the bytecode owner UStruct's reference list.

  • Fixed rsca for toolbox 2 0 in rider.

  • Non-nullable object properties should now have a default object value assigned to them in case of serialization errors.

  • Fixed mismatch string formatting argument in core test.

  • Replaced some TArray operator new usage.

  • Fixed a bug that truncated the lost of valid paths when emitting an error about an invalid package name.

  • FMicrosoftPlatformString::Strupr is now consistent with other platform implementation and works with non-null-terminated strings.

  • FScriptMapHelper::Iterator and FScriptSetHelper::Iterator post-increment operators were pre-incrementing.

  • Made BuildU[A|B]T.bat explicitly call the Windows find.exe utility.

  • Fixed DrawDebugCircle to draw correct number of segments.

  • Fixed LLM not setting the program size.

  • Fixed UEngine::DrawOnscreenDebugMessages function which was returning the wrong value.


  • Deprecated the FMessageDialog overloads that take the title by-pointer; use the overloads that pass it by-value instead.

  • Deprecated Engine::FindAndPrintStaleReferencesToObject as it was moved to FReferenceChainSearch.

  • Deprecated Engine::FindAndPrintStaleReferencesToObject and moved PrintStaleReferencesOption to its own file for better compile iterations. Moved FindAndPrintStaleReferencesToObject to ReferenceChainSearch.

  • Deprecated four FBulkData flags that no longer serve any useful purposes: BULKDATA_Unused, BULKDATA_ForceStreamPayload, BULKDATA_SerializeCompressedBitWindow and BULKDATA_BadDataVersion

  • Starting to remove support for delegate policies as they are incompatible with threadsafe delegates.

  • Removed usage of TRemoveConst and deprecated it.

  • Removed the deprecated rebasing Actor and the dependency to the rebasing offset.

  • Deprecated hashing arrays and TCHAR* with GetTypeHash.

  • Deprecated TScriptDelegate.

  • Replaced TModels traits class with TModels_V.

  • Deprecated UE_GC_TRACK_OBJ_AVAILABLE macro and simplified available UObject count tracking.

  • Moved FScriptSetHelper::HasElement and FScriptMapHelper::HasKey to the editor.

  • Removed DISABLE_DEPRECATION macro.

  • Removed UUnsizedIntProperty and UUnsizedUIntProperty which have been broken since the move to FProperties.

  • Removed UE::Core::Private::FWrappedObjectPtr, since it's unnecessary now that we have FObjectPtr.

  • Deprecated TRemoveCV.

  • Replaced TIsTArray trait class with TIsTArray_V.

  • Made ApplicationWillTerminateDelegate thread-safe: deprecated FCoreDelegates::ApplicationWillTerminateDelegate (because thread-safe delegates can't be statically initialised) and added FCoreDelegates::GetApplicationWillTerminateDelegate accessor for a thread-safe delegate.

  • Deprecated global Sort and StableSort functions. They only support an index type of int32 and can produce unexpected/undesirable behavior due to their use of TDereferenceWrapper. Uses of these functions have been replaced with the versions in the Algo namespace.

  • It is no longer possible to virtualize engine content and so the following config file options have been deprecated:

    • Engine:[Core.VirtualizationModule]:FilterEngineContent

    • Engine:[Core.VirtualizationModule]:FilterEnginePluginContent


  • Removed GIsUCCMakeStandaloneHeaderGenerator since C++ UHT no longer uses engine types.

  • Removed core delegates deprecated in 5.2.

  • Removed the old FTicker that was deprecated in 5.0

  • Removed EGCOptions::WithClusters to reduce the number of template instance permutations in Garbage Collector code and improve compile times.

Dev Tools


  • Removed C++ Unreal Header Tool (UHT).

  • Ported C# Unreal Header Tool UhtBuffer to new objects that use ArrayPool.

  • Add non-persistent metadata to the CsvProfiler.

    • By default csv metadata persists between captures which may be problematic if capturing different modes that have specific metadata since prior captures can pollute future ones.

    • This change adds a CSV_NON_PERSISTENT_METADATA macro which sets metadata that is cleared once the current capture ends.

  • [UnrealVS]

    • Added "Generate Assembly" menu option that asks UBT to compile a single file and generate an assembly file.

    • Upgraded UnrealVS.vsix to version 1.84.3

  • Added the ability to define new documentation policies and specify a default policy.

  • Added ability in UHT for arrays to be sized using static_cast.

  • Added the Build directory as a location UBT scans for UBT plugins.

  • [PerfReportTool] Added support for date formats and disabling column word wrap.

  • Added the ability to compute a hash from a slice of an array.

  • Modified UHT to not emit unused #define directives.

  • Updated UBT project code analysis to 4.2 and text encoding to 6.0.

  • Added the ability to set the IoHash directly in the file hasher

  • [UnrealBuildTool]

    • Added option to generate assembly files while compiling C++ files.

    • Supported only on MSVC compiler for now.

    • Generated files have the .asm extension and are located in the same Intermediate folder as the corresponding .obj.

  • Added generic double buffer async file reader with the ability to specify buffer sizes.

  • [Horde] Optimizations to Horde storage when dealing with larger data:

    • Added ability to specify buffer size with FileNodeWriter methods CreateAsync and AppendAsync.

    • Added ability to copy a FileNode tree directly into a stream without creating the nodes themselves.

    • When reading data, avoid creating byte[] for the cache if the cache is not enabled.

    • Reduced default read size from 15MB to 1MB when caching isn't enabled.

    • New ReadNodeAsync method that invokes a callback with the data instead of creating the node instance.

    • TreeWriter uses the current packet's full memory buffer size to detect the need to resize indead of the max packet size.

    • New bundle test for the streaming of FileNode directly to a stream.

  • Removed comment and tooltip metadata from shipping builds.

  • Added Apple Silicon native binaries for GitDependencies.

  • Added ErrorIfNotFound option to MoveTask to allow throwing an error if the specified file is not found. This option is disabled by default.

  • Optimized Visual Studio created projects and they are now much smaller.

  • Added validation logic to Unreal Build Tool (UBT) to ensure that plugins do not have dependencies on any plugin that is sealed.

  • [UGS] Error dialogs shown at the end of syncing (unresolved files, files needing deletion etc) are now focused when the UGS window is selected. In addition the UGS taskbar entry flashes before showing these modal dialogs and at the end of the sync to try and get the users attention.

  • Added a new bEnableLibFuzzer option for desktop platforms.


  • Improved C# UHT file reads by limiting the buffer size to reduce garbage collection stress.

  • Modified the ComputeAsync hash method to provide a file size hint so it can default to a larger buffer size to improve performance.

  • Modified the ComputeAsync hash method to use the double buffer reader above.

  • Enhanced UHT to be able to parse more C++ attributes.

  • Improved checks for keywords placed in invalid conditional blocks.

Crash Fix:

  • Fixed Hot Reload and Live Coding to not bother serializing delegates and bulk data. Delegate serialization was causing asserts with new concurrency checks and could have resulted in crashes in the past.

  • Fixed live coding shutdown to eliminate a crash on exit.

  • [UGS] Disabled "Open Project..." when right clicking in the main window unless the context menu was opened over a valid tab. This prevents a crash when attempting to open an invalid project.

Bug Fix:

  • Fixed Unreal Build Tool (UBT) log event level check that resulted in spam to the logger.

  • Fixed issue where modules that were not currently loaded could prevent live coding from patching modules that were.

  • Fixed issue where using live coding with the Clang compiler would generate "unresolved external" errors.

  • Live Coding no longer generates errors about object files being missing after a source file is removed from a unity file by live coding.

  • Removed unnecessary iteration in GetMaxEnumValue in UHT.

  • Fixed issue with UBT where the UE_TARGET_NAME isn't the actual target name. This resulted in Hot Reload and Live Coding to no longer work when used with a non-unity build.

  • Fixed C# UHT to allow functions with parameters in WITH_EDITORONLY_DATA blocks.

  • Fixed issue where the check for first header include was not being reported as an actual warning/error.

  • Fixed issue where Live Coding would fail with "unresolved external symbols" when used with Clang.

  • Fixed Live Coding Console to handle the patching of coroutines.

  • Fixed C# UHT strict documentation tests for function.

  • Fixed an issue with Live Coding where large projects might not have enough memory reserved around libraries preventing patching.

  • Fixed an issue where C# UHT metadata did not issue value change errors in metadata.

  • Fixed an issue in Live Coding preload module support where, if a module name is known but not currently loaded, then the engine would generate a check.

  • Fixed an issue where C# UHT failed to generate an error when an interface function was marked as BlueprintPure.

  • Fixed an issue where UBT failed to detect C# UBT plugins in the game folder.

  • Fixed an issue in C# UHT where, if a structure referenced itself, then it would end up in an infinite loop.

  • Fixed a rare threading crash when starting UnrealPak.

  • Fixed an issue where, if Unreal Header Tool (UHT) export code threw an exception, the build did not display the error message or fail the build.

  • Fixed UHT issue where invalid code would be generated if all FieldNotify properties in a class were marked as editor-only data.


  • [UnrealFrontend] Disabled old Profiler (UnrealFrontend/SessionFrontend/Profiler).

    • Old Profiler was deprecated in UE 5.0.

    • Use Trace/UnrealInsights instead.

    • Added UE_DEPRECATED_PROFILER_ENABLED global define toggle. This is off by default. This allows you to temporarily re-enable Profiler if needed; see UnrealFrontend.Target.cs.

    • Profiler module/code will be removed in a future UE version.


  • [UnrealFrontend] Removed the deprecated MEMORYDUMP run command.



  • Added FInstallBundleSuppressAnalytics class to help suppress install bundle analytics that avoid spamming during a specific bulk operator.

  • Enabled Unreal Trace Server for all platforms.

    • Unreal Trace Server now supports all desktop platforms (Win64, Mac, Linux).

    • Precompiled binaries are now included for Linux and Mac. This removes the need to run Unreal Insights program when tracing on those platforms.

  • Added user interface for displaying connection status to trace store.

    • Added logic to re-connect when the connection to the store server is lost.

  • Added user facing message events in TraceLog. Previously, errors in TraceLog would silently stop traces without any information to the user. This adds a way to receive those messages and log them using regular engine logging.

  • The new session id is now used when requesting a process current trace session. This resolves the issue with getting the current session, when the machine has many live sessions running at the same time.

  • Added persistent settings for Unreal Trace Server which allows setting changes to be retained after restart. Settings can be changed without restarting the server.

  • Added UE_TRACE_METADATA_RESTORE_SCOPE(MetadataId) macro.

  • Added alloc event callstack id and free event callstack id in tooltip of the Callstack column for Memory Insights.

  • Added a package field to the asset metadata scope, in addition to the existing asset name and object class fields.

  • Added the "screenshot" trace channel to the "default" channel preset.

  • Symbol resolving now automatically tries to remap known packaged renamed binaries to their original filename.

  • xmake is now used for building Unreal Trace Server on all platforms.

  • Added LLM tracking for TraceLog memory usage.

  • Made TimingView.AutoScroll option persistent in ini file for Timing Insights.

  • In Timing View, when Ctrl is pressed while clicking an event to be selected, the time interval that includes both the old selected event (if any) and the new selected event will be also selected.

  • Added "Project Name", "Other Metadata" info, if available and added "TraceId" as an optional metadata.

  • Added FD3D12Adapter::TraceMemoryAllocation and D3D12PoolAllocator to resolved symbols filter in Memory Insights.

  • Added support for unlimited number of heap specs in Memory Insights. Previously, it was limited to 256 heap specs.

  • All trace files now contain a metadata field with a session id and a globally unique trace id. Session id can be set from the command line to group session from many machines together. If no session id is specified a random one is generated.

  • Memory Insights / Mem Allocs table: - Improved the status bar text display of query info, query status, number of allocs and added number of filtered allocs.

  • Added status bar text info for selected items (including the total alloc count and total mem size of selected items).

  • Added tracing for the existing "Stats_GPU_*" float counters when "stats" trace channel is enabled.

  • Added project field in session info event, separate from the app name. Previously we used project name rather than app name if it was available.

  • Added Get*ProviderName public API for all providers. Refactored the IModule derived classes to ensure consistent implementation.

  • Tree Table View improvements:

    • Increased font size and updated text colors (ex.: when tree node is hovered/selected/filtered).

    • Added default icons and colors for tree nodes.

    • Added custom color for group nodes created by Callstack and Tags groupings.

  • Clip tracing of asset loading debug name to 1024 characters.

  • Updated Unreal Insights version to 1.04.

  • Memory Insights: Added option to include heap allocs in mem queries.

  • Memory Insights: Added analysis support for NeverFrees heaps.

  • Added limit for the number of log warnings generated.

  • Added EnterScope_TB / LeaveScope_TB (timestamps relative to BaseTimestamp) events ans to EnterScope_TA / LeaveScope_TA (absolute timestamps).

  • Network insights - Modified filtering to include sub-events when filtering packet content events.

  • Added delta time display of selected range of packets. Filtering now supports using filter by NetId and EventType in combination, which is useful to highlight specific events for a specific instance.


  • Users can now change store settings in Unreal Insights. Currently the user can change:

    • Store directory: The directory where new traces are stored.

    • Watch directories: A set of directories monitored for trace files. For example users can add their download folder and automatically see downloaded traces in the session browser.


  • Refactored the IProvider / IEditableProvider interface for Trace Services to avoid diamond problem.

Crash Fix:

  • Fixed crash in Frames track when there are no frame series created yet.

Bug Fix:

  • Fixed a deadlock that occured when stopping a trace with the "Open Trace in Insights" option enabled.

  • Avoid locking TraceAuxilliary destination and connection type while issuing delegates.

  • Restored Uri functionality for traces (backward compatibility with current/older UTS).

    • Disabled a trace session after it was renamed, until the trace id is properly updated the trace name changes color to grey.

    • Fixed focus for the trace sessions list (initial focus and after renaming a trace).

  • Improved Session Browser UI responsiveness when using a remote/slow trace store connection.

  • Fixed opening a trace from a remote trace store. The new UnrealInsights process is launched by specifying the store address in addition to store port. The trace id can now be specified as hex number (prefixed by 0x).

  • Return allocator result in the case of zero sized allocations. Remove checks for zero sized allocations in Trace's allocation wrappers leaving it to the allocator implementation to decide. Analysis already supports zero sized allocations (as long as they have unique addresses).

  • Fixed late connect for the Counters trace channel.

  • Changed TraceAuxilliary internal management of tracing status and trace destination.

  • Tree Views for Allocs Table, Tasks, Packages now have Separated tree view node filtering by hierarchy filtering. The order of async operations was changed. Node filtering (i.e. advanced filtering using the Filter Configurator) is applied first. Then grouping + aggregation is applied. Then sorting is applied. Finally, the hierarchy filtering (i.e. text search) is applied.

    • This enables text search (hierarchy filtering) and advanced filtering (node filtering) to be used in the same time. Also, the aggregation is now applied only once. These changes enables significant performance improvements for the tree operations, especially when node filtering is applied.

  • Disabled Rename/Delete trace files when using a remote trace server.

  • Fixed updating the list of traces. If list is scrolled on bottom it will remain scrolled on bottom also when new traces are added.

  • Fixed initial channels example (including a typo) and usage of "default" preset to include "region" and "screenshot" channels (Connection tab).

  • Fixed trace recorder IP address to be prefilled with correct IP or host name of (remote) trace server (Connection tab).

  • Trace store uses entire path for id. Only using the stem hides files with the same name present in multiple mounts.

  • Fixed a missing check to make sure the entire packet was sent. This guards against any low level transmission errors.

  • Updated Unreal Trace Servers readme to reflect dynamic ports used.

  • Fixed missing channel check for metadata restore scopes.

  • Fixed Trace.Screenshot not working when not running PIE or simulation.

  • Fixed realloc scopes for the video memory allocations. Previously only realloc scopes for system memory were supported.

  • Fixed late connect support for the "stats" trace channel. Changed the batch trace event to always start with an absolute timestamp value (instead of being relative to previous event).

  • Reduced the overhead of stats tracing when the "stats" channel is not enabled.

  • Fixed memory tracing for block allocators used by TConcurrentLinearAllocator ,FOsAllocator, FAlignedAllocatorInternal, and FOutputDeviceLinearAllocator's block allocator.

  • Fix to try to update symbol search path until module provider is created. Previously the symbol search path string was updated only whenever the panel was reset, which doesn't always correspond to when the module provider was created, leaving the string blank until the panel was recreated.

  • Counters: Fixed "Export Values/Operations" incorrectly saving all values/ops for selected counter even if a timing selection is made in the Timing View.

  • Counters: Added name of the selected counter in the default filename when exporting values/ops.

  • Changed zoom in and out with mouse wheel to auto-pin the hovered track in the Timing View.

  • When opening the profiling directory from the Insights Status Bar Widget, the folder will be created if it does not exist.

  • Fixed trace analysis for scoped trace events.

  • Added explicit support for counters with dynamic name.

  • Added support for hierarchical Clear and Restore scopes. The Clear/Restore scopes replaces the current metadata stack with an empty/saved metadata stack and restores the previous metadata stack at the end of scope.

  • Fixed scope of metadata and mem tag for mem allocations made by the trace system (extends scope over the original allocator calls). So, heap allocations will inherit same "trace" tag.

  • Fixes for traced metadata scopes applied in tasks.

  • Fixed log messages in memory analysis regarding TagTracker errors when memalloc channel is not enabled.

  • Fixed time for scoped events to be relative to base timestamp at runtime. This allows packing on 8 bytes (as in trace protocol 5).

  • Level streaming profiling is now disabled on the server by default.


  • Removed RenderCore's FTracingProfiler which is deprecated since UE 4.26. Please use Trace system and Unreal Insights instead.

  • Added UE_STATS_MEMORY_PROFILER_ENABLED to toggle on/off code related to MemoryProfiler in STATS system. It still requires STATS to be enabled and "-MemoryProfiler" to be specified in cmd line.

    • This is off by default as MemoryProfiler in STATS system functionality is deprecated in UE 5.3. For memory profiling, use instead Trace/MemoryInsights and/or LLM.

  • Removed the deprecated MemoryProfiler runtime:

  • Removed the deprecated MemoryProfiler2 tool. Use Unreal Insights (Memory Insights; -trace=memory) instead.


  • Removed usage of MessageLog on analysis thread. With this change direct usage of MessageLog in the analysis engine is replaced with a callback system which allows the user of TraceAnalysis to implement display of the messages themselves.



  • Moved all FInstancedStruct code that depends on the Engine module into a new StructUtilsEngine module. This allows modules that can't depend on the Engine to use FInstancedStruct.

  • Added nested containers support to PropertyBag (TArray>) with a max depth of two.

  • Added a DisallowedPlugins list that restricts which plugins can be used.

  • Added an experimental Plugin Reference Viewer tool that displays a plugins dependency graph. The experimental tool is disabled by default. You can enable the PluginReferenceViewer Access tool from the plugin browser window.

  • Added a new 'Sealed' plugin concept that will prevent other plugins from depending on a plugin.

  • Fixed an issue that would result in broken package references when creating new plugins using a plugin template that contains assets.

  • Added a NoCode plugin descriptor property that prevents a plugin from containing any code or modules.

  • Added a plugin template subfolder property to define the sub folder a new plugin will be created within.

  • Fixed an issue where creating a new plugin that could sometimes fail if the asset register scan is still pending during the plugin creation.



  • Added the experimental plugin Learning Agents. Learning Agents allows you to train AI characters using machine learning. This enables you to augment or replace traditional game AI, such as those written with behavior trees or state machines. In particular, the plugin allows you to use reinforcement and imitation learning approaches. In the long term, Learning Agents aims to be useful in a range of applications, including physics-based animations, game-playing NPCs, and automated QA testing.

  • Converted AI-related Asset Actions to Asset Definitions. This applies to State Trees, Behavior Tree, Blackboards, and Environment Queries.

Bug Fix:

  • Fixed an issue where ZoneGraph would automatically build when the Build Zone Graph While Editing flag was enabled in Project Settings.


  • Deprecated UAvoidanceManager::bAutoPurceOutdatedObjects. Please use bAutoPurgeOutdatedObjects instead.

AI Behavior Trees


  • Add a Default Blackboard config option for Behavior Trees.

  • Exposed Behavior Tree Editor functionality to be inheritable and accessible from other modules. Also introduced some smaller Behavior Tree Editor UX improvements.

  • Added a tooltip to the Behavior Tree context menu node descriptions.

Crash Fix:

  • Fixed an issue where setting the KeyType to None in the base class of UBlackboardKeyType_Object would cause a crash.

Bug Fix:

  • Fixed an issue where the BehaviorTreeEditorModule custom Toolbar Extenders were not being applied correctly.

AI Debugging


  • A newly created row in VisualLogger will now be hidden if all added items are filtered out by category verbosity.


  • DebugDrawService now uses synchronization objects for delegate unregistration to prevent RecreateRenderState_Concurrent from registering and unregistering delegates from multiple threads.

Bug Fix:

  • Fixed the position of the debug text for UE_VLOG_OBOX.

AI Navigation

API Change:

  • FZoneGraphPathFilter now has an optional fourth FZoneGraphTagFilter parameter in its constructor.


  • Added FZoneGraphTagFilter to FZoneGraphPathFilter so that FZoneGraphAStarNode can perform pathing requests using a given tag filter. Fixed UZoneGraphTestingComponent to properly use QueryFilter when performing a pathing request.

  • The oversized dirty area warnings now work with active tile generation (including Navigation Invokers). This fixes multiple unnecessary warnings when dirty areas are not touching the active tiles.

  • Added AgentMaxStepHeight to FNavMeshResolutionParam.

  • Added a display message when the Navigation Mesh version is compatible, but not the latest.

  • Added Navigation Invoker priorities (ENavigationInvokerPriority).

  • Fixed an issue where using LazyModifiersGathering by reading the resolution after GatherNavigationDataGeometry resulted in an Navigation Mesh resolution issue.

  • Added a task count and task wait time per layer to the CSV Profiler.

  • Added a log category and logs detailing invoker registration to LogNavInvokers.

  • Added a NavInvokers CSV category and track invokers count in CSV to the CSV Profiler.

  • Added tile generation history and stats when LogNavigationHistory is set to Log.

  • Increased the height where the Navigation Mesh can generate (now using 29 bits instead of 15, allowing 26000 km of altitude when using 5 cm CellHeight).

  • Changed rcCompactSpan to use rcSpanUInt for y.

  • Bumped the priority of dirty tiles near Navigation Invokers when sorting by invokers priority.

  • Added support for Geometry Collections in UNavModifierComponent. Before this change, a UNavModifierComponent on a Geometry Collection would not find the physics for the proxy mesh and fallback on an arbitrary FailsafeExtent.

  • Added support for Navigation Mesh resolution when doing async navdata gathering.

  • Added a console variable to toggle Navigation Mesh resolution.

  • Added NavMeshResolution to UNavModifierComponent.

  • Renamed the navigation console commands prefix from n. to ai.nav.


  • Added Navigation Mesh generation optimization when using it with Hierarchical Instanced Static Meshes. This avoids gathering unnecessary geometry when building tiles.

  • Added optimizations to UHierarchicalInstancedStaticMeshComponent::GetOverlappingBoxTransforms.

Crash Fix:

  • Fixed an issue where modifying the NavigationRelevantData array during garbage collection (when FRecastTileGenerator::AddReferencedObjects is called) would result in a crash. The change moves emptying NavigationRelevantData to the main thread so that it does not occur at any moment.

Bug Fix:

  • Fixed a memory leak in FNavigationOctreeElement operator and added move operators.

  • Fixed an issue that would result in a crash if there was no Navigation System.

  • Fixed an issue in UGeometryCollectionComponent where the bIsDynamicObstacle flag from UNavCollisionBase was not taken into account when exporting UGeometryCollectionComponent.

  • Made UWaterMeshComponent not navigation relevant. This fixed an issue with hundreds of Navigation Mesh tiles being dirtied when adding a UWaterMeshComponent.

  • Fixed an issue where building navigation when there was nowhere to build caused reduced editor performance.

  • Fixed an issue when using the async flag where saving files using source control in WorldPartitionNavigationDataBuilder would cause an error. This fixes the "MarkForAdd, Error: Failed mark the file" issue that could occur during build.

  • Fixed Navigation Mesh holes on steep slopes caused by a rasterization issue (this also fixes Navigation Mesh issues in stairs). Also added the ai.nav.EnableSpanHeightRasterizationFix console command to disable the fix if needed.

  • Fixed an issue that would result in memory corruption from FRecastTileGenerator::MarkDynamicAreas.

  • Fixed an issue where using SAVE_Async would not wait for async file writes before adding packages to source control.

AI Smart Objects


  • Moved registration to BeginPlay and unregistration to EndPlay for components used in a Game world. This will allow conditions to rely on a fully initialized Actor in case they need to access other components. It will also make it easier to spawn an Actor with a SmartObject component and set up its definition before finishing the spawning.

  • Added new methods to the API to filter a list of request results or slot handles by evaluating the selection preconditions.

    • Filter methods can accept external data as a struct with properties whose name and type match the WolrdConditionContext.

    • FSmartObjectUserContext has been introduced to cover the common case of passing in a user Actor to the context.

    • UserDescriptor is now stored as an instanced struct in the runtime slot.

    • Claim methods now receive a user descriptor.

    • Removed slot event delegate and reused the runtime instance one instead.

    • Listeners can now filter for a given slot using Event.SlotHandle.

    • Removed User Tags from the SmartObjectWorldConditionSchema. The User Tags are part of the query filter. Conditions requiring User Tags could fetch them from the Actors passed in the context.

  • Public methods relying on EvaluateConditionsForFiltering now validate that the Slot Handle is set and not stale. In such a case, a log message will be emitted that suggests to the user to call IsSmartObjectSlotValid to handle that scenario on the call site and avoid the log.

  • Added IsBoundToSimulation to the SmartObjectComponent to differentiate a registered component (valid Handle) from a registered component bound to the simulation (linked to its runtime instance).

  • Added unit tests for IsBoundToSimulation, RemoveComponentFromSimulation, and UnregisterSmartObject sequence to simulate the EndPlay issue.

  • Removed dependency on MassEntity to store slots.

  • A new icon is now used for SmartObjectPersistentCollection, SmartObjectComponent and SmartObjectDefinition.


  • Improved Blueprint integration with the Smart Objects subsystem.

    • Deprecated the pure version of FindSmartObjects and added a new non-pure Blueprint wrapper that allows proper iteration of the returned objects.

    • Changed the subclass parameters to use values instead of const references to allow direct selection on class pins.

Bug Fix:

  • Fixed an issue with container removal where removing multiple sequential entries in a batch would result in improper recomputed bounds.

  • RemoveComponentFromSimulation is now properly unbinding the component.

  • Unbinding a component from the simulation won't invalidate the registered handle anymore; this is handled by the FSmartObjectContainer.

  • Removed obsolete RuntimeCreatedEntries which was replaced by the registration type.

  • DebugUnregisterAllSmartObjects will no longer cause an ensure when calling EndPlay with the previous fixes.

AI State Tree


  • Added the ability to disable States and Tasks. In addition, it is now possible to force a condition result to true / false.


  • Improved the way that property names are reconciled when they change.

    • Added PropertyGuid to FStateTreePropertyPathSegment to allow reconciliation.

    • Changed Blueprint class and User Defined Struct property names.

    • Changed FStateTreePropertyPath to optionally handle property redirects and BP/UDS name changes.

    • Renamed UpdateInstanceStructsFromValue to UpdateSegmentsFromValue to better reflect its use.

    • Improved State Tree editor bindings to update when BP/UDS properties are changed.

Bug Fix:

  • Fixed an issue that would result in ID clashes when duplicating transactions. In addition, added several editor fixes.



  • The plugin manager can now find plugins using a plugin descriptor.

  • Instance static mesh components API improvements.

  • Added array view version of batching transform updates.

  • Added option for passing sorted array to removal function.



  • Added a function to override the runtime format in FSoundWaveData.

  • [Audio Modulation] Added AD Envelope Generator. This is useful for temporarily modifying the volume of a control bus.

  • [MetaSound] Added support for integral underlying types to TEnum.

  • Added Deactivate All Bus Mixes BP function. This is useful to clear out all active mixes when changing game state.

  • [MetaSound] Added the ListenerOrientation and SourceOrientation parameter interfaces.

  • The WaveTable plugin now supports fidelity and performance tuning and a more intuitive data usage mode for sampling and granulating.

  • Added Runtime MetaSound Builder to support building MetaSounds via code or Blueprint and auditioning in the MetaSound DSP graph in real-time.

  • Added functions to SynthComponent for setting pre-sends and post-sends for AudioBuses and SourceBuses.


  • The IsSeekable method in USoundWave is now virtual.

  • You can now get the values of non-audio outputs of playing MetaSound Sources. See UMetaSoundOutputSubsystem for more information.

  • Added Modulation Destinations to the Synth Component.

  • [MetaSound] TVertexAnalyzerForwardValue now remembers LastValue to prevent unnecessary data pushes.

  • [MetaSound] Added support for passing parameters.

  • Changed the address of audio parameter transmitters from using AudioComponentID to a hash derived from NodeWaveInstanceHash, PlayOrder, and the Component ID.

  • WaveTableBanks now support serialization as 16-bit assets and perform runtime bit-depth conversions where necessary.

  • Abstracted the Waveform Editor toolset into a utility collection to be used as generic sample sequence display tools.

  • Refactored Waveform Editor Widgets to remove the use of RenderData.

  • You can now re-import assets within the Waveform Editor.

  • Audio inputs now use WASAPI for device management on Windows operating systems.

  • [Sound Cues] When Override Attenuation is selected, Attenuation Settings will now gray out to better communicate the override.

  • Added a NumRepeats field to the TriggerRepeat MetaSound node.

Crash Fix:

  • Fixed a crash that would occur when reimporting an audio file over a Sound Wave marked as Ambisonic.

  • Fixed a crash that would occur when importing audio files.

Bug Fix:

  • [MetaSound] TVertexAnalyzerForwardValue now initializes LastValue on first execution as expected.

  • Fixed a bug where logging the default audio settings displayed 0 for max channels.

  • [Audio Modulation] Added a missing tooltip on the Control Bus Mix Stage Value parameter.

  • [Audio Modulation] Fixed a bug where Audio Component Modulation ignored inheritance from SoundWave.

  • [MetaSound] TVertexInterfaceGroup's variadic constructor arguments are ensured to be move-constructible to the group's base type.

  • Fixed a bug where a member could share a name with an existing namespace member already on the parent MetaSound Source.

  • [MetaSound] The WavePlayer node will now immediately fire OnFinished if no WaveAsset is passed in.

  • Wave file metadata chunks will now be preserved in USoundWave assets when converting bit depth of the source file.

  • Fixed an issue with bus and submix sends on muted Sound Waves.

  • Fixed a miscalculation related to a WaveTableBank's entry tail percent.

  • [Sound Cues] Fixed a divide by zero bug in the Enveloper node.

  • Fixed a bug that would cause audio to not play in sequences when cooked audio is referenced in the current level.


  • Deprecated the Steam Audio Plugin.

  • Deprecated the Modulator parameter on the Modulation Destination Settings.



  • Added facility to make explicit and validate UBlueprint and UBlueprintGeneratedClass subclasses. Subclasses can publish their mappings from the methods: IKismetCompilerInterface::OverrideBPTypeForClass, IKismetCompilerInterface::OverrideBPTypeForClassInEditor, and IKismetCompilerInterface::OverrideBPGCTypeForBPType.

  • Blueprint functions that take parameters by reference no longer require Blueprints that call the function to connect the pin corresponding to the parameter(s) that are passed by reference. This makes it easier to toggle a Blueprint parameter to be passed by reference.

  • Linear Color ToHex is now exposed to Blueprint.

  • Added a Blueprint callable function to shuffle an array using a 'random stream' for the source of randomness.

  • Added gather search data for BlueprintExtensions. This is used by the FindInBlueprint system.

Crash Fix:

  • Fixed potential crash when bFavorPureCastNodes is enabled.

Bug Fix:

  • Fixed a typo in the FGraphNodeCreator class description.

  • Fixed the asset loader to preserve component transform in the editor after a Blueprint has been reparented.

  • Fixed a bug that could cause sparse class data to be lost on load after reparenting a Blueprint.

  • Fixed a bug that prevented you from moving a Blueprint to a location that has a redirector that points to a Blueprint. This can often happen if you move a Blueprint then attempt to move it back.

  • Both Find-in-Blueprint and Blueprint namespace asset discovery are now deferred until after the initial asset registry file scan is complete.

  • Soft class objects are now included in a cooked set When using CookSettings.SkipOnlyEditorOnly assets referenced by Blueprint bytecode.

Blueprint Compiler


  • Improved redirect support for Blueprints. A reflected Blueprint type can now be changed without breaking existing content, so long as an autocast function exists for the two types.

Crash Fix:

  • Fixed a rare crash during Blueprint compilation after removing a variable from a component and compiling. The compiler was delta serializing against an archetype of a different type.

  • Fixed a crash when a skeleton class's CDO is accessed when the native class its based on is using sparse class data.

Bug Fix:

  • Improved handling for variables that were moved out of a class and into the corresponding sparse class data.

  • Stale DelegateSignatureGraphs are now removed before compiling, child Blueprints no longer improperly mutate their parent's delegate properties.

  • ExpandEnumAsExecs now always uses first Exec if an argument name matches Enum value (resubmit) ExpandEnumAsExecs was using an ambiguous pin lookup.

  • Fixed erroneous deprecation of BreakVector3f for float-based math functions.

  • Fixed a bug in Blueprint compilation that occurred when a Blueprint was recompiled when it had garbage subclasses.

  • Fixed references to trashed function objects after generating delegate properties during a batched Blueprint asset compile with inter-batch dependencies.

  • Avoid potential collisions with existing non-transient objects when creating transient event stub graph artifacts during Blueprint ubergraph compilation.


  • Removed HasNativeBreak from FVector3f.

Blueprint Editor


  • Added the ability to mark custom events as private. Added default FunctionFlags values that custom events would need for specifiers. Modified the UI to show the access specifier drop down for both function entry nodes and custom events.

  • By default, the editor will no longer mark outer level/OFPA assets as dirty when propagating default value changes to instances that already match the archetype's value. Instances will still be marked dirty if the default value change results in the instance value becoming realigned with the archetype.

  • Added new Blueprint editor settings to control how assets selected in the Content Browser will generate pre-bound actions when invoking the Blueprint graph context menu. The default settings now disable this feature in order to improve menu responsiveness.

  • By default, the editor will no longer mark an outer level/OFPA asset as dirty after manually compiling its underlying Blueprint type.

  • Non-blocking context menu UI mode is now enabled by default in the Blueprint graph editor.


  • Optimized async Blueprint context menu building by avoiding resorting and inserting nodes in the desired order.

  • Improved performance of Blueprint debugger by only populating the children of visible properties and not recursing further.

Crash Fix:

  • Fixed crash in SGraphPin::GetPinLabel after removing pins from a node.

  • Fixed crash when compiling a Blueprint after invoking Undo in the editor.

  • Fixed an editor crash when editing sparse class data fields in Blueprint class defaults.

Bug Fix:

  • Reduced the amount of graph refreshes performed in the Blueprint editor, reducing hitching and flickering when making changes in the Blueprint graph editor.

  • Fixed Private and Protected functions from not displaying in the context menu in child Blueprints.

  • Fixed bug that would cause properties in an object's sparse class data to not display as altered in the diff panel, even if they had been altered.

  • Fixed malformed asset resulting from duplicating a Blueprint with sparse class data.

  • Fixed variables that are dragged and dropped to the node with split struct pins from not being added.

  • Fixed issue where disconnecting an orphan pin would cause ensure to trigger due to an invalidated graph pin.

  • Fixed the potential for data loss when loading hierarchical Blueprint class assets with circular dependencies asynchronously in the editor.

  • Fixed the Blueprint Namespace entry widget's tree view from not working properly when only one root item matches the search box filter text.

  • Dragging new connections from interface(output)->object(input) will now include an explicit autocast node. Additionally, it is no longer possible to connect an array of interfaces output pin to a function call node's Target input pin. These changes apply to new connections only; existing connections will continue to work as before.

  • Fixed a bug that prevented copy pasted Actor Components from being removed.

  • Deferred validation of user-defined struct types in the pin type selector list until selection time for the member variable type widget in the user-defined struct asset editor. Invocation of the pin type selector menu for member variables is now a bit faster as a result.

  • The editor will no longer orphan pins during Blueprint graph node fixup if they are linked to an autocast or other implicit conversion node that supercedes the original link.

  • Avoided unnecessary serialization of editor-only references at cook time when analyzing Blueprint assets for external imports.

  • Relocated where we purge stale references from the Blueprint editor's MRU document list in order to avoid attempts to resolve those paths during asynchronous asset loads.

Blueprint Runtime


  • Optimized UUserDefinedStruct::InitializeStruct by avoiding redundant operations for STRUCT_IsPlainOldData macro instances.

Bug Fix:

  • Fixed a memory scribble when constructing struct literals with bitfields.

  • Added runtime capacity checks to Blueprint-facing script container library API to mitigate crashes due to integer type overflow.

  • Fixed a bug that caused circular component attachments when changing the constructor of native classes.


API Change:

  • It is now safe to call Super::ActivateAbility in a child class. Previously, it would call CommitAbility.

  • This will make it a little easier to write triggers/modifiers in Enhanced Input that want to access the Local Player if they want access to the User Settings object to check aim sensitivity or other things.

  • This is useful piece of state for games to use during pawn initialization.

  • Commands are prefixed with AbilitySystem.

  • GameplayTagQueries that are empty are ambiguous and should be handled on a case-by-case basis by the caller.

  • We can go back to the old way of loading the source texture if this breaks something with the "Paper2d.DisableSyncLoadInEditor" CVar flag.

  • passing nullptr into SDetailsViewBase::HighlightProperty no longer does nothing and will instead un-highlight all properties

  • This is a critical fix if you are attempting to use the input device subsystem.


  • Added an option to a Targeting System's AOE Targeting Task to offset based on relative space rather than world space.

  • Moved TargetingSubsystem functions into the same metadata category.

  • Added ULocalPlayerSaveGame base class to the engine that provides utility functions for saving and loading a save game object for a specific Local Player. This wraps the existing save/load logic on GameplayStatics and provides functionality needed to properly support save/load on non-PC platforms.

  • OnAvatarSet is now called on the primary instance instead of the CDO for instanced per Actor Gameplay Abilities.

  • Added the source location of the AOE task trace as the TraceStart of any FHitResult returned by that task so users have that information available after targeting.

  • Input slots now support enum ranges.

  • Updated enhanced input settings to allow deferral of settings updates.

  • MatchAnyTags, MatchAllTags, and MatchNoTags tag queries now have exposed make nodes in Blueprint.

  • Marked UTargetingTask as Abstract so it can't be chosen for EditInlineNew properties.

  • Added Data Store for Collision parameters used by the AOE targeting Task.

  • Added hook to override collision data from the data store in the AOE Targeting Task.

  • Exposed Async Task in the Perform Targeting node so we can get the Targeting Handle before get targeting results.

  • Added GetPlatformUserIndex function to LocalPlayer and fixed comments to explain the different indices.

  • Expanded AInfo's constructor to support a default ObjectInitializer parameter, covering cases where derived classes could override the default constructor and miss AInfo-specific initialization.

  • Allow both Activate Ability and Activate Ability From Event in the same Gameplay Ability Graph.

  • AnimTask_PlayMontageAndWait now has a toggle to allow Completed and Interrupted after a BlendOut event.

  • Post-process settings from camera shakes and camera animations are now handled as overrides, rather than base world values.

  • Added aspect ratio axis constraint override on camera components.

  • Added a GetOwningLocalPlayer function to the UPlayerInput class.

  • GAS: Added a GameplayTagQuery field to FGameplayTagRequirements to enable more complex requirements to be specified.

  • Added a ReceivedPlayerController function to UPlayer, called from it's owning Player Controller when the owning APlayerController pointer is now valid on that player. Alongside this, add a "OnPlayerControllerChanged" delegate to ULocalPlayer and Local Player Subsystems for an easy hook in.

  • Introduced FGameplayEffectQuery::SourceAggregateTagQuery to augment SourceTagQuery.

  • GAS: ModMagnitudeCalc wrapper functions have been declared const.

  • Marked all exec pins as advanced view on Input Action event nodes except for "Triggered".

  • Added continuous Input Injection to Enhanced Input.

  • Added support for setting AllowedTypes on FPrimaryAssetId function parameters. To use this, add UPARAM(meta = (AllowedTypes = "SomeAssetType")) to a parameter.

  • Added EKeys::AnyKey support to Enhanced Input.

  • GAS: Extended the functonality to execute and cancel Gameplay Abilities & Gameplay Effects from a console command.

  • Added the ability to perform an "Audit" on Gameplay Ability Blueprints that will show information on how they're developed and intended to be used.

  • FGameplayTagQuery::Matches now returns false for empty queries.

  • Exposed FDateTime's To/From Unix Timestamp functions to Blueprints.

  • Added support for properly replicating different types of FGameplayEffectContext.

  • Updated FGameplayAttribute::PostSerialize to mark the contained attribute as a searchable name.

  • FGameplayEffectContextHandle will now check if data is valid before retrieving "Actors".

  • Retain rotation for Gameplay Ability System Target Data LocationInfo.

  • Gameplay Ability System now stops searching for PC only if a valid PC is found.

  • Updated GetAbilitySystemComponent to default parameter to Self.

  • When diffing assets, their detail panels now have colored highlights signifying the changed properties.

  • Updated the comments on the Enhanced Action Key Mapping and the Input Action asset to be explict about the order of which modifiers are applied. Modifiers defined in individual key mappings will be applied before those defined in the Input Action asset. Modifiers will not override any that are defined on the Input Action asset, they will be combined together during evaluation.

  • Added callback options with metadata on FInstancedPropertyBag

    • Added a TypeFilter callback to filter out some types when changing the type of a property

    • Added a RemoveCheck callback to cancel the removal of a property

    • Added a generic way to invoke

  • You can now merge DataAssets that are conflicted in revision control by right clicking on them in the content browser and selecting "Revision Control/Merge".

  • Implemented support for changing default type in PropertyBag detail view Also move Metadata names to a seperate header to reference all available metadata values for StructUtils

  • Added a Debug Display Name string to Player Controller input modes. This is useful for doing a quick debug session of why input may not be getting to the player because it could be consumed by the UI.

  • Added clarification to the TouchInterface directions.

  • Marked functions as virtual in AbilityTask_WaitTargetData.

  • Added an advanced setting on the Input Action for the input accumulation behavior. This setting would allow you to change an input action to cumulatively combine input from different Action Key Mappings instead of always accepting the mapping with the highest key value. A practical example of when to use this would be for something like WASD movement, if you want pressing W and S to cancel each other out.

  • Added filtering on containers you can use with Properties for StructUtils.

  • Added SSourceControlReview::OpenChangelist method to allow external code to open the changelist review dialog.

  • Diff tool overhaul that allows asynchronous diffing and improves diff accuracy for details panels.

  • Added a EHardwareDeviceSupportedFeatures and EHardwareDevicePrimaryType enums to hardware device identifiers. These allow hardware device identifiers to set flags for themselves to identify some common traits that they have and check what kind of support they have. These are config flags that provide your game a method to change what they support for a given input device and add custom hardware types if desired.

  • Added support for instanced struct object references in DataTable and DataRegistry.

  • Allow for input injection based on a player key mapping name as well as a UInputAction pointer. We can do this by keeping track of the UInputAction* associated with each player mapping. Keep track of the owning Platform User ID of each player mappable key profile so that you can access the Local Player without needing to get the outer of the profile, which will be useful for custom profile subclasses.


  • Refactored camera shakes' time management.

  • Improved post-process settings blending between view targets.

  • Added option for ProjectileMovementComponent to avoid interpolation transform updates on some frames when an object isn't as relevant. Default version is based on not recently rendered but can be extended.

  • Added FScopedMovementUpdate around movement of interpolated component in ProjectileMovementComponent. This avoids moving its child components more than once if it then again simulates during the tick.

Crash Fix:

  • Fixed a crash when trying to apply gameplay cues after a seamless travel.

  • Fixed a crash caused by GlobalAbilityTaskCount when using Live Coding.

  • Fixed UAbilityTask::OnDestroy to not crash if called recursively for cases like UAbilityTask_StartAbilityState.

  • Fixed a crash caused by having entries added to the AsyncTargetingRequests while they were being processed (When an async targeting request node is chained with another one). Now we queue those and process them at the end of the tick.

  • Fixed AddTimedDisplay crash when changing a level.

  • Prevented a crash when attempting to add an invalid subobject class type with the Subobject Data Subsystem.

  • Fixed a crash caused by AGeometryCollectionISMPoolActor holding a garbage pointer.

  • Fixed a crash when diffing an Animation Blueprint.

  • Fixed a crash when diffing asset additions and removals in the review tool.

Bug Fix:

  • Use existing GameplayCueParameters if it exists instead of default parameters object in RemoveGameplayCue_Internal.

  • Changed Play in Editor initialization to create game instance subsystems before it creates and initializes world subsystems to match how it works in packaged games and map transfers.

  • Fixed GetInputAnalogStickState double-to-float wrapper from calling the wrong function.

  • GameplayAbilityWorldReticle now faces towards the source Actor instead of the TargetingActor.

  • Cache trigger event data if it was passed in with GiveAbilityAndActivateOnce and the ability list was locked.

  • Fixed RawScores from getting populated incorrectly in Targeting System Tasks.

  • Fixed an issue with Blueprint Debugging 'StepOver' command stopping in incorrect Blueprints.

  • TargetingSelectionTask_AOE now respects source actor rotation instead of being axis-aligned.

  • Skip processing TargetingTaskSet elements that are null.

  • Fixed SCS_Node Actor scenecomponents from not getting re-registered correctly after Build events.

  • Fixed some issues with blending out some infinite camera shakes.

  • Fixed composite camera shake pattern duration info as shown in sequencer.

  • Support has been added for the FInheritedGameplayTags to update its CombinedTags immediately rather than waiting until a Save.

  • Fixed Actor loading in the editor to correctly set the transform when a native root component changes class during reparenting.

  • Fixed issue affecting the timing of server-forced pawn position updates when time dilation was involved.

  • Limited the length of a player mappable name to the max length of FName's to properly check for the max length. This fixes a possible ensure that you could get if you used a name that's too long.

  • Fixed regression that would cause erroneous "AttachChildren count increased while detaching" error when a USceneComponent was garbage collected

  • Prevented AActor::RerunConstructionScripts from calling a redundant SetWorldTransform inside ExecuteConstruction when the transform hasn't changed. This was causing error accumulation in the relative and world transforms of a component that has an attach parent.

  • Fixed character movement issue that could prevent client moves from being submitted at the intended rate when time was dilated.

  • Fixed issue where a Character could intend to stay vertical (aligned with gravity) but unable to change pitch or roll to get there.

  • Moved ShouldAbilityRespondToEvent from client-only code path to both server and client.

  • Fixed an issue where subobjects that are stored in container properties (TArray, TSet, and TMap) would not show up in the details panel if they were created dynamically at runtime.

  • Newly created Blueprint Child Classes are now marked as Transactional and therefore allow undo immediately upon creation, rather than after first save.

  • Fixed pathing warnings when working with certain types of data assets and data tables.

  • Only attempt to auto upgrade to Enhanced Input if the project has a name. This solves an issue where you would get toasts about EI from the project launcher.

  • Check for null world pointer before starting/stopping shakes.

  • Added some data validation for Combo Step Completion and Cancellation States to make sure at least one state is set.

  • Do not attempt to synchronously load the source texture of a Paper2D sprite if we are already in the ASYNC loading thread. This can occur in the editor if cooked content is enabled, on post load of the sprite asset.

  • Fixed FAttributeSetInitterDiscreteLevels from not working in Cooked Builds due to Curve Simplification.

  • Set CurrentEventData in GameplayAbility.

  • Ensure MinimalReplicationTags are set up correctly before potentially executing callbacks.

  • Made Blueprint functions on the camera animation subsystem gracefully handle null pointers.

  • Fixed comment for UPawnMovementComponent::AddInputVector.

  • Fixed ShouldAbilityRespondToEvent from not getting called on the instanced GameplayAbility.

  • Gameplay Cue Notify Actors executing on Child Actors no longer leak memory when gc.PendingKill is disabled.

  • Made AActor::SetActorTickEnabled virtual.

  • Fixed an issue in GameplayCueManager where GameplayCueNotify_Actors could be 'lost' due to hash collisions.

  • WaitGameplayTagQuery will now respect its Query even if we have no Gameplay Tags on the Actor.

  • PostAttributeChange and AttributeValueChangeDelegates will now have the correct OldValue.

  • The minimal view info has been correctly reset to prevent parameters from "leaking" from one view target to the next.

  • Applied current scale and easing value to post-process settings weight

  • Fixed FGameplayTagQuery from not showing a proper Query Description if the struct was created by native code.

  • When bIgnoreAllPressedKeysUntilRelease is true, don't only ignore key presses for keys that were in the previous key mappings, but for every key.

  • Fixed not being able to Copy & Paste the Mappings list in an Input Mapping Context.

  • Only modify config files if the project has a name, which avoids modifying default engine ini files from the project launcher.

  • Fixed package load warning when loading changelists in the review tool that contain non-asset files.

  • Resetting the value of the action value bindings when the action is not present in the current mappings.

  • Added a "Force Reset" flag to device properties that gets set when PIE ends. This fixes an small bug where the light color or trigger effect could persist between PIE sessions.

  • Updated text exporting of objects (used for copy/paste) to sanitize property names containing special characters that would otherwise break the parser on import

  • Marked the FKey::KeyName as EditAnywhere so that its value is correctly propagated if it is changed on a subobject. Without this, the KeyName property will be filtered out when determining if a property has changed on a subobject, leading to an unusable UPROPERTY. This has no effect visually in the editor since the FKey has a custom details row.

  • Fixed non-deterministic behavior during cook time with regard to the Scale Method pin in on SpawnActorFromClass nodes

  • Fixed a regression that caused SDetailsViewBase::HighlightProperty to not support nullptr and thus removing any way to unhighlight a property

  • Fixed an issue where some key mappings would incorrectly be displayed as overriden in the "showdebug EnhancedInput" command. This was happening because the AddUnique call to the array would always add a new mapping, since it was comparing the instanced arrays of modifiers and triggers.

  • Removed an invalid "break" in a loop that created an order dependant check for chorded actions being blocked.

  • Fixed the Input Device Subsystem not finding a valid Game World in a packaged windows project.The subsystem was searching for a PIE only play world, not a cooked game world as well.

  • Fixed an issue when comparing enhanced action mappings during RebuildControlMappings because of a deep copy of the modifiers and triggers arrays, so any time we compare a new instance to old instance it would return false no matter what.

  • Fixed a bug that caused OneFilePerActor Actors to always diff the local asset against itself instead of against a previous version.

  • Ensure that the UAbilitySystemGlobals::InitGlobalData is called if the Ability System is in use. Previously if the user did not call it, the Gameplay Ability System did not function correctly.

  • Fixed route gamepad to second window. When this setting is enabled, if you have a gamepad connected to the editor, all gamepad inputs will be routed to the next PIE window.

  • Reduced false positives in text-based asset diffs by excluding export paths from the diff.

  • Fixed a bug that caused RefreshPropertyObjects in SKismetInspector to not get garbage collected.


  • Removed unused function FGameplayAbilityTargetData::AddTargetDataToGameplayCueParameters.

  • Removed vestigial GameplayAbility::SetMovementSyncPoint

  • Deprecated UPlayerMappableInputConfig in favor of the new UEnhancedInputUserSettings with 5.3.

  • Deprecated the FPlayerMappableKeySlot and all its related functions for 5.3, along with all the old player mapped key functions in favor of UEnhancedInputUserSettings.


  • Removed unused replication flag from Gameplay tasks & Ability system components

  • Removed ensure when no combo actions are present. Logs a warning instead.



  • Simplified UMassActorSpawnerSubsystem subclassing by moving post actor spawn steps from SpawnActor into SpawnOrRetrieveFromPool. SpawnActor now calls World->SpawnActor.

  • Added the bRandomize property to FMassTransformsSpawnData to control whether UMassSpawnLocationProcessor assigns transforms randomly (defaults to true to maintain current behavior) or if false, assigns transforms in order.

Bug Fix:

  • Fixed a bug in FMassEntityManager::BatchDestroyEntities where the ObserverManager wasn't being informed of the entity deletions, causing fragment destructors not to run.

  • Fixed processor execution flag for world for PIE.

  • Fixed multithreading access detector in FMassBatchedEntiityCommand's Add methods.



  • [NetBitArray]

    • Added IsBitSet.

    • Added CombineMultiple to run bit operations on two const bit arrays in 1 loop.

    • Added ToString that prints how many set bits the array currently has. Slightly expensive do not abuse with active logs.

    • Added FNetBitArrayPrinter utility functions.

  • [Network]

    • Added FNetContext for user code to tell if inside a real network RPC or not.

    • Added support to FNetContext::IsInsideNetRPC in both Iris and legacy.

  • [NetBitArray]

    • Added InitAndCopy functions on FNetBitArray. Used to quickly construct a bit array from an existing source, either bitarray or bitarrayview.

    • Added Set functions used to overwrite the bitarray with the word operations of two other arrays.

  • [SubObject Replication]

    • Added cvar net.SubObjects.DetectDeprecatedReplicatedSubObjects.

    • When enabled, it will ensure that it detects that ReplicateSubObjects is implemented in a class that switched over to the new registration method. This is only available in development builds.

  • [NetDriver] Added FWorldDelegate::OnNetDriverCreated delegate called after any NetDriver was created.

  • [Iris] A struct derived from a struct with a custom Net Serializer somewhere in the hierarchy is no longer required to implement a Net Serializer itself. The custom Net Serializer is automatically used appropriately and additional replicated properties will be replicated as expected.

  • Clients now disconnect on a bunch error when Iris is enabled. This prevents trying to deserialize packets indefinitely. When an error is set, it's unrecoverable.

  • FNetBitArray can now be used in range-based for loops. This loops over set bits and gives you the index of the set bit.

  • Added documentation to Network Prediction plugin README file.

  • Added ELifetimeCondition COND_Dynamic support. COND_Dynamic allows for a property to decide its actual replication condition after instantiation of the actor/component rather than being the same for all instances.

    • The condition can be changed using the macros:

    • DOREPDYNAMICCONDITION_INITCONDITION_FAST: when used in the object's GetReplicatedCustomConditionState implementation

    • DOREPDYNAMICCONDITION_SETCONDITION_FAST: in any other place where it's appropriate to change the condition.

    • If the condition is never modified, thus remaining COND_Dynamic, the property will always replicate when changed. It's possible to use the DOREPCUSTOMCONDITION_ macros on properties with this condition.

  • [Iris] NetObjectConnectionFilter is now available for Iris replication. This can be used to dynamically filter objects to only replicate to certain connections.

    • The main use case is when objects added to this filter may also be dependent objects as dependent objects override dynamic filtering, but not any type of static filtering.

  • Added additional Insights CPU scopes in Network Prediction plugin code.

  • Added a unit test program for the Network Prediction plugin that covers basic simulation ticking in forward prediction and interpolation modes.

  • ReplicatedPredictionKeys now explicitly copies ReplicatonID and ReplicationKeys to properly support being initialized with preserved ReplicationID.

  • Net Driver updates:

    • Collect the amount of packets sent and received by each connection, each frame.

    • Output the average and max per-connection packets received and sent every frame in CSV Profiler.

    • Added net.ForceOnePacketPerBunch console variable to force every packet to contain a single bunch. This can be used to debug rare ordering issues when two actors are dependent, but should not.

  • Added net.AlwaysUpdateGuidReferenceMapForNetSerializeObjectStruct console variable to always update GuidReferenceMap entries for NetSerialize structs with object properties, in order to prevent issues with old property values being applied when the struct's object reference is remapped.

  • CVarNetEnableDetailedScopeCounters is now cached in a global variable in order to prevent unnecessary work getting the console variable value every conditional scope cycle counter. ReplicateCustomDeltaPropTime is now only recorded if the object has any custom delta properties.

Crash Fix:

  • Fixed the seamless travel handler to handle PIE renaming for the transition map the same way it does the destination map. This fixes a crash with multiplayer PIE where it tries to reuse the same map package

Bug Fix:

  • Fixed GetNetMode to work properly in Play in Editor for functions like InitGame called halfway through world startup, and fixed related issues with EnableListenServer and dedicated server PIE worlds.

  • [ReplicationGraph] Added fix to prevent sending multicast RPCs on a channel that is closing but not yet cleaned up.

  • [ReplicatedSubObject] Fixed refcount breaking due to accessing invalid memory from a TSet iterator after having removed the iterator.

  • [RepGraph]

    • Fixed log spam caused by actors going outside the legal world bounds and staying OOB.

    • Only log a warning once when the actor goes OOB.

    • net.ReplicationGraph.PrintGraph now prints the list of DynamicSpatializedActors monitored by the Grid2D node.

  • Fixed an issue where actor channels were closed due to level being unloaded/streamed-out destroying NetStartupActors unless the channel had been explicitly broken.

    • This behavior can be disabled by setting the console variable as: net.SkipDestroyNetStartupActorsOnChannelCloseDueToLevelUnloaded 0.

  • Fixed behavior of simulated proxies controlled by the Network Prediction plugin when there's no autonomous proxy, such as when a client un-possesses a pawn and doesn't immediately possess another one. Interpolation of simulated proxies now continues while there's no local autonomous proxy.

  • FastArraySerializer is no longer allowed to modify state of Archetype or CDO when initializing base state as this lead to inconsistencies with assignment of ReplicationID

  • Fixed issue with missing detection of items being marked dirty.

  • Fixed issue with NetTraceReporter crashing when processing certain trace files.

  • Fixed an issue where FNetBitArray::FindLastZero returned index out of bounds for array sizes not aligned with the size of the storage.


  • [NetDriver]

    • Deprecated NetServerMaxTickRate variable and replaced them with Get/Set functions.

    • Added FOnNetServerMaxTickRateChanged delegate. Register to receive callbacks when the server tick rate changes.

  • Deprecated obsolete packet handler components.


  • Removed calls to SetNetVersionsOnArchive and SetNetVersionsFromArchive and redirect FInBunch::GameNetVer and FInBunch::EngineNetVer to use the internal connection pointer.

  • Removed FloatCastChecked in PreFrameReceive to fix an assert with a large DeltaTime that could occur in certain circumstances.

Level Design and Art Tools

Geometry Core


  • Added the ability to store and fetch temporary debug named-FDynamicMesh instances via global C++ functions UE::Geometry::Debug::StashDebugMesh() and FetchDebugMesh(). A new cvar geometry.DynamicMesh.EnableDebugMeshes must be set to 1 to enable this functionality. A console command geometry.DynamicMesh.ClearDebugMeshes can be used to clear the debug mesh set.

  • The FConvexDecomposition3 class now has a merge-only API, which can be used to approximate an input set of convex hulls with a smaller number of convex hulls.

  • Added Transform and Inverse Transform functions to Geometry Core's TPlane3.

  • Added Transform Normal and Inverse Transform Normal functions to Geometry Core's VectorUtil.

  • Added a FSphereCover concept as a new, optional representation of negative space for FConvexDecomposition3. This can be used to guide the merge phase of convex decomposition, more accurately keeping the convex hulls away from the object's negative space. Multiple methods are provided to generate a sphere covering that efficiently covers the negative space, with settings to allow some leeway to ignore negative space in small gaps or near the object surface.

  • The Clipper2 wrapper in the Geometry Algorithms module now supports taking the intersection, union, difference, and exclusive-or of arrays of polygons.

  • Added FindAllHitTriangles function to get all the triangles intersected by a ray (not just the closest one).

  • Dynamic Mesh Component now provides the option to control which color-space conversion is applied to Vertex Colors when creating the Render Buffers from the UDynamicMesh vertex color attribute (SRGB to Linear, Linear to SRGB, or No Conversion). This option is exposed as the Color Space Mode property on the class, as well as via new Blueprint functions Set Vertex Color Space Transform Mode and Get Vertex Color Space Transform Mode. The default is to not apply any conversion or transform.

  • DynamicMeshComponent now supports specifying custom vertex color remappings in C++, by passing a lambda to the new API function SetVertexColorRemappingFunction. ClearVertexColorRemappingFunction and HasVertexColorRemappingFunction have also been added.

  • Added theClear Vertex Color Remapping function.

  • Added theHas Vertex Color Remapping function.

  • Added a Split Attribute Welder function. FSplitAttributeWelder can be used to weld split-attributes that share the same vertex in the parent mesh.

Bug Fix:

  • Fixed exact predicate float control settings for clang, making exact predicates work correctly on platforms where clang was configured to use fast math.

  • Made the Geometry Core AABB types respect the IsValid flag on conversion to or from the Core FBox type.

  • Dynamic Mesh Component can now render a wireframe overlay in shipping builds, if an Engine wireframe material is available.

  • Prevented an issue where the editor might crash when determining the number of UV channels during mesh conversion.

  • Fixed issue in TMeshSimplification where explicitly-constrained vertices could result in collapses that ignore geometric constraints.

Geometry Script


  • Added two functions that compute the shortest distance between mesh points: Get Shortest Vertex Path (using Dijkstra ) and Get Shortest Surface Path (using intrinsic mesh edge flips.)

  • Added the ability to trace a straight line on a mesh surface through geodesic functions.

  • Added new mesh bone weight functions for getting information about individual bones of the skeleton stored in the dynamic mesh:

    • Get Root Bone Name

    • Get Bone Children

    • Get All Bones Info

    • Get Bone Info

  • Added the function Blur Mesh Vertex Colors for blurring mesh vertex colors.

  • Added the function Transfer Bone Weights From Mesh for transferring bone weights from one mesh to another.

  • Created new functions Discard Bones From Mesh and Copy Bones From Mesh.

  • Dynamic meshes now inherit the skeleton information when converting from skeletal meshes.

  • Create New Skeletal Mesh Asset From Mesh (LODs) can now use the proportions of bones stored in the input dynamic meshes. This is enabled through the Use Mesh Bone Proportions flag in the Geometry Script Create New Skeletal Mesh Asset Options.

  • Added Create New Static Mesh Asset From Mesh LODsand Create New Skeletal Mesh Asset From Mesh LODs functions for creating static and skeletal meshes from an array of LODs instead of just a single mesh.

  • Added the Append Bounding Box function,which takes an FBox instead of separate box parameters

  • Added the Mark For Mesh Rebuild Blueprint function to Generated Dynamic Mesh Actor, which allows other Blueprints to explicitly queue up a Mesh Rebuild event without re-running the Actor Construction Script.

  • Added Get Vertex Connected Triangles, Get Vertex Connected Vertices, and Get All Split UVs At Vertex functions, which can be used to query the one-ring triangles or vertices of a vertex, as well as the set of split UVs at a vertex in a given UV channel

  • Added the ability to run Delaunay Triangulation on an input set of points, and optionally a Constrained Delaunay Triangulation that preserves specified edges as well.

  • Updated the dynamic mesh component to expose new Blueprint functions Notify Mesh Updated and Notify Vertex Attributes Updated. These functions can be used to force either a full or partial update of the rendering buffers for the Component after the UDynamicMesh has been modified with deferred notifications.

  • Added the function Recompute Normals For Mesh Selectionto allow normals recomputation to be limited to a mesh selection.

  • Added the Compute Mesh Local UV Param function, which can compute an Discrete Exponential/Log Map (ExpMap) UV parameterization on a bounded-geodesic-radius area of a mesh. The subset of computed vertex/UV pairs is returned as output, rather than set on a mesh UV channel.

  • Added a Channel Pack node which has up to four input textures and creates an output texture where the RGBA channels are sourced from the inputs.

  • Added a new function, Select Mesh Elements In Box With BVH allowing efficient range queries on large meshes using a bounding box and an AABBTree.

  • Added the Get Mesh Volume Area Center function to compute the center of mass for a mesh, as well as volume and surface area.

  • The dynamic mesh component's Externally Provided tangent type setting has been renamed From Dynamic Mesh.

  • Added new polygon and path offset functions.

  • Added new functions and data types for managing simple polygons (polygons without holes) and lists of general polygons (polygons with support for optional holes) in 2D.

  • Editor-only functions Stash Debug Meshand Fetch Debug Meshhave been added, which can be used to save temporary copies of UDynamicMesh objects associated with string names. The cvar geometry.DynamicMesh.EnableDebugMeshes must be set, otherwise these functions are ignored.


  • Updated the polygon triangulation functions to have better error handling and a more robust winding-number-based fallback mode to generate better results in cases where input polygon edges overlap.

  • Recompute Normalsfunction now has a bDeferChangeNotifications option.

  • Updated the Copy Mesh From Component function to support Instanced Static Mesh Components; each instance of the static mesh is appended to the output mesh

  • TheBake Texture function was updated to expose an option to control the type of texture filtering applied.

  • Updated dynamic mesh components to use the tangents provided on their dynamic mesh by default, and the setting controlling this tangent source is now also exposed in the UI under the Dynamic Mesh Component properties.

Bug Fix:

  • Removed incorrect clamping of the Radial Samples parameter inAppend Disc.

  • Fixed an issue where passing an invalid path to Geometry Script's new asset utility functions could cause a crash. Package names are now automatically sanitized before use by these functions.

  • Fixed issue where Create Skeletal Mesh Asset From Mesh was not assigning materials correctly.

  • Fixed a crash when splines with duplicate constant points are converted to polylines.

  • Updated modules in the GeometryScripting plugin that are Runtime-capable to load in the PreDefault loading phase, before user construction scripts that may depend on Geometry Script.

Modeling Tools


  • Added a Mesh Topology Selection Mechanic which enables or disables different selection modes in the details customization.

  • Added a Generate Lightmap UVs option under the New Mesh Objects settings in the Modeling Tools Project Settings panel. If enabled, this will enable light map UVs on any new static mesh created within Modeling Mode.

  • Moved the Bake RC tool from Mesh Modeling Tools Exp to Mesh Modeling Tools Editor Only Exp module.

  • Adding a two-sided vertex color material. Same as Mesh Vertex Color Material but with Two Sided checked. Useed the new two-sided material in the cloth weight map paint tool so that we can paint on the back side of the 2D panels.

  • The Bake Transform and Edit Pivot tools now update all LODs by default, not just the active LOD, and exposed an 'Apply to All LODs option to control this behavior.

  • Updated Simplify To Minimal Planar to work on the boundary of meshes.

  • Added the Copy From Inputs option in Mesh to Collision tool to transfer existing simple geometry over to the target.

  • Added helper methods to count the number of Actor Components which match Target Requirements to assist with special tool needs.

  • Added helper methods to test for existence of volume components and components that support UVs in Tool Targets.

  • Updated the box finding code in MeshSimpleShapeApproximation to prefer to orient the boxes such that they align with the world frame better.

  • Harden and improved various conversions between dynamic meshes and volumes, to make modeling tools work more reliably on volumes.

  • Added a Gradient Interaction type to the Cloth Paint tool. The user selects high and low vertices and a gradient is automatically computed between them.

  • Added the Mesh Vertex Paint Tool has been added to Modeling Mode. This Tool can be used to directly paint asset vertex colors (but not per-instance override vertex colors).

  • Created the Draw Spline tool for drawing splines and spline-based blueprints.

  • Added a Revolve Spline tool.

  • Moved various settings from the secondary toolbar to the cog icon in quick settings, since the secondary toolbar is not enabled by default in some builds.

  • Added a PolyGroupID option to the Bake Textures and Bake Vertex Colors tools.

  • Exposed mesh simplification options in the Mirror and Plane Cut tools, to reduce excess triangulation along the cut and mirror plane.

  • Added a reusable geometry selection visualization system intended to be used in modeling tools with minimal boilerplate.

  • Unbinded the toggle gizmo action in some tools from a default hotkey to prevent users from accidentally pressing it and thinking that the tools are broken. Users can still set their own hotkey if their workflow benefits from it.

  • Adjusted how the Combined Transform Gizmo displays scale axis handles when only two axes are needed. The old approach had the handles react to the camera direction at all times, causing issues in the UV Editor and inconsistent orientations of the handles relative to the plane in the case of only two axes. The new approach only is reactive to the camera in cases of one or three axes and locks the handles into a single plane if exactly two axes are configured in the gizmo.

  • Added a Simple Collison Editor tool to assist with editing of simple collision primitive shapes directly within Modeling Mode for static and dynamic meshes.

  • Added Subdivide tool improvements dealing with meshes with open boundaries:

    • Factor out extra corner finding code from PolyEd and add support for it in the subdivide tool.

    • Added support for rounded corners for mesh boundaries.

    • Override subdivision scheme during tool usage rather than just at tool start, to allow extra corners to fix some issues.

    • Added some clarifying comments about schemes.

  • Changed the Mac bindings for grid size changes in Cube Grid tool to Option + A/D because Option + E is consumed by Mac.

  • Added geometry selection support to the Normals tool.

  • Added an edge simplification operation to the PolyEdit tool.

  • Added a Mesh Splines tool, which creates meshes from a selection of spline components. The tool enables triangulation and extrusion of the splines, as well as Boolean combinations of the spline shapes.


  • Updated the Weld Mesh Edges tool to optionally merge attributes.

  • Improved the documentation of options in the SubDiv tool.

  • The BakeRC tool now outputs a material which is configured to use any generated textures.

  • UModelingObjectsCreationAPI was extended to support materials by duplicating a given material.

  • Updatedthe Pattern tool to have an option to place a random selected object at each pattern position, rather than always placing all selected objects at each position.

  • Updated the Mesh To Collision, Convert, and Transfer tools to properly handle simple collision on Dynamic Mesh Components.

  • Updated the Displace Mesh Tool to show feedback about the vertex and triangle counts of the output mesh.

  • Moved the preview settings to above the list of generated textures in the BakeRC tool

  • Updated Volume to Mesh tool's tooltips to better reflect the tool's behavior.

Bug Fix:

  • Fixed a bug where the Trim tool starts a potentially expensive boolean calculation when only the opacity color alpha changes.

  • Updated the New Mesh Objects options under Modeling Tools Project Settings to be used more consistently by all Modeling Mode tools that create new mesh objects.

  • Prevented several UV modeling tools from launching on volume targets, which are not applicable target types.

  • Fixed an issue where the viewport level collision rendering would not correctly show the updated collision geometry after accepting the results of the Mesh to Collision tool.

  • Fixed the static mesh to dynamic mesh conversion not recomputing tangents with the recompute tangents option set, in some cases.

  • Improved checks for launching tools against assets that might be cooked in the editor.

  • Updated the Pattern Tool to emit contextually correct static mesh actors.

  • Fixed GetElapsedComputeTime so that the preview material kicks in after the proper delay.

  • Updated the Convert Tool to no longer copy incorrect Material IDs to the output mesh if the the Transfer Materials option is disabled.

  • Prevented several tools from running on volume targets since the operations didn't apply to that target type.

  • Dynamic mesh components now show vertex colors when the setting to show vertex colors is enabled in the viewport.

  • Fixed an issue where the Extrude Path tool generated a result with incorrect extrusion in some cases.

  • Hit-testing for the rectangular scaling and plane-translation handles in the Modeling Mode gizmo has been improved.

  • Fixed per-channel baking of curvature and ambient occlusion for the Bake Vertex tool.

  • The Subdivide tool now works on Mac and Unix targets.

  • Fixed previous collision geometry incorrectly remaining visible when Collision Type was changed in the AutoLOD tool. Now only the collision geometry for the active Collision Type is shown.

  • Fixed various tooltips, edit conditions and reset buttons in the AutoLOD tool

  • Fixed an issue where the PolyCut tool would generate a bad result if the cutting polygon was self-intersecting.

  • Updated the Bend operation in the Warp tool to support negative bend angles.

  • Fixed a crash in the Edit Pivot tool when multiple tool targets are backed by the same asset.

  • Fixed static mesh components created by modeling tools to set to static mobility by default, instead of movable.

  • Improved Project and Remesh tool's Target Edge Length tooltip, explaining why it's not starting at the default value hardcoded into the property.

  • Replaced the wireframe visuals in UV Layout Preview to use Mesh Elements Visualizer, to address Z-fighting visual artifacts in wireframe displays.

  • Fixed an issue in the Pivot Actor tool where changing the transform using the gizmo did not cause the reset to default arrow to appear in the details panel.

  • Fixed a crash in the Subdivide tool when adding Extra Corner Vertices was enabled for some meshes. Extra Corner Vertices can now only be added along open boundaries.

  • Adjusted the Project tool's settings to properly disable the smooth filling options when smooth filling is disabled.

  • Fixed a crash in the Bake Transform tool when some selected meshes have the same source asset.

  • Fixed issue with the Recompute UVs Op where an ensure would fire when no components contained at least one full triangle.

  • Updated the Simplify tool to conditionally disable the Prevent Normal Flips and Prevent Tiny Triangles, depending on the simplify algorithm used. This also enables support for the Prevent Tiny Triangles and Prevent Normal Flips under certain tool settings.

  • Updated The Voxel Blend and Voxel Offset tools to warn about possible artifacts when processing meshes with open boundaries when the Vox Wrap Preprocess option is not enabled.

  • Fixed computation of edge collapse lerp parameter which reduces artifacts in UV layers when remeshing.

  • Fixed readability issue in mesh statistics display.

  • Adjusted the behavior of the Mesh Visualizer settings to properly disable when the Visible property is checked off.

  • Prevented a crash when asset editors are closed with local changes during an asset reload, due to the static mesh tool target checking for transaction success incorrectly.

  • Fixed speckles in border regions when creating textures using the BakeTX tool.

  • The Mesh to Volume tool automatically simplifies models with too many faces for the BSP processing code to handle, preventing the editor from hanging when large meshes are converted to volumes with this tool.

  • Fixed a crash in the Paint Maps tool that occurred on painting on a mesh with no attributes then attempting to undo.

  • Disabled the rendering of the indicator circle in the Seam Sculpt tool, since it was not needed for the tool's functioning and caused visual confusion.

  • Fixed incorrect handling of texture source format BGRE8 in UE::AssetUtils::ReadTexture.

  • Updated the Mesh Tangents tool to warn users when attempting to copy tangents from a mesh that does not have tangents.

  • Changed the smoothing weight scheme to IDT Cotangent in the Hole Fill tool.

  • Updatedthe Hole Fil tool to re-check for mesh seams to constrain between iterations of remeshing.

  • Removed the stylus plugin from Modeling Mode, because of a performance issue that occurs when the stylus plugin is enabled.

  • Updated USkinnedAsset to allow a potentially running AsyncTask to finish before deleting it.

  • Updated the mesh visualization component used by many modeling tools, including Simplify and Remesh, to correctly distinguishes between normal and tangent seams, rather than treating both seam types as normal seams.

  • Updated the Editor 2D Mouse Wheel Zoom Behavior Target in the Interactive Tools Framework to make the clip plane math work out if the camera has negative z coordinates.



  • Created convenience functions in PCG data collections and PCG blueprint to remove some boilerplate.

  • Added substring/matches search which support wildcards in the PointFilter node for string types.

  • Provided a method to convert points along Landscape Spline into points on a Spline Component. Works best with single path or circular Landscape Splines.

  • Added missing steepness controls to the Volume, Spline, and Mesh Sampler nodes.

  • Added support for soft object reference user parameters & soft object pointers internally. Behaves like generic soft object paths but with the appropriate type narrowing.

  • Added support for overridable texture in the Get Texture Data node.

  • Added Loop node that behaves like a subgraph but will pass on a single data from the designated loop pins (first pin only by default).

  • Renamed Attribute Operation node to Copy Attribute.

  • Copy Attribute now uses the Attribute from another Attribute Set source (with an extra pin). New pin is marked (and shown) un-used if the pin is not used.

  • $Index is now a valid accessor to access the index of a point.

  • Improved behavior of Get Actor Data node for PCG partition actors in the case of Single Point.

  • Added an option to merge all points when querying multiple actor data with single point .

  • Added an option to ignore self in the Get Actor Data node.

  • Added SoftPath getter and setter support in PropertyBag to interact with properties that are SoftObjectPtr or SoftObjectClass.

  • PCG Tracking system is now centralized, improving performances.

  • The PCG Static Mesh Spawner now respects the ISM component type selected in the component descriptor, with the exception of changing to an ISM if the selection is HISM and the mesh is using Nanite.

  • Added a OneMinus node.

  • Added a Make Rotator attribute.

  • Some native nodes now have a Preconfigured Settings entry in the context menu, to quickly add a node with the wanted settings.

  • Preconfigured settings are available for Custom BPs, in the class settings.

  • Changed DensityNoise into AttributeNoise node, to support noise on all attributes.

  • Added aliases support on overridable PCG parameters in Settings, to facilitate deprecation.

  • Added ability to spawn Actor by attribute in the Spawn Actor node.

  • Added inspection support for subgraphs in the PCG editor.

  • Improved attribute operations by propagating the first non-param pin.

  • Input to propagate can now be overridden in the settings.

  • Added default value concept for all Make operations.

  • Changes that trigger PCG re-generation now cancel ongoing generation more efficiently. This should have a positive impact on landscape editing with PCG content and ensure that no stale data is present.

  • Added @Last and @Source as new Attribute Selectors. @Last gets the latest modified attribute. @Source gets the attribute specified by the input.

  • None becomes a valid attribute name.

  • Added a new Point Filter Range node, to filter on a range.

  • Read-only accessors are now throwing an error if it is used as an output accessor.

  • Added Is Cacheable Override for more fine-grained control when needed.


  • Improved naming for nodes with custom names and blueprint nodes in the node palette.

  • Improved support for name clashes, especially in BP exposed variables.

  • Properties need to be exposed to be added to the Attribute Set using the Get Actor Property node.

  • Seed for new nodes is not constant, but dependent on the node name. Seeds are kept as-is for existing nodes, to not break existing graphs.

  • Replaced Creates Artifacts with Is Cacheable in PCG blueprints to be clearer. Previously cached blueprints which did not have Creates Artifacts checked should be manually updated to set the 'Is Cacheable' flag to true.

  • Added getters for input/output pin properties by label in settings. Renamed getters on data collection to clarify it is done by label.

  • Added Get Target Actor, to be used instead of accessing the Target Actor variable directly. Refrain from getting the Target Actor variable on PCG Spatial data directly. Instead use the Get Target Actor method on the context.

Bug Fix:

  • Fixed some instances where PCG would access pending kill landscapes in some instances when getting landscape proxies.

  • Forced usage of the landscape original GUID for the landscape cache in cases where landscapes are instanced.

  • Fixed an issue where the world ray/volumetric query parameters would not be properly overridable.

  • Fixed outstanding bug in the metadata partition where the partition would not behave correctly for non-string values

  • Fixed the Landscape Blend Layer not sampling correctly when using 2x2 Subsections.

  • Fixed distance checks between the same source and target would lead to checking points against themselves.

  • Fixed issue with PCG partition actors not reacting to landscape changes before a full graph refresh.

  • Fixed issue where numerical values were not accepted for MakeTransform and MakeVector.

  • Improved logging for Metadata operation, making it easier to know why an operation is failing.

  • Fixed issue where the Create Spline node was ignoring custom tangents.


  • Support @SourceName (previous behavior of None = Create attribute with the same name as input). Not exposed. Used for deprecation.

  • Support @LastCreated (previous behavior of None = Get the latest created attribute in input). Not exposed. Used for deprecation.

UV Editor


  • The UV Editor now supports a UV distortion visualization feature. When enabled, it computes a per triangle distortion value of the triangle's UVs vs its world space positions. This is then displayed as a color blind friendly color overlay on the 2D UV mesh. The feature supports several metrics for distortion and one metric for relative texel density over the mesh.

  • Moved UV Editor plugin from Experimental plugin directory to the Editor plugin directory.

  • Refactored unwrapped to applied selection conversion slightly to make it more convenient for areas of the code outside of the selection mechanic to perform conversions.

Bug Fix:

  • Changed the Quick Translate options in the Transform tool to produce a single undo entry for the corner transforms.

  • Corrected issue where focusing on selections in the 3D viewport was using selections on the unwrapped 2D mesh instead.

  • Corrected issue where the background grid was being incorrectly drawn due to mishandling of minimum and maximum Y-axis bounds.

  • Adjusted the language in the Transform tool's tooltips to be more consistent between different direction buttons.

World Building

API Change:

  • In PIE, UWorldPartitionLevelStreamingDynamic::RequestLevel now behaves like what ULevelStreaming::RequestLevel.

  • ULevelStreaming sets ULevel::StreamedLevelsOwningWorld so that ULevel::PostLoad can now set the level OwningWorld. Since UWorldPartitionLevelStreamingDynamic creates a memory level, it sets the OwningWorld right before loading OFPA actors.


  • Added a delay to AddToWorld of a partitioned world if this same partitioned world hasn't finished removing it's sub-levels triggered by a prior RemoveFromWorld.

  • Added a LevelStreamingPersistence experimental plugin. LevelStreamingPersistenceManager handles persistence of tagged object properties when streaming-out/in levels. Persistent object properties that are tagged as public can be accessed and modified even when the level is not loaded.

  • Added UDataLayerManager which is local to each WorldPartition. Instanced world partition maps can now maintain their own Data Layer runtime states.

  • Added helpers UWorld::GetDataLayerManager and UWorldPartitionBlueprintLibrary::GetDataLayerManager which will automatically find the associated DataLayerManager.

  • Added World Partition Runtime Grid origin in grid settings to help properly align game content on runtime grid cells (for example landscape proxy actors)

  • Added a Preview Grid Level option to preview other levels of the grids

  • Added the ability to edit data layers of a level instance when editing the level instance.

  • Added editing data layer of level instance when editing the level instance even when the main world is not partitioned.

  • Added support for Make Current on Level instance DataLayerInstances when editing a level instance.

  • Unreal Engine now Includes time spent in FLevelStreamingDelegates OnLevelBeginMakingVisible/OnLevelBeginMakingInvisible and ULevelStreaming::BroadcastLevelVisibleStatus in their respective time budget.

  • The WorldPartitionSubsystem is now responsible for sorting cells and executing cell loading and activation for all registered world partitions.

  • Add Project Setting for default value to assign to new Level Instances

  • Packed Level Actors now avoid updating blueprints if packing result is unchanged.

  • DirtyFilesChangelistValidator now outputs the assets that need to be saved during changelist validation.

  • New IsMainWorldOnly actor property for filtering actors when they are being used in a Level Instance.


  • Optimized UpdateStreamingState for Server streaming, It now computes ClientsVisibleLevelNames once for all registered world partitions.

  • Added the wp.Runtime.UpdateStreamingStateTimeLimit command for incremental updates of registered world partitions (disabled by default). This is only useful when there's a lot of registered partitioned worlds.

  • Lowered the Net Update Frequency for HLOD actors (AWorldPartitionHLOD) in case they're ever set to replicated.

  • Any actor inheriting from AWorldPartitionHLOD with replication turned on will be affected, since there is now a NetUpdateFrequency of 1 by default as opposed to the default 100.

  • Changed default value of wp.Runtime.UpdateStreaming.EnableOptimization to true.

  • Set UDataLayerManager::SetDataLayerInstanceRuntimeState to BlueprintAuthorityOnly.

  • Replaced import data layer menu option with drag and dropping level instance data layers into main world AWorldDataLayers.

  • Disabled changing visibility and editor loading of DataLayerInstances of editing level instance.

  • Changed font from bold to bold+italic on DataLayerInstances containing actors that are part of editor selection.

  • Colorized and appended (Current) to the WorldDataLayer of the editing Level Instance in the DataLayer Outliner.

  • Optimized World Partition UpdateStreamingSources. Saves 1ms on project using >300 instances of partitioned worlds.

  • Moved initialization of game instanced world partition to happen when the level starts to be added to the world instead of when it is loaded.

  • Moved the uninitialization of game instanced world partition to happen when the level starts to be removed from the world instead of when it is done being removed from the level.

  • Centralized the initialization/uninitialization logic in WorldPartitionSubsystem

  • Instanced world partition IsServerStreamingEnabled/IsServerStreamingOutEnabled now forwards the logic to their parent world partition (if any) when using project default modes.

  • Disabled replication of WorldSettings on levels created for world partition streaming cells.

  • Added other missing deprecated UDataLayerSubsystem methods.

  • World Partition now relies on World's NumStreamingLevelsBeingLoaded instead of computing its own number of loading cells.

  • Fixed Data Layer asset paths when loading WorldPartitionActorDescs.

  • Level Instances with bEnableStreaming=true will now act as regular World Partitions when loaded on their own. Big Level Instances can now be partially loaded outside of their owning world.

Bug Fix:

  • Fixed UDataLayerManager::SetDataLayerRuntimeState helper to avoid having to resolve a DataLayerInstance for a Data Layer asset.

  • Fixed the case where an instanced world partition was added to the world, then removed from the world, then re-added to the world without being unloaded first.

  • Fixed deprecated UDataLayerSubsystem::GetDataLayerInstances to properly map to UDataLayerManager::GetDataLayerInstances.

  • Fixed pending cells to be loaded and to be added to the world not updating their cell sorting info.

  • Fixed UWorld::CanAddLoadedLevelToWorld to work with multiple world partitions.

  • Properly hooked Data Layers menu extenders and pass selection to delegate.

  • Fixed broken foliage instance selection after deleting an instance

  • Corrected missing initializations in FInstanceUpdateCmdBuffer ctor

  • Uninitializing a partitioned world should always trigger unloading of all cells regardless if server streaming and/or server streaming out are enabled/disabled.

  • Fixed replay playback not resetting runtime data layer states to their initial state.

  • In PIE, UWorldPartitionLevelStreamingDynamic::RequestLevel now behaves like what ULevelStreaming::RequestLevel does. ULevelStreaming sets ULevel::StreamedLevelsOwningWorld so that ULevel::PostLoad can set the level OwningWorld. Since UWorldPartitionLevelStreamingDynamic creates a memory level, it sets the OwningWorld right before loading OFPA actors.

  • Added server's client visible level names in update streaming state hash.

  • Fixed rare case where a WP streaming cell would contain an actor and this actor is also an editor-only reference of another actor of this cell. In this case, the editor-only reference must not be part of the WP streaming cell.

  • WorldPartitionSubsystem no longer updates streaming sources on the server when none of its registered world partition has server streaming enabled.

  • When sorting world partition cells, world partition doesn't rely on cell grid level, but instead uses grid cell extent to sort cells between multiple grids.

  • Fixed how MaxCellsToLoad is computed by World Partition to limit the total number of loading and pending load streaming cells.

  • Fixed infinite loop in Level streaming caused by UWorld::RemoveFromWorld completing in non incremental removal move after first starting in incremental mode and not resetting CurrentLevelPendingInvisibility.

  • Prevented async loading flush when world partition cell is activated.

  • Fixed bug where garbage marked levels were not given unique names, causing them to be reloaded.

  • Attached Actor Pre/PostSaveRoot transform fix.

  • Fixed cooked FunctionalTest not getting discovered for WorldPartition maps

  • Recompile skeleton class after clearing SimpleConstructionScript to avoid component name clashes when adding the new components to Packed Level Actor blueprints.


  • Removed DataLayerSubsystem since DataLayerManager supersedes its functionality.

  • UWorldPartitionRuntimeCell::IsLoading, UWorldPartition::UpdateStreamingState and UWorldPartition::CanAddLoadedLevelToWorld have been deprecated.

  • Removed CanBeUsedByLevelInstance. Level Instances that are World Partition-enabled still get embedded in their parent world grid independent of the value of bEnableStreaming.


  • Removed menu option Create Data Layer under DataLayer as it will never be allowed for DataLayerInstanceWithAsset since it is created without any valid DataLayerAsset.

  • Removed suffix - WorldDataLayers on parent node of DataLayerInstances in the DataLayer Outliner


API Change:

  • Implemented async loading of localization data, and extended dynamic loading to handle explicitly loaded plugins.

    • BeginInitGameTextLocalization and EndInitGameTextLocalization have been removed as part of this change.

    • You would now just use InitGameTextLocalization (which is async) followed by FTextLocalizationManager::WaitForAsyncTasks.


  • Implemented MinimumGroupingDigits for FastDecimalFormat.

  • Enabled "min two" grouping for Spanish by default.

    • This can be disabled via the Localization.SpanishUsesMinTwoGrouping console variable.

    • When enabled, "1234" formats as "1234" rather than "1 234", but "12345" still formats as "12 345".

  • Added an overload of FTextProperty::Identical_Implementation that lets you control the fallback lexical compare mode.

  • Implemented async loading of localization data, and extended dynamic loading to handle explicitly loaded plugins.

    • This change takes the existing support for 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 (eg, after a loading screen) by calling FTextLocalizationManager::WaitForAsyncTasks (though the engine init flow takes care of waiting for you unless you're loading additional plugin/chunked localization data).

    • This change takes the existing support for dynamically loading chunked localization data on PAK chunk load, and extends it to support dynamically loading any additional localization data.

    • This is used by the engine to support dynamically loading the localization targets associated with explicitly loaded plugins. These loads are all async, so must be waited on if you need them to block.

  • Added the Localization.DumpLiveTable command to dump the current live table state to the log. This can be optionally filtered using any of the following wildcard arguments:

    • Namespace: The namespace to filter against.

    • Key: The key to filter against.

    • DisplayString: The display string to filter against.

  • The validator to make sure localized assets do not contain dangling redirectors now properly considers the case where the localized and non-localized assets are both redirectors that point to the same respective path.

Bug Fix:

  • Always use a space and a comma as the group and decimal separator when using RAE-style Spanish numbers.

  • Fixed an assert when gathering localization data from a World Partition world that had already been loaded as the editor world.

  • Fixed text created from FText::FindText with a null source string failing to resolve correctly if the language changes.



  • Add Join in Progress to list of social debug commands.

  • MPA activity now set/unset in sync with joinability privacy. If undesired, set setMpaActivityInPrivateSession to true.

  • Added replacements for deprecated IAP blueprint nodes:

    • Make an In-App Purchase v2 has been replaced by the new "Start an In-App Purchase" node.

    • Process any New Unprocessed Purchases v2 has been replaced by the new "Get known In-App Receipts" node.

    • Query for Owned Purchases has been replaced by the new "Query for Owned In-App Products" node.

    • Restore In-App Purchases v2 has been replaced by the new "Restore Owned In-App Products" node.

    • New nodes allow validation/granting logic to be reused because they share common types for the receipts on their outputs.

    • Also added "Finalize In-App Purchase Transaction" so licensees can finalize the transactions using the receipts after processing.

    • All transactions should be finalized. Any non finalized transaction locally or server side will be refunded by GooglePlay and not finalizing locally the transactions on iOS may lead to bad performance

    • The recommended flows in a game should be:

    • On startup/after login "Query for Owned In-App Products", then validate/grant the missing products and finalize those receipts.

    • When the user initiates a purchase using "Start an In-App Purchase" validate/grant the products and finalize the receipt.

    • Any time the game may need to check for updates on products it can "Query for Owned Purchases" if they need a full update or "Get known In-App Receipts" if it is not interested in updating data from store servers.

    • After that products can be validated/granted and receipts should be finalized.

    • "Restore Owned In-App Products" does the same as "Query for Owned Purchases" on Android.

    • On iOS it calls restoreCompletedTransactions on the payment queue thus making available all already processed receipts for non consumable transactions.

  • Added a conditional in the BuildPatchServices system to ascertain if the destination file system is currently throttled, and, if so, stall file writing.

  • Convert online subsystem defines to be global FNames to avoid a lookup every time we use one.


  • Improved POSIX ICMP code and added a console command to test ICMP directly.

  • Moved USocialDebugTools::PrintExecCommands to protected so it can be overridden by subclasses.


  • Marked deprecated IAP blueprint nodes and created replacements:

    • Make an In-App Purchase v2 has been replaced by the new "Start an In-App Purchase" node.

    • Process any New Unprocessed Purchases v2 has been replaced by the new "Get known In-App Receipts" node.

    • Query for Owned Purchases has been replaced by the new "Query for Owned In-App Products" node.

    • Restore In-App Purchases v2 has been replaced by the new "Restore Owned In-App Products" node.



  • Added non-game thread support for http request.

  • Added http streaming download interface.

  • Added new test project WebTests with corresponding web server to test HTTP.

  • Added 64 bits length of file download support in http request.

  • Added LLM tags to CurlHttp allocation hooks.

Bug Fix:

  • Enabled WinHttp websockets to be created with an empty protocol list, which results in the corresponding header not being added.

Online Subsystem


  • Added a LobbyId override option to the CreateLobby method in the OnlineServices Lobbies interface. Added logic to LobbiesEOSGS to use the new option.

  • Added UE_ONLINE_ERROR_EXTERNAL macro to enable online errors to be defined outside of the UE::Online::Errors namespace.

  • Added presence tracking for OSSv2 Lobbies.

  • Added logic to trigger OnQueryUserInfoComplete delegates on OSS EOS.

  • Added support for BuildIdOverride on the command line to be surrounded by quotes.

  • Added GetInterface accessor to IOnlineServices to allow for additional/implementation specific interfaces to be accessed via the base IOnlineServices.


  • Modified OnlineBeaconClient login parameters to allow for more parameters than just the auth ticket.

Bug Fix:

  • Changed the default cache directory for Switch used by OSS EOS.

  • Delayed callback execution to match alternate flow paths in OSS EOS Session search code.

  • Refactored OSS EOS Friend status update handler method to trigger the appropriate corresponding UE delegates and keep a coherent state.

  • Refactored EOS Lobby Creation logic to destroy the lobby if the update step fails.

  • Added critical section around FOnlineSubsystemModule::OnlineSubsystems.

    • This fixes race conditions when multiple threads are accessing FOnlineSubsystemModule::GetOnlineSubsystem, observed to happen as part of multi-threaded FUniqueNetIdRepl deserialization.

  • Refactored session update code in OSS EOS Sessions interface to ensure non-owner lobby members can update their own lobby member settings, to match API functionality.

  • [Online Services] Added support to handle more operation cache settings, duration based and provide a setting to cache error results.

    • Limit concurrent operations in flight.

    • Fixed some operations not being removed/destroyed when we are done with them.


  • Removed unsupported members of LobbyMember type: PlatformAccountId and PlatformDisplayName.

  • Removed early exit in OSS EOS' FriendStatusChanged method in order to handle accepted friend invites via the EOS overlay.

Pixel Streaming


  • Added the ability for the bundled get_ps_servers script to pull down a release from Github.

  • Added a new framework to allow passing arbitrary configuration settings to the streaming infrastructure.


  • The default viewer port for PixelStreaming on Linux is now 8080. Port 80 requires root privileges on Linux, so this avoids elevation.

Crash Fix:

  • Fixed a crash caused by using UPixelStreamingSignallingComponent Blueprint types.

  • Fixed a crash that occurred when using OfferToReceive on Firefox.

  • Fixed a crash that occurred on shutdown.

  • Fixed a deadlock that occurred when using DX11 on AWS instances.

  • Fixed a crash that occurred when running with -onethread and encoding VPX.

  • Fixed a crash that occurred when a port was not provided for -PixelStreamingURL.

Bug Fix:

  • Fixed a bug where the embedded signaling server would not serve the images directory as expected.

  • Fixed a bug where showcase.html would not display images when using an embedded signaling server.

  • Fixed a bug where the embedded signaling server could not connect to the frontend.

  • Server targets can now build with PixelStreaming Blueprints enabled.

  • Fixed a race condition that could occur during stats collection.

  • Fixed a bug where the minimum bitrate could be set higher than the maximum bitrate.


Bug Fix:

  • Added a check to prevent memory mapping compressed or encrypted memory made with IoStore.

  • Fixed address sanitizer compile error on current versions of MSVC.


Crash Fix:

  • Fixed a crash that occurred when playing 2 startup movies using WindowsMoviePlayer.



  • Added sigaction failure check.

  • Provided an option to disable dump_syms where iteration speed is desirable. (-NoDumpSyms or set bDisableDumpSyms).

Bug Fix:

  • Stopped tooltips from popping up during window drags.

  • Replaced use of sa_handler with sa_sigaction. If SA_SIGINFO is specified in sa_flags, then sa_sigaction specifies the signal-handling function instead of sa_handler.

  • Started accounting for Linux dock dimensions when computing positions.

  • Fixed `TWeakObjectPtr`s not being indexed properly in LLDB.

  • Fixed launching on a remote Linux box from a Windows editor.

  • Fixrf DPI scale in Linux being incorrect on Odyssey G9 5120x1440 displays. These displays report invalid display information to the window system, resulting in very high scale values.

  • Fixed crash reporter not always showing up on Linux due to config variables being unexpectedly overridden.

  • Fixed some instances where modal window behavior on Linux didn't match other platforms.

  • Corrected some incorrect event resetting code in FramePro.



  • Moved some MacMenu calls to MainThread to avoid creating errors in the Main Thread Checker, which will be fatal in future MacOS versions.

  • Added encoder fault tracking to help diagnose GPU crashes.

Crash Fix:

  • Fixed crash with Dump GPU on Macs due to missing viewport.

  • Fixed a freeze that could occur on Mac when some pop ups were displayed.

Bug Fix:

  • Fixed incorrect timestamp queries calculation on Apple Silicon.

  • On Mac, UE will no longer rebuild cached menus on every key press. This prevents an FPS drop in editor/preview when the user is pressing keys on the keyboard.

  • MacSystemIncludes now undefines PF_MAX so it can be defined by UE for pixelformat instead of socket.h. This is the result of a long include chain wherein Cocoa.h pulls in networking code from PrintCore.h, which in turn leads to socket.h defining PF_MAX instead of UE.

  • Added some checks on CRC to make sure it actually exists and is executable.



  • Added an interface within IOpenXRExtensionPlugin.h to access StereoLayers.

  • Added support for XR_FB_composition_layer_alpha_blend extension.

  • Added support for cylinder and equirect layers in OpenXR plugin.

  • Added support for XR_FB_foveation OpenXR extension.

  • Added setting to enable/disable OpenXR foveation.

  • [ARSessionConfig] Added candidate image removal methods.

  • [OpenXR] You can now disable the depth layer via cvar.

  • [PSVR2] Adjustable max eye texture size now allows for PixelDensity > 1.0 with a setting to control the limit.


  • Hololens device detection will now occur after editor startup by default to reduce startup time.This setting can be changed in the Hololens Project Settings.

  • ARCore SDK for Android was updated to 1.37.

  • [OpenXR] Android apps on non-Oculus Android platforms can now startup OpenXR if they are not configured for Oculus Mobile Devices by changing vr.DisableOpenXROnAndroidWithoutOculus to false.

  • Reduced XR EControllerHand use.

  • Reduced total memory use overhead of HeadMountedDisplay modules by moving them to the XRBase plugin.

  • [OpenXRHandTracking] Improved support for using hand tracking along with controllers.

  • Packaging settings for Meta Quest devices has been changed from a list of devices to a single checkbox that enabled packaging for all Meta Quest devices.

  • OpenXR headers have been updated to OpenXR SDK 1.0.27 (2023-03-21).

  • Added a tooltip to MotionControllerComponent's MotionSource.

  • [PSVR2] Removed reliance on pre-registered buffers for reprojection.

  • [OpenXR] Runtime-supported extensions will now be logged.

  • [OpenXR] Refined CopyTexture operations for layer and spectator screen usage.

Crash Fix:

  • Fixed a crash related to planar reflection on SteamVR.

  • Fixed a crash that occurred when accessing vr.SpectatorScreenMode CVar without a controller connected.

Bug Fix:

  • [AR Pins] Fixed a bug where TrackingToWorldTransform and WorldScale were updating incorrectly.

  • [ARKit] ARKit anchors are now released when the ARPin is removed.

  • StereoLayerManager no longer uses invalidated FLayerData.

  • The xr.OpenXRForceStereoLayerEmulation console variable now picks up runtime changes only at the next VRPIE restart.

  • Stereo layers are now correctly removed when their actor is destroyed.

  • Fixed a bug related to the alpha of emulated stereo layers on the HMD and spectator screen.

  • Fixed a bug where XRDeviceVisualizationComponent would not correctly start the visualization of the device model.

  • Fixed Mobile Preview VRPIE being darker than what was shown in the HMD.

  • Fixed sorting function that made world locked layers render on top of face locked layers.

  • Fixed a bug related to FOpenXRHMD::UpdateLayer thread safety.

  • Fixed an Unknown ARCore Trackable Type assert which occurred during ARLineTrace.

  • [ARCore Trackables] Fixed a case where an ArTrackable handle was not released.

  • [OpenXR] Emulated layers swapchain will now use the prescribed layer format.

  • Fixed a bug involving a platform RHI disable check.

  • [OpenXR] Fixed a bug which occurred when stereo was disabled and re-enabled.

  • [VulkanRHI] LLM tags are now initialized earlier.

  • [ARKit] Invalid camera images will no longer be processed after pause and resume.

  • [ARKit] Camera texture resources will no longer be accessed on the delegate thread.

  • [OpenXR] Quad layers now respect component scale as expected.

  • Fixed several issues related to MotionControllerComponent Velocity.

  • [XRScribe] Pose replay will now match the original timescale instead of playing poses back as fast as possible.

  • Fixed an issue where OpenXRHMD SystemProperties was uninitialized until OnStereoStartup.


  • EnableAutoLoadingSplashScreen functionality has been deprecated.

  • [ARCore] Deprecated UGoogleARCoreFrameFunctionLibrary::GetCameraMetadata and

  • Deprecated ARCore AR Trackable Render Components.


  • Removed the deprecated camera metadata API.

  • Removed deprecated ARCore features.

  • Removed HoloLens "Multi" packaging.

  • [ARBlueprintLibrary] Deleted functions deprecated in 4.22 and 4.26.

  • Removed GetMobileVariableRateShadingImage to make Variable Rate Shading behavior consistent across mobile and desktop.

Platform Mobile


  • Optimized directional light uniform buffer update on mobile.

  • Added support for pixel shader version of TAA upsampling on mobile.

  • Added support for instance custom data in pixel shader while mobile GpuScene is enabled.

  • Changed Light Grid Data buffers to be StructuredBuffers.

  • Added support for ISM with mesh paint vertex color on mobile.

  • Detect hardware Cyclic Redundancy Check (CRC) instruction support on ARM platforms. Depending on the compilation environment, this can be a runtime or compile time detection. CRC is used in hash computations everywhere in the engine and this change will provide ~7x performance improvement on supported devices.

  • Replaced RHICommandListImmediate with RHICommandList to enable RDG pass parallelism on mobile platforms.

  • On Android and iOS, UE will now only update the list of receipts received from IOnlinePurchase::GetReceipts by user request. Receipts retrieved using IOnlinePurchase::GetReceipts are updated as a result of calls to IOnlinePurchase::QueryReceipts. After a successful call to IOnlinePurchase::Checkout, the receipt for the successful purchase is added to that list. Asynchronous transaction updates received only trigger the IOnlinePurchase::UnexpectedPurchaseReceipt delegate. Restored transactions on iOS are automatically finished so the end user does not need to do it.

  • Added support to handle subscriptions on OnlinePurchaseGooglePlay and OnlineSubsystemIOS. Subscription product types are now also queried to the stores. Whether a subscription is valid or not can only be handled by server-to-server calls to the store.

    • You can disable local acknowledge-and-consume by setting bDisableLocalAcknowledgeAndConsume_`_ in the [OnlineSubsystemGooglePlay.Store]` section from your .ini files. This supports the server-to-server validation recommended by Google.

    • Product IDs consumed by the engine for subscription products should be composed by be the actual product ID defined in the store, prefixed by "s-".

    • Several product entries will be received for a subscription product when the application invokes `IOnlinePurchase::QueryOffersById_`_ using a subscription product ID. The product ID on the received products will contain:

    • ++ The prefixed product ID

    • ++ The base plan

    • ++ The offer in the base plan

    • ++ The different price points.

    • As an example, this could be the list of ids created by `_IOnlinePurchase::QueryOffersById`_ requesting information for "s-test_subscription_1" (which in the store would be identified as just "test_subscription_1").

  • r.Mobile.EarlyZPassOnlyMaterialMasking is now handled per shader platform.

  • Increased ShaderComplexity cost of Masked Materials on Mobile ShaderPlatforms that do not use MaskedInEarlyZ.

  • r.Forward.LightLinkedListCulling is now set to 0 for platforms that do not benefit from it. This saves about 0.1ms on the GPU.

  • Added support for Inline RT Shadows on Vulkan.

  • Tonemapping LUT pass now runs only when needed.

  • Added support for CollisionMode PCM_DistanceField on mobile platforms that support Distance Field.

  • Removed SupportsCopyImage, as GL ES 3.2 standard has glCopyImageSubData.

  • Volumetric Support For Mobile is disabled by default in Device Platforms. Removed bSupportsVolumetricFog from DataDrivenPlatformInfo.

  • Added a new mode for rendering local lights in the Mobile forward renderer. You can enable this mode by setting r.Mobile.Forward.EnableLocalLights to 2 and r.Mobile.EarlyZPass to 1.

  • Mobile Light Prepass is now disabled by default.

  • Removed bSupportsMobileDistanceField from DDSPI in Global Distance Field For Mobile.

Crash Fix:

  • Fixed a crash that occurs when enabling transmission on directional light with spot light shadow on mobile.

Bug Fix:

  • Mobile rendering now samples SceneDepth instead of fetching SceneDepthAux when full depth prepass is enabled.

  • Fixed a bug where decals are missing skylight when using the mobile deferred renderer with static lighting disabled.

  • Directional lights with a light channel of none (0) can now cast shadows on mobile deferred.

  • Fixed a bug where simple light was missing on mobile deferred.

  • Fixed a bug where static meshes are missing local light when they are dragged in editor.

  • Fixed issue where distortion pass was not using the same pixel format as a base pass.

  • Previously, objects with masks would still do mask clipping in the pixel shader even with full depth pre-pass enabled. This issue has been resolved.

  • Fix a bug where the depthRT is empty during passes when DepthStencilState is enabled while doing DrawMaterialToRenderTarget on the mobile deferred renderer.

  • Fixed a bug where a black color would render on thin translucent material on mobile.

  • Fixed IBL reflections for Surface LightingVolume.

  • Fixed a GPU crash caused by Niagara Mesh Renderer shader which occurred on IOS 13 as well as some PowerVR android devices.

  • Fixed GPUScene uploader size limit check.

  • Indirect lighting scale is now correctly applied on mobile.

  • Moved Temporal Anti-Aliasing back to the end of the post-processing chain to save bandwidth. It now filters the bloom input to get rid of the flickering white spots.

  • Fixed a modulated shadow rendering issue on mobile.

  • Fixed a bug in GenerateGlslShader that occurs when a string is a substring of another in the ReflectData.

  • Fixed handling of Target Device in Mobile Preview.

  • Quad Complexity now works correctly for mobile preview.



  • Added a way to provide command line to Android apps using adb shell. You can now launch Android apps from adb shell and provide a command line arguments using the parameter -cmdline "arguments".

  • Purchasing multiple products in one transaction is now allowed in OnlineSubsystemGooglePlay.

  • Set Java 1.8 for sourceCompatibility and targetCompatibility.

  • Capped Low-Level Memory Tracker (LLM)'s Total stat to be no less than Total Tracked on Android, since on some devices UE can't read the GPU part of the total memory allocated by the process. However, LLM does its own counting on Unreal Engine's side for GPU-related allocations.

  • Advanced binary compression is now enabled by default on Android.

  • Upgraded Android Studio (Flamingo 2202.2.1) and Gradle (7.5 and use OpenJDK 17 from 2202.2.1).

  • Added support for Lumen Diffuse Indirect without requirement for Dual Source Blending in the desktop renderer.

  • Updated force feedback support on Android:

    • Use VibrationEffect for intensity control.

    • Forward feedback to controller(s) if Android.UseControllerFeedback has a value other than zero (defaults to 1).

    • Does not continue feedback when application is in the background.

  • Added Overflow 3 and 4 for Android OBB files. Use OverflowOBBFileLimit project setting to set number allowed. The default value for OverflowOBBFileLimit is 2, but you can set it up to a maximum of 4.

  • Updated Google-Services plugin for Firebase.

  • Updated Swappy to the latest from Android GoogleSource. Modified to always use the Java DisplayManager and refresh rate selection as it is more reliable on some devices.

  • Added additional Razer Kishi gamepad recognition.

  • Added the WebViewTextureSize CVar to control Android WebBrowser texture size in DefaultEngine.ini.

Crash Fix:

  • Fixed a crash when playing a .mp4 from UMG.

Bug Fix:

  • Fix a bug that prevented rendering custom depth on OpenGL.

  • Fixed bug where CommitComputeResourceTables were missing for dispatching indirect compute shader on OpenGL.

  • Fixed a bug where media couldn't resume after entering the background on Android devices.

  • Changed the location of the .apk generated by Gradle to avoid using outputFileName to redirect the .apk location.

  • Fixed a race condition when generating .apk in newer Gradle versions by using cleanPackageDebug/cleanPackageRelease instead of manual .apk removal.

  • Forward key pressed to UI even if virtual keyboard is shown on the screen. This enables hardware keyboard usage with EditText fields.

  • Removing emoji filtering on Android. Now it's possible to type emoji's from Android on-screen keyboard.

  • Fixed IME with hardware keyboard.

  • Fixed an issue causing fingerprint scanners being falsely detected as controllers.

  • Only archive AAB if App Bundles are enabled for Android.

  • Corrected performance issues by performing updates to device vibrator intensity less frequently.

  • Fixed Xbox and Razer wired controllers on Android 12+.

  • Use /sdcard/Android/obb for OBBs for all build types. /sdcard/obb is no longer used due to storage access restrictions.

  • Clear ANDROID_SDK_HOME environment variable in the SetupAndroid script. This should NOT be set with new tools.

  • Slight improvement to GetEntryLength in Android filesystem.

  • If the Android background downloader plugin is disconnected, it will now monitor network status and resume background downloads if reconnected.

  • Fixed OnLocationChanged broadcast for Android location services to use the game thread properly.


  • libc++_shared.so is no longer included in .apk packages on Android by default, as Unreal Engine no longer supports any dynamic libs built against libc++_shared.so.

iOS, tvOS, and iPadOS

Crash Fix:

  • Refactored resource transitions on Metal. Removed PrologueEncoder since it's not synchronized properly. This fixed a flickering and crash issue on iPhone14 with mobile GPUScene enabled.

Bug Fix:

  • Fixed a bug that occurrs when sampling SceneDepthAux in SunMask on IOS mobile deferred.


  • IHttpRequest implementation based on NSUrlConnection is marked deprecated. This functionality will be removed in 5.4.



  • Quixel Bridge 2023.0.3 improves version handling for MetaHuman exports.


API Change:

  • If your shader references GPUScene or another field in the scene uniform buffer, the RHI validation expects a valid reference for the scene UB. If this is not set, you may see an error like this: Shader expected a uniform buffer at slot 5 but got null instead (Shader='' UB='Scene'). Rendering code needs to set a valid uniform buffer for this slot. This can be resolved by adding a SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSceneUniformParameters, Scene) field to the shader parameter struct and setting its value using the helper method in FSceneView. If you're having trouble identifying which shader is missing the reference, you can run with "-rdgimmediate -rdgdebug -onethread" and find the shader in the callstack.


  • Added a Volumetric Clouds console variable "r.VolumetricRenderTarget.MinimumDistanceKmToEnableReprojection" to help hide reprojection issues to due to imperfect approximation of cloud depth as a single front surface. This is especially visible when flying through the cloud layer. This doesn't hide all issues but will help in a lot of cases. The problem when using this method is that clouds will look noisier when closer to that distance.

  • Optimized Volumetric Cloud shadows by using CloudSampleNormAltitudeInLayer correctly. This can result in performance wins between 5 to 10 percent.

  • Added support for Groom streaming. This allows you to load and unload content based on usage. This is experimental and disabled by default. You can use the console variable "r.HairStrands.Streaming" to enable it.

  • Added AutoLOD setting to Grooms. This allows it to dynamically adapt the number of active curves based on screen coverage. This avoids having to set this with manually discrete LODs, and adapt curve count at a more finer grain. Combined with streaming, it lowers GPU timing/memory usage. This is experimental and can be opt-in per asset. AutoLOD can be forced on all grooms with "r.HairStrands.AutoLOD.Force".

  • "WPO Disable Distance" material expression now works for non-Nanite Static Meshes.

  • Avoid unnecessary ray tracing shadow tracing for hair strands which saves 25% of shadow cost in test cases with many lights.

  • Added hair attribute value picking when attribute view mode is active.

  • Made sure GPU-scene instance count is clamped to the maximum GPU-representable index (16M), preventing overflow crashes.

  • Added ShaderPrint GPU string, which allow to upload strings to GPU(for example, asset name)

  • Added Blueprint exposed setter function for "NumCustomDataFloats" on Instance Static Mesh Component.

  • Added LOD curve/point count into the hair LOD panel.

  • Changed Groom RootUV to be optional. If an imported groom does not have RootUV imported, we no longer generate spherical mapping.

  • Make FAtlasTextureInvalidationScope public so that external code (plugins) can invalidate a particular texture (For example, for CPU data upload).

  • Added coverage threshold for hit proxy, in order to control at which coverage hair can be selected.

  • Added guide type to ease understanding/manipulation of the different types of guides. This allows editing rigging directly from the Groom Editor.

  • Added an option on the physics settings to force the Niagara component to be visible. This allows users to leverage Niagara rendering when using a custom solver.

  • Improved Distance Field Scene Management to support more than 4M instances.

  • Add Groom Memory Stats.

  • Added necessary conversions from / to the working color space in Volumetric Cloud rendering.

  • Changed how simulation cache is handled on groom to fix dynamic assignment. A groom asset now needs to opt-in to support groom cache. This opt-in ensures that interpolation data are property built for the groom asset. This option is automatically enabled when assigning a groom cache in the property grid. A groom asset with simulation cache support enabled, can now get a groom cache assigned through Blueprint at runtime. This avoids spawning actual simulation when running with a simulation cache.

  • Groom deformer (experimental) can now write out attributes (CV color, radius, etc) in addition to position. Attributes are also readable, as well as guide data.

  • Add visualization of imported attributes in Groom Asset Editor.

  • Added second Virtual Shadow Map resolution bias for moving lights along with tracking of what lights are moving. When a light stops is does a gradual transition to the original bias. Added Scalability console variables r.Shadow.Virtual.ResolutionLodBiasLocal, r.Shadow.Virtual.ResolutionLodBiasDirectional, and r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving to configure the LOD bias for a light that is currently moving.

  • Attached VRAM info to AppendStaticClientPerformanceAttributes.

  • Added per-primitive enum (ShadowCacheInvalidationBehavior) to enable users to override default engine behavior for shadow invalidations. This is useful to prevent invalidations from for example static WPO.

  • Changed GPU-Scene data to shrink as well as grow. The console variable "r.GPUScene.UseGrowOnlyAllocationPolicy" can be used to disable the new behavior.

  • Prevented instance over-allocation from crashing the editor / engine, clamping gpu-scene size to MAX_INSTANCE_ID, 16M. Added logging + on-screen message to surface the issue.

  • Added the console variable "r.CaptureNextDeferredShadingRendererFrame" to trigger capture a following deferred scene render. For example, RenderDoc or PIX.

  • Added the ability to trigger Virtual Shadow Map invalidation on Nanite LOD streaming changes. This is experimental and is controlled using "r.Nanite.VSMInvalidateOnLODDelta" (default: off).

  • Added a new global uniform buffer scoped for the scene rather than the view, and moved GPUScene from the view to this buffer. The scene UB uses RDG (unlike View), and is modular.


  • Reduced groom cluster resources size (~ -15%).

  • Improved groom per-CV color precision from 8/8/8bits to 11/11/10bits.

  • Improved the consistency of scene view extension calls in the game viewport and scene captures.

  • Changed cluster culling to be done in a single pass. This saves about 20% cost of the interpolation work. Clusters are not computed based on the first curve to avoid expensive cluster bound computation.

  • GPU Skin Cache update render thread optimizations. Rendering multiple Skin Cache enabled skeletal meshes should now process faster due to batching of work.

  • Improved how Groom Cache updates its data. Interpolation now runs on the GPU, and GPU resources are now cached to avoid constant reupload of the data every frame.

  • Improved the Pixel Inspector naming, fixed transparency, allowed negative values and ensured that luminance also respects the working color space.

Crash Fix:

  • Fixed crashes when importing groom-only guide cache. Also fixed a crash when importing guide with zero size radius.

  • Fixed a crash with hair with nDisplay.

Bug Fix:

  • Fixed tracing cut for Volumetric Clouds that could happen when traveling in and out of the cloud layer.

  • We now make sure we flush occlusion queries out of memory if we've turned them off.

  • Cloud shadow evaluation now works on the SkyAtmosphere when LUT are generated using async compute.

  • Fixed "GeForceNOWWrapper::GetClientCountryCode()" not writing the output parameter with the country code. (2 char country code).

  • Fixed Volumetric Cloud flickering happening after some time. The extra camera cut logic was unsafe and unstable.

  • Applied a fix for height fog on Volumetric Cloud not working when start distance is greater than or equal to 1.

  • Fixed Sky Atmosphere SkyLightLUT not accounting for overridden light direction.

  • Fixed flickering SkyViewLUT texture when viewed from afar in space.

  • Applied a fix for Static Meshes being marked dirty on load when built asynchronously.

  • Fixed hair bound with scaled transform and take into account hair width, so that large width increases correctly the bound size.

  • Fixed incorrect scratch buffer address when using more than two RayTracingScene layers causing crash or GPU hang.

  • Fixed Groom Cache (guide/strands) rendering and guide cache debug visualization

  • Fixed groom details refreshing in Blueprint.

  • Fixed how CPU bounds are computed for groom when attached to Skeletal Mesh.

  • Fixed slow opening of Groom Binding tab in Groom Asset Editor by avoiding loading assets.

  • Fixed missing groom shadow when "Hidden in Game" and "Hidden Shadow" settings are enabled at the same time with Movie Render Queue using the Path Tracer.

  • Fixed Rect Light support with MediaTexture. These textures, when assigned to a rect light, were missing invalidation to refresh their atlas content.

  • Fixed incorrect group names when the groom does not have group ID mapping.

  • Fixed hair strands rendering with stereo rendering.

  • Fixed hair scene scattering not running when the scene does not have a sky component.

  • Fixed hair physics settings working correctly with custom reset.

  • Fixed 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 (in cooked builds, for example).

  • Fixed a bug with Nanite Custom Depth rendering on some console platforms.

  • Fixed incorrect alpha channel output for the canvas "Translucent" blend option. It now uses "AlphaBlend" internally.

  • Fixed Directional Light preshadows in Cascaded Shadow Maps, which were broken after a recent change to WORLD_MAX for Large World Coordinates.

  • Fixed an issue where the "Draw Debug Capsule" option on Blueprint capsule components would render with incorrect scale.

  • Validate we have vertex data for the current MinLOD for InstancedStaticMeshes before creating SceneProxy, preventing a crash in some situations.


  • Deprecated direct access to groom and groom binding members.

  • Deprecated Ray Traced Skylight and removed it from Project Settings.



  • Moved all immutable geometry collection rendering data into the Geometry Collection asset. This is built as part of Geometry Collection DDC contents. The scene proxy has been reworked to use this data.

  • Added optional use of "Remove At Swap" when removing instances from Instanced Static Mesh Component. Also added a console variable to force the behavior with "r.InstancedStaticMeshes.ForceRemoveAtSwap". RemoveAtSwap should be faster than the previous behavior, but may break any code that depends on the current behavior.

  • Hide MarkedForDelete resources from RenderResourceViewer

  • Added Insight asset metadata tracking on DX12 buffers

  • Added the DECLARE_UNIFORM_BUFFER_STRUCT API macro to allow decoupling of uniform buffer parameter struct declaration and definition. Uniform buffer parameter structs can be forward declared, and so can be used by third parties without making the full definition public.

  • If the morph vertex buffer hasn't updated this frame or for some frames, use the last updated morph buffer for the previous morph data, so it cancels out the motion vector. This fixes a jittery issue in the Morph Target Preview tab in editor previewing using morph sliders.

  • Added Insight memory trace DirectX12 memory allocator tracking.

  • Changed the behavior of flag checkbox based on user feedback for the Render Resource Viewer. When unticked the resources with the flag set are now hidden from display. Also remove None flag checkbox and hide Transient resources by default.

  • Added "r.SceneCapture.DepthPrepassOptimization" to speed up pre-pass depth rendering for Scene Capture. This is a short-term optimization to support certain features requiring a depth pre-pass and can only utilize SceneCapture to achieve it currently. Note turning it on means rendering after depth pre-pass (e.g. SingleLayerWater) is ignored, hence the result is different from when the console variable is off.

  • Added output owner name to rhi.DumpResourceMemory command.

  • Added Insight asset metadata tracking on DX12 textures

  • Exposed CreateSinglePrimitiveSceneUniformBuffer in the IRendererModule to make it possible to create a Scene UniformBuffer using public interface.

  • Added a context menu on selected resource, and context command to find assets in the Content Browser (shortcut CTRL+B) to the Render Resource Viewer.

Crash Fix:

  • Fixed an Editor-only GPU crash on unaligned texture copy when loading a streaming virtual texture with border less than 2.

  • Fixed a crash when trying to render with empty Geometry Collection mesh data.

  • Fixed "r.SkinCache.RecomputeTangents=0" causing crashes when rendering Skeletal Mesh with the skin cache.

Bug Fix:

  • Fixed a GPU hang that could occur when changing material type on an Runtime Virtual Texture asset.

  • Fixed GPUScene per instance HZB instance culling on mobile where previously the HZB was not being bound.

  • Fixed bad motion vectors being generated for some instanced objects.

  • Fixed bad hash calculation of virtual texture pool settings. This could lead to an issue where we did not correctly detect when the pool size settings are changing.

  • Removed render thread access of parent UTexture from FVirtualTexture2DResource. This fixes race condition check firing when the Virtual Texture sRGB flag is flipped.

  • Fixed off by one logic in check() for Static Mesh LOD count. This would trigger a check() if we used 1 less LOD than the maximum.

  • Fixed Skeletal Mesh post load being called on game thread from Niagara when actual loading is still happening from the loading thread.

  • Fixed an issue when multiple viewports are open, only the viewport in focus has valid velocity on skeletal meshes. This is fixed by switching to use GFrameCounter which is incremented once per engine tick, so multi views of the same frame share the same value.

  • Fixed the Skin Cache Editor debug visualization modes looking different from their console variable equivalent. Fixed the shading difference and the debug texts not showing up correctly.

  • Fixed Instanced Static Mesh loose params warnings in debug build. Create a loose parameter uniform buffer to capture those parameters.



  • Volumetric Fog buffer allocations are now independent from dynamic resolution scaling.

  • Sky Light created from Environment Light Mixer uses real time capture by default.

  • Added support for Rect Light Volumetric Fog light functions.

  • Fixed wrong color of translucent shadow volume when light is an atmospheric light.

  • Added Exposure as new light unit.

  • Improved order independent transparency triangle sorting precision.

  • Added Virtual Shadow Map high quality shadow filtering for translucent surface for Substrate and legacy path. This is a global opt-in feature (r.Shadow.Virtual.TranslucentQuality).

Bug Fix:

  • Fixed Subsurface Profile causes an orange rim using Ray Traced lighting at certain angles. The issue is caused by not enough penalty to the depth in the screen-space bilateral filtering.

  • Fixed missing Volumetric Fog light function from atlas for Spot Light.

  • 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 lights get toggled on and off.

  • Fixed a potential Ray Tracing performance issue with invalid shadow rays being traced.

  • Fix incorrect ref counting decrements when texture is removed from Rect Light texture manager.

  • Fixed unclamp radius / length for Point / Spot Lights causing visual artifacts.

  • Fixed overflow when computing Rect Light texture MIP causing incorrect atlas packing.



  • Height fog in Lumen Reflections is now partially supported (only Height Fog, not Volumetric Fog).

  • Lumen reflection on translucent now accounts for roughness and goes through the denoising process.

  • Lumen reflections with hit lighting now support multi-bounce reflections, controlled by "Max Reflection Bounces" setting in Post Process Volume.

  • Lumen Hardware Ray Tracing path is now fully compatible with async compute and it's enabled by default on supported platforms for improved performance.

  • Added boolean "Allow Front Layer Translucency" to material, which allows to control whether given material should write Front Layer Translucency. This is useful to disable small particles from using Front Layer Transparency or solve sorting issues.

  • Improved Lumen Scene tracking of primitives. Primitives are now included in the Lumen Scene only if they can be traced by a currently active tracing method.

  • Added support for Nanite Ray Tracing in Lumen HWRT and Ray Tracing Debug Visualizations

  • Increased "r.Lumen.Reflections.MaxBounces" limit to 64. It controls the max number of bounces when multi-bounce Lumen reflections are enabled.

  • Added "r.Lumen.Reflections.VisualizeTraces" debug utility. It visualizes a dedicated reflection ray traced from the current cursor position.

  • Replaced Lumen Scene visualization with Geometry Normals visualization in Lit->Lumen->Overview visualization mode. Geometry Normals view is useful to spot any issues with distance fields or ray tracing setup.

  • Added support for two sided and thin foliage shading models in Lumen hit-lighting path.

  • Enabled ray tracing culling by default in order to simplify initial setup.

  • Improved global distance field ray hit evaluation, decreasing possibility of sampling surface of an occluded object which is near to the hit point.

  • Made significant Lumen HWRT optimizations which hit-lighting optimizations targeting PC.

Crash Fix:

  • Fixed a crash when setting world space radiance cache probe resolution below supported values.

Bug Fix:

  • Fixed opacity clipping not happening on Lumen front translucency.

  • Fixed geometry normals on meshes with negative scale (flipped culling) when using hit lighting reflections.

  • Fixed Lumen not working with ISM / HISM due to automatic primitive merging in surface cache.

  • Fixed an issue with "r.Lumen.ScreenProbeGather.ScreenTraces.HZBTraversal.SkipFoliageHits" when Substrate is enabled.

  • Fixed mesh card generation hangs on specific meshes due to an EmbreeRay issue where EmbreeRay.ray.tnear could end up being further than EmbreeRay.ray.tfar causing an infinite loop.

  • Fixed Material Ambient Occlusion which was incorrectly applied on top of emissive when not using async Lumen, and on top of emissive and direct lighting when using async Lumen.

  • Fixed Time material node being always set to 0 when capturing Nanite meshes into surface cache.

  • Fixed artifacts when running on GPUs supporting only 64 thread wide waveops.

  • Fixed missing reflections far away in the distance due to a hardcoded 1000000.0 cutoff in the bilateral filter.

  • Fixed surface cache corruption after surface cache atlas resize or compression settings change.

  • Fixed SWRT reflection traces feedback for mesh SDF and heightfields

  • Fixed radiance cache lag in scenes with lots of geometry detail (foliage, trees). Such scenes were requesting too many new probes per frame, preventing cached probes from getting any updates.

Materials and Shaders

API Change:

  • Please use the more efficient UMaterialExpression::GetInputsView() instead.

  • Any code explicitly using FShaderCompilerInput::bGenerateDirectCompileFile should be replaced with EnumHasAnyFlags(Input.DebugInfoFlags, EShaderDebugInfoFlags::DirectCompileCommandLine) instead.

  • FShaderCompilerEnvironment::GetDefinitions is now deprecated; only internal shader preprocessing code can now access values of preprocessor definitions. Any code which was previously retrieving definitions by value should set such values via FShaderCompilerEnvironment::SetCompileArgument (or via the helper SetDefineAndCompileArgument which can be used for values which are consumed by both the preprocessor and compilation code) and retrieve these values via FShaderCompilerEnvironment::GetCompileArgument.

  • Remove any usage of the FShaderPipelineCompileJob::bFailedRemovingUnused; it's no longer needed or used anywhere in engine code.

  • In the unlikely case there is code referencing FShaderCompilerEnvironment::RemoteServerData it should be removed if possible. If there are use cases of this for which other mechanisms (such as the new compile argument functionality) are not sufficient, please contact the UE dev team.


  • Optimized material expressions concerning loop detection. This removed individual calls to UMaterialExpression::ContainsInputLoop() and instead moved graph loop search in HLSLTranslator::Translate(). Since this can be done once for all inputs, the visited node set can be shared, making the loop search algorithm O(n), which visits each node exactly once rather than O(n^2) that performs the loop check for each node independently. This optimization, combined with other optimizations, makes translating an expensive material from 5.6 seconds to 0.9 s (a material from Fortnite was used in this test).

  • Added code in Material Interface serialization function that validates the associated EditorOnlyData name to be "canonical" (name of the material followed by "EditorOnlyData"). If the name isn't canonical it may cause problems with the editor running on cooked content. The validation code will try to rename the EditorOnlyData to the correct name.

  • Added support for virtual texture feedback behind a Single Layer Water Material. We stochastically drop some writes to the feedback buffer so that we don't overwrite all of the content from the surface beneath.

  • The legacy MCPP preprocessor was removed and all shader preprocessing is now done with the new "stb_preprocess" library.

  • Made a change that modifies and future-proofs the mechanism which determines which debug outputs should be dumped for a particular shader compile input. Rather than an ad-hoc collection of boolean flags, a bitfield enum class is now used instead.

  • Added a new "compile argument" functionality on the FShaderCompilerEnvironment class. This is intended to be used for any generic arguments required by the IShaderFormat implementations as input to the actual compilation process; previously the preprocessor definitions were being abused for such arguments. This is a requirement for forthcoming work which improves the job caching and deduplication mechanisms.

  • Added functionality to validate the consistency of the shader job cache. If enabled, compilation will be run for all shader jobs, even those that would have been cache hits, and then the resulting output will be compared with the existing cached value. Output for any mismatches will be dumped to Saved/ShaderDebugInfo/CacheMismatches, with files named according to the input hash whose outputs do not match, along with log warnings indicating the mismatch and the associated filenames. Since this effectively disables the job caching mechanism by always compiling jobs, this should only be enabled locally in the case where a cache collision is suspected (which could potentially be the case when DDC is reporting non-determinism in shader maps).

  • Implemented "GetShadowReplaceState" for ray traced shadows.

  • Implemented support for explicit #error directives in the shader source in the new preprocessor library.

  • Fixed a mismatched string formatting argument in the shader compiler (for hlslccflags).

  • Dragging a cubemap texture onto a mesh in the Editor now generates a compiling Material.

  • Added camera relative origin options for object, actor, and particle Material expressions. Performing calculations in camera space is more precise and is usually faster by avoiding double precision math in Materials.

  • ODSC + Staged builds — The ability to launch a staged build and only use the COTF server to process recompileshaders commands.

    • Adds a cmd line option, -odschost= which allows the game to connect directly to the COTF server, but only to send ODSC recompileshaders commands.

    • If we don't have a default COTF connection (for cooking assets), we create our own connection to the COTF server.

    • Refactor code to send a command to the COTF server into a function. That way if we don't have a "special" ODSC only connection we can use the command that way.

    • Fixed an issue with the "RecompileShaders material" command. It would only search and find a single material and recompile it. This ignored any material instances. Now the code takes into account finding all dependent instances and issuing a recompile command for them.

  • Added cook stats to track critical path, game thread time to submit Material compile jobs. On Lyra this accounts for ~10.4% of a full cook with -noshaderddc and a warm cache for everything else. On CitySample this accounts for ~8.9% of a full cook with -noshaderddc and a warm cache for everything else.

  • Added EffectiveParallelization to the cook analytics for shader compilation. This statistic shows up as "Shaders_EffectiveParallelization".

    • NewGatherAnalytics should be grabbing the CompileStatsLock since it is reading the stats -

  • The console variable r.SSProfiles.Transmission.UseLegacy was added to use the legacy transmission profile. This is enabled by default. When legacy transmission is disabled, the transmission profile is more physically accurate. When enabled, more artistic license is possible by adjusting the ExtinctionScale.

  • ComputeAllStateCRC()was added. This provides a way to more quickly detect changes to a Material, including changes to any Material Functions or Material Instance parameters.

  • The Material option "Always Evaluate World Position Offset" was added. When enabled, World Position Offset is always evaluated for a Material, and cannot be disabled by "Evaluate World Position Offset" or "World Position Offset Disable Distance" on the component. This override is intended for Materials that should not disable World Position Offset, even for performance purposes.

  • Added Shader Compilation stats to cook analytics. This adds GatherAnalytics to the various shader compilation classes allowing each of them to pass their own stats back to the cook. These stats have the base name "Shaders_" as a prefix. The goal is to capture high level stats which are good indicators of performance and are useful for catching regressions. Also added:

    • Shader Job Cache stats to track Queries Hits, NumInputs, NumOutputs, and MemUsed.

    • MemBudget Stats that include ShadersCompiled, TotalThreadTimeForAllShaders, and TotalThreadPreprocessForAllShaders.

  • The compiler options flags CFLAG_CullBeforeFetch and CFLAG_WarpCulling were added to control warp culling and Cull Before Fetch hardware optimizations.

  • Added the console variable r.MaterialLogErrorOnFailure which emits an error when a Material fails to compile (instead of a warning). This variable defaults to false, but you can enable it from the command line with the following: -dpcvars="r.MaterialLogErrorOnFailure=1"

  • Added a cook stat to provide path time metrics on UMaterialInstance::PostLoad. This accounts for 7% of critical path time when cooking certain projects.


  • Optimizations in Material translation code amounting to 50% speed up. Optimized function UMaterialExpression::GetInputs() with highest exclusive run-time during material translation from 19.79% to 1.79% exclusive run time. This change caches the inputs upon expression creation by default and returns a TArrayView instead of always creating a new transient dynamic array. The optimization also simplifies code for some Expression types. Also optimized ContainsInputLoopInternal() to use a linked list of stack allocated nodes instead of Pushing/Popping from a dynamic array.

  • Don't set EarlyZ if we are sampling virtual textures but not doing any virtual texture feedback. This is a small optimization for the case of rendering with runtime virtual texture and not using feedback. Typically that can happen with landscape grass.

  • Implemented changes to hash and calculate Material Debug Name once per-Material instead of once per-shader job. FStrings are passed by reference in PrepareMaterialShaderCompileJob instead of copying them.

Crash Fix:

  • Added a check that reports errors if a parameter in a Material is bound to different values, instead of silently trying to compile the Material anyway. This was causing a crash when two Material functions containing a shared parameter bound to different values (for example, different textures) were used in the same Material.

  • Fixed access in "ItemPropertyNode.cpp" to a shared ptr constructed from a weak ptr. Code was not testing that object still exists, causing a crash when resetting Linked Material Blend Layer to Default.

  • Fixed a bug in MaterialX Luminance, which caused the Editor to crash after dragging an additional Luminance variable from the same connected node.

  • Fixed a crash caused by errors in the code for Material duplication.

  • Implemented changes to prevent the Editor from crashing when the user selects a Material whose ShaderMap contains null shaders. This change only makes the Editor more robust and prevents the crash; shaders in the ShaderMap may be null after loading due to external issues.

  • Fixed an Editor crash when Material Parameter nodes were renamed to an empty string. Empty strings are now ignored when renaming a Material Editor node.

Bug Fix:

  • Fixed too intense transmission in the Subsurface Profile shading model by extending ExtinctionScale from 1 to 100. This reduces the transmission distance when the scale is larger than 1.

  • Resolved several issues with CompileFXC.bat which prevented it from working correctly.

  • Addressed issues with the FRHIDispatchIndirectParameters size which could unnecessarily cause a full shader recompile on some platforms.

  • Fixed an issue with decals being rendered a second time in the translucent pass. This could happen for some depth of field setups, including the cine camera view.

  • Fixed an issue which caused oversaturated emissive GBuffer decals caused by shader code typo using DECAL_RENDERTARGET instead of DECAL_RENDERTARGETMODE.

  • Fixed an issue with wireframe colors on shipping builds.

  • Fixed a bug where MaterialInstanceDynamics created in the Blueprint Editor were not marked as public. This prevented the level from being saved.

  • Fixed a subsurface transmission bug where the transmission lookup table (LUT) is incorrectly built based on unit scale for the subsurface profile.

  • Fix a bug preventing some Materials from being moved to a different folder in the Content Browser. The issue was caused by an invalid state of the Material EditorOnlyData.

  • Disabled ability to override parameters that cause Material Instances to create a new shader permutation when parenting a restricted (non-base game cooked) parent. In restrictive mode, material instances could not inherit from a cooked material not in base modules. Now material instances can inherit from such restricted materials as long as they do not introduce a new static parameters permutation and thus a new shader. To prevent this, the user interface disables the checkboxes that would trigger a new shader to be created, with full validation is still performed at cook time, so even if a user manages to create a material instance with a static permutation, this would be rejected by the content worker.

  • Fixed a memory leak which occurred when Planar Reflections outside the camera view were culled without releasing the memory.

  • Solved an issue with incorrect Material EditorOnlyData name messaging being generated during cooking.

  • Fixed artifacts in the Clear Coat shading model which occurred when one of the components of the base color is exactly 0.0.

  • Fixed a bug with DistanceFieldApproxAO returning an incorrect result when the Material specifies an input Normal.

  • Fixed a bug whereby Material Instances with different sets of static parameter values and other flags would race to print out debug information, resulting in different sets of debug info from one run to the next.

  • Solved a regression in the job cache hit rate, which occurred because the debug info path was always included as part of the computation of the job input hash. This information is now excluded from the hash, restoring and potentially improving the hit rate.

  • Fixed a minor bug in the shader parameter parser functionality which was assuming only a single space between #line and the line number in line directives.

  • Fixed a crash in the Material Analyzer which occurred when a StaticComponentMaskParameter was present.

  • Fixed an enum mistake in UMaterialInterface::GetFontParameterValue.


  • Reintroduced (and deprecated) the older version of ContainsInnerLoopInternal() in UMaterialExpression.

  • The FShaderPipelineCompileJob::bFailedRemovingUnused field was deprecated. The only purpose of this field was to append some information to a log message which was determined to be unnecessary.

  • The FShaderCompilerEnvironment::RemoteServerData field was deprecated. Since some IShaderFormat-specific remote compile functionality was removed, this is only used for adding unnecessary ifdef'd out debug info to associated shaders.


  • Removed const from GatherAnalytics since it now needs to grab the lock and call GetTimeShaderCompilationWasActive.



  • Add an option on Static Mesh for WPO not to write velocity. We default to writing velocity, but the option can be useful if we know that we have "static" WPO for things like camera-facing impostors where we don't want that to generate motion vectors.

  • Added support for Spline Mesh Component with Nanite. This is experimental.

  • Improved visual quality of selection outlines of Nanite in the editor. There are no more jittering, or occlusion issues.

  • Implemented instance culling hierarchy and support for Nanite instance culling based on this. The feature is disabled by default (r.SceneCulling), and may be considered Beta for this release.

  • Added a new show flag to enable/disable the visualization of Nanite streaming data (Show -> Nanite -> Streaming Geometry). When disabled Nanite meshes will only be rendered at the quality level that is always resident in memory.

  • Added new Explicit Tangents option to Nanite mesh settings. When enabled, the tangents are stored explicitly on disk instead of being derived implicitly at runtime. While this comes at a small additional storage cost, it can be preferable in cases where the implicit tangents are not precise enough.

  • Optimized CPU overhead of Nanite streamer


  • Implemented performance improvements to NaniteStreamOut.

  • New sliding window vertex cache for pixel programmable. 20% faster masked foliage rasterization in forest scene.

Crash Fix:

  • Fixed a crash that would happen in building Nanite if the mesh had no triangles.

  • Fixed a crash in the Nanite streamer that could occur on shutdown.

  • Fixed a crash in the Nanite streamer that could occur on IO errors.

Bug Fix:

  • Fixed a bug in the editor where selecting an ISM / HISM actor or component would not render selection outlines for Nanite instances.

  • Fixed the "Shadow Pass Switch" Material node for World Position Offset, Pixel Depth Offset, and Opacity Mask on Nanite materials.

  • Applied a fix for the Camera Position Material Expression node returning the wrong position for shadow views with Nanite programmable rasterization.

  • Fixed issues with selection and deletion of Nanite Foliage Instances in the editor.

  • Fixed an issue where some Nanite visible clusters' flags could get cleared, causing WPO to be disabled for them.

  • Fixed issues with Custom Depth rendering of Nanite on consoles.

  • Fixed an issue where reading custom data as a vector in a Nanite Material to calculate World Position Offset would always result in using the default value.

  • Fixed issues with rendering Nanite custom depth with multiple views (for example, split-screen and VR)

  • Added a check when the build process goes out of memory and prints better log info (error code and Graph->Num when PartGraphRecursive fails).

  • Fixed Client issue that does not respect Allow Masked Material set in the editor

  • Fixed an ensure that could trigger when Nanite meshes were loaded, but there were no Nanite meshes in the scene.

Neural Network Engine (NNE)


  • NNEModelInstance has been introduced to prepare weight sharing optimizations. A runtime now creates a model, and one or multiple inferable model instances are created from a model.

  • NNE runtimes have been moved to own plugins which need to be enabled in addition to NNE to become available.


  • The NNERuntimeORTCpu has been updated to use the ORT 1.14.1 library.

  • UNNEModelData assets have an allow list to exclude certain runtimes from cooking it. It can be accessed by double clicking the asset. The feature defaults to an empty list which will cook for any runtime matching the previous behavior.

  • UNNEModelData assets can be reimported and opened in editor (using netron).


  • The old NeuralNetworkInference (NNI) has been removed, please use NeuralNetworkEngine (NNE) instead.



  • Niagara opaque particles can now collide with depth buffer without colliding with themselves. It can be achieved using the new PartialDepthBufferCollisionQuery node. This is Experimental.

  • Implemented Summary View 2.0 which allows the user to create custom views for an emitter. The primary use case is exposing specific inputs for complicated emitters, such as fluids. However, this is a useful feature to put emphasis on specific parts of an emitter.

  • Now we allow Python conversion scripts to reset values to their default and set hidden inputs on the new module.

  • Exposed Timed Niagara Effect Properties to Blueprint.

  • Added drag/drop support for emitter assets in the system editor.

  • Made visuals for convert nodes more compact.

  • Added support for curve assets to the curve data interfaces.

  • Added Collapse Categories support for the stack. If a Data Interface (any object, but primary consumers are Data Interfaces) has that flag, root level categories are skipped and instead their children are used.

  • Revamped the Stack type UI (more compact, more color, better visuals).

  • Added a setting to make numeric inputs feel snappier by updating the sim after every input change.

  • Improved metadata for module inputs.

  • Added True argument to allow the deletion of a static switch variable when no static switch is referencing it anymore.

  • Added Inline enum support for static switches to Niagara.

    • To use it, set a static switch node to Integer mode. The case labels are now editable. If edited, the display of the integers will show up like an enum in the Niagara stack when editing module inputs.

    • To change this, access the Widget Customization entry in a variable's settings. Default is the default integer view, and Enum Style is the enum-like view.

    • This is useful for one-off static switches that are kept in a single module and don't need an entire enum asset to be created and maintained.

  • Added widget support for stack inputs (sliders, min/max, volume).

  • Niagara renderers can now be moved via context action.

  • When pasting an entire emitter from one system to another, user parameters are now copied with them and added to the new system, if they don't exist yet.

  • Added age update mode dropdown to life cycle track.

  • Added a component and life cycle track by default when adding a Niagara Actor to sequencer.

  • Added a warning if life cycle track is not set up correctly for sim caching.

  • Added Python script support for deprecated module changes.

  • Changed the Reset Simulation command (hitting Space) to also resume playback if currently paused.

  • Reordered system properties.

  • User Parameters now support widget customization via the User Parameters Hierarchy Editor. This includes setting Min and Max, displaying floats or integers as sliders, and more.

  • Added a default UI state option for emitters that determine if they will be shown in Summary View or default view when added to a system or creating a new emitter.

  • Changed the Behavior Examples label to Learning Examples.

  • Added logic to ensure the emitter editor data exists when an emitter is post loaded or initialized.

  • Simplified emitter properties:

    • Removed Combine Event Spawn option.

    • Removed Script Category property for emitters in systems.

    • Removed Asset options properties for emitters in systems.

    • Moved Attributes To Preserve to the advanced view.

    • Hide Pre Allocation Count is now hidden if the mode is automatic estimate.

    • Moved Max Delta Time Per Tick to the plugin settings.

  • Added a decal icon for the decal renderer.

  • Changed the tab names Selection and Selected Emitters in the Niagara System editor to Details, including the icon, to be more consistent with the engine.

  • Fixed pin coloring for constant value make nodes.

  • Added thumbnails for curve assets.

  • Added a context menu option to record multiple cache tracks at once.

  • Added a new scratchpad action and set parameters to suggested in menu.

  • When renaming User Parameters in the User Parameters tab, name verification is now implemented.

  • Added duplicate script variable validation and fix logic. Validation and Fix can be run via command line in editor. The commandlet can be run via the project startup command line and will print out all scripts with their given guid conflicts.

  • Added a custom search box that adds filtering for parameters in the NPC editor.

  • More view settings are now saved per-asset (view location, view rotation and orbit mode) or in a config file to maintain Niagara viewport settings across sessions.


  • Improved the UX to expose options of function script input nodes.

Crash Fix:

  • Added reallocate pins when a static switch node references a different, pre-existing script variable via renaming. This fixes a crash where the visuals expect the pins to be created under the new static switch variable.

  • Fixed a crash when trying to set uobject-attributes in the stack.

  • Refactored a temporary array of transient stack entries that could get garbage collected anytime and cause various crashes. These stack entries managed stack entries for comment nodes, so now we have a proper comment collection stack entry.

Bug Fix:

  • Added various small fixes to static switch nodes.

  • Fixed an ensure being triggered when editing any FText field in Niagara script details.

  • Fixed a bug where sim caching can lead to minute-long hitches with large numbers of particles.

  • Fixed a bug where disabled modules could generate compile warnings.

  • When applying modules that are in use in an emitter/system, the module no longer gets deselected, and the UI gets refreshed so we get live changes.

  • Fixed a bug where component renderers were still visible when another emitter was running isolated.

  • Fixed a compilation bug with disabled nodes and data interfaces.

  • Removed the search box in the Details panel of the NPC editor.

  • Fixed the scroll bar not appearing in the Niagara Parameter Collections.

  • Fixed copy paste of modules not properly pasting values for static switches in static switch chains.

  • Fixed issue when finalizing empty sim caches.

  • Removed of incorrect default pins that would show up as 'None'.

  • Fixed scratch pad parameter panel bug where if a used function had the same parameter as the script asset that owned it, it would override the asset's own parameter. UI wise it would look fine due to the same name + type, but selecting it wouldn't work as the guid wouldn't match. - Removed sub graphs adding their script variables to be used for the script parameter panel - Refactored into using the graph's script variables directly instead of using the reference map. Reference map is now only used for reference count, not for item creation.

  • Fixed copy paste of modules not properly pasting values for static switches in static switch chains.

  • Fixed system parameter panel selecting parameters in scratch pad via name instead of via guid.

  • Fixed dragdrop ops of different types than FNiagaraHierarchyDragDropOps from being used in the hierarchy editor.

  • Fixed issue when adding a new user parameter while a custom section is selected.

  • Fixed issue where the length of the life cycle track was not evaluated correctly when caching a Niagara simulation.

  • Fixed LWC issue in camera DI.

  • Fixed emitters opening up the parameter panel to "Active Module" instead of "Active Overview".

  • Fixed editor only parameters not being marked as RF_Transactional. This fixes issues with transactions not properly being recorded in Niagara.

  • Fixed issue where replacing a module with another module using the same name caused it to lose static switch inputs.

  • Fixed issue where HLSL compile errors were not correctly shown in the stack.

  • Fixed a crash when using LWC structs.

  • Fixed issue where SWC structs would appear in the UI.

  • Fixed issue where using LWC structs as module inputs would not use the correct struct converter.

  • Fixed the script variable customization to also account for parameter pins that are disconnected from an output node. This fixes an issue in which a disconnected parameter pin wouldn't show its custom pin if the value mode was set to 'custom'. Also, you no longer need to reselect a parameter after adding it to a parameter map get node to make it show the default value

  • Added additional call to replace user param references on emitters and fixed renderer attribute binding references not being fixed when renaming a user parameter.

  • Fixed issue where the wrong asset was used to initialize sequencer recording.

  • Fixed emitter assets not dirtying when disabling a sim stage.

  • Fixed loss of parameter references when updating an input parameter's name in a module. The 'BoundPinNames' array was getting updated with an incorrect parameter handle, which made the lookup for subsequent renames break

  • Fixed issue where changing versioned properties would not dirty a script/emitter.

  • Fixed issue with async raytrace data interface not issuing traces.

  • Stopped considering input pins for get nodes as parameter reference This fixes an issue where a pin that was only referenced in a get node would count 2 references, which would stop it from being renamed properly from pin as it would duplicate a new parameter

  • Fixed transform function descriptions in camera DI.

  • Fix for the Apply button in Niagara scripts only checking for the exposed version guid instead of the currently edited version.

  • Fixed missing stack refresh when changing a user parameter name.

  • Fixed issue where the Details view would not properly show rows with changed visibility after a tree refresh.

  • Fixed issue when undoing an emitter add transaction.

  • Fixed an unnecessary refresh in the parameter panel causing loss of selection after modifying a value of a variable.

  • Added metadata to allow multiline text entry for python script.

  • Fixed sequencer caching bugs.

  • Fixed Blueprint API of "spawn system with parameter" functions.

  • Fixed output & transient parameters appearing outside their own stage when opening a parameter menu.

  • Fixed Custom HLSL pins not being modifiable. Also added visibility delegates for action "Reset to Default" and "Promote to Parameter". Also changed the Pin Section name used in Niagara to use the parent section name so we no longer have 2 sections called "Pin Actions" at times

  • Cleanup of old rapid iteration parameters used name only, not type. This resulted in cases where old parameters that used the same name as a new parameter of different type would not get cleaned up.

  • Fixed multiple lookups in the merge manager that looked up by name only instead of name + type. This in conjunction with the fix above results in more stable diff process. All of this fixes an issue where some fluid emitters were showing or not showing the 'reset to parent emitter' arrow wrongly

  • 'Ghost entries' no longer appear and a stack search result gets maintained even after changing a value in the stack.

  • Focusing the scratch pad manager tab when creating a new scratch pad so you can immediately rename it Made the toolkitmodebase public so that other parts in the plugin can access the tab names properly

  • Fixed "parameter for" node.

  • Fix highlighting of multiline HLSL comments.

  • Fixed issue where the simulation was always reset after a change, even when paused.

  • Heterogeneous Volumes: Introduce per-volume step size based on local-space step factors. Step size is now calculated in local space as a function of voxel width, projected along the ray direction. Toggle global step-size values to -1 (disabled). Change default MaxStepCount to 512 steps.

  • Fix for alpha-compositing issues with Heterogeneous Volumes when using the Niagara baker.

  • Sort heterogeneous volumes by camera-depth and adjust compositing to match.

Path Tracer


  • Added depth pass for path tracing that matches the behavior of the rasterizer path. The output is in DepthZ so post process depth of field works now as a bonus. You can use the same depth post process material to output in Movie Render Queue. If you'd like to disable the path traced depth buffer and use the depth from the rasterizer instead, you can use "r.PathTracing.Override.Depth 0". Also, the "Output Depth" has been renamed to "Output Depth and Velocity" in Materials.

  • Added Post Process Material and Movie Render Queue support for path tracing buffers. This means that Post Process can access path tracing buffers (raw/denoised radiance, albedo, normal, variance) with unique materials using the "Path Tracing Buffer Texture" Material Expression. And, access means that output in Movie Render Queue is supported.

  • Added basic support for Substrate has been implemented. The path tracer can now handle Substrate Materials, including multi-layered ones. Substrate's MFP is mapped to random walk subsurface scattering for opaque materials and to absorption in translucent cases. We expect to see fairly close agreement in many cases, though this support should still be regarded as experimental. Support for translucency and thin shading models are expected to improve in future releases.

  • Sky meshes should be included for raytracing when using the path tracer The console variable "r.RayTracing.ExcludeSky" is now ignored when the path tracer is active.

  • Implemented support for DBuffer Material Expression functionality in Path Tracer

  • Added a Blueprint call to invalidate path tracing output. The intent of this call is to give control over cases that cannot be handled by automatic invalidations.

  • The path traced image now invalidates itself when a Skeletal Mesh morph target changes.

  • Changed refraction rays to behave more like camera rays with respect to the "Affect Indirect" primitive setting. This makes refraction and transparency behave more consistently with one another.

  • Added support for path tracing heterogeneous volumes. This uses the Voxel Grid Pipeline to create global acceleration structures to represent heterogeneous volumes in the path tracer. Creation of global acceleration structures is memory intensive. Refer to the corresponding Voxel Grid Pipeline CL 25170595 for instructions on parameter tuning to control memory and quality. r.PathTracing.HeterogeneousVolumes (default = 0) Enables heterogeneous volume rendering in the path tracer r.PathTracing.HeterogeneousVolumes.RebuildEveryFrame (default = 1) Rebuilds the acceleration structures every frame.

  • Adding volume emission to the path tracer.


  • Improved SSS random walk sampling.

  • Improved volume light sampling for local lights.

  • OpenImageDenoise transfers have been sped up. Some optimizations were made to the pixel readback which saves some denoising time.

Bug Fix:

  • Fixed darkening in subsurface scattering when the scattering radius is small. The code now more seamlessly blends towards the diffuse behavior instead.

  • Fixed issue where materials using non-tangent space normals could have flipped normals in some cases.

  • Fixed fireflies that can occur from the rough diffuse shading model at grazing angles.

  • Fixed the "Path Tracing Quality Switch" node in materials not working in decal materials.


  • The Path Tracing Post Processing Volume setting for Filter Width for anti-aliasing has been removed. We found the default value (3.0) is effectively the optimal one and that there wasn't much reason to change it. If you still need this property, you can use the console variable "r.PathTracing.FilterWidth" to adjust it.



  • Added a Post Process Setting to Image Effects with Sharpen. This controls the strength of image sharpening applied during tonemapping.



  • Vulkan Bindless: Push a draft implementation of the FVulkanBindlessDescriptorManager that uses VK_EXT_descriptor_buffer. Uses one descriptor set for each type of resource, each backed by a descriptor buffer. Everything is bound and visible to every shader, except uniform buffers which are bound per draw/dispatch. Uses a single pipeline layout for everything. Initial buffer sizes for each descriptor type can be configured through CVars (they do not automatically grow yet). Still very experimental, and requires multiple other features to be disabled.

  • VulkanRHI: Use array for dynamic buffer allocations and removed the hardcoded "NUM_BUFFERS=3" value. Use a fence to manage buffer availability. Do not rotate dynamic buffer usage when a staging buffer is used for the copy.

  • VulkanRHI: Vulkan SDK upgrade to 1.3.239

  • Removing full-type RHI_API uses and adding them to members that need it. This reduces export counts and is part of upcoming coding standard changes.

  • Moving D3D12 Extension includes into their own headers.

  • Updating to Agility SDK 1.610.2

  • Moving a couple DDSPI fields to Editor-only code blocks, and moving Editor-only DDSPI types into the cpp files to keep Editor includes out of the global scope.

  • VulkanRHI: Moved Engine minimum core version to Vulkan 1.1.

  • VulkanRHI: Added VULKAN_SM6. Moved features and requirements around to match what was done on D3D12 SM6.

  • Making FRayTracingGeometryInitializer not a memory layout type since nothing needs it like that anymore.

  • VulkanRHI: Use Vulkan profiles to validate support for a feature level on startup before call to CreateRHI().

  • VulkanRHI: Added Vulkan_1_3 support for shader compilation, which is used for VULKAN_SM6.

  • Improved DX12 GPU breadcrumbs that track all active, finished and not started scopes on the GPU. The new implementation logs all scopes currently scheduled or active on the GPU.

  • RHI: Avoid re-allocating the OutData array in RHIRead*SurfaceData when possible.

  • Enabled async compute by default in D3D12 on NVIDIA Ampere and newer cards.

  • The command line argument "-vulkandebug" allows usage of our distributed vulkan validation layers for both Windows and Linux.

Bug Fix:

  • Bumped nVidia minimum version to 527.27. A random issue with landscape tools has been known to be problematic for drivers less than version 526.67. The exact cause is unknown but a resolution appears to have been made in one of the 527 releases. The first version to not exhibit the problem is 527.27.

  • Fixed FRHIGPUTextureReadback to work with subrects, as well as volumes and texture arrays.

  • Fixed structure init in Vulkan RHI.


  • Removing RHI code deprecated in 5.0.

  • Removing deprecated RHI symbols.

  • Removed CoreMinimal includes from public RHI headers.

  • Removed the deprecated RHISetComputeShader.



  • Brought back proper premultiplied alpha that can be toggled on Materials and Material Instances. Coverage over the background can be overridden from the root node when Alpha Composite Blend Mode is selected. If not plugged in, coverage of over background is off and regular blending is used.

  • Added support for decals with Substrate Materials.

  • GPU Lightmass now supports Substrate Materials.

  • Added support for glint BSDF to Substrate.

  • Ray tracing material shaders use fully simplified material for smaller payload.

  • Optimized Substrate shader compilation time.

  • Added in Material Editor complexity on Slab node.

  • Substrate now uses progressive material simplification to fit in memory. Simplifying Slabs at the bottom of the material topology first.

  • Made multiple improvements to the Material Editor Substrate tab.

  • Added support for Planar Reflections to Substrate.

  • Lumen card capture now uses fully simplified material with Substrate.

  • Added distortion coverage mode to be compatible with legacy distortion in Substrate Materials.

  • Fixed some editor pop up message due to bad bitfield macro when using Substrate Materials.

  • MFP is no longer clamped to fp111110 when in forward to be able to get to an transmittance closer to identity=1 (invisible surface).

  • Allocation of tile tile list buffers is now independent from the dynamic resolution when using Substrate.

  • When a new material is created using Substrate, a simple UE4-like lit shading model material function is used instead of a Slab. This shows that Substrate works with material function and makes material authoring simpler by default.

  • Added Substrate node for converting Index of Refraction to F0 and rotating anisotropy tangent.

  • Added Substrate Standard Surface nodes.

  • Add Specular Profile to Substrate. This allows the artist to provide a custom LUT describing specular behavior for view and light angles. The LUT can be procedurally generated or provided from a texture.

  • Added material buffer allocation policy. This allows control of how the material buffer is allocated. This is controlled with "r.Substrate.BytesPerPixel.Mode". When set to 0, allocate material buffer based on view requirement. When set to 1, allocate material buffer based on view requirement, but can only grow over frame to minimize buffer reallocation and hitches. When set to 2, allocate material buffer based on platform settings.

  • Added Byte Per Pixel view mode for Substrate.

  • Change Substrate Cloth / Sheen model to From Charlie to Disney LTC.

  • Added normal curvature-based roughness support.

  • Added Substrate Topology previsualization on the Substrate node within Material Editor.


  • Improved Substrate diffuse color sRGB encoding.

Crash Fix:

  • Fixed a crash when assigning a Material Function onto new material that is reopened later.

  • Fixed a crash when a Substrate Material has more shared tangent basis than allowed.

Bug Fix:

  • Fixed Substrate Material Preview on nodes to account for the Substrate tree from the previewed node only. This fixed material function input / output, reroute nodes and everything in between that is not directly connected to FrontMaterial.

  • Applied a fix for Virtual Shadow Maps and Subsurface Scattering using Substrate Materials.

  • Fixed opacity clipping for translucent writing velocity.

  • DXC and SPIRV-Cross fixes to enable Substrate in D3D11.

  • Fixed Volumetric Cloud Extinction being grayscale.

  • The Unlit Shading Mode now also works with refraction.

  • Fixed emissive exhibiting different behavior when enabling Substrate.

  • Decals now do not impact the look of other substrate material when in range of effect.

  • Fixed a wrong opacity with Substrate for depth and velocity.

  • Fixed "UseDiffusion" affecting the look of simple Volume Slabs.

  • Slab now respects Additive Blend Mode.

  • Fixed bad transmittance when doing masking through a vertical layer operator and more than 2 layers.

  • Applied a fix for Substrate interacting with responsive anti-aliasing.

  • Fixed microoclusion/F0/F90 usage.

  • Brought back support for "Custom UV" on root node.

  • Substrate now properly accounts for "Allow Negative Color."

  • Fixed Lumen ScreenProbeGather ReferenceMode when Substrate is enabled.

  • Fixed Lumen ScreenProbeGather and Lumen Reflection temporal filtering with multi-BSDFs.

  • Fixed Lumen history being reset on LumenScreenProbeGather & LumenReflections when Substrate 'max BSDF count' change.

  • Fixed legacy Eye Material conversion with Substrate.

  • Avoid non-necessary initialization causing massive shader stall. Reduce base pass cost of complex material by ~50%.

  • Fixed ray traced shadows with Substrate

  • Fixed Lumen specular interreflection with Substrate.

  • Fixed Lumen ScreenProbe / Reflection history reprojection with dynamic resolution scaling when enabled. Also fix Lumen ScreenProbe normal disocclusion.

  • Fixed Lumen.Visualize.IndirectDiffuse with Substrate enabled.

  • Added support for short range Ambient Occlusion with Lumen HWRT path.

  • Fixed "IsThin" support with SSS diffusion and SSS profile diffusion (now it works as expected, and diffusion is no longer scaled incorrectly) Also fixed "IsThin" to support surface for translucent case.

  • Fixed Substrate legacy material conversion with Virtual Texture input.

  • Fixed Substrate missing tangent frame when using parameter blending.

  • Fixed increase of energy when light transmission is enabled due to incorrectly normalize phase function

  • Fixed incorrect VSM backface culling with Substrate for pixel having subsurface.

  • Fixed missing Emissive input on Hair materials with Substrate.



API Change:

  • GlobalMatrices has been deprecated and ComponentSpaceTransforms should be used instead. If there's a need to get FMatrix type, Unreal Engine provides simple ways to convert from the FTransfom type to FMatrix type.


  • Added the ability to add collision profile overrides per particle, per level, and for abandoned particles on Geometry Collections.

  • Added cluster unions which are functionally equivalent to welding, but for Geometry Collections. This will eventually be expanded to support Static Meshes.

  • Introduced new external context-safe payload that can be used for Chaos acceleration structures.

  • Revamped scene query interfaces with templates to be able to accept additional types of scene query overrides.

  • Exposed a ComponentOverlapComponent function on the primitive component that also returns the overlap result.

  • Geometry Collections will not try to replicate empty internal clusters.

  • Added support for implicit object unions in OverlapQuery and SweepQuery.

  • Added an option (p.Chaos.DebugDraw.ConnectionGraphLevelOffset) to change what level of connection graph is being drawn in Chaos Debug Draw.

  • Disabled cluster particles when they no longer have children.

  • Geometry Collection particles now have a debug name set.

  • Added functions to the physics object interface to make line trace, overlap, and sweep on the UPrimitiveComponent generalizable beyond Static Meshes.

  • Modified the K2 overlap functions to return a hit result as well

  • Introduced a new FPhysicsObjectId alias to add some type clarity to the various functions on the IPhysicsComponent that deal with this ID.

  • Moved ChaosSQTypes from PhysicsCore to Chaos.

  • Exposed getters for the XR and Velocities property on geometry particles.

  • The FaceNormal is utilized in the sweep even when we hit implicit objects without a face index.

  • Added accessor functions to the FReadPhysicsObjectInterface to convert the physics object handle to the raw particle appropriate for the context.

  • The physics object interface and the Scene Query types should now be able to statically select the shape instance to operate on.

  • Added additional trace scopes for the various paths in OnSyncBodies.

  • Added functions to the physics object interface to query the hierarchy level of a particle and generate connectivity edges between particles.

  • Modified the various connectivity graph function APIs to be more flexible and to support filtering based on a "from" and "to" set of particles.

  • The physics object interface now uses const handles when possible.

  • Added a function to get the body ID from the component, given a raw game-thread particle.

  • Added support for merging collisions for contact pairs that appear with matching solver time. This removes cases where multiple hits for a contact pair would be received in a single frame with identical velocity data (since delta-V is updated per-frame). Includes information on multiple contact pairs that hit in the same solver frame to allow users to still use the same data.

  • Added torque units Nm and kg cm^2 / s^2, and force unit kg cm / s^2.

  • Added conversion utilities.

  • Optimized FPhysInterface_Chaos::SetMaterial by reusing a formerly temporary allocation.

  • Added render interpolation of the resulting offset from a physics resimulation via linear offset decay.

  • Added functionality to cache physics state of objects that are based on FPhysicsObject. The cached state is used by state replication and unlocks state/movement replication for objects like Cluster Unions which are based on FPhysicsObject.

  • Added the option to override an Actor's physics replication mode via physics object presets.

  • Added a Geometry Collection Dataflow node to simplify existing convex hulls on a Collection, with options to use either mesh-based simplification or a new dihedral angle threshold method.

  • Changed the cache collection object to be usable in Blueprints.

  • Geometry Collections now expose the IsRootBroken function to Blueprints.

  • Made the following changes to Dataflow:

    • Added new math library nodes.

    • Moved make nodes to a separate file.

    • Moved conversion nodes to a separate file.

  • Made sure the Geometry Collection custom renderer system is properly handling the bHiddenInGame flag.

  • Exposed Gravity settings on the immediate physics Actor.

  • Added the concept of internal call stack to the context to allow detection of loops in Dataflow.

  • ISM Pool optimization: made sure instantiated Static Meshed from the ISM Pool do not create their physics state.

  • Added override nodes to Dataflow.

  • Added Override properties to the Geometry Collection asset.

  • Added support for AssetUserData API to Geometry Collection assets.

  • Chaos: Optimized SpatialAccelerationCollection RemoveFrom by avoiding array allocation.

  • Added ability to set the gravity group index for a Geometry Collection.

  • Updated Geometry Collections to report sockets in their root proxy Static Meshes if they are available.

  • Added a Dataflow node to read specific float values from a float array.

  • Optimized data marshalling of Geometry Collections' physics results between the physics thread and game thread.

    • Removed global transforms from the payloads.

    • Only send data for the transform indices that have been changed (reduced copies and memory allocations).

  • Optimized the processing of Geometry Collection physics results by using ref counting pointers instead of making copies of the entire data.

  • Added a setter on EnableNanite UProperty to Geometry Collections.

  • Added the Chaos debug command p.Chaos.DebugDraw.ColorShapesByInternalCluster to display which physics particle is an internal cluster.

  • Added support to LevelSet for the connection graph generation.

  • Added new options to the Auto Cluster tool in Fracture Mode for grid-based clustering and a minimum cluster volume option.

  • The Tiny Geo tool in Fracture Mode now has a Tiny Cluster mode, which merges tiny clusters. This includes options to control whether the clusters considered should be restricted to the current Fracture Level, or to sibling clusters in the current hierarchy, or to clusters connected via the current proximity graph.

  • Added new Fracture plugin project settings to control the default location for new Geometry Collection assets created in Fracture Mode.

  • Added a Quick Settings section to the Fracture Editor UI, to allow users to easily control the default folder for new assets and to jump to fracture project and editor settings.

  • Added a way to control at which level Geometry Collection position and velocity are replicated for clusters.

  • Added support for custom primitive data in Geometry Collection Assets.

  • The Fracture Mode now shows the Rest Collection of the first-selected Geometry Collection in the level, providing easier access to the asset.

  • Added a Get Root Index node to Dataflow for managed array collections.

  • Added Geometry Collection Dataflow nodes: Cluster Selected, Merge Clusters, and Select Target Level.

  • The Split Components setting for Geometry Collections has been renamed Split Meshes, to reduce confusion with the unrelated UE Component concept.

  • Added physics material options on to the Geometry Collection asset.

  • Added the ability to use density from the assigned material ( or the overridden ones on the component).

  • Added the ability to Apply Default from Asset on the component as a button in the editor properties.

  • Added a BranchCollection Dataflow node.

  • The Fracture Mode Materials Tool now shows and updates the materials of the Geometry Collection asset (the Rest Collection), rather than the override materials on the Geometry Collection Component.

  • The Fracture Mode Set Removal, State, and Convex tools now automatically change the Fracture Mode's Outliner Column Mode to Removal, State, and Collision, respectively on switching to the tool.

  • Chaos cloth XPBDSpringConstraints have been internally rescaled to be resolution independent. Existing constraints have their behavior changed depending on their current resolution (spring length). These constraints were not exposed through any existing cloth plugins, so minimal impact is expected.

  • The Fracture Mode Proximity Tool can now set up Geometry Collection proximity based on a measure of the contact area of the convex hulls of the bones. This allows for better filtering of connections where the bones were barely touching, or only touching along a sharp corner.

  • Added a float comparison Dataflow node. Int and Float comparison nodes are now in the Math > Compare category.

  • Added a new material-based Damage Model for Geometry Collections. It is using material tensile strength and surface area of contacts between pieces to compute damage thresholds.

  • Added a node to get the sum of convex hull volumes for a given Geometry Collection bone selection.

  • The Create Leaf Convex Hulls Dataflow node now exposes the option to run a convex decomposition on leaf nodes of a Geometry Collection, enabling more accurate convex collision.

  • Add an Uncluster Geometry Collection Dataflow node.

  • Added the ability to control server and/or client Chaos debug draw via the following console variables: p.Chaos.Solver.DebugDraw.ShowServer and p.Chaos.Solver.DebugDraw.ShowClient. Also added the p.chaos.debugdraw.seethrough console variable to control whether or not the lines are drawn over objects.

  • Cloth to Dynamic Mesh: set default material ID to zero on all sim triangles.

  • Cloth Editor: if any triangle in the render mesh has an invalid material ID, apply the default WoldGridMaterial to it.

  • Added new Dataflow nodes to support exporting of Geometry Collection surfaces, convex hulls, and sphere coverings as OBJ mesh files, and to write Strings to files for debugging purposes.

  • The Fracture Mode Convex Tool now only shows collision shapes for the current Fracture Level.

  • Added delegate InjectInputsExternal to FNetworkPhysicsCallback. This will be broadcast during InjectInputs_External.

  • Chaos Caching: Blueprints are now allowed to access the observed component's EnablePlayback and CacheCollection properties.

  • Added a GetBoxLengths Dataflow node that can get the bounding box lengths for each transform in a Geometry Collection, where length can be measured along a chosen axis, the min or max axis, or the diagonal.

  • Added a SelectFloatArrayIndicesInRange Dataflow node that can select indices in an array of floats where the floats match a specified value range.

  • Added a CollectionTransformSelectionFromIndexArray Dataflow node that can select Geometry Collection transforms with indices matching the values in an array of integers.

  • Made server authoritative Geometry Collection particles unbreakable on the client -

  • Added unbreakable flag to Chaos clustered particles SOA.

  • Added a new Merge Convex Hulls Dataflow node which can reduce the convex hulls used to represent collision on geometry collection bones.

  • Added GetAccumulatedTime function for obtaining the physics solver's AccumulatedTime in fixed step mode.

  • Added a new experimental Skinned Level Set primitive type for Physics Assets. This primitive embeds a Level Set into a lattice which is skinned by transferring the skinning weights from the associated mesh vertices to the lattice. This primitive can only be used by cloth simulations and is experimental. It has not been optimized.

  • Added material strength information to the Chaos physics material.


  • Modified primitive component wake/sleep events so that they don't depend on the existence of a BodyInstance, which makes them more generalizable.

  • Geometry Collections no longer construct FName types at runtime for the removal feature related facade classes.

  • Optimized Geometry Collections by removing feature runtime execution. Also reduced its memory footprint per Geometry Collection instance.

  • Moved rendering and navigation updates from the Geometry Collection Component TickComponent method to PostPhysicsUpdate one. Also cached RootIndex in the Geometry collection asset to avoid scanning through all the transforms each time to find it

  • Geometry Collections's bool-typed managed arrays now use BitArray instead of TArray in order to save memory

  • Geometry Collection Optimization: Only enable the primary Geometry Collection Component tick function when removal features are needed (after the root breaks).

  • Optimized the memory storage of Geometry Collection clustered particle flags.

  • Chaos now uses a smaller data type to store clustered particle properties when possible and better manage memory allocation when populating the connection graph.

  • Geometry Collection ISM Pool rendering optimization: Now uses new API to pass transform more efficiently by reducing array allocation.

  • Improved the convex collision generation of Geometry Collection by doing the following:

    • Added Dataflow node to generate Geometry collection cluster convex collision from leaf nodes.

    • Improved Fracture Editor convex visualization (display of convex union when parent convex is missing).

    • Added a column to the Fracture Editor Outliner showing the number of convex and when a parent is using a union.

  • Geometry Collection optimization: Changed GlobalMatrices array of FMatrix to ComponentSpaceTransforms array of FTransform. This reduces the number of back and forth conversion between FTransform and FMatrix.

Crash Fix:

  • Fixed a crash issue where clearing a Chaos property flag would cause it to try to remove a dirty proxy when that proxy still had dirty shapes.

  • Fixed an issue with cloth simulation where setting a new Skeletal Mesh asset would sometimes cause a crash.

  • Fixed Chaos unit test crash when using LevelSets in cluster union.

  • Fixed a potential crash in Geometry Collections when a physics state is created while the Rest Collection is not set. This may happen when adding a Geometry Collection component to a Blueprint while having it open for editing in the editor.

  • Fixed a crash when evaluating Dataflow terminal node from Blueprint with a name that does not exist in the graph.

  • Fixed a Chaos Cloth crash in FClothVisualization when the debug materials are loaded.

  • Fixed a crash in the Skeletal Mesh cloth painting tool caused by bone mapping indices left invalid after adding existing cloth data to a Skeletal Mesh asset using a different skeleton.

  • Fixed several bugs that could cause crashes when using Take Recorder while PIE was running with cloth simulations.

  • Fixed an issue where a Landscape would potentially dispatch a newly created physics Actor and then subsequently destroy the geometry it uses before the next physics update, leading to a crash due to use-after-free.

Bug Fix:

  • Fixed an issue where disabling a Geometry Collection particle could leave the particle in acceleration structures.

  • FReadPhysicsObjectInterface::AreAllShapesQueryEnabled now works on both external and internal contexts.

  • Chaos event dispatching no longer iterates through all the listeners even when there are no events to dispatch, resulting in a slight performance improvement.

  • Collision conversion now checks against the inner shape type to handle the case of a transformed union.

  • Applying external strain to a Geometry Collection particle should now apply even if that particle doesn't have children.

  • The Blueprint library function for finding the closest physics object will now filter based on whether the particle is enabled or not.

  • Fixed an issue where Chaos Fields would make all particles it made dynamic also enabled, which would cause Geometry Collection particles to collide against their root particle.

  • Removed ensure when drawing unions which have a single shape.

  • Fixed an issue where OnComponentPhysicsStateChanged was not getting called properly for Geometry Collections.

  • Fixed an issue where Geometry Collection events would not be registered properly after the Construction Script re-registers the component.

  • Fixed an issue where internal clusters were not being cleaned up property when children were removed from them, regardless of which path that removal came from.

  • Fixed an issue where Geometry Collection replication was relying on bFirstUpdate to determine whether or not to replicate a cluster. The particle level is used instead.

  • Fixed an issue where Geometry Collections would not properly pull the state from PrevData/NextData for some of its particles with non-interpolatable properties.

  • Fixed an issue where Geometry Collection particles were not being added to the external Scene Query queue. This ensures that they are always in the external Scene Query, even after it gets swapped.

  • Fixed an issue where Geometry Collection cluster particles had a cluster group index set on them when they were the root particle (does not have another parent).

  • Fixed an issue where the RewindData and MarshallingManager would have different sizes of their data history.

  • Fixed a crash happening when simulating physics with a Geometry Collection that has no rest collection assigned.

  • Fixed an issue where populating the physics replication cache consumed a lot of CPU time in levels with many Actors.

  • Fixed an ensure triggering from duplicate Geometry Collection particles caching in rewind data.

  • Fixed an issue that made all islands resimulate when one triggered a re-simulation.

  • Fixed an issue where the Geometry Collection RestTransform was not in sync with the RestCollection transforms, causing incorrect asset thumbnails.

  • Replaced an ensure by a non-breaking verbose log when not finding a supported collision type during cloth collision with the environment.

  • Fixed an issue in the Chaos Cloth editor where the transform gizmo and numeric input in the Preview Scene were out of sync.

  • Fixed an issue in Geometry Collections where the Mass attribute was being accessed as a Double, instead of a Float causing potential out of bounds access.

  • Fixed a Dataflow stack overflow in invalidation code when connecting nodes in a loop.

  • Made serialization of Dataflow node more robust to input and outputs changes.

  • Fixed the cloth painting material offset z-fighting with the source render section by adding a small normal offset.

  • Fixed a compilation error related to duplicated Solver symbols in TUserDataManagerPT::SetData_GT.

  • Fixed a Chaos Cloth crash when undoing mask targets in the Clothing window of the Skeletal Mesh editor.

  • New Geometry Collections now convert vertex colors from Linear to sRGB space for rendering by default, to match the behavior of Static Mesh rendering. Old assets keep the previous behavior for compatibility by default. Use the new ConvertVertexColorsToSRGB checkbox on a Geometry Collection asset to toggle this behavior.

  • Fixed an issue where in some cases Geometry Collection data would not be consistently updated, which caused an ensure on pressing 'Reset' in Fracture Mode.

  • Removed unnecessary tick function from event dispatcher base class which could lead to accumulating no-op ticks from Geometry Collection components in Post Physics tick groups.

  • Removed allocation of multi-find array in GetPendingCollisionForContactPair.

  • Fixed an issue where heightfield overlaps where not taking into account entire materials.

  • Reduced the stack reserved hit buffer sizes down to 16K from 64K in scene queries, still reserving 128 hits for queries prior to heap allocating.

  • Fixed the physics thread Geometry Collection Active attribute not being properly initialized (and taking one update cycle to do so).

  • Fixed a Fracture Mode issue where the alpha channel on Geometry Collection vertex colors would be reset to 1 when a Geometry Collection was fractured.

  • Fixed breaking model considering a parent multiple times when classifying required breaking particles.

  • Fixed children with strains not being processed when their parent cluster breaks.

  • Fixed an issue where IsHole for heightfields was returning True when no materials were present in the heightfield.

  • Disabled sleeping event handling in Geometry Collection event handler. This avoids multiple dispatches of identical sleeping events as they are handled by the scene.

  • Fixed an issue where changes to a Geometry Collection asset in Fracture Mode would not propagate to other Geometry Collection components using the same asset.

  • Updated Chaos Cache Managers to now work correctly when they're spawnable if they're observing components that belong to the cache manager itself. In particular, they will now work if they were created by adding a destruction Cache Collection to the scene. Cache Managers observing other components (e.g., cloth) continue to not be able to be spawnable.

  • Fixed an issue where FRewindData::RewindToFrame would keep dirtying particles/joints every rewind. If the game was constantly rewinding, this would cause the size of the FRewindData::DirtyParticles array to get too big.

  • Fixed an issue where Geometry Collection rendering would not match the Static Mesh rendering because the Static Mesh recomputed tangents and the Geometry Collection did not.

  • Fixed an issue where the GeometryCollectionComponent implicit generation was calculating incorrect sizes for box clusters.

  • Updated Chaos Cloth caching to store the necessary transforms to playback with the correct transforms. Existing caches will continue to work as before (e.g., if they did not require the additional transform information, they will continue to work).

  • Fixed an issue where undoing the creation of a new Geometry Collection would leave a broken asset, which could crash the editor if used. We no longer transact the creation of the Geometry Collection asset, so the asset will persist in a valid state.

  • Fixed an issue where a tiny triangle could make cloth simulation with self collisions very slow.

  • Fixed repeated calls to update Geometry Collection particle views during Geometry Collection proxy initialization.

  • Fixed an issue where the altered rigid clustering advance was considering all top level particles for breaks, instead of only considering the particles that were strained. This greatly reduces the steady state cost of the breaking model.

  • Fixed an issue in Geometry Collections where removal of random generated timer values were not consistent between client and server.

  • Fixed an issue with Geometry Collection caching where caching was not properly recording and replaying if the break event notification was not set on the Geometry Collection.

  • Fixed a Chaos Cloth bug where the shared config ownership was preventing a Skeletal Mesh asset from being saved after adding their clothing data to another Skeletal Mesh.

  • Fixed an issue where the Explode Amount slider was not working when the selected Geometry Collection was inside a Blueprint.

  • Fixed the Chaos Cloth Deformer when using a mirrored transform.



  • UE attempts to select the best solution when opening files using Visual Studio source code accessors.

Bug Fix:

  • Fixed clamping issue in SAnalogSlider where the MinValue and MaxValue were ignored when navigating with a controller. This behavior is now consistent when using a mouse or a controller.

  • Fixed a bug where navigating past the min or max value of SSlider would invalidate the widget and call a value change delegate despite not changing the value.

  • In USlider, fixed a MVVM notification and delegate that were not called when the value was changed from code.



  • Moved STextScroller implementation from CommonUI to Slate.

  • Added cache functionality to SDropTarget for expensive AllowDrop operations. This is turned off by default. By default, OnAllowDrop is called every frame, which is user bound. Setting bUseAllowDropCache to true will cache AllowDrop the first time it is called. The cache is cleared whenever a drag & drop operation starts.

  • Added OpenComboBox function to SObjectPropertyEntryBox widget

  • Added ObservableArray pattern to ListView, TitleView and TreeView in Slate. The TreeView implementation only supports the new pattern for the root items, as that is where performance improves the most when it is changed. The observable array automatically notifies the view when an item is added/removed from the array.

  • Slate batching improvements for large element sets:

    • Group similar elements at compile time using tuples.

    • Merge similar renderbatches in same-typed element buckets (currently for box and lines only).

    • Reserve verticies / elements in a batch before using them.

  • Slate element creation is now batched per element type to improve instruction coherency.

  • It is now possible in SHeaderRow to specify the text overflow mode by providing a value of type ETextOverflowPolicy to the new argument OverflowPolicy.

  • UE now resaves Slate PNG files with incorrect sRGB profile, logging PNG filename during libpng warnings and errors.

  • Added widget state, which is intended to be used by external systems to generically respond to widget changes regardless of type.

  • To avoid temporary array allocations per draw, Slate now uses static indexes for both text and shaped text where possible.

  • Retained widgets now group by element type.

  • You can now add a widget inside the global window overlay.

Bug Fix:

  • When UE creates a Modal window using FSlateApplication::AddModalWindow, if it can't find the Slate Virtual Window, it falls back to a non-modal window.

  • Slate only allows explicit navigation if the target widget is enabled.

  • SlateFontInfo now limits Outline to 1024.

  • Fixed an issue where a widget in scroll box could get stuck in its hover state.

  • Fixed issue where mouse position would not be calculated correctly when dragging a scroll area.

  • Added Variation Selector characters to the list of characters that require full text shaping.

  • Fixed scroll box scroll lag that occurred when scrolling by holding the scroll bar with the mouse.

  • Fixed an issue causing ellipsis to appear on multiple lines on multline text, and for each text block in each line for combination of multiline + rich text or multiline + bidirectionnal text, instead of having a single ellipsis as expected.

  • Fixed an issue causing ellipsis to not show or be misplaced on text with multiple runs, such as rich text or bidirectionnal text. This bug was more likely to happen on left to right text.

  • Fixed ellipsis not showing or showing the wrong side for multiline right-justified text, or right-to-left text that was left-justified.

  • Fixed a bug that prevented selecting an item in the list view when the list view was empty.

  • Combo boxes no longer always trigger a value change event when opened.

  • Added support for the -nullrhi command option to all standalone Slate applications.

  • Fixed an issue where tooltips could be spawned while not using a mouse.

  • The PropertyViewer's container now rebuilds when a Blueprint is recompiled. Depending on whether UE performed full rebuilds or skeletal rebuilds of Blueprints, they were not always marked as "newer class exists."

  • Fixed SlateTextureAtlas creating free nodes in empty slot lists that have dimensions smaller than what can be used by glyphs. The code previously created two nodes as long as one of them exceeds the minimum dimension. In practice, this results in iterating over 94+ unused elements each time a glyph is added. With this update, it should only create the smaller node if it exceeds the minimum.


  • Removed & deprecated FSlateDataPayload used by Slate elements. Relevant data is instead built into subclasses to avoid indirection. For example, instead of using FSlateBoxPayload, use FSlateBoxElement.



  • Adding Desired Focus widget to UserWidget. This new property makes it possible for the user widget to forward the focus to one of its children when it receives focus. It can be set at runtime and in UMG Designer as a default value.

  • URichTextBlock::ClearAllDefaultStyleOverrides is now BlueprintCallable.

  • Added OnIsItemSelectableOrNavigable delegate to list views.

  • UListViewBase: Added pure virtual OnIsItemSelectableOrNavigable function. OnIsSelectableOrNavigableInternal checks if OnIsItemSelectableOrNavigable is bound, and if it is, it returns its value.

  • IMPLEMENT_TYPED_UMG_LIST: Added OnIsItemSelectableOrNavigableDelegate. This oiverrides OnIsItemSelectableOrNavigable and returns OnIsItemSelectableOrNavigableDelegate.

  • Added support for specifying Input Configs from BP for activatable widgets.

  • Added several debug CVars to CommonUI:

    • CommonUI.Debug.WarnDesiredFocusNotImplemented – Provides a warning when activating widget without GetDesiredFocusTarget implemented.

    • Added CVars to track Input Config changes:

    • CommonUI.Debug.TraceConfigChanges

    • CommonUI.Debug.TraceConfigOnScreen

    • CommonUI.Debug.TraceInputConfigNum

    • CommonUI.Debug.CheckGameViewportClientValid – Provides a warning when using CommonUI without CommonGameViewportClient.

    • CommonUI.Debug.WarnAllWidgetsDeactivated – Provides a warning when deactivating all widgets.

    • Slate.Debug.TraceNavigationConfig – Logs when navigation config changes in Slate.

  • Moved UMG/FieldNotification files for Viewmodels to the FieldNotification module.

  • Added support for Viewmodel FieldNotify broadcast on Blueprint-defined variables.

  • Added Editor Utility version of UMG widget components to prevent serialization conflicts.

  • Added a delayed to when Viewmodel bindings are ticked by a world. If the widget changed worlds, the binding might not be ticked anymore.

  • Filter Viewmodel context creation type per class. Use MVVMAllowedContextCreationType or MVVMDisallowedContextCreationType to allow or disallow types.

  • Added COMMONUI_API to FUIInputAction and some related functions in UCommonUIInputSettings.

  • The View Binding picker now filters conversion functions by display name and by keyword.

  • In the View Binding panel, the Add button now adds the widget the user has selected in the UMG designer. You can change this behavior, and it is saved in a setting (Add Binding Mode).

  • Added support for ascent and descent override for FontFaces, which you can edit in the Font Face editor.

  • Added the ability to scale font size in the font editor's preview.

  • Views are no longer added to the WidgetBlueprintGeneratedClass if there are no bindings.

  • Added a Blueprint view to the AssetSearch. The module is not added by default because it depends on the AssetSearch plugin.

  • Added a menu extension to Viewmodel editor. The Bindings panel is now "MVVM.ViewBindings.Toolbar" and the viewmodel panel is "MVVM.Viewmodels.Toolbar"

  • Return the World of a widget when it's valid. Added a message when the widget cannot be added to the World.

  • Added the Viewmodel tag data to the UserWidget generated class. It was present on the blueprint asset but that data is not present in cooked build.

  • Added a callback to add tag data to a widget's generated class asset.

  • Added the Auto execution mode for Viewmodels. Auto will decide at compile time if it should run the binding immediately or on a delay. A binding will be run in delay mode if the binding can be triggered from more than one field.

  • Added extension to insert a Customization for the Designer DetailView from a Blueprint extension.

  • Removed the need to have a SourcePath for ComplexConversionFunction in Viewmodels. The source data is inside the function itself and the fieldnotify name is already saved in the class binding.

  • Updated GetBindingInfoFromFieldPath to support nesting a Viewmodel inside another Viewmodel.

  • Added a unit test for the GetBindingInfoFromFieldPath function.

  • Added DoesInitializeAtConstruction on the View class to support manual initialization. When the flag is false, the user is responsible for initializing the view.

  • Added ReevaluateSourceCreator for Viewmodels. A source discovered at compile time and added to the list of SourceCreator may need to be evaluated if the path contains a notify. This function is similar to SetViewModel but finds the new value from the SourceCreator.

  • Exposed Viewmodel properties to the Details panel. You can now inspect Viewmodels with the Object Inspector. You can then see which Viewmodel is attached/bonded to the View.

  • Added support for nesting Viewmodels inside Viewmodels.

  • Added support for Viewmodel sources that are not UserWidget properties. The compiler generates the missing path.

  • Viewmodels now use FText::Identical to compare FText.

  • Added Viewmodel performance stats to the runtime View.

  • Added an option to log all Viewmodel bindings after compilation. Enable the CVar MVVM.LogViewCompliedResult to log this information.

  • Added a virtual method so that CommonInputProcessor can be overriddenoverriden.

  • You can select an abstract class as a Viewmodel class, but you can't create an instance from an abstract Viewmodel class.

  • Added Resolver, a new way to select a Viewmodel. You can extend the Resolver and can implement your own logic on own to find/create the Viewmodel.

  • Updated style defaults on UMG widgets to use default style cache.

  • Added option to hide the BindingWidget, NavigationSimulation, Pallets, and Hierarchy windows from the UMG Designer.

  • Renamed CommonUI FUICameraConfig to FActivationMetadata.

  • Added a message at compile time notifying when 2 Views will be used at runtime.

  • Added unit test for FieldNotificationDelegate for Viewmodels.

  • Added support for custom pins for complex conversion functions.

Crash Fix:

  • Fixed a crash in the loading screen when clicking the X window button before the end of the Loading Screen.

Bug Fix:

  • Fixed an issue where multiple default action prompts could appear on CommonUI buttons when disabled and re-enabled.

  • Correction to Favorite features in UMG Designer to allow more than one Widget to be favorited when the Library Window is shown.

  • The Design View Widget sets the desired size of the selection border to 0 to prevent the UMG Design View from representing the layout of 0-sized widgets incorrectly.

  • Fixed an issue that prevented CommonUI actions from updating when the activated root doesn't support activation focus.

  • Applied fixes to Analog Cursor functionality to support gamepad-driven cursor movement.

  • Viewmodels are no longer overridden when set before widget initialization.

  • Fixed an issue preventing Blutility classes from being included in other modules.

  • The Viewmodel system now tests if the Binding library is loaded before accessing it.

  • Fixed an issue preventing users from renaming Viewmodels from the details panel.

  • Moved the Global Viewmodel Collection to GameInstance subsystem to allow PIE and splitscreen.

  • Fixed retainer widgets not rendering in editor. These are now configurable via 'Slate.EnableDesignerRetainedRendering'.

  • Fixed a bug where removing a View Binding didn't return the correct state of the bindings.

  • Fixed the order of delegates in Viewmodels when adding and removing delegates while a delegate is executing.

  • Before deleting a Viewmodel, UMG will now check if the Viewmodel is in use by looiking through its bindings and conversion functions.

  • Updated the compiler error message for Viewmodels when a field is not found, most likely due to a missing FieldNotify.

  • Fixed accessing private UFunctions in Viewmodels with AllowPrivateAccess.

  • Fixed the ViewModel IsBindingValid error message, which did not include the full property type.

  • Fixed Viewmodel field pickers that do not show function when there is no filter.

  • Added support for arrays of object bindings in Viewmodels (the same way BP does).

  • UMG now detects circular reference in the widget tree at compilation.

  • Fixed an issue preventing widgets from registering multiple enhanced input actions.

  • Fixed an issue which caused cached slots in the viewport subsystem to fail to update when modified in a Blueprint's construction script.

  • Fixed CommonUI Action Domains not resetting config on editor reload.

  • Changed the displayname of some Viewmodel properties.

  • Changed the error message for when a Viewmodel field does not exist to include a possible solution to the problem. This tests if the field exists on the downcast struct instead of the previous property owner struct.


  • Removed the specialized Viewmodel editor in favor of using the Blueprint base editor instead.

Virtual Production



  • Added a tool for making fine adjustments to the nodal offset by hand.

  • Added an anamorphic distortion model and support for calibrating an anamorphic lens to the Camera Calibration plugin.

  • [Remote Control] Exposed websocket server bind address in project settings.

  • [Aja] Add options for HDR support.

  • [Rivermax] Additions to Rivermax:

    • Added more logs in the output stream for missing chunks.

    • Changed rivermax output scheduling when stalls are detected.

    • Added a Rivermax TRO override console variable.

  • Added HDR support for blackmagic media output.

  • Added additional deinterlacing methods and the ability to provide your own deinterlacer for video input.

  • [Remote Control] Added a setting to control allowed origins.

  • Added new frame locking mode to Rivermax capture.

  • [Remote Control] Enforce passphrase usage for clients outside localhost by default.

  • Added OCIO support for Aja and Blackmagic media sources. You can now select an OCIO configuration to be applied to your SDI feed before it's displayed in the engine.

  • Added media capture markup to track frames.

  • Enabled new style output by default on any newly created media texture.


  • Changed Rivermax RTP timestamp to reduce media latency seen by analyzers.

  • Moved media capture sync point to its own thread for frame locking work.

Crash Fix:

  • Added protection against crash during Rivermax initialization when prerequisites are not met.

  • Fixed a Remote Control crash that occurs when invoking a setter method on a property in CreateRCCall.

Bug Fix:

  • Fixed Media Plate tiles and mips support in scene captures.

  • Fixed an issue where pre-cached EXR tiles missed updates with the Media Plate.

  • [Remote Control] Fixed Websocket server from keeping port open after changing it.

  • [Remote Control] Fixed remote control presets sometimes not finding objects in Play-In-Editor (PIE).

  • Fixed a race condition preventing Rivermax input stream to play.

  • Fixed remote control crashes:

    • GEditor was accessed without testing for nullptr.

    • PropertyWatchers are now only used in -game except for transform properties.

    • In PropertyWatcher->CheckForChange, IsIdentical was called on LastFrameValue.GetData without first checking if the last frame value had any data in it. LastFrameValue should now be correctly initialized if it couldn't be done at the creation of the property watcher.

  • Fixed Media Capture pooled render targets becoming invalid in the rendering thread during garbage collection.


  • Deprecated the UImgMediaPlaybackComponent and its functionality has been entirely superseded by the Media Plate.

  • [Media Capture] Deprecated FMediaCaptureOptions ResizeSource in favor of ResizeMethod.



  • Added a new tab to the ICVFX panel to display the stage actor's details panel and components list. This allows users to edit any property on the stage actor without needing to go to the level editor window.

  • Added ability to alphabetically sort nDisplay cluster nodes and viewports in the tree view in the nDisplay editor.

  • Added global chroma key settings to nDisplay stage actor that can be used by any ICVFX camera, as well as for any overlapping chromakey when enabled.

Bug Fix:

  • Ensured the media plate material instance constant is properly transacted.

  • Fixed OpenColorIO display-view transforms not working on nDisplay nodes.

  • Fixed an issue where the buttons on the left panel of the color grading drawer overlap with other UI elements if the splitter was dragged too far to the left.

  • Fixed UDisplayClusterGameEngine::Init potentially corrupting command-line arguments during parsing. If a quoted argument contained a space (such as a path), other common sequences such as \n and \t, or octal escapes, were mishandled.


  • Deprecated the Custom Chroma key Enable flag, which has been replaced by a combo box in the parent chroma key settings that determines what kind of chroma key is used for the ICVFX camera.


API Change:

  • Assets must be re-saved to gain efficiency improvement. The asset must also be resaved if the configuration changes or when the library version is updated.


  • Exposed OpenColorIO CPU color transforms on textures to editor blueprints.

  • Exposed OpenColorIO active viewport configuration control to editor blueprints.

  • Improved OpenColorIO asset load times by caching generated resources into the UAsset.

  • Added premultiplication and alpha inversion controls to the OpenColorIO public rendering interface.

  • Added OpenColorIO support for automatic conversions to and from the engine working color space when configs have a defined interchange color space.


  • Updated default media plate material in Composure to new style output (regular color texture sampler).

Bug Fix:

  • Fixed in-game OpenColorIO to ensure it remains active when a high resolution screenshot is taken.

  • Patched the OpenColorIO library to disallow 1D texture resources.

  • Added the option to select .ocioz files in OpenColorIO configs.

  • Fixed texture Derived Data Cache (DDC) invalidation for advanced source color and encoding settings.



  • CineCameraRigRail updates:

    • Added checkbox option to set all inheritance options at once.

    • Added option to visualize and manipulate point rotation in the context menu.

    • Implemented Drive Mode in the rig rail.

    • Implemented speed visualization in the rig rail.

  • Disabled speed heatmap when CineCameraRigRail is driven by Sequencer.

  • Added a mechanism to multi-user which enables clients to request preloading of level sequence assets.

  • Integrated the new multi-user level sequence preloading functionality into Sequencer Playlists.

  • Reintroduced the bCheckReferencesOnDelete editor setting. This is used by stage operators to prevent long running operations in fast paced environments.

  • Render Grid plugin:

    • Made the render grid blueprint graph be an editor-time blueprint graph, to support editor-only blueprints.

    • Made non-transient variables in render grid assets work again.


  • Fixed jumping current position when switching drive mode.

  • Fixed several bugs and issues in Render Grid plugin:

    • Added multiple new blueprints.

    • Added additional python example scripts

    • Cleaned up the render grid UI.

Bug Fix:

  • [Virtual Scouting] Fixed user getting stuck and unable to deselect actors if both hands are holding an interact tool. Second tool now falls back to the navigation tool if the context menu is activated.

  • [Virtual Scouting] Prevent users from selecting zoom lens in VR Viewfinder. If lens options are changed during editor session by editing Project Preference > Cinematic Camera, VR Viewfinder will respect newly added lenses.

  • [Virtual Scouting] Disabled collision on camera mesh in Viewfinder tool.

  • The UDP message processor does not start processing messages until the PostDefault phase of engine startup. Users should not rely on the UDP message processor at startup.

  • Fixed missing key frames when importing 30 FPS ARKit takes recorded by the Live Link Face iOS app, using the Live Link Face Importer plugin.

Upgrade Notes



Upgrade Notes:

  • Added the Animation Compression Library (ACL) Plugin as an Engine plugin and set the ACL Plugin as the default animation compression codec. Licensees already using the ACL Plugin from the Unreal Marketplace with binary builds of the engine will automatically upgrade to the new version. Those using a source version of the ACL Plugin will have to remove their old version and bring any code changes manually over. New animations will use the ACL Plugin while old animations will continue to use their current codec.


Upgrade Notes:

  • [Sequencer] Duplicating a shot or creating a new take now retains the shot's color tint.


API Change:

  • Added API to NodeTestGraphBuilder to explicitly define custom names when connecting input/output nodes to the test graph.



Upgrade Notes:

  • Deprecated TDepletableMpmcQueue as it uses spin-waiting that can cause priority inversion and subsequently deadlock on some platforms. Use TConsumeAllMpmcQueue instead of TDepletableMpmcQueue.

Dev Tools

Upgrade Notes:

  • LazyObjectPtr and ObjectPtr are no longer allowed as TMap keys in blueprint-enabled function arguments.Functions utilizing TMaps with an ObjectPtr as a key must be changed to use the raw pointer.


Blueprint Editor

Upgrade Notes:

  • Input Event nodes are no longer allowed in animation blueprint event graphs. Instead, set a property value on the animation blueprint and set it in an input-enabled actor.


Upgrade Notes:

  • [Modular Gameplay Effects - Gameplay Ability System (GAS)] Moved some gameplay effect functionality into optional components. All existing content will automatically update to use components during PostCDOCompiled, if necessary.

  • Changed the default aspect ratio constraint to maintain Y FOV since camera FOV is now always handled as horizontal FOV. If preserving the exact framing for a given window size is important, you can specify the old setting value (maintain X FOV) in DefaultEngine.ini.

  • Added Enhanced Input User Settings, which stores player mappable keys and other input settings in a save game object. This feature is off by default and can be enabled in the Enhanced Input developer settings or in a config file.

  • Made the behavior of Enhanced Input when flushing the pressed keys consistent with the legacy system. This behavior is Default ON, but can be toggled off in the Project Settings > Enhanced Input.

Level Design and Art Tools

Geometry Core

API Change:

  • Added a new FLocalPlanarSimplify class to provide an algorithm to locally simplify triangles connected to a specified set of edges, which is useful to improve mesh quality after operations that tend to add extra vertices only in known regions of a mesh – such as plane cuts and polygroup edge insertions. It is now used by the FMeshPlaneCut algorithm to improve the resulting mesh quality.

Modeling Tools

Upgrade Notes:

  • The MatEd tool now warns the user if they have removed materials that are used by the mesh. If the user accepts the result with this warning active, the faces that used the removed material will be re-assigned a valid material, so the MatEd tool now cannot create meshes with invalid material assignments.


Upgrade Notes:

  • The Spline Sampler now has a toggle to choose between bounded and unbounded sampling. To preserve behavior, previous Spline Samplers will remain unbounded. Newly created samplers will be bounded by default.

  • The Difference Node now better adheres to a common standard. Source Inputs are iterated on and Difference Inputs are combined into a union before the operation takes place. Previous nodes will receive an injected Union node along their input edge to preserve older behavior.

  • Refactored usage of TargetActor so it is used to do artifact targeting. In PCG blueprints, instead of using the TargetActor variable on PCGSpatialData, please use the GetTargetActor call on the PCGContext, passing it the previously used PCGSpatialData. When retrieving the target actor, use Context->GetTargetActor(SpatialData) instead of SpatialData->TargetActor.


Online Subsystem

Upgrade Notes:

  • Refactored OSS EOS logic surrounding setting the BucketId for Sessions and Lobbies on creation and searches. Any BucketId can be set now from the game side by adding a setting with the following key FOnlineSessionSettings::Settings: OSSEOS_BUCKET_ID_ATTRIBUTE_KEY

  • Added config toggle for OSS EOS to use EOS_Achievements_UnlockAchievements instead of unlocking achievements through stats. Added deprecation marker for stat implementation, to be removed in 5.4. To be added to a relevant engine config file: [OnlineSubsystemEOS] bUseUnlockAchievements=True

  • Added bUsesPresence as an attribute in OSS EOS Sessions and Lobbies to retrieve it reliably instead of inferring it from other data. Wrapped new logic in config option bUseSessionPresenceAttribute. To be added to a relevant engine config file: [OnlineSubsystemEOS] bUseSessionPresenceAttribute=True

Pixel Streaming

Upgrade Notes:

  • Multiple Pixel Streaming streamers supported on one signaling server. This requires streamer id to be uniquely set and the updated Pixel Streaming infrastructure from Github.



Bug Fix:

  • Fixed a bug related to light bounds for volumetric fog rendering.



Upgrade Notes:

  • Added Predictive Interpolation, a new type of physics replication. Predictive Interpolation is a replication method that replicates behind the last received state from the server (interpolates), while still allowing for local physics manipulation (predictive). This replication is experimental and still a work in progress. The replication can be accessed by switching on Physics Prediction in Project Settings and then setting the Physics Replication Mode to Predictive Interpolation on the actor. Ensure the actor is set to replicate, replicate movement and the root component to simulate physics.

  • [Geometry Collection] The 'Bone Selected Material' has been removed from the user-facing materials list on Geometry Collection Components, simplifying the user experience, and removing the ability for the user to break Fracture Mode selection visualizations by changing this material.



Upgrade Notes:

  • Exposed the console variable Slate.EnableInvalidationPanels to shipping builds. Ensure the console variable is not in your .ini file to keep the previous behavior.


Upgrade Notes:

  • Added viewmodel capability on all blueprints that implement the notification interface and removed the hidden viewmodel editor from the build. If you used the old editor, the regular blueprint editor should take over but you'll need to mark your properties as FieldNotify manually.

Virtual Production


Upgrade Notes:

  • Enabled multi-user support for Procedural Content Generation (PCG) actors.

  • GPU Memory and CPU Memory stats have been added to the Stage Monitor Tool.

  • Landscape Actor support has been enabled for multi-user.

  • Multi-user session information has been exposed in editor-only blueprints.

  • Improved the display of Live Link Face App in Switchboard tool.

  • Added multi-user custom event sequencing.

  • The UE_ADDITIONAL_PLUGIN_PATHS environment variable is now only supported in editor builds.

Help shape the future of Unreal Engine documentation! Tell us how we're doing so we can serve you better.
Take our survey