Unreal Engine 5.0 Release Notes

Overview of new and updated features in Unreal Engine 5.0

What's New

Unreal Engine 5.0 enables game developers and creators across industries to realize next-generation real-time 3D content and experiences with greater freedom, fidelity, and flexibility than ever before.

We are empowering big and small teams to really push the boundaries of what's possible, visually and interactively, with the ability to:

  • Leverage game-changing fidelity: Bring incredibly immersive and realistic interactive experiences to life with groundbreaking new features like Nanite and Lumen that provide a generational leap in visual fidelity, and enable worlds to be fully dynamic.

  • Build bigger worlds: Think big, really big. Unreal Engine 5.0 provides the tools and assets you need to create truly expansive worlds for your players to explore, using content that scales.

  • Animate and model in context: New artist-friendly animation authoring, retargeting, and runtime tools—together with a significantly expanded modeling toolset—reduce iteration and eliminate round-tripping, speeding up the creative process.

  • Get up to speed faster: With a modern, flexible UI that offers an enhanced user experience and increased efficiency; updated industry-specific templates that act as more useful starting points; and migration guides that provide a smooth transition from previous versions for existing users, Unreal Engine 5.0 is easier to adopt and learn than ever before.

This release includes improvements submitted by the incredible community of Unreal Engine developers on GitHub! Thanks to each of these contributors to Unreal Engine 5.0:

AlexThiv, alwintom, aidinabedi, aknarts, anon-oss, congyue1977, Deathrey, Dyanikoglu, dorgonman, error454, erebel55, foobit, fieldsJacksonG (Microsoft), ggsharkmob, hach-que, iniside, ImaginaryBlend, IgnacioFDM, (Intel), jorgenpt, kasp1, Kirchesch, liuhao0620, matthewjnv (Nvidia), Mastercoms, Muchcharles, projectgheist, , RandomInEqualities, Stanley1108, scorpio20t, tuxerr, (Oculus), TheoHay, velvet22,


Lumen Global Illumination and Reflections

Lumen is a fully dynamic global illumination and reflections solution that immediately reacts to scene and light changes, offering artists and designers the ability to create more dynamic scenes with greater realism. Changing the angle of the sun, turning on a flashlight, opening an exterior door, or even blowing up a wall will cause a change to indirect lighting and reflections.

The system renders diffuse interreflection with infinite bounces and indirect specular reflections, highlighting even the most minute details within expansive, elaborate environments.

Lumen Global Illumination and Reflections Enabled

Lumen Global Illumination and Reflections Disabled

Artists and designers are no longer tied to static scenes with precomputed lighting baked into textures—a huge time saving when you can see the results of changes right in the editor without needing to rebuild lighting, or to set up lightmap UVs for individual Static Meshes.

Lumen implements efficient Software Ray Tracing, allowing for global illumination and reflections to run on a wide range of video cards, while supporting Hardware Ray Tracing for high-end visuals.

Since the launch of Unreal Engine 5 Early Access, Lumen has seen the following improvements:

  • Full Hardware Ray Tracing pipeline for Lumen GI and Reflections

  • Shipped on next-gen consoles in The Matrix Awakens

  • Support for large view ranges with Far Field Hardware Ray Tracing

  • Feedback driven Surface Cache, giving higher quality in reflections

  • Lumen visualization view modes for troubleshooting content

  • Improved Final Gather quality, especially visible on foliage

  • Improved Reflections denoiser, especially for glossy reflections and behind moving objects

  • Translucency Final Gather, which improves global illumination quality on translucency and Volumetric Fog

  • Landscape support

  • Radiosity Final Gather, which improves the quality of multi-bounce global illumination and GI seen in reflections

  • Lumen settings exposed to the user interface for quality/performance tradeoffs

  • Subsurface / Two-Sided Foliage shading models supported

For more, see the Lumen Global Illumination and Reflections documentation.

Nanite Virtualized Geometry

Nanite's virtualized micropolygon geometry system enables developers to create games with massive amounts of geometric detail. You can directly import film-quality source art composed of millions of polygons — anything from ZBrush sculpts to photogrammetry scans — and place them millions of times, all while maintaining a real-time frame rate, and without any noticeable loss of fidelity.

Nanite intelligently streams and processes only the detail you can perceive, largely removing triangle count and draw call constraints. It eliminates time-consuming work, such as baking details to normal maps and manually authoring levels of detail, freeing you to concentrate on creativity.


Since the launch of Unreal Engine 5 Early Access, Nanite has seen the following improvements:

  • Optimization controls to reduce the size of Nanite meshes on disk.

    • This allows for optimization of meshes during development by removing the least significant data first so that it's more akin to lossy compression. For example, in the technical demo "Lumen in the Land of Nanite," the chest piece of one of the statues was able to lose 88% of its triangles (and disk size) without any noticeable differences.

  • Compression improvements resulting in ~20% smaller disk footprint for Nanite meshes at the same quality.

  • For projects converting from UE4 to UE5, the Nanite Auditing Tool can assist with moving a lot of existing content over to use Nanite and to diagnose Nanite content that becomes broken during development, such as unsupported features being enabled.


    • The tool audits Static Meshes in two categories:

      • Errors displays issues with Nanite-enabled meshes, such as material incompatibilities with alpha test, world position offset, pixel depth, and so on.

      • Optimize displays opportunities to enable Nanite on non-Nanite meshes, assuming no incompatibilities are detected.

    • Access this tool from the main menu by selecting Tools > Nanite Tools

  • Nanite meshes now support general view modes like Wireframe and Shader Complexity Optimization.

    • The Shader Complexity view mode shows a heatmap of shader instruction counts per pixel, encompassing all rendered objects. Nanite's existing Material Complexity view mode shows a heatmap of the number of unique materials on Nanite geometry only per 8x8 tile, which is a useful metric for determining material coherency in the Nanite pass.

  • Improvements for Nanite meshes to support lightmaps without artifacts on UV seams.

  • Nanite now requires DX12 on Windows. DX11 is no longer supported.

For more, see the Nanite Virtualized Geometry documentation.

Virtual Shadow Maps (Beta)

Virtual Shadow Maps provide the next generation of dynamic shadowing for real-time, taking advantage of Unreal Engine 5's Nanite, and World Partition features. They offer consistent high-quality shadows, as needed for film-quality assets and large open worlds.

Traditional dynamic shadowing techniques have often been limited to small and medium-sized worlds, forcing designers and artists to sacrifice quality for performance. By contrast, Virtual Shadow Maps offer a single unified shadowing method that automatically applies quality where it is needed most. Shadows can now have consistent quality for small and large objects over greater distances—with realistic soft penumbra and contact hardening.

Percentage-Closer Filtering (PCF) blurs uniformly,|removing important detail

Shadow Map Raytracing (SMRT) produces plausible|soft shadows with contact hardening

Since Unreal Engine 5 Early Access, the Virtual Shadow Maps system has received the following improvements:

  • New visualization modes for the Level Editor


  • Improved scenes with foliage by integrating Virtual Shadow Maps with Distance Field Shadows for far-field rendering

  • Added support for more geometry types

  • Added support for (simple) SubSurface and Foliage Materials

    • Subsurface Profile and Transmission are not yet supported

  • Improved robustness, performance, and quality for caching

  • Support for Large World Coordinates

  • (Experimental) Support for Separate Static Caching

  • Virtual Shadow Maps now require DX12 on Windows. DX11 is no longer supported.

For more, see the Virtual Shadow Maps documentation.

Temporal Super Resolution

Nanite micropolygon geometry and the fidelity demands of next-generation games have increased the amount of detail that is possible to display on screens like never before. To meet those demands, the Temporal Super Resolution algorithm has been developed from scratch as a replacement for Unreal Engine 4's Temporal Anti-Aliasing (TAA) for higher-end platforms.

Temporal Super Resolution provides native high-quality upsampling built into Unreal Engine and supports a broad array of hardware. Temporal Super Resolution is the default anti-aliasing method and is enabled for all projects.

Temporal Super Resolution has the following properties:

  • Output approaches the quality of native 4K renders with input resolutions as low as 1080p, allowing for both higher frame rates and better rendering fidelity.

  • Less ghosting against high-frequency backgrounds than was visible with UE4's Temporal Anti-Aliasing.

  • Reduced flickering on geometry with high complexity.

  • Supports Dynamic Resolution Scaling on consoles.

  • Runs on any hardware that supports D3D11, D3D12, Vulkan, Metal, PlayStation 5, and Xbox Series S|X.

  • Supports DirectX 12 Shader Model 6.

  • Shaders have been specifically optimized for PlayStation 5 and Xbox Series S|X GPU architectures.

In the comparison below, we show the quality and performance differences between captured frames rendered at native 4K and 4K rendered at 1080p resolution upscaled. Using Temporal Super Resolution, it is possible to achieve image quality near native 4K resolutions and reduce GPU frame time by nearly 50%.

4K frames rendered at Native 4K resolution|Frame Time: 57.50 ms

4K frames rendered at 1080p resolution (r.ScreenPercentage=50)|Frames Time: 33.37 ms

In each of the comparison images, the 4K images are limited to the width of this page. To see their full, uncompressed resolution, Right-click on either image and choose Open in New Tab or Save image as.

Path Tracer Improvements (Beta)

The Path Tracer continues to see improvements in Unreal Engine 5.0 with its physically correct and compromise-free results. It can be used for ground truth comparisons, standalone frame renders, and with Sequencer's Movie Render Queue to render frames for high-quality cinematics.

This release has improvements with:

  • Material Support:

    • Eye

    • Hair (experimental)

    • Alpha Channel

  • Native ray-traced Depth of Field

  • Solid glass now supports color absorption (using Beer's law), which allows for realistic coloring of refractive glass

    image_10.png image_11.png image_12.png image_13.png

  • A PathTracingQualitySwitch expression that allows artists to develop the behavior of their materials for the Path Tracer without compromising the look and performance of the raster path for real-time

  • Improved sampling and performance

For additional information, see the Path Tracer documentation.

Local Exposure Post-Processing

Local Exposure is a new technique that automatically applies local adjustments to exposure—within artist-controlled parameters—to preserve both highlight and shadow detail, on top of the existing global exposure system.

This is especially useful for projects with challenging high-dynamic-range scenes using dynamic lighting, in which applying a single global exposure adjustment is not enough to avoid blown out highlights and completely dark shadows.

For example, in games with dynamic time of day systems, players can easily encounter scenes with both under- and over-exposed areas in the final image, such as indoor scenes with very bright outdoors visible through a door or window, which can be problematic for gameplay. Using Local Exposure helps achieve a more consistent final image when carefully crafted lighting per scene is not feasible.

Local Exposure: Enabled

Local Exposure: Disabled

Local Exposure properties are found in the Post Process Volume settings under the Lens > Local Exposure category.


To see how Local Exposure is being applied to the scene, use the visualization found in the Level Viewport's Show > Visualization menu.


To learn more about Local Exposure, see Auto Exposure.

Post-Motion Blur Translucency

Certain effects (such as in-world UI elements) suffer from quality degradation and artifacts when rendered in the current translucency passes due to post-processing effects such as Motion Blur and Temporal Anti-Aliasing.

Unreal Engine 5.0 introduces a new Post-Motion Blur Translucency pass that gives artists a way to create translucent Materials that are not affected by Motion Blur or Temporal Anti-Aliasing.

You can assign translucent Materials to the Post-Motion Blur pass in the Details Panel properties of the Material. Under the Translucency > Advanced section, select After Motion Blur from the Translucency Pass drop-down menu.

Particle system with Motion Blur

Particle system in the After Motion Blur Translucency pass

Depth Test is not currently supported by this pass. This means that objects rendered After Motion Blur cannot be occluded by other objects in the scene, even if they are closer to the camera.

Material Editor Collapsible Nodes

Collapse Nodes is a new feature in the Material Editor that gives you the ability to collapse a selection of Material Expressions or Functions into a single node in the Material Graph. This allows you to simplify the appearance of complex Material networks, making them easier to read and interact with. At any time, you can revert Collapsed Nodes to their original configuration by right-clicking a Collapsed Node and choosing Expand Node from the context menu.


DirectX 12

Microsoft's DirectX 12 (DX12) is now the recommended RHI for Windows PCs using Unreal Engine 5 features. As DX12 support matures in the engine, memory management, feature completeness, and stability are top priorities. Newly created projects in Unreal Engine 5 will use DX12 by default.


The Vulkan RHI has received numerous stability and feature updates in Unreal Engine 5 that improve usage for both desktop and mobile. This includes support of Unreal Engine 5 features like Nanite and Lumen (with software ray tracing only) on Linux.

For requirements, see the Hardware and Software Specifications documentation.

World Partition for Large, Open Environments

World Partition is an automatic data management and streaming system used both in the Editor and at runtime, which completely removes the need to manually divide the world into countless sublevels to manage streaming and reduce data contention.

Using World Partition, the world exists as a single persistent level. In Editor, the world is split using a 2D grid and data is partially loaded based on your area of interest using the World Partition editor window. This makes it possible to handle massive worlds that would otherwise not fit in memory or take a long time to load. When cooking or launching PIE, the world is divided into grid cells optimized for runtime streaming, which become individual streaming levels.


World Partition has continued to receive improvements since the Unreal Engine 5.0 Early Access release:

  • New Open World and Open World Empty default map types

  • Streaming sources now support custom shapes

  • Support for Landscape brushes

  • New Builder commandlets to automate batch processes and generate or modify data in World Partition levels

World Partition is enabled by default when using many of the New Project templates designed for Games, as well as the Open World and Open World Empty map types.

For more information on using World Partition, please see our World Partition documentation.

Data Layers for World Partition

Data Layers for World Partition is a system designed to conditionally load world data by activating and deactivating layers in the editor and at runtime. Data Layers are an excellent way to organize your world in the editor. You can also use it to handle different scenarios in your game and create different variations of the same World. This is great for different setups for night and day, or changes to the world after completing quests.

You can control Data Layers from the Data Layers tab in the Editor or from Actors' Details panels.


For more, see the World Partition - Data Layers documentation.

One File Per Actor

The new One File Per Actor system works with World Partition to make collaborative editing in a large world much easier. The level editor saves individual Actors to their own files, rather than grouping them all into a single, monolithic level file. This means users only have to check out Actors they really need from source control, rather than the entire level.

This feature is now enabled by default when using World Partition.

For more, see the One File Per Actor documentation.

Automatic Grid-Based HLODs

Working with World Partition, the Automatic Grid-Based Hierarchical Level of Detail (HLOD) system creates custom, data- driven HLOD Layers to optimize large numbers of Static Mesh Actors being displayed outside the loaded area. This feature provides a minimal set of HLODs using instanced static mesh components (ISM) or visible proxy meshes over unloaded World Partition grid cells, reducing the number of draw calls, and boosting performance.


These proxy meshes are generated using the original Actor geometry and are simplified to reduce memory usage.

For more, see the World Partition - Hierarchical Level of Detail documentation.

Large World Coordinates

Large World Coordinates (LWC) introduces support for double-precision data variant types in Unreal Engine 5 where extensive changes are being implemented across all engine systems to improve floating-point precision. These systems include Architectural Visualization, Simulation, Rendering(Niagara and HLSL code), and projects with massive world scale. While much work has been done to make sure Large World Coordinates are performant and exposed everywhere in UE5, there are still some limitations in some systems at large distances from the origin due to precision issues we haven't yet addressed for launch.

Licensees can begin to move their code over to these new data types immediately, but full support for creating and populating large worlds will come in 5.1 after we have verified all the systems in the engine work as effectively at large scales as they do at current ones. Then, we'll set the maximum world size default variable to absolutely massive scales.

In Unreal Engine 4, 32-bit float precision types would restrict the size of the world. LWC vastly improves the size of your projects by providing a 64-bit double to your core data types. These new changes will enable you to build massive worlds and greatly improve Actor placement accuracy and orientation precision. Since Large World Coordinates uses the double type, the PhysX physics system is not compatible with UE5.

For information on experimenting with large worlds, see the Large World Coordinates documentation.


Control Rig Improvements

Control Rig is now Production-Ready and enabled by default, with several new tools, features, and modes to help you rig and animate your characters in Unreal Engine 5.0.

Animation Mode

Animation Mode has been improved to provide you with a more animation-friendly interface.

The Anim Outliner and Anim Details panels contain a filtered list of your Controls and properties, making it easier to manage your selections and keyframe attributes.


Several tools are also provided to aid your animation workflows. These include the Pose Tool, where you can save and reuse pose data for your Controls, and the Motion Trail Tool, where you can visualize the movement of keyframes in the viewport.


To learn more about Animation Mode, refer to the Animation Mode page.

Space Switching

Controls can be quickly and easily re-parented by using Space Switching. Using this feature, new spaces can be created in real time and keyframed within Sequencer, or pre-built in the Control Rig Asset. As a result, you can now dynamically change the spatial parent of your Controls without needing to create complex constraint-switching logic.


To learn about how to use Space Switching when animating, refer to the Space Switching page.

Graphing Improvements

We have added and improved several graphing behaviors when creating Control Rigs, in order to align more closely with Blueprint workflows.

You can now create Functions within Control Rig. With functions, you can better organize large graphs, repeat logic, and easily share functionality across Control Rigs.


Arrays can also be created and stored, making it easier to manage a set of items. This new Array type replaces the Collection type and comes with a rich set of new nodes to add, remove, and work with Array items.


Python Scripting

Python Scripting can now be used in Control Rig to automate workflows and create tools for the rigging process. You can also use the Control Rig Python Log to reverse-engineer commands and copy scripts to share to other projects.


Visit the Control Rig Python Scripting page to learn more about it.

IK Rig and IK Retargeter

The new IK Rig system provides a method of interactively creating IK solvers (including the new Full-Body IK), and then defining target goals for them. The resulting IK Rig Asset can then be embedded into an Animation Blueprint where the goals can be controlled at runtime. This new method of retargeting deprecates and replaces the Retarget Manager from Unreal Engine 4.


IK Rigs can also be used to create improved animation retargeting between different Skeletal Meshes by using the IK Retargeter. With this new retargeting system, you can accurately transfer animation between any two Skeletons; either at runtime or by generating duplicate animation Blueprints and sequences using the offline exporter.


To learn more about IK Rigs and IK Rig Retargeting, visit the IK Rig page.

Blend Space Improvements

Blend Spaces have been improved in Unreal Engine 5.0, and now contain an array of new features and behaviors.


Smoothing has been overhauled, where you can now easily set different smoothing types and times. You can select several types of interpolation, such as Linear, Ease In/Out, or Spring Damper.

For more information on the different smoothing properties, you can refer to the Blend Space Asset Details section.


Blend Space Graphs

Blend Spaces can now also be created directly in your Animation Blueprint by creating Blend Space Graphs. With these graphs, you can create bespoke Blend Spaces for your Animation Blueprint, diverge them from other assets, and edit sample logic.

To learn more about Blend Space Graphs, refer to the Blend Spaces in Animation Blueprints page.


Blend Space Analysis

Blend Space sample placement and management can now be automated by using Blend Space Analysis. Several analysis functions are provided, which cover most typical Blend Space setups, such as locomotion, aiming, and more.

To learn more about Blend Space Analysis, refer to the Blend Space Analysis page.


Rewind Debugger

Animation debugging has been improved with the introduction of the Rewind Debugger. This tool provides a captured gameplay timeline of actors and animation events that can be paused, stepped, and rewound to specific points in time. You can also easily select Actors and Objects in the scene to debug. With the Rewind Debugger, you can now have a deeper understanding of how your gameplay animations are functioning as they play live.

Skeleton Improvements

Animation Mirroring

You can now mirror your character animations easily in Animation Blueprints using the Mirror Data Table and Mirror node. With the Mirror Data Table, you can mirror not only your Animation Sequences, but also curves, sync markers, and Notifies.

Visit the Mirroring Animation page to learn more about this feature.


Skeleton Compatibility

The new Skeleton Compatibility property allows different Skeletons to share their data, without having to engage in lengthy retarget or reimport workflows. Using this feature, you can easily make similar Skeletons share their animation data, such as Animation Sequences, Animation Blueprints, or Blend Spaces. Skeleton compatibility requires bone names to match between the skeletons for them to be compatible.


Locomotion Improvements

Unreal Engine 5.0 now includes features for adapting animations for various gameplay scenarios

Distance Matching

Procedurally manage the speed and playback of your gameplay animations by using the new Distance Matching features in your Animation Blueprint. Distance Matching synchronizes animation playback to the character motion using animation curve data. You can combine this adjustment with Stride Warping to resolve common issues with feet sliding.



No Distance Matching

Using Distance Matching

Pose Warping

You can now procedurally alter a character's stride direction, walking speed, and foot placement by using Pose Warping. Pose Warping is a new set of Animation Blueprint nodes that can dynamically warp components of animation poses. Using these nodes will reduce the manual work needed to develop complex animations for your character.

Visit the Pose Warping page for more information about the new nodes and their functions.



No Orientation Warping

Using Orientation Warping

Motion Warping

Dynamically warp the root motion of a character by using the new Motion Warping feature. Using Motion Warping, you can define "warping windows'' using Animation Notifes, then configure these windows in Blueprints to warp to arbitrary targets.

For more information, visit the Motion Warping page.


Machine Learning Deformer

You can now create real-time mesh deformation by using the new Machine Learning (ML) Deformer. The goal of the ML Deformer is to bring film-quality offline processed deformations to real-time. This works by applying corrective deformations on top of a linear skinned Skeletal Mesh. Applying these corrections will make it look closer to the offline simulated deformations. The correctives are learned by a machine learning algorithm.

In order to train the ML Deformer, it needs thousands or tens of thousands of example poses that are deformed using both the complex deformation and using linear skinning. The deformer will then learn these differences and apply them at runtime. To help generate training data, we have also created a Maya plugin, although it is not required to use this.

This feature is still highly experimental. The memory requirements are quite high, and performance is not optimal yet.

To learn more about how to use the ML Deformer, visit the Using the Machine Learning Deformer page.




Analogous to a fully programmable material and rendering pipeline like the Material Editor, the new system lets you manage all aspects of audio rendering to drive next-generation procedural audio experiences.

MetaSounds provide sample-accurate control and modulation of sound using audio parameters and audio events from game data and Blueprints. They also offer the ability to compose MetaSounds within MetaSounds, define and implement parameter interfaces, and use a preset system which streamlines user workflow.

MetaSounds also come with significant improvements to performance over Sound Cues and offer a fully extensible API that can be used by third-party plugins.


Project Acoustics


Epic has collaborated with the team from Microsoft's Project Acoustics to develop a deep integration of their plugin for UE5. Project Acoustics is a next-generation baked acoustic system that allows for simulation of audio propagation, reverb, and other advanced acoustics processing. Focused on performance and scalability, Project Acoustics is already utilized in many AAA games and will be available for all licensees on the Unreal Marketplace soon.

You can learn more about Project Acoustics by reading the Project Acoustics Overview documentation from Microsoft.

Geometry Tools

Geometry Tools provide Unreal artists in all industries a wide array of tools for the creation and editing of meshes in all resolutions. UE 5.0 contains a host of new and improved tools for modeling, baking, and UV editing. Architectural advancements are supporting these improvements and creating the framework for the future.


Modeling Tools

Transform Tool
  • The modeling mode Transform tool has expanded snapping and alignment functionality that greatly enhances the speed of working with multiple meshes.

  • PolyEdit Snapping - The polyEdit tool now has additional snapping and alignment functionality.

  • Vertex/Edge Snapping for Volumes and DynamicMeshes - Snapping vertices and edges on Volumes and DynamicMeshComponents is now available.

Primitive Tool
  • The Add Primitive Tool Stair Generator now supports floating, curved, and spiral stairs.

  • Dynamic Mesh Actor/Component - In addition to Volumes, a new Dynamic Mesh Actor and Component type has been added inside our modeling tools. DynamicMeshActors can be turned on via the project settings. These dynamicMeshActors can be serialized, duplicated, cut-and-pasted between Editors, they work in PIE, and work in a built game. They currently support Complex Collision only, Simple Collision support will be added in the future.

PolyEdit Tool
  • The PolyEdit tool includes numerous improvements that allow for an increase in functionality and efficiency.

    • Insert Edge Loop - The edge loop inserter can now highlight problematic (non-quad-like) groups that stop the loop. This makes it easier to understand the insertion limits, and provides the user with hints about how to adjust the group topology to help the Tool.

    • Insert Group Edge - the Insert group edge tool has been moved to the PolyEdit tool to improve the workflow and minimize back and forth between tools.

    • Cut Faces - A cut tool has been added that will cut selected faces with a user defined cut direction.

    • Retriangulate- Retriangulate will recompute the triangles on a selected polygroup.

    • Marquee Selection - Marquee selection is now available in polyEdit for all mesh component types.

    • Extrude - Extrude has new options for direction, measure direction and polygroups creation.

    • Simplify by Group - After repeated modeling operations the topology can become inefficient. Simplify by polygroup is a powerful tool for refining a mesh based on user defined areas.

    • Push/Pull - The push/Pull tool acts as a "boolean extrude". Instead of topological edits the extruded mesh acts as a solid and is added or subtracted. this allow for operations like pushing a hole through a mesh.

    • Bevel - A new Bevel tool has been added to polyEdit.

CubeGrid Tool
  • The CubeGrid tool is a quick tool that allows for the rapid development of an asset or level. The tool has options for:

    • Select/deselect grid units

    • Pull/push selection

    • Adjust grid size

    • Reorient/snap grid to non-orthogonal angles

LOD Manager
  • The LOD Manager allows for exploration and management of LODs directly in the viewport.

    • Restoration of LOD0 from the high res source model

    • Preview of individual LODs in context in the viewport

    • Comparison between SourceModel and RenderData LODs

Pivot Actor
  • The PivotActor tool creates a new empty actor parent to the selected actors. This feature is similar to a "locator" in existing DCCs. The pivotActor is an easy way to control and manage transforms.

  • The Subdivide Tool allows modelers and sculptors to create the appropriate resolution by adding/smoothing the mesh to a higher resolution via different subdivision techniques. The tool currently now supports:

    • Bilinear Subdivsion - Bilinear subdivision simply subdivides the PolyGroups but does not generate a smooth surface..

    • Loop Subdivision - Loop subdivision works directly on triangle meshes, meaning it can be applied to meshes with any PolyGroup topology, or no PolyGroups at all. It produces similar smooth surfaces.

    • openSubdiv/Catmull-Clark - Catmull-Clark is designed to work on quad meshes, and relies on PolyGroup topologies that are relatively simple and well structured.

    • New PolyGroups - There is now an option to generate new polygroups for each level of subdivision. This allows for continued refinement/modeling with tools like PolyEdit.

  • The Polycut tool has been enhanced with the ability to use a Mesh Boolean-based operation. The new mode allows the cut to go through more than one layer or when the cutting curve extends past the edge of the subject mesh.

  • The Mesh Boolean and Self Union have been significantly improved. The tools now remove spurious edges introduced in the low-level mesh operations. These edges accumulate over multiple operations and can lead to precision errors. The new implementation is more robust and efficient.

Trim Tool
  • The Trim feature, previously in the Mesh boolean tools, has been moved into its own tool. The new tool has additional options for choosing which side of the geometry to trim.

Lattice Deformer
  • The Lattice Deformer tool has been enhanced with:

    • Soft deformation mode option

    • Lattice point constraints

Warp Deformer
  • The flare tool has additional options for profile type along with an updated gizmo for simpler interaction

  • New Show Original Mesh option

  • Snap Gizmo can now snap to objects in the world

  • New option to shift the Gizmo to Center

  • The bend tool has new features making the tool more powerful and usable.

    • You can lock one side in place while deforming,

    • A visualization will show how the line from lower to upper is bound through the gizmo center as the mesh gets bent.

    • The upper/lower bounds have more expected effects on the bend.

  • The Vertex Sculpting panel has a redesigned UX panel. The New UX has several key improvements

    • Larger Icons in flyout panels have replaced the previous brush type and falloff dropdown lists, providing increased efficiency and legibility.

    • New custom tile-view Asset Picker is now used for brush Alpha Masks.

    • The Alpha Mask picker now supports filters based on local user configured Collections. Allowing users to quickly jump to their favorite Alpha mask sets, including a new recently-used list.

  • The active brush stamp and alpha mask can be displayed in the viewport as part of the brush indicator.

Mesh Simplification
  • The mesh Simplify tool has new options for optimizing an existing mesh.

    • Existing Positions is a a new reduction method that creates simplified meshes while maintaining some of the existing vertex positions of the original mesh.

    • Simplify by Polygroup uses only the polygroup as constraints in the simplification. This is also available via the polyEdit tool.

    • Geometric Tolerance Constraint.

Mesh Project
  • The Mesh Project tool has been improved with additional parameters and performance.

  • The Remesh tool now has an option for Subdivide before Remesh- When remeshing a low polygon mesh it can be useful to subdivide with loop or catmull-clark subdivision so the resulting mesh does not inherit the facets of the original polygon structure

Mesh Displacement
  • The Displace tool has been improved with multiple additions.

    • PN Triangle Subdivision - The PN Subdivision defines a smoother version of the mesh replacing each flat triangle with a curved mesh.

    • New Tessellation algorithm - A new mesh tessellation method has been implemented that improves the speed and granularity of both Uniform and PN triangle tessellation. The result is much closer to the tessellation shader.

    • Channel selection when displacing a texture map.

    • Scale and tile 2D textures.

    • Adjust intensity with a contrast curve.

Volume Creation and Editing
  • Creation and editing of Volumes has been improved with several important additions.

    • Creation tools, like the Primitive Tools, PolyExtrude, PolyRevolve, etc., can now emit a Volume (with selectable volume type) instead of a Static Mesh.

    • Editing Tools that emit new derived objects, like Boolean or Plane Cut, now can use Volumes as both input and output.

Voxel Blend and Subtract
  • The voxel Blend tool can now perform a CSG subtraction with a customizable smooth falloff.

  • The Jacketing tool, which is used commonly for removing unseen geometry, has been enhanced.

    • Creating new groups from occluded triangles is now an option. This will allow for finer grained manual control prior to removal.

    • Erode the selection of occluded triangles before removal. This will provide a less aggressive removal of triangles.

Static Mesh Editor Modeling Tools
  • Mesh Editing tools are now available in the Static Mesh Editor via a new StaticMeshEditorModeling plugin. Currently only the AutoLOD, LOD Manager, and Inspector tools are exposed to the Static Mesh Editor. The Inspector Tool can be used to visualize many types of mesh information that were not easily visible inside the Static Mesh Editor, such as highlighting UV seams and mesh boundaries, as well as wireframe-on-shaded, UV checkerboard, etc. (including for Nanite-enabled meshes).

Baking and Mesh Attributes (Beta)

In Unreal Engine 5, we continue to expand and update our suite of texturing and material baking tools. Texture and material baking are an important part of asset development. Baking tools are not only essential to LOD generation, but also create workflows for advanced material creation directly in the Editor.


Bake Texture

We have made a variety of improvements to the tools since the Unreal Engine 5.0 Early Access release:

  • Combined Input Normal with Baked Normal

  • Multi-Sampling

  • Added Additional Geometric Bake Types

  • Improved Ambient Occlusion performance

  • Bake Attribute to Vertex

  • Texture to Vertex Baking

  • Texture filtering

  • Support for UV layers

  • Ability to preview a texture map as an effect or texture

Bake All Tool

A new BakeAll tool is now available in Modeling Mode. While the BakeTexture tool provides a solution to bake the details of a single mesh to a target mesh, BakeAll supports baking the details of multiple source meshes, onto a single lower polycount target mesh.

UV Editing (Beta)

The UV editing tools within Unreal Engine 5.0 have been significantly updated and expanded, dramatically extending the capability of UV creation and editing directly inside of the Editor.

New UV Editor Panel


The new UV Editor Panel is the primary workspace for editing UV layouts. The 2D UV panel is the primary area for evaluating layout packing and UV orientation and has support for:

  • 2D Selection and Transforms

  • UV Channel Visibility

  • UV Channel Copy, Add, and Remove

  • Unwrap Automatic and per island

  • Cut and Sew operations

  • 3D preview

  • Texture display

Project UV Tool
  • Project UV has been completely rewritten and supports many user requested features.

    • World-space dimensions are now used instead of relative bounds, and can be held fixed between uses of the Tool to create tiling UVs with consistent size.

    • Preliminary support for transferring face selections from the PolyEdit and TriEdit tools.

    • Now Supports multiple UV channels.

    • ExpMap UV algorithm: The ExpMap UV method follows a curved surface and is similar to Planar Projection. The extreme texture stretching that can occur as the surface bends away from the projection plane is avoided, and locally-projected decals maintain their shape more accurately.

Auto UV Tool
  • The Auto UV tool has been updated with a new process for constructing UVs on high-poly meshes. The new option combines several steps into a single operation (small patch generation, patch-merging, final UV generation, and UV packing). Individual parameters can easily be adjusted and repeated to produce quality UVs.

Unreal Editor Interface

Updated User Interface

The User Interface (UI) has been updated for Unreal Engine 5 to provide a consistent and streamlined experience. The default colors have been adjusted for a darker default theme. Users can also set up their own Themes in the Editor Preferences, to customize the editor to their own preferred style. Updated icons provide compact and consistent visual cues.

New features such as the Content Drawer, sidebar Tabs, and the Create Menu provide easy access to the tools you need, while also allowing maximum space for the viewport.


Content Drawer

The Content Drawer is a new feature that allows you to summon a Content Browser overlay. This gives you rapid access to assets, without having to reserve space for a docked panel. You can summon the Content Drawer using Ctrl + Spacebar. Alternatively, you can click on the Content Drawer tab name to expand the drawer. The Content Drawer can also be docked within the Editor layout, or used in conjunction with the traditional Content Browser.

Sidebar Tabs

Users can now dock a Panel into a Sidebar Tab on either side of the Editor. By docking a Tab, you can keep frequently-used Panels accessible, without the need to sacrifice screen real estate. Since Early Access, the Tabs have been updated so you can pin them open.

Loading and background progress indication

Additional details are now displayed on the splash screen while a project is being opened, providing more context and visibility into the loading process.


The editor status bar now features a progress indicator for background tasks in the lower right corner. This progress bar displays the combined progress of all background tasks and can be expanded to show individual progress indicators for contributing tasks.

Details Panel

The new Section Bar at the top of the Details Panel is designed to reduce scrolling, by providing quick access to related categories of properties. In addition, you can save frequently-used properties as Favorites that show up at the top of the Details Panel for a given Actor type.

Create Menu

The Level Editor Main Toolbar now includes a Create button. This gives you quick access to placeable Actors, and sources of content such as Quixel Bridge or the Unreal Marketplace. Actors can be dragged directly from the dropdown menu into the Viewport, or clicked for quick placement in front of the camera. This way, you can place Actors without having to dock the Place Actors panel permanently in the Level Editor's layout.


Quixel Bridge Integration

Quixel Bridge is now integrated directly in Unreal Editor. You can dock Quixel Bridge in the Editor layout, then drag Assets directly into your Level. The Quixel Bridge panel can be accessed from the Level Editor Main Toolbar's new Create menu, or from Window > Quixel Bridge.


If you previously installed the Unreal Engine 5.0 Preview versions, you need to update Quixel Bridge to the latest version prior to use. You can update the plugin in the Epic Games Launcher.

For more information on Quixel Bridge for Unreal Engine, see the documentation here.

Multi-Tab Modes

Some modes are complex and need to display additional UI elements, so they have been redesigned into a system that supports more tabs than the default toolbar and mode settings. This applies to Fracture Mode and Animation Mode. If you close a tab, you can always reopen it by selecting the tab from Window > Editor Modes.


Searchable Menus

You can now search in menus with nested submenus. Actions that match your search criteria within any submenu will be displayed for you to access.


Some menus have been reorganized for improved clarity and usability.

  • Actor contextual menus were refactored. Elements from this menu can be found in the main menu bar under the Select menu, the Actor menu, or the Component menu.

  • For developers creating in-editor tools, a number of widgets have moved from Editor/EditorWidgets to Developer/ToolWidgets.

Lyra Starter Game


Accompanying the release of Unreal Engine 5, we are pleased to announce Lyra. Lyra is a new sample gameplay project intended to be a starting point for creating new games and to serve as a learning resource for understanding the Unreal Engine 5.0 Framework.


Its architecture is designed to be modular, including a core system and plugins that are updated regularly along with the development of Unreal Engine 5.0. Key features include:

  • Cross-platform compatibility and scalability

  • Online multiplayer and cross-play support for Epic Online Services and Console Online Subsystems

  • A choice between two different Gameplay modes: Elimination (Team Deathmatch) and Convolution(Control point)

  • A customized Gameplay Ability System

  • Niagara FX

  • Unreal Motion Graphics(UMG) widget classes and UI Icons for the project's gameplay concepts, including menu settings, controller key sticks, and displays for health, mana, and ammo—these UI features are designed with modularity so you could use their systems in your own game independent of Lyra

  • Optimized, hand-crafted content including locomotion animation assets, sounds, and a weapon system that is compatible with any Pawn

  • New UE5 Mannequins, Manny and Quinn—these Mannequins are playable characters that share the same core skeleton hierarchy as MetaHumans, with a compatible animation system.


City Sample Project


The City Sample project is a playground where designers and developers alike can explore how various new and improved systems can be brought together to create expansive and engaging environments. This sample is built using the same assets and design techniques used in The Matrix Awakens: An Unreal Engine 5 Experience technical demo released on PlayStation 5 and Xbox Series S|X hardware.

New and improved features of Unreal Engine 5 enable you to build highly detailed large worlds that can be designed, populated, and dynamically lit to bring this visually stunning city to life. The city is designed and built using procedural generation using the Rules Processor and uses the following features to bring the city to life:

  • World Partition works in conjunction with One File Per Actor to improve level streaming and editor workflow efficiency.

  • Nanite enables the use of high-fidelity virtualized micropolygon geometry.

  • Lumen generates dynamic global illumination and reflections using Hardware Ray Tracing.

  • Virtual Shadow Maps provides consistent, high resolution shadowing for the city.

  • Mass AI manages the behavior and visualization of traffic and crowds based on the MetaHuman library.

  • Chaos physics drives the vehicles and the destruction system.

  • MetaSounds system fills the city with urban sounds.

  • Niagara is used for particle systems.

  • And more!

Artificial Intelligence


Unreal Engine 5.0 launches with new features that provide users with the ability to create more believable AI agents than ever before. MassEntity provides a framework for data-oriented calculations that can be used in use cases where performance is key—including the simulation of tens of thousands of AI agents in the scene.

In addition, Unreal Engine 5.0 comes with Smart Objects—a collection of objects placed in a level that AI agents and players can interact with. This system is easily configurable and can add an unprecedented level of interactivity to your scene.

Unreal Engine 5.0 comes with significant improvements to AI agent navigation with features such as Mass Avoidance and Zone Graph. Mass Avoidance provides high-performance avoidance for any Entity using the MassEntity system, and Zone Graph provides efficient long-distance navigation via specific navigation flows.

Unreal Engine also launches with StateTree—a scalable and general-purpose hierarchical state machine that combines the Selectors from behavior trees with States and Transitions from state machines. Users can use StateTree to create highly performant logic that stays flexible and organized.

Mass Entity (Experimental)

MassEntity is a framework for data-oriented calculations that allows players to interact with tens of thousands of simulated entities at high performance.


MassEntity's primary data structure is the Fragment, which represents an atomic piece of data used in calculations. Common examples for Fragments include Transform, Velocity, and LOD Index. Fragments can be grouped into collections, and an instance of such a collection can be associated with an ID. This collection instance is called an Entity.

Creating an Entity is similar to class instancing in object-oriented programming. However, instead of strictly declaring a class and its functionality, Entities are built by Fragment composition. These compositions can be changed at runtime. For example, an Entity's composition can include two Fragments such as a Transform and a Velocity.

Smart Objects (Experimental)

Smart Objects are objects placed in a level that AI Agents and Players can interact with. These objects contain all the information needed for those interactions.


Smart Objects are part of a global database and use a spatial partitioning structure. This means that they can be queried at runtime by using filters such as location, proximity to the Agent, and tags.

At a high level, Smart Objects represent a set of activities in the level that can be used through a reservation system.

Mass Avoidance (Experimental)

Mass Avoidance is a force-based avoidance system integrated with MassEntity. The system provides high-performance avoidance for any Entity using the MassEntity system.


Zone Graph (Experimental)

ZoneGraph is a lightweight navigation system that uses metadata to represent specific navigation flows (traffic lanes, sidewalk, wood trail, etc.) as opposed to a Navmesh, which focuses on a physical representation of the world. The metadata is represented by a point-to-point corridor structure connected by segments.



This system can be used for efficient, long-distance navigation of Ai agents. You can also define specific navigation flows directly in the level for a high level of control over agent navigation in the level.

State Tree (Experimental)

StateTree is Unreal Engine's scalable and general-purpose hierarchical state machine that combines the Selectors from behavior trees with States and Transitions from state machines. Users can create highly performant logic that stays flexible and organized.


StateTree contains States that are arranged in a tree structure. The State selection can be triggered at any location in the tree (initially from root). During the selection, each State's Enter Conditions are evaluated, and if they pass, the selection advances to the State's child States.

Selecting a State will activate all of the States from the leaf State up to the root State. Each state consists of Evaluators, Tasks, and Transitions.


Chaos Physics enabled by default

Chaos Physics is a highly customizable, lightweight physics simulation solution available in Unreal Engine 5, built from the ground up to meet the needs of next-generation games.


The system includes the following major features:

  • Rigid Body Dynamics and Ragdolls

  • Rigid Body Animation Nodes and Cloth Physics

  • Destruction

  • Vehicles

  • Physics Fields

  • Fluid Simulation

  • Hair Simulation

The Chaos Physics system replaces the existing physics system and comes with major new features, such as Asynchronous Physics simulation, a robust destruction system, Physics Fields, and fluid simulation. It also has full support for double-precision worlds.

Chaos Destruction


The Chaos Destruction system is a collection of tools that can be used to achieve cinematic-quality levels of destruction in real time. In addition to great-looking visuals, the system is optimized for performance, and grants artists and designers more control over content creation and the fracturing process by using an intuitive nonlinear workflow and a new asset type called Geometry Collections.

Users construct the simulation assets using pre-fractured geometry and utilize dynamically generated rigid constraints to model the structural connections during the simulation. The resulting objects within the simulation can separate from connected structures based on interactions with environmental elements, such as Physics Fields and collisions.

In addition, Chaos Destruction comes with a new Cache System that allows for smooth replay of complex destruction at runtime with minimal impact on performance.

Chaos Destruction easily integrates with other Unreal Engine systems, such as Niagara and Audio Mixer, to spawn particles or play specific sounds during the simulation.

Chaos Vehicles


Chaos Vehicles are part of Unreal Engine 5's new vehicle physics system.

Chaos Vehicles support any number of wheels—from two-wheeled motorcycles to vehicles with six, eight, or even more wheels. In addition, the system supports any number of forward and reverse gear configurations.

You can configure Chaos Vehicles with any number of aerofoil surfaces that provide downforce or uplift at specific locations on the chassis. These surfaces can simulate automobile spoilers, or even aircraft wings.

You can add a number of arcade-style forces to provide more direct control of the vehicle chassis. Common examples include applying direct torque to keep a motorcycle upright, or directly controlling the pitch or roll of a helicopter.

Vehicle Deformation


With the release of The Matrix Awakens: An Unreal Engine Experience, vehicles showcased a robust deformation system used in conjunction with Chaos Vehicles to create realistic deformation when vehicles take damage.

This new deformation system combines ControlRig with improvements to the Chaos Vehicle system to create unique deformations for each vehicle. Each dynamic crash is achieved by utilizing the vehicle's driving dynamics and modifying the vehicle's center of mass.

The system detects collisions by using several physics bodies placed around the vehicle. Constraint plasticity, a feature introduced in UE5, provides the ability to permanently deform physics constraints after passing a specified threshold.

Unreal Engine 5 comes with the ability to query and modify constraint attributes via Blueprints, which provides a way to manipulate deformation in a more granular way. The designer can also activate and deactivate a hierarchy of dynamic physics bodies during gameplay, which can be used to enable or disable parts of the physics simulation to improve performance.

You can test the system and learn more by downloading the free demo from the Marketplace.

Chaos Cloth Simulation


The Chaos Cloth system features an entirely new set of parameters and user controls, giving users the ability to easily create and manage a variety of looks to suit their cloth simulation needs.

From increased collision support per cloth (>32), debug draw CVARs, as well as added mask controls, Chaos Cloth is designed to make it easier than ever to create high-fidelity cloth. Additionally, users are given more intuitive controls to visualize collision backstops, a more useful Anim Drive, plus an improved wind.

Brand new to Unreal Engine Cloth is the ability to use Blueprint Interactor Nodes for greater control of cloth at runtime. We've also added support for fields which can be used to localize cloth effects as well as the ability to easily create world collisions.

Physics Fields


The Physics Field System enables users to directly affect Chaos Physics simulations at runtime on a specified region of space. These Fields can be configured to influence the physics simulation in a variety of ways, such as exerting force on rigid bodies and cloth, breaking Geometry Collection Clusters, anchoring or disabling fractured rigid bodies, and interacting with rigid body animation nodes and cloth.

In addition, the Physics Field System can communicate with other engine systems, such as Niagara and Materials. These systems can sample Physics Fields by using built-in functions that allow the evaluation of a Field at a specific location.

Niagara Fluid Simulation

Unreal Engine 5.0 includes an artist-friendly set of tools for simulating fluid effects in real time that includes a variety of GPU-based simulators, reusable modules, and robust data structures that are all usable within the Niagara Editor. Advanced users can take advantage of the wide range of exposed parameters to modify the simulation to their needs.


The fluid simulation system is designed to generate complex fluid effects for real-time environments that can be used in games and cinematics. The system can also be used to bake out complex simulations to flipbook textures for a variety of use cases.

To learn more about Fluid Simulation, download the Content Examples project from the Marketplace and visit the Fluid Simulation documentation.

Asynchronous Physics Simulation

In Unreal Engine 5, users can now run the physics simulation in its own separate Physics Thread as opposed to running on the Game Thread.

The main advantage of running physics in its own thread is that the simulation runs on a fixed tick interval, which allows for more predictable results.

You can use this feature to fine-tune your simulations to always behave in a predictable way. This behavior also serves as the foundation for networked physics, as it allows the server and its clients to tick physics at the same rate, making it easier to synchronize the results.


Large World Coordinate Support

Unreal Engine 5.0 brings you the ability to work in Large World Coordinates, so that you can build much bigger worlds in a single level. The implementation in the main engine, as referenced in the Large World Coordinates release note, is to use doubles instead of floats for core data types. This takes you from 32-bit precision to 64-bit.

However, in Niagara we had to plan for a more economical approach to keep the rendering on both the CPU and the GPU as efficient as possible. Therefore, rather than implementing doubles, we have implemented a grid system for the world. In one float, the position of the Niagara system within that grid is saved, and in the other, that grid's position in the world.


As such, there is a unique setup for working with Large World Coordinates in Niagara. Find out more on the Large World Coordinates in Niagara page.

Simulation Stages

Simulation Stages were an Experimental feature in previous versions of Unreal Engine. In UE5, Simulation Stages are now Production-Ready and also readily available directly in the Niagara Editor.

In the Niagara stack, groups such as Emitter Update or Particle Update are themselves simulation stages. However, you can add as many simulation stages as you may need for your desired effect. A simulation stage is a stage that you can set up, through which you can have the Niagara editor perform some calculations and iterate. Consider this like a for loop, where you can define whether to iterate over an array, a 2D grid, a 3D grid, a render target, or a set of particles.


You can also see simulation stages used heavily in the Niagara_Fluids floor in the Content Examples sample project. Some fluid emitters may have a dozen simulation stages or more.


GPU Ray Tracing Collisions (Experimental)

In Unreal Engine, you can set up a particle system to collide with objects in the level using the Collision module. In previous versions of Unreal Engine, when using a GPU emitter, you had several options in this module. Typically, most used the Depth Buffer option, which generates a simulation of the environment. This is a low-cost, but also low-accuracy solution. The shapes are not accurately portrayed, and if a particle goes off the screen, then it disappears immediately.

In UE5, we are adding an option to the Collision module to use ray tracing on the GPU. No matter whether the emitter and its particles are on-screen or off, or hidden behind an object, the collision will use raytracing to calculate an accurate result.

Note that the calculation is asynchronous, so the Niagara collision will be one frame behind. Hardware ray tracing is also required for this feature.

To learn more about how to turn on this experimental feature, see the GPU Raytracing Collisions document.

Performance Budgeting

When building a game, you can have a lot of variability in the FX workload depending on the scene composition. Sometimes you may want to take actions to help manage the performance, such as culling instances outside a certain range, or instances that exceed a budget usage.

Performance budgets are configured as part of Effect Types. Effect Type assets allow for a variety of settings to be configured once and applied across a collection of Niagara effects. These options are all available under the heading Budget Scaling. For more information, see the document Performance Budgeting.


Cascade Converter

The Cascade to Niagara converter will migrate Cascade assets to Niagara. It can still be accessed by right-clicking on a Cascade asset and selecting the option Convert to Niagara System.

Improvements have been made under the hood to the way the conversion works, such as:

  • Niagara Scripts are now automatically arranged in the order of their dependencies. This means users will no longer have to fix the order of modules by hand.

  • The Light Renderer conversion has been improved.

  • Cascade Shape modules are now converted to the new Niagara Shape Location module.

    Module Changes

Several modules have seen changes or additions in this version of Unreal Engine.

Shape Location

The Box, Sphere, Cylinder, and Torus Location modules have been deprecated. They are replaced by a single comprehensive Shape Location module. In this module, you can choose the shape that you would like it to be and then the settings adjust accordingly. We have also added two additional shapes: Ring/Disc and Cone.


Add Velocity

The Add Velocity in Point, Add Linear Velocity, and Add Velocity in Cone modules are now deprecated. They have been replaced by a single comprehensive Add Velocity module. In this module, you can choose the mode in which to add velocity and the settings will adjust accordingly.


Update Mesh Orientation

The Orient Mesh to Vector, Flight Orientation, and Pure Roll Orientation modules are now deprecated. They have been incorporated into the Update Mesh Orientation module. In this module, you can select how you would want your mesh to orient and then the settings will adjust accordingly.


By default, the Update Mesh Orientation module is set to Rotation Rate, which is the same as the previous Update Mesh Orientation module.

Initialize Particle

In previous versions, there were two modules: Initialize Particle and Initialize Ribbon. The ribbon functionality has been merged into Initialize Particle.


Static Variables

For users who are creating their own custom modules, there is a new feature added to the Niagara Script Editor called Static Variables. Static Variables are variables that contain information that doesn't change after compile time. They can be used to save information that you may want to do math operations on, or propagate through multiple modules in your stack.

To create a new Static Variable, you can click on the Plus (+) sign in the Parameters window. There are two types of Static Variables you can create from the Parameters panel: Static bool, and Static int32. You can see that a Static Variable shows up with a red S.


Static Variables could be used so that you can set your options once in your emitter, and then use those options in different simulation stages.


Another good usage for Static Variables is to drive Static Switches in your modules. This is particularly useful for complicated emitters, with many high-level options to set. Typically these options are created by using Static Switches inside the module scripts. This allows you to show and hide elements in the user interface depending on what option is selected.

On the Static Switch node, you will see an option Expose as Pin. When enabled, you can wire in a Static Variable. The type of Static Variable you can wire in depends on the type of Static Switch. You can wire in a Static bool, Static int32, or Static enum.


When you then enable that Static Variable in the Selection panel, the Static Switch then enables the options in the user interface.


Emitter Summary

With some Niagara systems becoming very complex, having many different simulation stages, it can become difficult for you to find the settings that you frequently need to adjust. As such, there is now an area at the top of each Emitter called the Emitter Summary. You can configure your frequently used settings to show up here.


To add a parameter to your Emitter Summary, simply right-click on it in the module and then select Show in Emitter Summary.


GPU Spline

The Spline component data interface previously only worked for CPU simulations. This feature now works on the GPU as well.

Data Registries

Unreal Engine 5.0 supports Data Registries. A Data Registry is an efficient global storage space for data structures tagged with the USTRUCT macro. Data Registries support both synchronous and asynchronous data access, including user-defined caching behaviors. They are intended to work with general read-only data.

  • Tasks System

Our new Tasks System job manager provides a framework to execute user code asynchronously by building and running a directed acyclic graph of dependent tasks. It comes with a new general API and system for developers to schedule tasks in a multithreaded environment. This system efficiently distributes small tasks across an optimal number of threads. The new API makes it much simpler to express multithreaded designs, and runs efficiently on targets with both high and low core counts. The new Tasks Insights view also improves the debugging and optimization process.

This is an improved version of TaskGraph, Unreal Engine's job manager. Tasks System and TaskGraph use the same backend (the scheduler and worker threads).

Unreal Insights

Unreal Insights identifies areas in your project that require optimization. The tool integrates itself as a stand-alone profiling system to collect, analyze, and visualize data emitted by Unreal Engine. It simplifies the process to add your own profiling data and includes the capability to record data remotely, minimizing the application's impact on your project during execution.

Timing Insights Window

The Timing Insights window is where you'll see frame performance data along the different CPU and GPU tracks. A new toolbar was added to the Timing view, splitting the Tracks drop down menu into multiple menus.


Quick Find

The Quick Find widget is used to search and filter events displayed in the Timing View.

The widget can be opened from the Timing View context menu or by using the CTRL+F shortcut when the timing view has focus.


The Quick Find widget search logic is defined using groups and filters. Group nodes contain child Filter nodes and define the logic applied to the children's result.

Memory Insights

Memory Insights is a new component that provides you the capability to investigate memory usage and call stack tracing in your project. The runtime component traces events for every allocation, reallocation, or free event that occurs during runtime, then reconstructs that memory usage pattern during analysis. The Memory Insights timeline supports overlaying additional tracks, such as bookmarks, asset loading, and CPU/GPU timers.


When using Memory Insights, Developers can now see more detailed information about memory allocation and deallocation, including theLLM tags and callstacks associated with each block of memory at any point in time.


The Investigation panel provides the capabilities to make different queries about allocations. LLM Tags controls the visibility of different LLM Tags.

Separate Server Trace Process

The Unreal Trace Server is run in the background as a single server instance and can be shared between multiple instances of your project. It is a lightweight program that has minimal impact on performance and does not include a user interface.

Improved Late Connect

In previous versions of Unreal Insights, if your connection to the Insights program was late, then any one-time events (Important Events) would be missed before you could make a connection. Important Events are now cached on the Unreal Engine client side, therefore they are sent to late-connecting machines during connection.

Task Graph Insights

Task Graph Insights provides profiling of the Task Graph system. This includes the ability to see Timing Events related to each Task, in addition to the task dependencies that show relations to nested and subsequent tasks and timing events.


Context Switch

Context Switch is a new trace channel that displays information about CPU Core tracks. Each CPU core has a track that displays details for the recorded trace, such as timing events that show each event that is executed from each CPU thread.


Zen Loader for Runtime Asset Loading

Zen Loader is the default runtime loader for Unreal Engine 5.0 that loads assets from container files. It reduces the CPU Overhead by using an optimized package and object dependency graph that is computed offline during the staging phase. Using container files avoids file system abstractions and provides the loader with the ability to find data chunks with minimal CPU overhead using a new I/O abstraction layer called the I/O dispatcher. The I/O dispatcher uses platform specific backends to benefit from hardware capabilities and APIs.

The Zen loader is based on the Event Driven Loader (EDL) and requires the same output types from the cooker such as name tables, import / export maps, and preload dependencies. The legacy EDL runtime logic has been moved offline and is produced during the staging phase. Zen loader is used instead of EDL whenever you are staging with pak commands.

Additional changes Include:

  • Package summaries, export blobs, bulk data and shaders are placed in container files.

  • The most important package metadata and all package interdependencies are collected into a package store that is indexed by package IDs.

  • The .uasset package header is transformed to an optimized package summary.

  • Import maps with outer chains have been removed and replaced with direct references by export object hashes.

  • Name tables have a new optimized batch format.

  • Preload dependencies have been flattened into per-package export bundle nodes, each specifying a sequence of CreateExport and SerializeExport calls and dependencies to other export bundle nodes.

Common UI Plugin (Beta)

Unreal Engine 5.0 introduces CommonUI, a plugin that supports development of cross-platform user interfaces with complex navigation, such as those with multiple layers, popups, or sub-menus.

You can enable Common UI in the Plugins menu. Note that as of UE 5.0, this plugin is considered Beta, but it is tested and used widely in Epic Games' own products, including Fortnite. Below is a summary of CommonUI's tools. For more comprehensive information on how to use them, refer to the Common UI documentation.

Activatable Widgets

The Common Activatable Widget class is a new base C++ class you can use for widgets. Activatable widgets can toggle between an Active or Inactive state. When Inactive, they still render onscreen, but are not interactable. These are ideal for elements that can be disabled and skipped in a menu's navigation, such as a grayed-out menu option. Note that Activatable Widgets are in an Inactive state by default.

Input Routing

It can be challenging to make complex menus consisting of multiple layered windows and prompts, as the UI has to prevent the user from accidentally interacting with menus that aren't in focus. Input routing automatically handles this process by capturing input in the game's viewport class, then diverting it to the topmost-painted active widget in the viewport, as well as its children.


For instance, If you have two menus on top of each other, the input routing system will forward input to whichever one is on top. After that, the menu will route input to its children. The menu on the bottom layer will not receive input at all, and therefore users cannot interact with its child buttons until either the top menu is removed, or until it is moved to the top. Activatable widgets that are in an inactive state are also ignored. This makes navigation with gamepads much easier to facilitate, but this functionality also works with touch input and mouse and keyboard.

Input Mapping and Platform Support


Tapping a button on your input device will automatically switch the icon that the Common Action widget shows.

Common UI provides several quality-of-life tools for mapping UI inputs across different platforms, including:

  • UI Input Action Mapping – Create an Input Action data table to map abstract UI actions to specific buttons.

  • Per-Platform Action Overrides – Create overrides for specific UI Actions, such as when you need to swap the confirm and back buttons on specific consoles.

  • Controller Icon Management – Create Controller Data Assets with icon sets for specific controllers, then associate them with UI Input Actions. The Common Action widget will display the appropriate icon for the selected action and whichever device the user is using to control the application.

Note that the actions listed in Input Action data tables are specifically used for Common UI user interfaces, and are not related to the ones used for in-game actions in either the legacy input or Advanced Input systems.

Common UI Widgets and UI Styling


Common UI adds a new library of widgets, listed under the Common UI Plugin section in UMG's Palette. Many of these are pieces of UI functionality that are commonly reproduced in many games and applications. These include:

  • Specialized text blocks for date/time and numeric values.

  • Navigation and visibility aids like carousels and animated switchers.

  • Platform aids like a loading guard and a hardware visibility border.

  • Widgets that provide basic functionality, like buttons and text, but that use style data assets for styling.

The styling data assets for Common UI are Blueprint classes that feature materials, textures, fonts, and other stylistic elements normally found in standard UMG widgets. Common UI's widgets use references to these assets instead of keeping the styling data on the widgets themselves. This makes it easier for UI designers to create a consistent style across many different menus and HUDs.

Furthermore, you can provide a global default style that applies to any new instances of Common UI widgets. You can find these options in the Project Settings > Plugins > Common UI Editor menu, under Template Text, Template Button, and Template Border. When you provide styles for any of these, their changes will propagate to all Common UI widgets that don't have a different style set.

In Project Settings > Plugins > CommonUI Framework, you can also select assets for more specialized elements, including a Default Throbber Material for loading guards, and a Default Image Resource that can act as the placeholder image for unloaded elements in your UI.

Slate and UMG Performance

In Unreal Engine 5.0, we have improved the performance of Slate and UMG. The main improvements are use of Global Invalidation and use of Slate Attributes, which reduce the need for updating TAttributes multiple times per frame. Detailed information about Slate Attributes can be found in Engine\Source\Runtime\SlateCore\Public\Types\SlateAttribute.h. Global Invalidation (introduced with 4.24) only updates/paints widgets that are invalidated.

It is now easier to switch your project to Global Invalidation, since SlateAttributes are updated correctly when Global Invalidation is enabled. For performance reasons, it's better if you do not use SlateAttribute/Attribute for your game widgets. Global Invalidation is not enabled by default, and some minor SWidgets still need to be converted to the new system.

Multiple verification functions were added to test the integrity of your SWidget hierarchy. They can be enabled from the Widget Reflector.

Virtual Production


Image from THE EYE: CALANTHEK courtesy of Aaron Sims Creative.

Unreal Engine 5.0 marks a new milestone for virtual production workflows. The stability and maturity reached with UE 4.27 has been brought forward into UE 5.0. In-camera-VFX tools support all the key workflows of 4.27 with new features added in UE 5.0 to further support stage operations and content production.

Nanite is supported as a Beta feature in both Movie Render Queue and nDisplay rendering pipelines for virtual production use cases. If used with GPULM or the Path Tracer, the Nanite Fallback Meshes are used instead of the full-detail surface. USD support has broadened from just Levels to Sequencer allowing for production workflows like layout to utilize Unreal Engine in an USD pipeline.

Lumen is considered a Beta feature for the MRQ rendering pipeline with the documented limitations. Though Lumen may seem to work with nDisplay, it is not yet ready for in-camera-VFX productions and similar workflows using the VR and nDisplay rendering pipelines. Users should expect issues with artifacting or performance. We will continue Lumen development and expect to support nDisplay and VR workflows in the future.

Nanite + GPULM + Path Tracer for In-Camera VFX

In-camera-VFX productions can leverage Unreal Engine 5.0's new rendering features to maximize quality and creative freedom for filmmakers. With Nanite, VFX-style assets that were traditionally only available in the realm of post-production can now be used in real time and lit with GPU Lightmass. nDisplay's support for the Path Tracer opens up the lighting workflow, allowing for an accurate, live preview of changes made on stage. Full virtual texture support in nDisplay is another addition to the release that further advances the toolset available for virtual production content creation.

nDisplay Improvements

We've continued to improve the nDisplay tools in Unreal Engine 5.0 by adding overscan support for the inner frustum, support for failover, and viewport rotation in the nDisplay Config Editor. Additional changes include:

  • Support for overlaying stats per viewport with projection policies

  • Improved Blueprint API

  • Frustum visualization and inner frustum border visualization

  • Support for procedural meshes

nDisplay Directional Overscan for Inner Frustum

You can now specify inner frustum overscan per left/right/top/bottom direction. For in-camera-VFX scenarios, this feature can be useful for extending the inner frustum in specific directions to accommodate the latency of moving cameras or reducing the rendered size of the frustum if it's partially obscured by the set. Its resolution can optionally auto-adapt to maintain the same visual quality.


In-Camera VFX setup showing the border visualization and overscan features on the inner frustum. First, no overscan is applied to the inner frustum, then 50% applied to extend the right side of the inner frustum, and finally a 1.25 multiplier is applied on the whole inner frustum.

Viewport Rotation in Output Mapping

Previously, to apply transform operations to an nDisplay viewport you had to provide a Static Mesh or external .obj file with custom UV mappings. You can now apply transform operations to viewports, such as rotation and scale, directly in the Output Mapping panel of the nDisplay Config Editor.


Support for Failover

You can now enable a failover policy for your nDisplay cluster. The failover policy currently available is Drop S-node on fail, where a secondary node will be dropped from the cluster should it disconnect or exceed the network timeout settings. Once the failed node is dropped, the cluster will continue without the failed node. If the primary node is dropped, the cluster will still terminate.

New Console Variables Editor Plugin (Beta)

The Console Variables Editor is a panel that displays information about all the console variables and commands set in the project and provides a central location to view and modify all the variables. You can create presets to use the same console variables and values across multiple projects. The Console Variables Editor also has support for controlling console variables and commands across multiple computers in a Multi-User session.


New OpenCV Plugin (Beta)

In previous releases, OpenCV was included in the Virtual Production toolset. In this release, it is now a standalone plugin. The plugin uses OpenCV version 4.5.5 and adds new Blueprint nodes, such as for ArUco marker tracking and chessboard tracking.

Remote Control Improvements

We added ways to reduce the amount of time spent setting up Remote Control Presets and Web Applications in new scenes:

  • Rebinding: Now you can open a previously created Remote Control Preset and rebind it to Actors in your new scene to relink the controls.

  • Templates: When you want multiple instances of an Actor with similar controls, you can now set a group of controls in your Remote Control Web Application as a template for an Actor. Switch the Actor instance in the web application to use the controls on that instance.

Camera Lens Calibration Improvements

In this release, we're previewing two new algorithms for calibrating lens distortion and nodal offset, and adding improvements to the lens calibration process, including:

  • Manually adjusting the image center after you calibrate the lens

  • Adding overlays, such as a crosshair, to the Lens File Asset Editor's viewport

  • Calibrating nodal offset with a new algorithm which finds the optical axis and entrance pupil position of the lens

  • Calibrating lens distortion with a new algorithm where you can manually capture a set of 3D-2D point correspondences

  • Lens information automatically saving to the Lens File now

  • Importing and exporting to a ulens file in JSON format

DMX Improvements

We continued to make improvements to the DMX toolset, including:

  • Significantly improved save speed for DMX tracks with Take Recorder

  • Output ports can be delayed

  • Output ports now support many unicast addresses

  • Output ports resend unchanged data once every second

  • The matrix can be assigned in the Fixture Type

  • Increased support for GDTF standard


Level Snapshots Improvements

We added support for the following functionality to the Level Snapshots plugin:

  • Removed the Level Snapshots for nDisplay plugin and added nDisplay support to the Level Snapshots plugin

  • Added support for foliage

  • Parent/child relationships and components can now be restored from a Level Snapshot

  • Improved performance for saving and loading Level Snapshots

Switchboard Improvements

This release, we focused on improving the user experience for Switchboard, including:

  • Improved UX in both the main Switchboard window and the Settings window

  • Multi-User Server is now accessible at the bottom of the main Switchboard window and adds actions for controlling the Multi-User session

  • You can enable Unreal Insight collection when a node launches

  • Logs can now be collected in a zip file from Switchboard

Sequencer Playlists

Prepare, queue, and trigger level sequences on the fly with the new Sequencer Playlist feature. Playlists provide increased flexibility and agility when interacting with animated content on virtual production, broadcast, and live events stages, removing the need to pre-time all sub-sequences in advance for playback in editor.

Sequencer Playlists include the ability to:

  • Play and stop level sequences, individually or all at once

  • Trim, loop, and timescale a sequence on playback

  • Mute level sequences as needed to skip playback on specified clips

  • Infinitely hold the first frame of a sequence for rehearsal and alignment

  • Record animation triggered by a Playlist with Take Recorder to capture live playback for post


Universal Scene Description (USD) Improvements

Epic Games continues to expand its support for Universal Scene Description (USD). Unreal Engine 5 brings several improvements to USD, with a focus on improving the import/export process and expanding USD support for features such as Nanite and Sequencer.

USD Stage supports Nanite

Unreal Engine 5's new Nanite virtualized micropolygon geometry system can be used with the USD Stage Actor. This allows the import of film-quality source art composed of millions of polygons and removes the previous requirement for 3D Artists to create a high-res and low-res version of their assets.

Users can enable Nanite for their USD assets by adding the Nanite tag to assets in their USD file. Alternatively, users can provide a threshold in the setting of the USD Stage.

Other USD Improvements

The USD import and export pipeline continues to receive improvements with this release:

  • Unreal Engine now uses USD SDK version 21.08

  • Sequencer now exports animation sequences to USD file formats

  • Static Mesh assets can now be exported to USD from the Content Drawer

  • Unreal Engine Levels can now contain multiple USD Stage Assets

Developer Tools

Live Coding

Unreal Engine supports Live Coding using an integration of Live++. This feature was introduced in UE 4.22 as an experimental feature, and is now enabled by default for all projects in 5.0.

With Live Coding, you can re-compile your C++ code and patch your project's binaries while the engine is running, even when using play in editor (PIE). Compared with the Hot Reload system from previous releases, Live Coding provides significantly faster iteration time and more flexibility, so it is enabled by default. However, you can disable it to use Hot Reload instead.

When editing your C++ code in your IDE, the Live Coding Console will appear automatically.


The Live Coding Console provides an output log for compilation status. This is separate from the standard Output Log, and will only show Live Coding build information.

Whenever you are in either your IDE or Unreal Editor, press Ctrl + Alt + F11 to rebuild your code and patch your game's binaries. A notification will appear in the lower-right corner of the screen showing the status of your build. You can continue working in the editor or testing your project uninterrupted while the build runs.


If your build succeeds, you will immediately see changes according to your code. Live Coding will work when Unreal Editor is open, when using PIE, and when attached to a packaged build in your native desktop environment. It will not work when launching on consoles and mobile devices.

Note that when changing default values for variables, values set in the constructor implemented in the .cpp will not update in existing instances of objects. However, if you change them in your .h file, you will see the change take place.

Live Coding itself will handle small code adjustments, like value changes and adjustments to functions, very easily. However, if you use it for large-scale, structural changes without enabling Object Reinstancing, it can behave unpredictably and cause crashes. Refer to the notes on Object Reinstancing below for more information.

Object Reinstancing

Object Reinstancing regenerates object instances after rebuilding C++ code with Live Coding or Hot Reload. It affects objects associated with any of the following UE types:






This includes Actor and UObject instances themselves, instances of Blueprint nodes derived from relevant variables, and other objects created by the Unreal reflection system when using these macros.

Hot Reload and Live Coding use Object Reinstancing by default. You can disable it for Live Coding by toggling the Enable Reinstancing option in Editor Preferences > General > Live Coding.


Enabling this greatly increases Live Coding's stability and consistency when handling large-scale code changes. However, if your code maintains pointers to objects that can be re-instanced, you need to use the ReloadReinstancingCompleteDelegate and ReloadCompleteDelegate to update these pointers or invalidate caches so they can be repopulated later. Hot Reload is more likely to tolerate re-instanced objects being improperly dereferenced, but Live Coding will cause crashes when the editor is being shut down due to conflicts with re-instanced objects' destructors.

Clang Sanitizer Support

In Unreal Engine 5.0, Unreal Build Tool supports Clang's sanitizers for Linux and Android. These perform fast analysis of your C++ source code for specific types of errors that normally must be found at runtime, such as attempts to access uninitialized memory, race conditions, and memory leaks. The following sanitizers are available through a series of new UBT arguments:


UBT Command


Address Sanitizer (ASan)


Detects a variety of memory access problems, including out-of-bound access errors and memory leaks.

HWASan (Android only)


Hardware-accelerated version of ASan for Android. Should use 20-30% less memory.

Thread Sanitizer (TSan) (Not working on Android)


Detects threading issues like race conditions and ADA problems.

Undefined Behavior Sanitizer (UBSan)


Detects anything that C++ recognizes as an undefined behavior, like out-of-bounds errors, integer overflow, or uninitialized memory.

MinUBSan (Android only)


Minimalistic version of UBSan for Android.

Memory Sanitizer (MSan) (Linux only)


Detects attempts to read uninitialized memory.

To use these, run Unreal Build Tool with the UBT command for the desired sanitizer, and they will be linked in your final executable. For example, the following command would link ASan into your project:

Build\BatchFiles\Build.bat MyGame Android Development -WaitMutex -FromMsBuild -EnableASan

You will then see the sanitizer's error detection output in your logs when you run your application. To use them in Visual Studio, open your project's Properties, then add the argument to NMake > Build Command Line. Note that each of these typically slows down the programs they are instrumented in by anywhere from 2-3x.

For more information on Clang's sanitizers, refer to Clang's documentation, which includes thorough information about these tools.

RAD Game Tools

Bink Audio

The Bink Audio codec developed by RAD Game Tools is now built-in to Unreal Engine 5. Bink Audio is a multiplatform, highly optimized, and memory-efficient audio encoding for general purpose use. Enable it on your SoundWave assets with a simple checkbox under the Format header.

Turnkey Platform Automation System

Turnkey is a new system in Unreal Automation Tool (UAT) that simplifies platform support, including SDK installation and deploying builds to devices. The goal of Turnkey is to provide a pipeline where common operations like these are a simple one-click process for most users within an organization.

Most of Turnkey's options can be found in the Platforms menu in Unreal Editor.


From here, you can check which SDKs you have installed, and either install new SDKs or update existing ones. Going forward, this menu replaces both the File > Package Project option and the Project Launcher, condensing all build management options in Unreal Editor into one place. The Device Manager is still used for discovering and claiming devices, but the Quick Launch options will quickly deploy your build to a specified device.

You can also access Turnkey from a command line interface by running RunUAT.bat Turnkey. While this displays a command line menu, any options in Turnkey can be specified as parameters in the initial call to the .bat file. For example, RunUAT Turnkey -command=ExecuteBuild -platform=Win64 will build your project for Windows. The options in the Platforms menu are simply pre-scripted commands for different platforms and configurations.


While Turnkey can be used for managing builds and devices, its most powerful feature is automated SDK installation. Many platforms update their SDKs frequently, but any given version of Unreal Engine is compatible only with specific SDK versions from when it was released. This can make it difficult for developers to determine which SDKs they should use, especially if they are making multiple projects using different versions of Unreal Engine. It can also be difficult to make sure everyone within an organization consistently stays up to date when upgrading. Turnkey simplifies this process by automatically fetching and installing the best available SDK for your current version of Unreal Engine.

To use this feature for desktop and console, your organization needs to host SDK files in an accessible location. Turnkey supports Perforce, Google Drive, or local file paths for hosting these SDK files, and you can set rules about where it should look, as well as what platforms you have SDKs available for in your organization.

For full documentation on setting up and using Turnkey, refer to the Turnkey documentation. For information about Turnkey's functionality on Mobile platforms, see Turnkey Support for Mobile.


Development Requirements and Compatible Hardware

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

iOS, iPad OS, and tvOS

UE 5.0 supports iOS, iPadOS, and tvOS devices that support version 14 and higher for their respective SDKs and use an Apple A8 processor or later. The following are the minimum compatible device models:

  • iOS 14

    • iPhone 6S or later

    • iPod Touch 7th generation

  • iPadOS 14

    • iPad 5th generation or later

    • iPad Air 2 or later

    • iPad Mini 4 or later

    • iPad Pro (all models)

  • tvOS 14

    • Apple TV HD

    • Apple TV 4K (first generation)

    • Apple TV 4K (second generation)


UE 5.0 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 G710 series

    • Adreno 5xx, 6xx or 7xx series

    • PowerVR GM9xxx

    • Xclipse 920

  • Compatible Graphics APIs

    • OpenGL ES 3.2

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

Turnkey Support for Mobile

When you use Turnkey to set up the Android SDK, it will automate most of the setup steps, including downloading the required version of Android Studio and running additional setup steps and scripts. While you still need to run through the installation wizard manually, this reduces many possibilities for error. Manual SDK setup is still available, but this process is recommended.

Turnkey not available on macOSX for Android at this time, but will be in a later release.

Because provisioning for iOS, tvOS, and iPadOS is strictly controlled, Turnkey does not yet support any automated provisioning setup for iOS. However, it supports Xcode setup and SDK checking.

Android File Server Plugin

UE 5.0 introduces Android File Server (AFS), a plugin that embeds a file server into your project when creating builds. By default, embedding is disabled in shipping builds. You can communicate with your device's instance of AFS to:

  • Push files over WiFi, USB, or to use both simultaneously to increase installation speed

  • Change the command line text file without pushing a full build

  • Display the contents of any text file on your device

  • Perform many other operations available in ADB

AFS provides a way to deal with file operations without requiring external storage permissions or scoped storage. AFS is enabled by default, but you can disable it in Project Settings > Plugins > AndroidFileServe if you want to use ADB instead.


When the plugin is enabled, Development and Debug builds will use AFS to push files to Android devices. You can use a USB connection, or you can push to devices connected to your local area network with WiFi. For faster deployments, you can also use USB and Network Combined to push files over both at the same time. Whenever one connection is occupied transferring a file or batch of files, the other will take over. This is integrated as part of the deployment process.

AFS also has its own command line tool, which you can find in your engine's install directory under Engine/Binaries/DotNET/Android/UnrealAndroidFileTool. This directory includes versions of the executable for Linux, MacOS, and Windows.


When you run this executable through a command line, you will see a menu with all of its available functions.


If you add the help command together with some of the commands that have parameters, it will output more information about that command.

Finally, AFS can be started and stopped from inside your Unreal application using a Blueprint library.


While AFS has basic security using a unique security token generated for your project (see the Security Token parameter in Project Settings), this can be useful for creating more secure ways to start and stop AFS compared with using the default broadcast receiver.

Note that Android File Server requires Android SDK 26 or higher.

Android Binary Size Improvements

In UE 5.0, we have introduced many optimizations that significantly reduce the binary size for Android applications. These include compiler and linker flags that enable dead code elimination, identical code folding, and code bloat cleanup. These optimizations reduced the binary size for Fortnite by roughly 50%. Additionally, these can make your code slightly more efficient.

There are also a set of advanced binary optimizations that must be manually activated, and they are available only with minimum Android SDK version 23 or higher.

You can change your min SDK version at your *Engine.ini file:


To enable advanced optimizations, add the following setting:

    bEnableAdvancedBinaryCompression = true

Projects with a minimum SDK version of 23 or higher will use the new GNU hash ELF section instead of the previous format, which provides better performance and faster startup times. In addition, your project will also take advantage of APS relocation table compression, an Android-specific compression format. For example, in our tests, a relocation table with a size of 62 MB was reduced to roughly 8 MB.

Projects with a minimum SDK version of 28 or higher can take advantage of RELR relocation table compression, which is even more efficient than APS. For example, our 62 MB table was reduced to roughly 600 KB, or two orders of magnitude.

Upgrading your MinSDKVersion to 23 or higher has another benefit—Android OS will now be able to load .so binaries from your application's APK directly, eliminating the need to unpack and install them on the device separately.

Projects shipping through the Google Play Store will benefit from this, as it provides a better on-the-fly APK compression when users download your app. However, this is not guaranteed to be the case on other app stores. Unreal Engine enforces APK compression by default. If you want to disable it, you can do so with the following config variable:

    bExtractNativeLibs = false

DXC as Default Shader Compiler for Vulkan and GLES 3.2

In UE5, we have switched the shader compiler toolchain for Vulkan and OpenGL ES3.2 from HLSLcc to Microsoft's DirectX Shader Compiler (DXC). This compiler generates SPIR-V directly and does not need to generate GLSL high-level source to improve performance, and it uses SPIRV-Tools optimization passses to produce efficient SPIR-V code. DXC also provides access to the latest HLSL language features, and you can take advantage of a larger online community for support, including developers from Microsoft, Google, and AMD.

For Vulkan, DXC is the only available shader compiler in UE 5.0. The HLSLcc compiler has been removed completely from the Vulkan backend and is no longer available.

For OpenGL ES3.2, HLSLcc is still available as a fallback, and provides the only means of supporting OpenGL ES when emulated uniform buffers are disabled.

Mobile Rendering Improvements

The following rendering features are available in the Mobile rendering pipeline for UE 5.0:

Preintegrated Subsurface Scattering Shading Model (Beta)


Left to Right: No SSS, SSS Enabled on PC, SSS Enabled on Mobile.

The Mobile Forward renderer now supports a Subsurface Profile shading model, making it possible for Mobile applications to represent materials like skin, wax, and plastic with greater detail and lighting accuracy. For efficiency, a diffusion profile is pre-integrated as a lookup table, which you can adjust at runtime. The Mobile subsurface model requires a curvature map, but otherwise is compatible with all of the same parameters used for subsurface profiles on desktop and console.

Distance Field Shadow Support (Experimental)


In UE 5.0, the Mobile renderer has support for Distance Field Shadows. In Mobile projects with dynamic lighting, enabling this feature provides Distance Field Shadows alongside Cascade Shadow Maps. While Cascade Shadow Maps provide shadows for objects closer to the camera, Distance Field Shadows will fill in shadows at farther distances from the camera. This is useful for games that need dynamic lighting and need to render shadows at longer distances than Cascade Shadow Maps permit.

Distance Field Shadows are Experimental on most Mobile hardware. To use them, locate DataDrivenPlatform.ini under Engine/Config/Android or Engine/Config/IOS. Then, in the appropriate [ShaderPlatform ...] sections for your target platform, set bSupportsMobileDistanceField, bSupportsDistanceFields, and bSupportsByteBufferComputeShaders to true, and set r.DistanceFieldShadowing to 1. After that, simply enable Distance Field Shadowing on the lighting source in your level.

Note that Distance Field Shadows require a depth prepass, which will roughly double your number of draw calls. This can have a severe impact on performance in Mobile games, so you should do performance testing on your target hardware before making any commitments to using it in your games.

Mobile Performance Improvements

In UE 5.0, the Mobile rendering pipeline has several optimizations designed to reduce draw calls and computations during rendering passes.

Cascaded Shadow Map Caching (Experimental)

Large worlds that rely heavily on dynamic lighting can be very costly for rendering performance, as they require dynamic shadows for potentially hundreds of Static Meshes at long draw distances. This is especially prohibitive on Mobile devices. Unreal Engine 5.0 provides a system for caching Cascaded Shadow Maps (CSM) for static meshes, which saves draw calls and potentially improves performance in these environments. To use this feature, enable the Enable CSM Caching setting through the Project Settings menu and restart Unreal Editor.

This feature is Experimental, and does not guarantee that performance will be improved. While CSM caching does save draw calls, it also adds a shadow map copy pass, which increases bandwidth cost. You should always do a comparison on your target hardware to determine whether or not CSM caching will help in your project.


Mobile projects now support SkinCache, which pre-computes skeletal mesh skinning once at the start of a frame, then re-uses that computation for different rendering passes within the same frame. This can noticeably improve performance in Mobile projects using a large number of skeletal meshes.

By default, SkinCache is disabled on all platforms. To enable it, open your Project Settings and enable Support Compute Skin Cache.

GPU Scene Instancing and Culling

In UE 5.0, we have improved dynamic instancing and GPU instance culling on Mobile. GPU scene instancing and culling can significantly reduce your project's draw calls, thus improving rendering performance. The efficiency gain will depend on your project's content. Projects that use a large number of meshes with the same materials will see the most benefits from enabling this feature.

To enable GPU scene instancing and culling, open your DefaultEngine.ini, locate or add the [/Script/Engine.RendererSettings] category, and add r.Mobile.SupportGPUScene=1.


Vulkan Support for Variable Rate Shading

Variable Rate Shading (VRS) is a feature supported on newer GPUs that provides various methods for adjusting the shading rate of pixels in render targets.

Support for VRS in Unreal Engine now includes:

  • Windows devices with DirectX 12 and VRS Tier 2 support

  • Windows devices with Vulkan and VK_KHR_fragment_shading_rate extension support

  • Oculus Quest with Vulkan and VK_EXT_fragment_density_map extension support

VR Template Updates

In this release, we improved the VR Template with the following functionality:

  • VR Pawn has a Head-Mounted Display model.

  • Grab System supports Component Grab and Drop.

  • VRSpectator can be controlled using a Gamepad.


Direct Link in Editor

Unreal Engine 5 adds support for Datasmith Direct Link in Unreal Editor. Use Direct Link to visualize changes made to a scene in an external design application (Revit, Rhino, Archicad, as well as any other design application supporting Datasmith with Direct Link) in Unreal Editor in real time.

This feature streamlines your workflow and eliminates the need for time-consuming export and re-import operations, so you can focus your energy on creating amazing architectural visualizations instead.

Direct Link behaves identically to the Datasmith file import / re-import workflow:

  • Creates the same Asset types (Materials, Static Meshes, Lights, Cameras, and so on) as the ones found in a *.udatasmith file

  • Does not purge unused assets if they disappear from the design application

  • Supports metadata

  • Supports Datasmith overrides on Actors and Assets

Data Formats

We continue to improve support for importing glTF files into Unreal Engine. In this release, we added support for the following PBR schemas to the glTF Importer plugin:

  • Clearcoat

  • IOR

  • Sheen

  • Specular

The Datasmith CAD importer has received significant updates. While the user interface and workflows are similar, import results will vary compared to previous versions of Unreal Engine.

You can now specify whether to import the parametric data or the mesh inside a JT file. This gives you greater control over what data is being imported into Unreal Engine and allows for greater flexibility.

This option is exposed through the ds.CADTranslator.PreferJtFileEmbeddedTessellation console variable.

You can tweak the stitching tolerance for the Heal and Sew stitching techniques using the ds.CADTranslator.SitchingTolerance console variable. The value is in Unreal units.


We expanded the range of features that can be exported from Solidworks into Unreal Engine using Datasmith. This affords greater fidelity when exporting your Solidworks projects to a *.udatasmith file.

In Unreal Engine 5, we added support for exporting the following Solidworks features:

  • Animations authored in SolidWorks can now be imported as Level Sequences

  • Configurations can now be imported as Level Variant Sets


For this release, we improved user control over what data gets exported from Revit to a *.udatasmith file or via Direct Link. This reduces the need to perform manual tweaks and to prune unneeded data and Assets from your Unreal project after importing or re-importing the Revit scene.

You can now configure the following additional options:

  • Metadata Filtering: Specify which metadata is exported.

  • Level of Tessellation: Specify the level of tessellation used when Revit creates the meshes, as defined by the Revit API.

Neural Network Inference

The Neural Network Inference plugin (NNI) is a new plugin used to evaluate neural networks in real time inside Unreal Engine. This plugin provides features such as the machine-learning based ML Deformer system, which allows very high-resolution vertex offset data to be compressed through a ML network and played back in real time. The system acts as a foundation to many ML-based approaches to solving development challenges, including animation, ML-based AI, camera tracking, and much more.

NNI supports the industry standard ONNX model format and can run any model exported as ONNX from standard ML training frameworks (PyTorch, TensorFlow, MXNet, etc). This provides users the ability to take their ML models from anywhere and run them directly in the engine. The team collaborated closely with Microsoft to use their ONNX Runtime project as the core of the NNI plugin's inference system.

The initial version of the plugin supports CPU inference on PC (Windows/Linux/Mac) and Consoles (PS5/Xbox Series X). At the moment, GPU evaluation is only supported for Windows DirectX 12.

Platform SDK Upgrades

In every release, we update the Engine to support the latest SDK releases from platform partners.


  • Windows

    • Visual Studio 2019 v16.11.5

    • Windows SDK 10.0.18362

    • .NET 4.6.2 Targeting Pack

    • .NET Core 3.1 Runtime

  • IDE Version the Build farm compiles against

    • Visual Studio - Visual Studio 2019 v16.11.5 toolchain (14.16.27023) and Windows 10 SDK (10.0.18362.0)

    • Xcode - Xcode 12.4

  • GDK

    • Windows SDK: 10.0.19041.0

    • GDK: October 2021 Update 1

    • Firmware Version: Recovery November 2021 10.0.22000.3055

    • Supported IDE: Visual Studio 2019

  • Android

    • Android Studio 4.0

    • Android NDK r21e

    • Minimum Android SDK 23

    • Android SDK 26 (Android 8.0) if using Android File Server

  • ARCore

    • 1.22

  • ARKit

    • 4.0

  • Linux "SDK" (cross-toolchain)

    • v19 clang-11.0.1-based (CentOS 7)

  • Oculus

    • 33.0

  • OpenXR

    • 1.0.22

  • Google Stadia


  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 13.3.0 + optional NEX 4.6.6

    • Minimum Firmware Version: 13.2.1

    • Nintendo Dev Interface 2.5.4

    • Supported IDE: Visual Studio 2019

  • PS4

    • Orbis SDK 9.008.001

    • System software:

      • 9.030.001

      • 9.040.001

    • Supported IDE: Visual Studio 2019

  • PS5

    • Prospero SDK

    • System Software:



    • Supported IDE: Visual Studio 2019

  • macOS

    • Recommended

      • macOS Latest Monterey, Latest Xcode 13

    • Supported

      • macOS Big Sur 11.6.4

    • Minimum

      • macOS Catalina 10.15.7, Xcode 12.4

    • Machine Architecture Note

      • Added preliminary support for native Apple Silicon for macOS targets*****

      • Some SDKs do not yet contain ARM64 slices (e.g. Steam, Vivox).

  • iOS / tvOS / iPadOS

    • Recommended

      • Latest Xcode 13

    • Minimum

      • Xcode 12.4. Note that Xcode 13 is required to test locally with iOS 15 devices.

    • Supported Target SDK versions: iOS 14 or later

Upgrade Notes


  • PhysX is no longer a supported Physics backend in UE5. Additionally, UE5 provides new Vehicle and Destruction systems that are not backwards compatible with UE4 PhysXVehicles and ApexDestruction.


  • The Magic Leap plugin is not included in Unreal Engine 5. If your Unreal project is targeting Magic Leap devices, you should continue to use Unreal Engine 4.27.

  • The HoloLens plugin and all of its functionality has been fully integrated into Unreal Engine 5. Because of this, the HoloLens plugin is no longer required and you cannot add it to a project. If you have an existing project that uses the HoloLens plugin, Unreal Engine 5.0 will prompt you to remove the plugin's config data the first time you open the project after upgrading to UE5.

Release Notes



  • Added the option to ignore actors that do not implement the IGameplayTagAssetInterface when performing an EQS query with EnvQueryTest_GameplayTags. These ignored actors will not be included in the filter or score operations.

  • Added an option to EnvQueryGenerator_PerceivedActors to control whether all actors known to the AIPerceptionComponent will be gathered or only the ones actively being perceived.

Bug Fix:

  • Fixed an issue where an EQS query instance was using an incorrect EQS query asset that had the same name as the intended asset. This resulted in the query using an asset with an incorrect location.

  • Added an additional check to the Environment Query Manager to check for a valid Blackboard component if the dynamic parameter is configured to read from a blackboard.

  • Fixed an issue where running an EQS query that resulted in all items being filtered out was sometimes flagged as successful.

  • Fixed an issue where EQS contexts created in Blueprints could sometimes retrieve null actors or invalid locations via the ProvideContext call.

Behavior Tree


  • When using the Behavior Tree interface to create a new Task / Behavior / Service asset, the user can now choose the location and filename of the new asset, instead of having to rename the auto-generated one after creation.

  • Added a new parameter to the Run EQS Query task called "Update BB on Fail."

    • If enabled, this parameter will clear out the indicated blackboard entry if the EQS query fails.

    • This setting is enabled by default and can be changed via Project Settings > AI System > Clear BBEntry On BTEQSFail.

Debugging Tools


  • Added filter volume support to the Visual Logger.

  • Added a log category that shows when a dirty area is affecting one or more Navmesh tiles. This shows you how many tiles on a navigation mesh are being dirtied and who are the biggest offenders.

  • Added a way to change the font size used by the Gameplay Debugger via the console variable, gdt.fontsize. The value specified will get stored in the user's .ini files.


  • Added an optional feature to the Navmesh Data called "Use Virtual Geometry Filtering And Dirtying."

    • This feature uses virtual methods to check if an actor needs to be added to the navmesh (providing the ability to create custom logic on extended navmesh classes)

    • This change also prevents dirtying navigation areas that have been requested by an actor that is not on the navigation mesh.

  • FRecastTileGenerator::ApplyVoxelFilter is now a virtual function.

  • Switched NavMesh to use Oodle compression (bias for size in editor, bias for speed in standalone).


  • Reduced the memory footprint of the Navigation Mesh by using smaller data types when possible, fixing struct alignment to reduce padding, and factoring out settings that were unnecessarily included in each dtMeshHeader.

  • Added support for Large World Coordinates (LWC) to Navigation Modifiers.

  • Added support for Large World Coordinates (LWC) to Recast and Detour Crowd Manager.

  • Added support for Large World Coordinates (LWC) to navigation mesh serialization as either floats or doubles. This is achieved by serializing as doubles in either case.

Bug Fix:

  • Fixed an issue where the navigation mesh was not generating correctly when the NavMeshBoundsVolume was placed perfectly flat on the floor surface.

  • Added a safety check when loading a navigation mesh to check if code referencing an older version of the navigation mesh attempts to load a newer version of the navigation mesh.

  • Fixed an issue where the navigation mesh was being unnecessarily rebuilt based on the number of bits required to store maxTiles.

  • Fixed an issue where the Navigation System would rebuild the navigation mesh during OnWorldInitDone for DynamicModifiersOnly navigation if the AutoGenerateNavigationData was disabled.

  • Fixed incorrect uncompressed buffer size passed by DetourTileCacheBuilder to calculate maximum compressed size.



  • Added UAnimDistanceMatchingLibrary, which exposes Anim Node functions for driving animations based on distance.

  • Added UAnimCharacterMovementLibrary, which exposes functions for predicting where a character will stop or pivot. This is used as input to the distance matching functions.

  • Added UDistanceCurveModifier, which is an Animation Modifier that generates curves used for distance matching library functions. The modifier generates the distance curve based on root motion information from the animation.

  • Added SyncMarkerAnimModifier, which is a Blueprint Animation Modifier included with the Animation Locomotion Library. It provides an example of how to generate Animation Sync Markers automatically.

  • Added a Python Command Log tool in Control Rig for printing of equivalent Python commands when performing actions in the Control Rig Editor.

  • Added Control Rig Spline plugin, which enables the creation of Spline-based controls in Control Rig.

  • Added example Control Rig Context Menu commands written in Python: Add Null Above Selected, Add Controls For Selected, and Alignment tool.

  • Added Copy Python Script button in Control Rig Class Settings which copies the entire Control Rig to Python in order to replicate a Control Rig.

  • Using the Shift + Delete shortcut retains node connectivity in Control Rig to be consistent with the Blueprint functionality.

  • You can now toggle the effector transform on the FABRIK node in Control Rig. This addition aligns with how the FABRIK AnimGraph node works.

  • Motion Warping is a new experimental plugin which allows you to dynamically adjust root motion to align to targets.

  • SkeletalMerging is a new plugin which exposes Skeletal Mesh merging to Blueprints, and adds SkeletonMerging functionality which allows for merging of Skeletons.

  • Added support for importing Animation Transform Attributes from FBX by name(-matching) nodes within the FBX scene.

  • Project specific scriptability UFunctions were ported to the Engine.

    • SetPreviewSkeletalMesh was exposed to Blueprint and Python for Animation Blueprints and AnimationAsset derived classes.

    • Added (script exposed) functionality to retrieve UAnimationGraphs and UAnimationGraphNodes of a specific class from UAnimBlueprint and UAnimationGraph respectively.

    • Added (script exposed) functionality for populating and updating a PoseDrive node and PoseAsset.

  • Added a normalization trait/concept for animation attributes, allowing for user-defined normalization functionality after accumulation/blending operations. Normalization for the Transform animation attribute was implemented.

  • Added non-blendable versions of TransformAnimationAttribute, FloatAnimationAttribute, and IntegerAnimationAttribute.

  • Added a Get with validity checking for Animation Curves.

  • An asset registry tag "SkinWeightProfiles" was added to the SkeletalMesh asset to make it discoverable and searchable in the Editor.

  • Multiple UV channels are now supported when CPU skinning a Skeletal Mesh.

  • Added project settings that allow for defining a default set of AnimModifiers to be added to any imported AnimSequence. A new flag was added to state whether or not modifiers should be automatically applied during (re)import.

  • Added GUID to PoseAsset to track it against the Source Animation, and prompt the user if it has become out-of-date, which happens when the Animation Sequence is changed or reimported. The UX was improved for PoseAsset in the details panel.

  • Added USkinnedMeshComponent::GetRefPoseTransform.

  • GetBlendProfile is now exposed to Blueprints. This can be accessed with MontagePlay/Stop_WithBlendSettings.

  • Control Rig was promoted from beta and is now production ready.


  • You can now copy and paste Control Rig shape properties.

  • Moved animation asset browser context menu to UToolsMenu API.

  • Replaced Animation Recording sampling rate with FFrameRate to improve UX and integrate better with AnimDataModel.

  • Various improvements were made to Animation Attribute bone index mapping.

    • Introduced FMeshAttributeContainer which stores the attributes according to FMeshPoseIndex.

    • Added FinalizeAttributeEvaluationResults to SkeletalMeshComponent. This remaps the evaluated compact-pose indexed attributes to mesh-indices.

    • Added CopyFrom template to AttributeContainer for different bone index types.

    • Ensured that attributes are only inserted during evaluation if its bone index is present in the required bones

    • Added engine-level testing for remapping between LODs with removed bones, and remapping between Skeletal meshes with different skeleton hierarchies.

Crash Fix:

  • Fixed a crash that occurred when opening Mirror Data Tables.

  • Fixed a crash that occurred while applying multiple Anim Modifiers.

  • Fixed a crash that occurred when selecting 'Frame from this animation' as the Base Pose Type for an animation sequence containing animation attributes.

Bug Fix:

  • Fixed interp alpha value calculation in AnimationBudgetAllocator so it is 1 instead of 0.5 when the tick rate is 1.

  • Fixed bug that caused sync markers generated by UAnimationBlueprintLibrary::AddAnimationSyncMarker to have an invalid GUID, which would cause all sync markers to be deleted when one was deleted.

  • Expanded the list of regular expressions used to match mirrored bones to ensure the UE5 Mannequin mirrors correctly.

  • Fixed an issue with sync mirroring on blend spaces.

  • Skeletal Mesh errors now print out the path name of the component rather than just the name. This fix means you can see what Actor instance, and class, owns the component rather than the generic name StaticMesh0.

  • Fixed an issue with the mirror node that could result in incorrect behavior when the node was evaluated with identical bone counts but different bone indices.

  • Undoing a remove row operation in the Mirror Data Table now restores the location of the row.

  • You can now use WasAnimNotify functions with Linked Anim Layers.

  • Added a cache of active skeletal mesh thumbnails scenes (similar to class/blueprint thumbnail rendering) to prevent out-of-memory crashes.

  • Removed GetResourceSizeEx from UMorphTarget and FMorphTargetLODModel, as this functionality has been superseded by counting memory through UMorphTarget::Serialize.

  • Fixed a typo in SkeletalMeshComponent.h.

  • Fixed incorrect results generated when evaluating compressed Animation Curves containing user-weighted tangent data.

  • Implemented changes to ensure that the CPU access flag is correctly inherited when generating a SkinWeight buffer for alternative skin weight profile(s).

  • Fixed a bug in which CTRL+Z and CTRL+Y would not undo/redo modifications to Additional Meshes.

  • Fixed an issue with the behavior of the DoesBoneName function from AnimationBlueprintLibrary.

  • Anim runtime methods were re-exposed to the Engine API.

  • Made changes to ensure that users cannot generate Blend Profile names with invalid characters, as this name is used to generate a UObject.

  • Switched FAnimNode_TransitionPoseEvaluator to use heap-based Animation Attribute container rather than stack-based.

  • Fixed a bug where deleting one generated sync marker would cause all of the sync markers to be deleted.


  • Deprecated the Verlet Control Rig node in favor of the Spring Interpolate node.

  • Removed the Copy to SoundWave menu option.


  • Removed the recording state from the Play button in transport controls for the Animation Editor(s). This fixed an issue with the play button being shown as a pause button while recording animation in Control Rig.

Animation Assets


  • Added virtual bone support to blend profiles and blend masks.

  • Added alpha lerping to the Modify Curve Animation Blueprint node when setting Apply Mode to a non-blend value.

  • Added Maximum Duration Seconds and Sample Frame Rate options when recording animations in the Animation Sequence Editor.

  • Multiple montages can now be synchronized in Animation Blueprints using the Montage SyncFollow and Montage Sync Stop Following nodes.

  • Added 'Selected and Children' and 'Selected and Parents and Children' Bone drawing modes in the Animation Editor viewport menu.

  • Added a Blend Profile mode selection to the Blend profile picker.

  • Added an option to the Blend profile picker for blend mask creation.

  • Added a blend mask mode to the layered blend per bone node. Blend masks can be used to specify per-bone weights in a skeleton hierarchy.


  • Pose Search Databases now support root motion extrapolation so animation sequences can be used from start to finish without the need to add lead-in or follow-up sequences. The system will extrapolate the root motion velocity to generate an estimate of the root motion beyond the limits of the main sequence.

  • Added Extrapolation parameters to PoseSearchDatabase.

  • Changed the sorting in the skeleton tree so that it is alphabetical, while still maintaining the hierarchy.

  • Optimized USkeletalMeshComponent::ComputeRequiredBones().

  • Selecting Meshes and Bones is now better handled in the Animation Editor Viewport. Now when selecting, it will take into account bone visibility and cursor position to properly select either bones or meshes.

  • Section Selection toolbar button is now removed as it is now no longer needed due to selection improvements.

Crash Fix:

  • Fixed a crash when a Skeletal Mesh was referencing a deleted skeleton.

Bug Fix:

  • Fixed Show All Sections not correctly restoring all sections after filtering cloth views in the Animation Editor viewport

  • Fixed virtual bone skeleton tree item not also selecting when a virtual bone is selected in the viewport.

  • Fixed font not found warning spam when a virtual bone skeleton tree item is selected.

  • Fixed virtual bone name not showing when selected in viewport.

  • Fixed parity of virtual bone name text shadows.

  • Fixed skeleton tree undo and redo and sync when editing sockets.

  • Creating an Anim Curve on an animation sequence timeline that shares the same name as an already created curve will now reference that same curve, instead of doing nothing.

  • 'Reset Columns' now correctly works in the Animation Editor asset browser.

  • Fix for animation recorder manager not correctly stopping when reaching the Maximum Duration limit.

  • You can now drag and drop multiple Sequences onto a Montage timeline.

  • Fixed an issue with the Blend profile picker sometimes showing in a non-standalone mode outside of the skeleton editor.

  • Fixed a bug with reset to default with blend profiles.

Animation Blueprints


  • Generated node array properties are now marked as Blueprint visible so they can be exposed through generic FOptionalPinManager-driven nodes. Now arrays are not needlessly exposed and can be handled with struct member get-by-ref calls rather than struct member sets.

  • Added State Machine common helper Functions for use in the AnimGraph: Convert to Animation State and Is State Blending In / Out.

  • Added the Pose Watch Manager to track active pose watches in Animation Blueprints

  • Debug visualization can now be displayed simultaneously for all selected nodes in the Animation Graph Editor viewport.

  • Added the ability to tag and reference by tag any anim graph node using the new Tag property.

  • Anim graph nodes will now display their tags in the bottom-right corner.

  • UAnimGraphNode_BlendListBase is now exposed to exported API.

  • New functions have been added for evaluating timecode attributes on the root bone in an anim sequence.

  • "TCHour", "TCMinute", "TCSecond", "TCFrame", "TCSubframe", and "TCRate" can now be used as bone attributes on the root bone to pass timecode information through an animation sequence.

  • Added the EvaluateRootBoneTimecodeAttributesAtTime() function, which can be used to evaluate root bone timecode attributes at a particular time.

  • Added support for parsing the timecode rate as a string into the FFrameRate it represents, and accounts for the use of drop frame timecode rates (with either "29.97df" for NTSC_30 or "59.94df" for NTSC_60 frame rates).

  • Added function library support for member reference customizations and anim node functions

  • Exposed CreateNodeFunctionsWidget on anim graph node widget so that non-derived types can use it.

  • Added node function specific library for skeletal controls.

  • Added pure conversion functions for Animation Blueprint node references.

  • Added an indicator of whether node properties are dynamic in the property access binding menu.

  • You can now use the transform manipulator in the Animation Blueprint Viewport when manipulating skeletal control nodes values

  • The Animation Blueprint now shows an empty mirror node on the right-click menu when a compatible Mirror Data Table does not exist.

  • Anim Composites now appear in the Anim Blueprint context menu.

  • Added Anim Node library functions for sequence players and evaluators.

  • You can enable Anim Blueprints to show pin inspection tooltips.


  • Doubling clicking a pose watch in the pose watch manager will now frame the node in Animation Blueprints.

  • The Gravity Override parameter in the Anim Dynamics node can now be defined in world space.

  • Conduits in State Machines can now be used as entry states.

  • The compiler will now produce a warning when using experimental AnimGraph nodes.

  • Animation Blueprints now support debugging of post-process blueprints.

  • State machines now have updated iconography.

  • Child anim blueprints can now be used as the default instance class in Linked Anim Layers.

  • Improved appearance of node-specific visuals for certain anim graph nodes.

  • Improved debugging and error reporting of node-specific visuals for certain anim graph nodes.

  • Improved pin sorting for Anim Nodes.

  • Improved the Linked Anim Graph with node customizations such as node color, tooltip, and title, and allowing property access bindings.

  • There's now a warning when an incompatible Post Process Anim Blueprint is applied to a Skeletal Mesh.

  • Improved performance of Animation Blueprints when displaying large graphs.

  • Optimized building reference and identity poses by avoiding excessive inner branching when setting a compact pose to a reference pose, and avoiding setting scale twice when resetting a transform to additive identity.

  • Optimized property access runtime by caching the return value property, and no longer using a mem stack allocator but instead an inline-allocated array of bytes and manually aligning the base pointer.

  • Previously a large shared pointer destruction chain occurred when resetting tick records each frame. To reduce tick record context data overheads, individual shared pointers to context data were switched to unique pointers, while allowing shared ownership and holding a shared pointer to the entire array.

Crash Fix:

  • Fixed crash when editing Call Sites on Property Access nodes used in the Animation Blueprint Event Graph.

  • Fixed crash when compiling an Animation Blueprint with all bones hidden.

  • Fixed crash with out of bounds skeleton bone indices.

  • Fixed crash when dragging a sequence player into a Template Animation Blueprint.

  • Fixed crash when compiling on load anim graphs that contained null nodes.

  • Fixed SVisibilityWidget crashing on Linux when opening the Pose Watch Manager.

  • Fixed crash when using details panel to edit multiple blend weights on a single node.

  • Fixed crash when copy, pasting, and compiling various animation nodes.

  • Fixed crash when cooking child Animation Blueprints.

  • Fixed crash when right-clicking a child asset of a template animation blueprint that has no skeleton.

  • Previously older Anim Blueprint generated classes, on first load, could contain out-of-date node type layout tables, and were unusable unless they were patched up with compile-on-load. Now non-compile-on-load paths successfully load these Anim Blueprints, although they cannot be used.

  • Fixed the crash that occurs when compiling an Anim Blueprint with an empty state machine.

  • Fixed the post-compilation crash that occurs when using the Call Function Anim Nodes.

  • Fixed an occasional crash that occurs when performing an undo while the Slot Names Editor is open.

  • Child Anim Blueprints that use Blendspace Graphs no longer reference null blendspaces.

  • Fixed a crash that occurs when selecting a Linked Anim Layer class.

  • Fixed a crash that occurs while compiling child Anim Blueprints that weren't properly initialized.

  • Fixed a crash that occurs when selecting property access chains involving structs with native break functions.

  • Opening a collapsed area in the Create Animation Blueprint dialog no longer causes a crash.

  • Calling Anim Node functions when running standalone nodes no longer crashes.

  • Fixed a crash that occurred when selecting a slot node in a template Animation Blueprint.

Bug Fix:

  • Pose watching now correctly works for Blend Space and State Machine nodes.

  • Copy and paste now works for Blend Space AnimGraph samples.

  • Fixed being unable to make permanent pose watches created when enabling ‘Automatically create pose watch on selection'.

  • Added 'Initial Update' animation node function callback.

  • Pose watches now correctly delete when deleting a graph that contains them.

  • Fixed error when using a non-thread-safe function on an anim node.

  • Fixed metadata preventing new node bindings from being created.

  • Fixed a load ordering dependency with parent and child Animation Blueprints when child classes were PostLoaded() after their parents.

  • Fixed window focus loss when searching for parent blueprint classes while creating Animation Blueprints.

  • The schema type will now be checked before creating animation-specific graph pin widgets in order to resolve issues with execution pin connections.

  • Fixed animation node functions not being called correctly.

  • Fixed function library support for member reference customization and animation node functions.

  • Fixed non-deterministic cooking issue with child Animation Blueprints.

  • Single frame blendspaces now correctly sample root motion.

  • Property access generated properties are flagged as compiler-generated now, so CopyPropertiesForUnrelatedObjects will skip them.

  • Fixed issue where undo and redo weren't working correctly on property access nodes.

  • You can now spawn variable setters in Anim Graphs.

  • Modify bone and other edit modes now propagate to debugged objects during PIE and in Editor worlds.

  • The default values for Anim Node's bool pin no longer show up when pins are connected.

  • The Property Access node now has a move cursor when you hover over the node.

  • Previously, pose handlers were incorrectly calling a CacheBones pass on the graph during initialization. In the base class this was not a problem, but in derived classes, such as those with input poses, this could cause CacheBones to be called before Initialize.

  • Improved error handling for Anim Node references, especially when tagged nodes are disconnected.

  • Fix crash redo-ing and compiling an initial update anim node function binding

  • For child Anim Blueprint overrides, the Anim Node data is now linked to the class that matches the CDO being patched.

  • Sequence evaluators now show they can output a root motion delta.

  • ExtensionContent now works for a FDetailWidgetRow created from IDetailPropertyRow::CustomWidget().

  • Cooked Anim Blueprint Assets now animate when placed.

  • Optimized linking of Anim Layers with reduced calls to FindFProperty by caching generated parameter properties in FAnimBlueprintFunction and only iterating on them when linking.

  • Fixed Linked Anim Layer Node pins not being properly regenerated.

  • Fixed Linked Anim Layer pins not being available for bindings when using a self layer.

  • Corrects some mirror node bone index usage, and skips unnecessary intermediate array allocation.

  • Deprecated direct access to internal mapping arrays in FBoneContainer.

  • Fixed some bone index types, including type conversion occuring when using IInterpolationIndexProvider.

  • Fixed issue where keyboard input closed the color picker for Anim Notifies.

  • Template Anim Blueprints can no longer be retargeted.

  • We now correctly override the thread safety of return-value properties for property access when a function is marked thread-safe.

  • You can now disable notify instances and native notify types from being called in Animation Editors.

  • Undo and redo actions now work on property access call sites.

  • When starting in a different tick group for Skeletal Mesh Components allow a parallel animation eval.

  • Fixed edge case where graphs Linked Anim Layer Nodes were initialized without an interface.

  • Property access now works correctly with Blueprint refactoring tools, such as find references, renaming, and deleting.

  • Linked Anim Layers no longer show up multiple times in the context menu.

  • Fixed the issue where array child properties of an Anim Graph Node were still being shown when arrays were bound to pins.

  • Anim getters now use Linked Anim Layers.

  • Alpha blending options no longer keep bindings hidden when the alpha method is switched.

  • Linked Anim instances that have a mix of interface and non-interface layers now only unlink interface layers when unlinking.

  • There are now Anim Node data flags to reduce the overhead introduced by Anim Node functions. The data no longer has to be fetched out of folded constants to determine that it is invalid.

  • The node lookup in the Anim Blueprint compiler is used now instead of relying on the reverse DebugObjectToPropertyMap. This fixes debug weights occasionally breaking in Anim Graphs.

  • Anim Blueprints are no longer part of unneeded dependency compilations.

  • Fixed the issue in Animation Blueprints where exposed pins that were not exposed by default were not updating their values.

  • There is now a looping tooltip for transport controls.

  • Blend lists now only reinitialize children when their weight is zero.

  • There are now error reports for dynamic values that are not exposed on pins.

  • Custom pins are now created on Anim Graph Node creation and not just on reconstruction.

  • You can now debug post-process Blueprints in the Animation Blueprints Editor.

  • Fixed assert occurring when compiling an Animation Blueprint with an Anim Node function node in the Anim Graph.

  • Sparse class data is no longer derived from an incorrect base when used with a native base class.

  • You can now create a child Anim Blueprint with another compatible skeleton.

  • You can now place cooked Anim Blueprints in Level Viewports.

  • Fixed "Unable to push default value for pin" warning when linked anim graph node pins are connected.

  • You can now override Aim Offset Assets.

  • Property access thread safe logic now correctly enforces function metadata overrides.

  • Fix asserts with child Animation Blueprints by ensuring that cleaned-up sparse class data structs are moved out of the package they are in.

  • You can now open newly-spawned empty Blend Space Graphs.

  • Nested property validity filters, such as checking to see if an entry in the menu has compatible submenus, are now performed for functions.

  • You can no longer bind UObject types to unrelated types in the menu.

  • The display name now appears for script properties and functions, and ScriptName for native ones if available.

  • You can now double-click an aim offset with exposed pins.

  • GetLinkedAnimLayerInstanceByGroup now works correctly in packaged builds.

  • Property access nodes can now be correctly searched for in the AnimGraph context menu.

  • Fixed an ensure when opening some linked Animation Blueprints. Linked Animation Blueprints can be debugged, but previously the logic to set up a debugged object based on a Skeletal Mesh made the assumption that only the main animation instance would be the class being set. The check was expanded for that fallback logic application to cast a wider net than just the preview instance.

  • Extra Anim Node child properties no longer appear incorrectly on unbound structs, and bindings no longer appear on un-bindable properties.

  • Skeleton Assets now generate a thumbnail in the Create Animation Blueprint dialog.

  • Fixed an issue where a single step in the Animation Blueprint had no effect. It now steps at a fixed framerate.

  • Property Access nodes are easier to move around now.

  • Fixed an issue where nested structs that were bound to Anim Node pins were not showing their child values.

  • Fixed spurious compiler thread-safety errors when batch compiling.

  • Fixed issues with child Animation Blueprint compilation ordering. Also improved cleaned-up sparse class data structs.

  • Fixed issues with Sequence Player node Blueprint exposure.

  • Fixed a crash when opening a child Anim Blueprint of a template Anim Blueprint.

  • Fixed warnings caused by tagged-property-serialization with generated sparse class data structures in Animation Blueprints.

  • Rewrote the tooltip for sequence player's SetStartPosition to better explain its functionality.


  • Deprecated UAnimClassData, as it is no longer required by the Blueprint nativization feature, which has also been fully deprecated.


  • Removed duplicates of the Component and Actor transforms in FAnimInstanceProxy.

Animation Tools


  • Added "Spherical Pose Reader" Control Rig node, which provides easier setup of secondary deformations by defining custom regions of influence around bone rotations.

  • Added suite of new Python functions for getting and setting Control Rig Values and Keyframes in Sequencer.

  • Added options for previewing root motion in the animation editor viewport.

  • The "Duplicate and Retarget" batch process for Animation Blueprints now uses the new IK Retargeter asset.

  • Added Control Rig editor profiling for heat-map style runtime cost profiling.

  • Added support for map controls as inputs on the Control Rig Animation Blueprint node.

  • Added nodes in Control Rig to interact with Arrays such as Add, Num, GetAt, and SetAt.

  • Added the option to automatically link new mutable nodes in the Control Rig Settings.

  • Control Rig: Functionality for the ControlRigComponent to perform lazy evaluation.

  • Added the following nodes to Control Rig: New Item Equals, Item Not Equals, Item Type Equals, and Item Type Not Equals.

  • There is now a new user workflow to promote pins to a variable in Control Rig.

  • There are new nodes to allow Nulls and Control to reparent and space switch in Control Rig.

  • Skeleton Editor has a new transform widget for editing and viewing bone transforms.

  • You can now inspect live values running through a Control Rig in the Details panel's Live Values section.

  • You can now frame the selection and the complete graph in Control Rig using the F hotkey.

  • There are new Control Rig nodes so you can interact with arrays of transforms to perform accumulation, project from local to global space, and draw arrays of transforms directly.

  • There's a new option in Control Rig to show the Controls' colors on the icon in the Rig Hierarchy widget.

  • Fixed an issue where the Viewport appeared blank for additive animation. We now always retrieve a valid skeletal mesh for previewing.

  • The Viewport has been updated to use AdvancedPreviewScene similar to the Animation Editor viewport(s).

  • Added the ability to update a PoseAsset pose-entry with the current in-viewport pose.

  • Added the option Show Mesh Edges in the Animation Viewport Show Options menu.

  • Exposed TargetSkeleton and PreviewSkeletalMesh for BlendSpace factory as BlueprintReadWrite. You can use this to create blendspaces from Blueprints and Python.

  • Added the option to only apply out-of-date animation modifiers to an animation sequence. This option appears in the contextual menu of an Asset, and through the Details view of AnimationModifier classes.

  • Added option to visualize Animation Transform Attributes in the Animation Editor. You can access this option from the Show Flag menu.

  • Added a new option to DebugSkelMesh to track the LOD of an attached instance in the Level Viewport.

  • Added new default gizmo libraries with shapes that have uniform scale to Control Rig. Assets from previous versions will maintain their original gizmo library.


  • Enabled full support for user defined struct usage in Control Rig.

  • The Control Rig runtime VM has been upgraded to a more compact and flexible memory backend.

  • Reduced the memory footprint and runtime of Control Rig by using inline allocators to avoid allocations for minimum size cases, and batch allocating elements.

Bug Fix:

  • Control tracks in Sequencer now correctly update their name when a Control is renamed in the Control Rig editor.

  • Fixed Bone selection behavior in Control Rig viewport.

  • Fixed an issue where any pending Apply Preview Mesh pop-up toasts were not faded out when consecutively changing the Preview Mesh.

  • Reduced the number of editor transactions created when dragging BlendSpace sample points. We now create a single transaction for interactive changes.

  • Fixed a scaling issue with the scrollbar in the Animation Editor Timeline.

  • Fixed an issue with Additional Meshes where their post-process Animation Blueprints were not being evaluated correctly in Animation Editor(s).

  • Fixed not being able to select a PreviewMesh using the arrow keys.

  • Fixed an issue with Animation Recorder generating gaps or missing curve-key values by ensuring that WriteIndex is used to populate curve-key data.


  • Deprecated the Transform Constraint Control Rig node. It is replaced with new Parent/Position/Rotation/Scale Constraint nodes.



  • Added support for importing enum FBX properties as string-typed custom attributes. Enum-typed properties in the FBX are converted to string-typed custom attributes using the string value that corresponds to the enum index.

  • Added dedicated settings for timecode custom attribute names, which can be customized for a pipeline using BoneTimecodeCustomAttributeNameSettings.

  • Sequencer will now check for timecode properties to use as TimecodeSource when importing FBX to Control Rig.

  • Skeletal Meshes imported from FBX now stores mesh names, number of vertices, and the start vertex offset.

  • You can choose to store the vertex numbers from your DCC for a Geometry Cache imported from Alembic files, by enabling Import Vertex Numbers.

  • The Alembic Importer and Geometry Cache plugins are now no longer experimental, and are instead production ready.

Bug Fix:

  • Fixed precision issues that could result in Anim Sequences from FBX importing at the wrong frame rate, and improved animation sampling precision on animations with larger durations.

  • Streaming a geometry cache from Alembic with constant topologies now supports frame interpolation, This is needed for subframe sampling and motion blur.

  • Alembic import settings created from a script can now be used and displayed in the Import dialog.


  • Removed support for HDF5-format Alembic. Instead, use or convert your Alembics to Ogawa format before importing in Unreal Engine.

Skeletal Mesh


  • Moved Bake Out Materials to the Skeletal Mesh Editor toolbar.

Crash Fix:

  • Fixed crash when calling Set Skeletal Mesh function in Blueprints.

Bug Fix:

  • Fixed editable skeleton transactions sometimes not being saved.

  • Fixed a crash when serializing morph targets on an editor platform that didn't support morph targets.


  • Removed skinning pre- and post-offset. This was added temporarily in 4.26, specifically for the MLDeformer prototype. The public functions were always marked as deprecated.



  • Added Bandsplitter MetaSound nodes that split audio into discrete frequency bands, with the option to phase correct so that they can sum back together with minimal artifacts.

  • Added a Dynamic Filter node to MetaSounds. This node is a filter with bell and shelf modes that filters based on the strength of the signal at the affected frequency range. This node can be sidechained with a secondary audio source.

  • Added a new UInterface that allows Actors to automatically fill out and pass an array of AudioParameters to any owned sounds from said Actor.

  • Added a Diffuser node to MetaSounds. This node diffuses incoming audio like a reverb, but without adding a long tail.

  • Added the ability for an Audio Component to be associated with multiple active sounds.

  • Added variables to the MetaSound graphs.

  • Parameter setter calls on an AudioComponent are now cached in separate "InstanceParameters" arrays and supersede changes to the "DefaultParameters" array (redirected from the original InstanceParameters array).

  • Parameters now have a fallback structure set by Blueprints / runtime "InstanceParameters", instead of those provided by ActorParamInterface. These parameters are set as defaults on the AudioComponent.

  • Added Unreal Insights markup to the Quartz Audio system. Various Quartz mechanisms and performance considerations can now be visualized in the Unreal Insights tool.

  • Enabled Google Resonance Audio as a default engine plugin.

  • Added audio slider and knob widgets. These widgets can be used as standalone widgets and within the MetaSound editor.

  • Added Editor Preferences options for various MetaSound and Sound asset types for easy access when creating new assets.

  • Added an Editor Preferences option to automatically solo audio for the first PIE client.

  • Added an Additive Synth MetaSound node.

  • Added support for Metasounds in Sequencer via the transmission interface.

  • Added the ability to modulate Output Volume, Wet Level, and Dry Level on submixes with the Audio Modulation plugin. This replaces the old properties, which are now deprecated. The old volume properties will transfer to the base values of the new Modulation Destinations automatically, and will work the same even if the Audio Modulation plugin is disabled.


  • Added more trace events to the audio device and to Metasound rendering to get more useful performance information when viewing Unreal Insights sessions.

  • The dynamics process and MetaSound Compressor node can now apply upwards compression in addition to downwards compression. Upwards compression can apply up to a maximum of 36 dB of gain to a signal below its threshold.

  • Improved the MetaSound OnPlay CPU performance.

  • Improved the clarity of the default values in Audio Platform Settings UX.

  • Changed the log verbosity in the Steam Audio spatialization plugin to reduce the number of messages.

  • Added the ability to compile out huge symbols out of libSamplerate to save on memory.

  • Optimized MetaSound node searching.

  • Improved the tool tips for Audio Stream Caching statics.

  • Cleaned up XAudio2Windows and separated it into smaller, more manageable pieces.

  • Enabled the MetaSound AutoConverter nodes between enums and int32, and updated the conversion nodes style.

  • Updated Wavewriter to support multiple channels.

  • Added optimizations to Recycle threads for Null Renderer devices.

  • Added optimizations to the DeviceInfo Cache.

  • Added optimizations for Windows to the Threaded device swap.

  • Did an incremental refactor to XAudio2 and moved the stringify error codes into StringHelper.

  • Changed the Mute / Solo option for Sound Classes to only apply while in PIE.

  • Reduced the number of log messages produced when using procedural SoundWaves on Sequencer's audio track.

Bug Fix:

  • Fixed an issue where the MetaSound block-rate AD Envelope node was not allowing attack rates smaller than one block size (eg 0). If set to under a block length, it will now skip its attack phase.

  • Fixed the MetaSound Compressor node failing to update some of its inputs while running.

  • Fixed Metasound type conversion nodes outputting default values on the first render block.

  • Fixed an issue where ActiveSounds and AudioComponents spawned via GameplayStatics functions wouldn't have an Owner actor assigned to them.

  • Fixed an issue with Focus Interpolation where it would always interpolate up from 0, instead of initializing to the current Focus value.

  • Fixed an issue where it was possible to divide by zero on the MetaSound AD Envelope.

  • Fixed a bug where the initial value of the Metasound math operator nodes was not being set.

  • Fixed an issue that would result in the lack of clamping when recording output.

  • Fixed an issue where binaural audio was not working correctly on some plugins.

  • Fixed an issue where the audio settings were not being saved to .ini files on some platforms.

  • Fixed an issue where the MetaSound InterpTo nodes and Conversion nodes were not propagating their initial output values at the point of construction.

  • Fixed an issue where sending a normal submix to a soundfield submix could result in an incorrect init order or a crash.

  • Fixed an issue where Soundfield Submixes would not properly re-initialize when the encoding format changed in the editor.

  • Fixed an issue where the Audio Capture Component would crash if OpenCaptureStream() hadn't been called.

  • Fixed an issue where sounds were cutting off if they started playing within the binaural radius, and the listener left that radius.

  • Added protection against a potential null pointer deref in SubmixUtils::AreSubmixFormatsCompatible().

  • Fixed an ensure when binaural sound was sent directly to a soundfield submix.

  • Fixed an issue where the Modulation EnvelopeFollower was not reinitializing when the AudioBus was initially unset.

  • Added a Multithreaded Patching (MTP) Remainder check in the calculation to now ignore (and properly clean-up) inactive outputs.

  • Fixed an issue where FQuantizedPlayCommand::CancelCustom() was letting pending play commands play un-quantized instead of stopping the sound.

  • Fixed an issue where audio buses were mixing in incorrect data when the sound started playing in a "paused" state.

  • Added a fix to prevent an Audio Component from accessing an uninitialized Quartz Clock.

  • Fixed an issue where the Audio Streaming Cache would crash if the configuration caused the cache to have zero elements.

  • Fixed an issue where swapping an in-flight threaded audio device would cause a shutdown crash.

  • Fixed an issue where the AudioMixer XAudio2 would not recover after failing to initialize. This allows for device swapping after an open failure.

  • Removed the DLL fallback code that was causing issues with initialization recovery.

  • Fixed several issues with the audio channel that would result from device swaps.

  • Removed the PhysicalSpeaker property from being monitored for swapping and improved logging around channels changing.

  • Fixed an issue that would result in memory corruption in USoundNode.

  • Fixed an issue where the MMNotification client would experience a deadlock.

  • Fixed an issue that would cause incorrect fading of a SubmixEffect.

  • Fixed an issue with a race condition in the Windows Session Notification client Unregister / Register.

  • Fixed an issue where the MetaSoundSource of a Metasound asset would get corrupted when setting the Playback position to be non-zero.

  • Fixed an issue where the Bhaskara and Pure Math variations of the Sine MetaSound Generator Node were not correctly handling negative frequencies.

  • Fixed an issue where copy / paste was not working correctly in the Audio Mixer thread priority.

  • Fixed an issue where adjusting nullptr check in the AudioDevice would result in a crash.

  • Fixed an issue where stereo sounds with binaural spatialization were not panning correctly.

  • Fixed an issue where switching back from a NULL renderer device would result in the user's PC hanging.

  • Fixed an issue in AudioMixer that would result in a nullptr on partial initialization teardown.

  • Fixed an issue in the Audio Streaming Cache that would result in a crash.

  • Fixed an issue where the WaveWriter node was creating files even when it was not connected in the MetaSounds graph.

  • Fixed several issues with the Metasound Oscillator Generator node, including DC offset for square wave, triangle wave phase offset, and fade in for unipolar generators


  • Deprecated the MetaSound Send and Receive nodes.

  • Removed the Sound Visualization plugin in favor of the more comprehensive functionality in the Audio Synesthesia plugin and other parts of the audio engine.

  • Removed the stat audio console commands in favor of the au.Debug family of console commands.

  • Deprecated the SpokenText field in SoundWave.

  • Removed the au.debug.ListSounds command.


All Xbox


  • Always include the "requires xbox live" flag in the manifest, as per the guidance from Microsoft, even if it is false.

  • Adding support for Simplified User Model.

  • Added support for detecting and reducing register spillage in the Xbox shader compiler. It will do multiple iterations with decreasing target occupancy to prevent it.

    • The maximum retry count is specified with UE_XBOX_SHADER_COMPILER_AVOID_SCRATCH_USAGE_MAX_RETRIES, and this defaults to 3. The final target occupancy will always be 1, and this reduces in powers of two with each iteration.

  • Gauntlet now removes previous staged build before deploying new build.

Bug Fix:

  • Fix for PIX profiling settings to retain control of instrumented D3D12 on Xbox over ProfileGPU.

  • Lazy initialization of audio resources in FMediaFoundationMovieStreamer and proper handling of PLM suspend/resume events.

Playstation 4


  • Enable OnlineSubsystemPS4 plugin by default

Bug Fix:

  • Replace pthread functions with SCEpthread functions for Sony events. The SCE version uses relative time for timeouts which handles potential errors when changing the system time.

  • Fixed copies of cubemap texture mips.

  • Fixed net address failures when the port is negative.

Playstation 5


  • Implement package discovery, installation and deployment for Playstation 5 automation.

  • Integrated MemPro for Playstation 5.

  • Added support for PS5 shader compiler stats to be available in the editor.

Bug Fix:

  • Fixed the creation of update packages based on a previous release. The build system no longer considers MasterVersion to determine if a package is a previous release, but the highest MasterVersion is preferred when selecting from the available base packages.

  • Fixed issue where GPU readbacks would sometimes return stale data.


Bug Fix:

  • Fix Stadia's keyboard handling under AZERTY and other country-specific layouts.

  • Fix stadia failing to package in installed builds.



  • Add setting for enableSingleMode option in Switch Controller Support Applet. If enabled, it specifies whether to start controller support in single-player mode. Players are prompted to prepare controllers, including attached controllers, for one person. See nn::hid::ControllerSupportArg::enableSingleMode in the Switch documentation for more info.

  • Added two new features for SwitchInputSender:

    • Added a checkbox to reset the required version automatically when launching the requested app. This removes the need to reset the required version manually with DevMenu.

    • Added the --no-wait command when launching an application to allow the call to RunOnTarget.exe to return immediately instead of waiting until the title exits. This frees SwitchInputSender to do other tasks while the title is running.

  • The Switch RHI will remove unnecessary geometry shader management functionality at compile time if tesselation and geometry shaders are not used. This results in a small performance improvement.

  • Added a return code to the program RegTarget to indicate whether the requested operation was successful or not.

  • Allowing static shader platforms on Switch. This reduces runtime memory usage by around 9MB. To take advantage of these savings, choose a shader platform for the project. Then add defines for "USE_STATIC_SHADER_PLATFORM_ENUMS=1" and either "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH_MOBILE" or "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH" in the project's _Target.cs file.

  • Optimized compiler and linker flags to reduce memory footprint and binary size.

  • Optimized NVN CPU allocator by reconfiguring CPU memory growable allocators to reduce waste.

  • Optimize the chunk search in GrowableAllocator, so it's no longer O(n^2) in most cases. The chunk search time is now 20x faster, and overall allocator overhead is reduced by 40%.

Crash Fix:

  • Previously, when taking a Low-Level Memory tracker (LLM) capture, the application would crash on exit. This crash has been resolved.

  • Previously, if the Switch's profiler system was active, the app would crash on exit after tearing down the profiler system. The crash has been resolved by waiting on the render threads to drain before tearing down the profiler system.

  • Previously, SwitchInputSender would crash on exit if it was closed while still running tasks when it was closed. It will now exit normally.

Bug Fix:

  • Previously, if FSwitchPlatformFile::OpenWrite() was called, and bAppend was true, it would overwrite the existing data with any new data. Now FSwitchPlatformFile::OpenWrite() will seek to the end of the file, and it will write new data at the end of the file.

  • Previously, custom stencil lookups would not return the correct result due to the lookup referencing the incorrect texture channel. The lookups will now return the correct data.

  • Previously, if too many file handles were opened, FSwitchFileHandleBase::Read() would assert before attempting to reopen the file. Now the assert will only fire if the reopen attempt fails.

  • Previously, an assert would be triggered in the SwitchMediaDecoder during Cook On The Fly (COTF) when it attempted to read a file from staged data. This was resolved by changing the check() into an error message as staged data is unavailable during COTF.

  • Previously, the Boost setting would not be set correctly when SwitchInputSender requested a change. The setting will now be set as requested.

  • Previously, an error would occur if the user lifted a finger from the Switch touchscreen and a new finger started touching the screen in the same frame. This error has been resolved by sending all TouchEnd events first, preventing a new TouchStart event from occurring before the corresponding TouchEnd has been sent.

  • Previously, SwitchInputSender would fail to update a kit's firmware if the Switch console had a custom name. Now SwitchInputSender can correctly update the firmware of a Switch console which has a custom name.

  • Previously, the error "Issue 11-801 - Uses development APIs appears" would appear when packaging an application in the Shipping configuration. The functions causing this are now no longer referenced in the Shipping configuration, and the error no longer occurs during packaging.

  • Updated the SwitchInputSender export process to include missing assets when exporting and updated the ExportSwitchInputSender.bat file. Previously the exported version of SwitchInputSender would fail because of missing assets. Now those assets are included.

  • Previously, SwitchInputSender would terminate the running application when connecting to a Switch console. Now SwitchInputSender will connect without the need to terminate the running application.

  • Previously, when setting a new memory value for the Switch console, SwitchInputSender would not reboot the console, and the setting would not take effect until the console was manually rebooted. SwitchInputSender will now reboot the console when necessary, aligning with the other options that also require a reboot.

  • Set NumBuffers=1 when ResourceArray is provided.


  • Sparse Texture support (bUseSparseTextures) has been deprecated due to the lack of performance when enabled and the code complexity incurred to support them. Disable Sparse Texture support for improved performance.

XBox One GDK

Bug Fix:

  • Fixed a virtual address leak when an ESRAM allocation fails.



  • Added an active timer count threshold at which we assume something is wrong and dump all timers to the log. The intention is to provide information in cases where projects have thousands of active timers at once, which can degrade performance.

  • Added an exec command called "DisplayCVarList" that supports a comma-separated list of CVar names to draw to the screen. This command also supports name completion; for example, you could enter "r.nanite" to see all CVars related to Nanite.

  • Added FMemoryWriter64 for serializing to a TArray64.

  • Added IntCastChecked and IntFitsIn utility functions.

  • Added UTF8CHAR string overloads for FCrc::Strihash_DEPRECATED.

  • Added TSharedFromThis::AsWeak() to complement TSharedFromThis::AsShared().

  • Added an FUtf8StringView overload for FSoftObjectPtr::SetPath().

  • Added UTF8 constructors to FBlake3Hash and FIoHash.

  • Extended FResourceSizeEx to keep track of name for each memory size added. This allows for verbose reporting of resource sizes. This results in output which will dump each tracked named size.

  • Added additional `AddSharedSystemMemoryBytes function which accepts a named tag.

  • Modified the FStaticMeshLODResources class method GetResourceSizeEx to use the new interface.

  • Modified FSkeletalMeshLODRenderData::GetResourceSizeEx() to use the new interface.

  • Added optional alignment awareness to the allocator model, and added support for that to TArray and FScriptArray.

  • Added: FArchive::SerializeCompressedNew can use arbitrary compressors, not hard-coded to ZLib like FArchive::SerializeCompressed.

  • Added the ability to use TArrayView with Append in TSet.

  • The Chunk Downloader now has a GetNumDownloadRequests() function.

  • CurveTable now has RemoveRow functionality to match DataTable.

  • The editor now has a new user interface for the CSVToSVG command line tool.

  • The editor can now create data tables from a raw data array.

  • Added a new WIDETEXT macro for WIDECHAR literals.

  • Users can now disable all or specific notifications from the DDC system.

  • TMemoryImagePtr, FWeakObjectPtr, TOptional, TInlineValue and FObjectPtr debugger visualization now support visualization of dereferencing expressions.

  • Added missing constexpr and UE_NODISCARD to eligible functions in UnrealMathUtility.

  • Created FTSTicker, a thread-safe version of FTicker. FTSTicker can add and remove tick delegates concurrently. Removing a delegate can block until its execution is finishing in parallel.

  • Added a new constexpr FPlatformString::IsCharEncodingSimplyConvertibleTo() function which tests if one encoding can be assignment-per-character converted to another.

  • Added a placeholder for HashCombineFast(), which is intended to serve as a placeholder for an in-memory fast hash combining algorithm, unlike HashCombine() where the results may be persisted.

  • HAL/HideTCHAR.h and HAL/AllowTCHAR.h for including around third-party headers in UTF-8 mode which use their own implementation of TCHAR (for example, Windows headers).

  • FSpinLock and generic TScopeLock. These are classic spin-locking behaviors, so use them with caution.

  • TIsCharType now has specializations for UTF32CHAR and wchar_t when PLATFORM_TCHAR_IS_CHAR16 is set. Added a new PLATFORM_UCS2CHAR_IS_UTF16CHAR macro.

  • Created the Game Thread CPU Timing platform API for more accurate CPU Percentage and CPU saturation detection. Also added a platform API for free (on Unix) process performance stats (Page Faults, IO, and Context Switches). Game Thread CPU Timing is guarded with the CVar: Platform.TrackGameThreadCPUUsage

  • TInlineValue has a new EInPlace constructor.

  • Enabled DisplayAll commands in TEST config builds.

  • Added TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW and UTF8TEXTVIEW macros for creating string views to replace the TEXT macro with "_SV" added to the end of the quoted string literal.

  • Remove unused names from package headers, reducing the amount of data and number of names that have to be serialized. We now:

    • Strip names that are not used when cooking for UnversionedPropertySerialization.

    • Strip names that are not used by the loader when staging for IoStore.

  • The third-party Imath library (version 3.1.3) is now included for use in the engine.

  • FString::AppendChars, CompactBinary, and FName construction now support UTF-8. FUtf8StringView is now constructible from both ANSICHAR and UTF8CHAR strings.

  • Removed the unused InstallVisualizers.bat file because Visual Studio versions above 2015 do not use it. Added a .natstepfilter for common Unreal parameter constructor functions to avoid stepping into the parameter construction when trying to step into a function that takes the parameter.

  • Added a Custom Config directory feature that can be used to support multiple packaging targets per platform.

    • Setting CustomConfig=Directory in a Target.cs file will cause it to overlay config files from Project/Config/Custom/Directory on top of the other config files, enabling easy override of things like OSS settings to support multiple stores.

    • In development, -CustomConfig=Directory can be specified in both C++ and C# to enable the same functionality, which can be used to select between different stage/deploy configurations in a build script.

  • Added PackageName.DumpMointPoints, PackageName.RegisterMountPoint and PackageName.UnregisterMountPoint console commands to manage UnrealFileSystemMountPoints in non-shipping builds.

  • Added GetValid(Object) global function. GetValid can be used in places where pointer validation with IsValid(Object) triggers static analysis warnings.

  • Added the ability to specify referencer name provider type for TStrongObjectPtr.

  • Made the verbosity of the uninitialized reflected property check configurable through either project or engine modules. Projects use DefaultEngine.ini, while engine defaults are in BaseEngine.ini. Issues with UObject* properties are upgraded from Warning to Error. Other types remain the same for both engine and project modules (Display), but engine will soon change to Error as well. For example:

    • [CoreUObject.UninitializedScriptStructMembersCheck] EngineModuleReflectedUninitializedPropertyVerbosity=Error ProjectModuleReflectedUninitializedPropertyVerbosity=Warning

  • Added OodleDataCompression.h interface for direct access to Oodle compression. Oodle compression is now built into Unreal Engine Core and is available on all platforms for general purpose compression needs. This is separate from the configurable pak/iostore compressor.

  • Optimized IsValid(Object) performance: 19.8ms -> 9.2ms (based on internal GarbageCollector tests)

  • Add UE_CALL_ONCE to help call void functions once

  • In OutputDeviceFile, the async writer can now set its thread name to either the file name or a sequential number. Define OUTPUTDEVICE_DEFAULT_ASYNC_WRITER_THREAD_NAME to change the default behavior, which is to use the file name.

  • Added support for disabling Pending Kill functionality in the engine. Pending Kill will be disabled by default for any new projects created with the next Engine release.

  • FGCObjects without GetReferencerName overrides will now be reported during Garbage Collection verification tests.

  • Changed the CsvProfiler worker thread to be created on demand, rather than unconditionally. The CSV_PROFILER macro is now defined in Shipping on the Dedicated Server only if checks are defined as well.

  • Added support for disabling CsvProfiler categories through configuration by using the CsvProfiler/DisabledCategories array.

  • The UCLASS specifier now takes a Hidden flag. This maps directly to the ClassFlags Enum CLASS_Hidden flag. Adding this flag will hide the given class from any class browser in the editor.

  • Introduced Garbage Collector History. Garbage Collector can now store information about its previous runs which can then be used to track down UObject memory leaks.

  • The ReferenceChainSearch class will no longer store raw pointers to UObjects when constructing reference chains and instead will only preserve basic information about UObjects separate from UObjects themselves.

  • Downgraded level leak asserts to errors when PendingKill is disabled.

  • Updated to Oodle 2.9.5 SDK. Oodle 2.9.5 provides significantly faster rate-distortion optimized texture encoding.

  • Added a UnrealTraceServer.exe to the binary build. UnrealTraceServer is the tool that records traces for profiling purposes.

  • Added functionality to Allow Cast to gracefully handle an interface instance that's not a UObject.

  • ISPC support has been added for double versions of core types.

  • Traced a timing event for each task's start-end interval.

  • Added a template VariantStructure as an alternative to the template BaseStructure that provides access to script structs for f and d LWC variant types.

  • In the PathPermissionList class a const FName reference is now used instead of FName in iterators whenever it is possible.

  • Added support for values larger than 2 GB in the Derived Data Cache.

  • Added compression to the Derived Data Cache, reducing its size by 65-75%.

  • Added the ability to configure Task priorities from config files.

  • Made the scrollableFormatting and reverseSortRows properties of the SummaryTable able to be set in XML.

  • Added listSummaryTables option to list the available summary tables in the current ReportXML, then Output the report XML filename and report graphs filename to the log.

  • TPromise can now use non default constructible types.

  • Added support for more than two sticky columns in collated summary tables. New format info for columns have been created to replace the "lowIsBad" list. This provides specifying auto colorization rules and numerical formatting.

  • Added support for multiple section boundaries, and minor (dashed line) section boundaries Section boundaries no longer require startToken or endToken. Section boundaries now can be specific to collated or full tables

  • Added a minFrameCount param which filters out rows from the summary table based on frame count. This allows us to filter out bad CSVs. This works after the cache reads, so bad PRCs will also be filtered out.

  • Added maxFileAgeDays argument. CSV or PRC files older than the specified parameter will be ignored. This is faster than querying timestamp metadata, especially when reading from network drives.

  • Added input format detection for csvConvert. If not specified, input format and compression will be used for output.

  • Added setMetadata key/value argument for overwriting metadata, and ensured the command line metadata is written at the end when writing in .csv format.

  • PerfReportTool - hitchSummary - add summary table metrics for hitches of thresholds up to 1000ms at 100ms intervals. The new metrics are named Hitches>Xms.


  • Improved debugger visualization of TStaticArray.

  • Moved the FResourceSizeEx into its own cpp file so modifying the header isn't a full recompile.

  • Upgraded the engine's version of the third-party OpenEXR libraries to 3.1.1.

  • Moved GChaosMode state onto the heap to save on the static memory footprint.

  • Made FrameRate, Timecode, and TimeManagement work better with NTSC and/or drop frame timecode and frame rates.

  • Added quotation marks around strings from failed comparisons during automation tests to aid readability.

  • Added more heterogeneous string encoding overloads of FGenericPlatformStricmp::Strnicmp.

  • Reimplemented TSharedPtr reference counting using std::atomic and more optimal memory ordering in ESPMode::ThreadSafe mode.

  • Standardized the null smart pointer .natvis to say "nullptr" instead of "Null".

  • Improved performance, reduced code bloat, and simplified searching for non-constexpr constants by adding appropriate use of constexpr through core engine code.

  • Implemented scratch buffers for encoder scratch as well as decoder to improve OodleDataCompression performance.

  • Marked all FPlatformProcess::SleepInfinite implementations as [[noreturn]]

  • We now support passing a default value to FVector::GetSafeNormal. This value will be returned if the original vector is zero.

  • Loading of plugin-specific config files has been modified to be more consistent and reliable. BasePluginName.ini should always be used for engine plugins and DefaultPluginName.ini for game plugins.

  • FArchiveReplaceObjectRef (and subclasses) now pass parameters through flag enums rather than long lists of bools. FArchiveReplaceObjectRefBase no longer tracks replaced references by default.

  • Unified and improved output when reporting Garbage Collection World leaks and in 'obj refs' command output.

  • Added OodleTextureSdkVersion field to Texture assets so that textures remember the version of Oodle they were encoded with. Legacy assets load with this field blank. Different versions of Oodle Texture can be used based on this field to prevent unnecessary patch generation.

  • Disabled CsvProfiler RenderTargetPool category on the server side by default.

  • Prevented useless FString allocations in FindOrCreateStatSeries when checks are compiled. Enabled TLS memory caches for the CSV processing thread

  • PerfReportTool: Split classes into separate files.

  • PerfReportTool: Made Summary types self-register so they're self-contained and more easily extendable.

  • PerfReportTool: Removed redundant XmlHelper class, by converting existing usage of this to use the GetSafeAttribute method.

  • improved summary table formatting by adding support for 3 levels of section barrier in summary tables.

Crash Fix:

  • Fixed a crash when calling TPolygon2<>::Contains on an empty polygon.

  • Fixed a crash due to a missing type in the FAutomationTestAttemptToFindUninitializedScriptStructMembers test when running the automation tests from within Unreal HeaderTool.

  • Fixed a Linux crash when connecting to an incorrect trace host address.

  • A crash has been fixed that occured when running a reference gathering while incremental garbage collection running.

Bug Fix:

  • Fixed FastDecimalFormat not handling inf.

  • Fixed compile error in TRobinHoodHashMap::Remove() and data loss warning in TRobinHoodHashMap::Num().

  • Fixed FStringView::Mid to work the same as FString::Mid. Added Left, Right, and other slicing functions to TArrayView to match the behavior of FString.

  • Tidied up TSharedPtr's FReferenceControllerOps using if constexpr.

  • Fixed TTuple's per-element constructor to be conditionally explicit, allowing tuples to be initialized with a braced list of initializers.

  • Fixed some usages of FBox::ExpandBy, and clarified FBox comments.

  • Made TVariant::IsType issue a compile error when T isn't in the variant.

  • Fixed Expose_TFormatSpecifier in UTF-8 mode.

  • Fixed a dereferencing null pointer static analysis warning in AppendCharacters in String.cpp.

  • Caused a compile error when a class hierarchy inherits multiple instances of TSharedFromThis or when using TSharedFromThis when T doesn't inherit TSharedFromThis.

  • Supported the # alternative representation modifier in FGenericWidePlatformString::GetVarArgs.

  • Improved DisplayString visualization for TMemoryImagePtr.

  • Fixed the "% 123d" explicit space-padding formatting syntax in FGenericWidePlatformString::GetVarArgs.

  • Fixed FMath::Wrap for zero-sized ranges.

  • Fixed a compile error in TArray::operator<< when an element type is bulk serializable but not regularly serializable.

  • Made TUniquePtr's debugger visualizer's expanded view more consistent with other smart pointers.

  • Fixed the optimized map and set property serialization path when there are no defaults and the container is non-empty.

  • Fixed FGenericWidePlatformString to be usable under Windows by setting PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION.

  • Removed UTF8CHAR as an alias for char8_t in C++20, as it causes ABI conflicts when linking modules built with a mix of C++17 and C++20.

  • Fixed a crash when trying to convert an array of a serialized struct type to an array of a non-struct type.

  • The W component is now properly preserved in vectorized TTransform::TransformFVector4 and TTransform::TransformFVector4NoScale.

  • Fixed up FCString in UTF-8 mode.

  • Loaded packages are no longer incorrectly marked as missing, which prevents incorrect skipping of imports after requesting load of an invalid export in a valid package.

  • Added support for padded widths in FImageWrapper classes, which fixes a bug where a Remote Session's image buffer could include garbage pixels on the right side due to the underlying GPU's pixel alignment requirements.

  • Added Define log categories for NO_LOGGING configurations.

  • The entire hash map will now lock instead of individual hash buckets when iterating UObject maps to prevent memory stomps when creating, renaming, or destroying objects mid-iteration.

  • Duplicating components now correctly duplicate instanced subobjects owned by that component.

  • Fixed redirected or unqualified enum values.

  • Fixed the GetMinimalName method from the MappedName class to be aware of case sensitive FNames.

  • Fixed the MemoryWriter from failing to write an index size greater than 2GB.

  • Slightly reduced framepro send buffer size so it fits under the small alloc max size amount of some allocators.

  • Fixed potential memory stomps during localization data gathering.

  • The method FStructUtils::TheSameLayout no longer returns false when passing in null structs to compare.

  • Prevented the Plugin Utillity method AddToPluginSearchPathIfNeeded from adding mod or enterprise plugin directories to the plugin search path.

  • UMG list view will now track its Actor references and remove them when they're about to be destroyed to ensure they don't prevent levels from being Garbage Collected.

  • InputComponent will now clear its reference to the PlayerInput to ensure it doesn't prevent levels from being Garbage Collected.

  • Cleared a reference to PathFollowingComponent on the MovementComponent when the PathFollowingComponent changes its MovementComponent to make sure it does not prevent levels from being Garbage Collected.

  • FPlatformMemory::OnOutOfMemory: Fixed thread-safety issue when concurrent calls return from the function.

  • Released references to other objects when the PlayerCameraManager gets destroyed to make sure they don't prevent levels from being Garbage Collected.

  • CheatManager will now empty its extensions list when its outer PlayerController is about to be destroyed to prevent issues with Garbage Collecting leaking references.

  • Fixed use iostore and make binary config settings from not being saved to the launcher profile.

  • Cleared the thread buffer for CPU tracing to avoid scopes ending up after thread end and cleared the thread buffer pointer.

  • Fixed a mismatching Malloc / delete in the DistanceFieldStreaming implementation .

  • Fixed a few issues where adding or changing a default subobject class in a class constructor would overwrite the previously set values in Blueprints and other instances of that class.

  • The CameraModifier's CameraOwner reference will now be nulled when it gets destroyed to ensure it does not prevent levels from being Garbage Collected.

  • PlayerState's Pawn reference will now be tracked and released when no longer required to make sure it doesn't prevent levels from being Garbage Collected

  • The AbilitySystemComponent's references to other Actors will now be released when the Actors are about to be destroyed to make sure they don't prevent levels from being Garbage Collected.

  • The AudioComponent will now clear references to other objects when its EndPlay is called to ensure it does not prevent levels from being Garbage Collected.

  • Fixed trace timestamps for Unix to match the double type.

  • Fixed usage of StringCast API in various source files.

  • Fixed usage of TCHAR_TO_ANSI and TCHAR_TO_UTF8 macros in various source files.

  • Fixed invalid arguments from being passed to CSV_EVENT and TRACE_BOOKMARK.

  • Fixed several Printf string calls that contained incorrect var arguments.

  • Fixed single-property config updates from failing to remove entries that were no longer needed as they matched the CDO.

  • Fixed Stats macros from causing extra evaluations of their Value expressions.

  • Fixed CrashReportClient from writing a buggy compressed header at the start of the compressed report and the valid one at the end of the report.

  • Fixed the FArchiveFileReaderGeneric to respect the FILEREAD_Silent flag.

  • Fixed a pointer to an unexpected type being passed to the CaptureStackBackTrace method.

  • Fixed a race condition causing log lines to merge together when writing to stdout.

  • Fixed many math types like FVector, and FIntPoint from violating strict aliasing rules.

  • Fixed Pakfile creation when the uncompressed buffer size exceeds the int32 capacity and introduced the TInlineAllocator64.

  • Added an ensure to avoid a synchronization bug involving DDC memory backend and value-locking that can occur when disabling the memory backend.

  • Fixed a bug where the filter order is ignored for columns in the rowSort list in collated summary tables. Columns you are collating by will still appear first, but their relative order is preserved.

  • Fixed peak summary from not emitting SummaryTableData when detailed reports are disabled.

  • Fixed an issue where Async Loading Handles could stall on Switch.

  • Fix to Async Loading Handles to stall on Switch, which was caused by an issue with the initial pak list.

  • Prevented the EditorPackageLoader method NotifyConstructedDuringAsyncLoading from asserting if an object is created during async loading.


  • Deprecated the FPlatformString::TIsFixedWidthEncoding trait and replaced it with a constexpr FPlatformString::IsFixedWidthEncoding function.

  • Added a deprecation warning to typed allocators which fires when the allocator won't return appropriately-aligned memory - explicitly aligned versions of the allocators or alignment-aware allocators should be used instead.

  • Changed FPlatformString::CanConvertChar to FPlatformString::CanConvertCodepoint, with improved checks and documented assumptions.


  • Deprecated the IsInitialized function and variable from ThreadingManager. The variable's access was causing TSan warnings.

  • Deprecated most public properties of UPackage and created accessors for them to be used instead.

  • Deprecated StringBuilder::Append(Char) in favor of StringBuilder::AppendChar(Char).

  • Deprecated StringBuilder's class AppendAnsi method in favor of the Append method.

  • Deprecated the TStringView SizeType method in favor of int32.


  • the "Shared" version of the memory tracking functions. These are not used at all across the engine. This simplifies the code and makes the output of the obj list more readable.

  • Removed FPlatformMisc::SetEpicAccountAPI.

  • Removed the unused and inconsistently-applied BogusChar option from FPlatformString string conversion functions.

  • Removed deprecated FPlatformMisc::GetEnvironmentVariable overload.

  • Removed THasGetTypeHash.



  • Added Virtual Assets Dialogue to Derived Data Widget.

  • Added Analytics Support for Virtual Assets / Virtualization Module.

  • API support added to DerivedDataBackendInterface to help filter and tidy-up the Cooker's user interface:

    • IsRemote: Is this back end local or remote?

    • IsWrapper: Is this back end a wrapper?

    • GetTypeName: Returns a relatable back end type, such as Memory, S3, Http, Zen, or Fixed.

  • Reformatted the Cache Statistics user interface to show meaning full type name and display details.

  • Reformatted the user interface to add bold type for Titles and Totals

  • Disabled the InEditorCooking by default for all projects. Cooks launched from the editor by QuickLaunch will instead launch the cook commandlet in a separate process. Future cook architecture will move away from InEditorCooking, and the current default map type - WorldPartition - does not yet support it. A project should enable InEditorCooking only if necessary for backwards compatibility and only if it does not use WorldPartition.

  • Added ICookInfo and FInstigator to the cook to provide the AssetManager with the reason why a package was requested by the cook. This information is used automatically by the AssetManager, but can also be used to diagnose errors during cooking.

  • Added the commands -dpccvars=cook.displaymode=4: is used when packages are cooked, they will display the instigator that caused them to be cooked.

  • CookShowInstigator=: is used when the given package is cooked, it will display a message about the chain of instigators that caused it to be cooked.

Bug Fix:

  • Fixed ZenCache Statistics appearing when Zen is not the DDC backend.

  • Fixed pulsing of the cooker's Upload/Download arrows.

  • Fixed an AssetRegistry bug that caused the importer's new asset to never be found again until the editor is restarted.

  • Fixed the RemovePath method from the AssetRegistryImpl class to return true if the path already does not exist.

  • Changed the SetDefaultsForCookedEditor to always define the ASSETREGISTRY_ENABLE_PREMADE_REGISTRY_IN_EDITOR macro.

  • Made changes to the PackageNameCache definitions. The DoesPackageExist method will now use the TryConvertLongPackageNameToFilename method instead of the LongPackageNameToFilename method, so that it doesn't assert if the package name can't be resolved to filename.

  • The CookOnTheFlyServer class method GetAllPackageFilenamesFromAssetRegistry will now skip package names that don't have a valid mount point, such as packages in plugins that haven't been mounted yet.


  • LegacyBulkDataOffsets is no longer supported in UE5.

Memory Profiler

Bug Fix:

  • Fixed the maxcount calculation to no longer integer overflow before capacity integer overflows. This expands the number of allocations we can fit into 32-bit LLM tracking, which is needed for some large projects that still want to use 32-bit LLM tracking.

Network Profiler

Crash Fix:

  • Fixed a crash that occurred when the nettrace is enabled and NetDriver is removed mid-frame.


Bug Fix:

  • Fixed Exclusive time computation for old Profiler.



  • Implemented support for commands -Info, -List, -Diff and -Extract for IoStore containers.

Bug Fix:

  • Added a warning that will be printed when a pak file is loaded with a mount point that is not mounted to any root directory.



  • DatasmithContent - Improved water shader (caustics, reflections, depth).

  • glTF Importer: Added support for PBR-Next Materials.

  • Navisworks: Added a warning dialog when trying to export an empty (initial) state.

  • Revit: You can now specify which metadata is exported with the Datasmith file.

  • Datasmith glTF: Added support for transmission extension.

  • DatasmithContent - Added water material and 2 instances for pools.

  • Changed the default, fallback Refraction value for Materials generated from USD Stages from 1.5 to 1.0.

  • It is now possible to set a threshold number of triangles, after which static meshes generated when opening or importing USD stages would get Nanite enabled. Additionally, it is now possible to add the "unrealNanite" token attribute to a Mesh prim, and use the "enable" or "disable" values to override the Nanite threshold and always enable or disable Nanite for static meshes generated from that prim.

  • Added a new export option when exporting levels to USD that allows controlling whether foliage is exported to the foliage Actor's layer or the place Component's layer. This is especially useful when the Place in Current Level option is enabled on the foliage tool.

  • You can now pick which AUsdStageActor is bound to the USD Stage editor via the combo box at the top-right of the window.

  • Prim attributes on the USD Stage editor are now sorted alphabetically by their attribute names.

  • You can now control the exported LOD range when exporting Static and Skeletal Meshes to USD.

  • Implemented custom 'unreal' USD render context for Unreal Materials. Now, existing, persistent Unreal Material Assets will only be used when opening a stage when the 'unreal' render context is selected. Additionally, in most scenarios, exporting Materials and Components that use Materials (with Material baking disabled) will generate USD Material prims with custom Unreal Shader prims, analogous to how MDL Materials are handled in USD.

  • There is now a new button (Reset State) on the File menu of the USD Stage editor. Use this button to reset the state / session of the opened stage without reloading it from disk.

  • Animated light and camera attributes, as well as skeletal animation, will now be read from USD and automatically added to the generated LevelSequence as regular tracks. Manipulation of these tracks will write the data back out to USD.

  • When writing out animation tracks to the stage while a USD Stage is opened, the exporter will now only bake every frame of the animation if absolutely necessary.

  • You can now control the location of the Asset folder when exporting Assets and Levels to USD.

  • You can now track the assignment of Material overrides on geometry cache Components generated when parsing the USD Stage. These assignments are now serialized to USD.

  • When exporting a Level to USD, if a USkyLightComponent is encountered that uses a TextureCube Asset with no existing HDR file on disk, the export process will now generate a brand new .hdr file from the source Asset and reference it in the exported USD scene.

  • Datasmith Solidworks: You can now export animations from Solidworks.

Bug Fix:

  • DatasmithContent - Fixed default rotation value for triplanar projection.




  • Improved the test exclusion list mechanic. This consists of the following changes:

    • Renamed blacklist to excludelist.

    • Support section exclusion rule can now exclude entire sections of tests.

    • Mark excluded tests as skipped in the report instead of entirely removed for the test list. This checks for exclusion just before running the test.

    • Removed NotEnoughParticipant state in favor of Skipped.

    • Add support for exclusion management from the Test Automation window.

    • Exposed device information to UE test report.

    • For platforms, the mechanic to edit their exclusion config file must be done manually through the target platform config file. This will be improved in a future release.

  • Added support for on-demand virtual devices in Gauntlet.

  • When test passes stop because of critical failures, AutomationTool now resumes UE test passes using a JSON report as tracking support.

  • Add support for comparing images other than PNGs.

  • Exposed arbitrary image comparison with test reference to python and blueprint.

  • Implemented OnTestStart and OnTestEnd events for the AutomationTestFramework. Included TestSamples plugin as an example.

Bug Fix:

  • Properly initiate FImageComparisonResult::CreationTime member.


Bug Fix:

  • Fixed the initial map setting of the project launcher being ignored when also specifying maps to cook.

  • Fixed the -SeparateDebugInfo command for BuildCookRun failing to place debug files in a separate directory with the manifests.

  • AutomationTool will guard against the target platform's cooked data folder not existing during staging. This can happen when making builds that re-use previously generated pak files.

  • Pass -unattended to unrealpak from the staging code so that it doesn't pop up interactive dialogs.



  • Added support for nested expansion of Build Graph Properties. For example: $(Outer$(Inner)).



  • Added support for Visual Studio 2022 as a source code accessor and compiler.

  • Added experimental support for Intel OneAPI compiler.

  • Added Linux and Mac support to GenerateClangDatabase in UBT.

  • UBT can create an "Internal" include directory. This directory is only added to a module if the referenced module has the same scope.

  • Uses /sourceDependencies to generate dependency list instead of cl-filter if the msvc compiler version is at least 14.27

  • Replaced uses of whitelist and blacklist with AllowList and DenyList in .uplugin and .uproject module descriptors. For example, WhitelistPlatforms is now called PlatformAllowList. If the new names are not found, the parser will fall back to the old names for one or two releases, but support will be removed entirely in a future version.

  • Added a -Rebuild command line option that will clean a target before attempting to build it.

  • Added support for passing /experimental:deterministic to the MSVC compiler (WindowsPlatform.bDeterministic). This is disabled by default.

  • Added support for log file rotation to UnrealBuildTool.

  • Added a TraceConsole function to EpicGames.Core.Log.

  • Added support for Clang's static analyzer to the Unreal Build Tool. You can enable this by adding -StaticAnalyzer=Clang to the invocation line. By default, Clang will print out the output from the analyzer to stdout. However, if you add -StaticAnalyzerOutputType=Html, a directory will be written in the same location that object files are produced, with a navigable HTML file containing the result of the static analysis.

Crash Fix:

  • Fixed a crash in UnrealBuildTool when a platform SDK is only partially installed.

Bug Fix:

  • Added sourceFileMap to the generated VSCode launch.json file for installed builds, so the debugger can load source files correctly when debugging the editor.

  • Fixed not being able to generate VS2022 project.

  • Updated compiler version to 143 in VS Project Generator.

  • UnrealBuildTool will provide a warning if a module is referenced with an incorrect text case.


  • Removed support for deprecated Intel compiler.

  • Removed support for Visual Studio 2017.

  • Set minimum Visual Studio version to 2019 v16.11.5, toolchain 14.29.31033 Set minimum Windows Clang version to 10.0.0



  • UnrealHeaderTool can parse UFUNCTION defaults from default constructed structs.

    • Example: void MyFunc(FMyType MyArg = FMyType());



  • Texture encoding now supports two encoding settings, so that you can enable slower, high quality encoding features for cooked builds while retaining fast encoding in editor. These settings are in Project Settings -> Texture Encoding. There is also a user override in Editor Preferences -> Texture Encoding.

  • Migrated the Alembic third party AlembicLib module to Engine/Source/ThirdParty.

  • Upgraded engine version of the third-party Alembic libraries to version 1.8.2.

  • Added Default World Partition Settings. These can be found in AWorldSettings, can be saved from the WorldSettings panel in the World - Advanced section. These set a default loading state for a World Partition map, including loaded cells and data layers, to avoid an empty world when loading a map for the first time.

  • Added support for property categories to be prioritized via a new 'PrioritizeCategories' metadata.

  • Added support in the Content Browser for Delete/Copy/Rename operations on World Partition worlds.

  • Upgraded the engine version of the third-party USD libraries to version v21.08.

  • Added a project setting to the World Partition settings for the Foliage Grid Size. This setting gets assigned to the WorldSettings actor when the WorldPartition gets created.

  • Property tooltips now also contain the raw name of the property, so you can identify the property if the name is too long to be displayed in full.

  • Feature packs can now have multiple categories specified for them in the "Category" field of the manifest.json file

  • Added the ability to break the Details view into sections, such as "Rendering" or "Physics". Sections can be defined anywhere with access to FPropertyEditorModule, using the FindOrCreateSection function. See FDetailCustomizationsModule::RegisterSectionMappings for an example of current section mappings.

  • Refactored the existing Derived Data Cache (DDC) Toolbar Widget:

    • Moved all the code to a plugin module.

    • Removed superfluous icons from the toolbar.

    • Added combo-box dropdown menu options.

    • Added dockable window support.

    • Added icons to the UE5 style.

    • Numerous adjustments made to UI layout.

  • Upgraded the engine version of the third-party OpenSubdiv libraries to version 3.4.4.

  • We now use per-platform Python site-packages directories for USD Python modules. This leverages recent changes to the PythonScriptPlugin that recognize per-platform site-packages directories. Arranging the modules this way allows the Python modules generated by building USD to be dropped directly into the appropriate platform directory and avoids the need to patch the init.py files to look for Mac .so files in a different location.

  • Advanced dropdowns in Details views are now styled like a normal group rather than as an expander.

  • Made adjustments to the Spline component, so that Alt-Drag and Add Key To Segment now copy the spline point type (curve/linear/constant) of the adjacent spline point.

  • Added detail customization for vector curves, so that you can create curve editors for vectors that are similar to the editor available for float curves.

  • Spline components are now colored with a gradient effect to more easily tell when they are selected, and they have more distinct colors.

  • Added support for cm/s as a speed unit for ForceUnits/Units property metadata.

  • Updated spline box and frustum selection to always add rather than toggle points in the selection area, or append to selection when shift is pressed.

  • P4 Client SDK has been updated to 2021.2 for the Mac target platform.

  • AssetRegistry now adds writable files to the Reconcile cache in the Source Control window.

  • There is now an UncontrolledChangelistValidator, which reconciles writable assets and warns the user if new uncontrolled changes are found during changelist validation

  • Added a Validate Changelist contextual action to the Source Control Changelists window.

  • Added Usecases to Editor Validators, so validators can specify which Usecase should be executed by overrides.

  • There is now a FValidateAssetsResult struct which holds detailed information about validated assets and results.

  • You can now open Unreal Insights from the Editor menu.

  • Added virtual shadow map debugging and profiling visualizations to the Editor Viewport dropdown.

  • You can no longer undo the deletion of sublevels.

  • Added new settings to the Geometry Cache plugin settings to control the memory usage of streaming geometry caches from Alembic and USD.

  • Streaming geometry caches stats are available through the console command stat GeometryCache.

  • Uncontrolled Changelists now support files marked for delete in Source Control.

  • You can now disable hardware occlusion queries on a per-scene basis in the Editor.

  • The Texture Editor now has a new tab that shows various properties about the encoded texture, including whether the texture was encoded with Fast or Final quality. This tab lets you experiment with various Oodle properties like encode quality settings on the texture, and also can show you the deployed size benefits of RDO encoding.

  • The P4 Client SDK has been updated to 2021.2 for the Win64 target platform.

  • When you launch Unreal Insights from the Editor, if Unreal Insights is not found it will now be built.

  • When importing a static mesh from an Alembic file, you can now enable Propagate Matrix Transformations without enabling Merge Meshes.

  • There is now a DirtyFilesChangelistValidator to verify there are no unsaved modifications when submitting a changelist in Source Control.

  • The FPropertyAndParent struct now contains the array indices of the changed property and all its parents, so you can determine which property value changed.

  • Added the option Delete New Files on Revert to the Source Control window.

  • Removed Python 2.7 support from the Engine.

  • Added a delegate for mode toolkits to do any UI shutdown that depends on the mode UI layer.

  • Exposed a Python setting to let users select if the embedded Python interpreter should run in isolation mode or not. By default, the engine interpreter runs in isolation mode to minimize risk of having incompatible Python software crashing the engine.

  • Reskinned the Message Log.

  • Added a shaded preview for Volumes.

  • Changed the column names in the Outliner to support localized strings.

  • Added the UFUNCTION UBlueprintEditorLibrary::GeneratedClass(UBlueprint*) as a script method for Python users. For example, bp = unreal.EditorAssetLibrary.load_asset("/Game/Blueprints/BP_AdjustButSpawn") print(bp.generated_class())

  • Reskinned the Restore Packages panel.

  • Added Bridge menu item back to the workspace menu, as well as updated the icon.

  • Added a 'Preview Profiles' combo box to asset editor viewport toolbars to quickly change preview profiles. The profile combo is only visible when the user has more than one profile. This was added to the Material Editor, the Static Mesh Editor, and the Niagara Editor.

  • FAssetEditorModeUILayer now serves as a layer between a given asset editor and the mode toolkits, so that the mode toolkits can request UI panels and the asset editor determines where they are located in the asset editor layout. The first implementation is in the Level Editor, and all default mode UI has been moved to FModeToolkit.

  • Added the ability to show or hide individual columns in the Outliner by right-clicking on the header.

  • Separated out the FActorInfoColumn that showed modes such as Type / Level / Layer into separate columns that can be hidden or shown.

  • Added support to recursively search Editor menus.

  • Added the combo chevron to the Status Bar button.

  • Reskinned the Create Blueprint From Selection Panel button.

  • Added colors to all major editor tab icons. Renamed the World Outliner to Outliner.

  • Reskinned the Plugin Manager.

  • Reskinned the Project Launcher window.

  • Added support for multiple modes in mode UI layers. There is now a paired AssetEditorUISubsystem that does the tab registration so the modes don't have to be registered before the asset editor opens.

  • Viewports can now focus on anything implementing a typed element world interface, not just Actors and Components.

  • Reduced the default length of Spline Component tangents to make them more manageable.

  • Reskinned the Level Editor Toolbar.

    • Moved the Editor Modes into a single dropdown.

    • Combined the Content and Create Menus into one menu.

  • Updated the placement and style of Play and Debug buttons in toolbars.

  • All menus, those created by menu builders and UToolMenu, now have a default height of 1000.

  • Add and Filter menus in the Content Browser are now searchable.

  • UToolMenus are searchable by default.

  • Added a warning icon in the Auto Save Restore UI beside a package to restore, if the auto-saved package modification time is older than the file it is supposed to restore.

  • Hiding a Level deselects everything in it now, not just Actors and Components.

  • The Open Asset Dialog (Ctrl + P) now opens as a Tab instead of a floating window.

  • Updated the embedded Python interpreter from 3.7.7 to 3.9.7.

  • Added the ability to copy property display names using the right-click context menu.

  • The visibility of columns in the Outliner is now saved across editor sessions.

  • In the USD Stage Editor, dirty layers will now show a star (*) after their names.

  • Removed the Alt+P shortcut for opening the Place Actors Panel.

  • Added support to USD for the IOR attribute on UsdPreviewSurface materials.

  • Added the SSimpleButton widget to the ToolWidgets API. This can be used to create buttons in the UE5 Style.

  • Added SSimpleTimeSlider to the ToolWidgets API. This can be used to create a Time Slider in the UE5 Style.

  • Add the SSearchableComboBox widget to the ToolWidgets API. This can be used to create a searchable combo box in the UE5 Style.

  • Added SCheckBoxList to the ToolWidgets API. This can be used inside a Custom Dialog to display a list of checkboxes.

  • Added support to USD for virtual textures on the UsdPreviewSurface master materials.

  • Added SWarningOrErrorBox to the ToolWidgets API. This can be used to display a warning or error in the UE5 Style.

  • Added SSimpleComboButton to the ToolWidgets API. This can be used to create a combo button in the UE5 Style.

  • Added SPositiveActionButton to the ToolWidgets API. This uses the UE5 Style and can be used for actions such as "Add".

  • Added SNegativeActionButton to the ToolWidgets API. This uses the UE5 Style and can be used for actions such as "Delete".

  • Added a script to build the USD SDK for UE on Windows.

  • Imported jpeg textures will now be stored in their original jpeg format in the package file, and will only be converted to compressed PNG format when the texture pixel data is modified inside the Editor.

  • Reskinned and Updated Interfaces:

    • World Details

    • Levels Browser

    • HighResScreenshotTool

    • Path Picker

    • Asset Picker

    • Find In Blueprints

    • Message Dialogs

    • Scene Outliner

    • Icons

  • Created Styling option for Parent Rows in Tree Views.


  • Added a Source Control Asset Data cache to prevent Source Control Changelist Window from rebuilding the Asset Data from scratch when the UI refreshes.

  • Modified the Source Control beautification to be an async process, preventing crowded changelists from blocking the workflow. The filenames are now beautified when available.

  • Parallelized Asset Data information retrieval from Source Control.

Crash Fix:

  • Fixed a crash when an invalid TitleProperty was used for a Details property.

  • You can no longer dock tabs into docking areas that are contained inside the tab itself, because this would cause an infinite loop and eventually crash.

Bug Fix:

  • The MakeTransform function now takes a default value for Scale from the FTransform struct. This fixed Python to initialize the unreal.Transform method with the expected default values.

  • Fixed mouse wrapping prematurely over RDP when clicking 10% away from screen edge.

  • Fixed an issue where Advanced Copy was not copying packages that weren't loaded into memory.

  • Fixed an issue where the camera would snap back after using SetLevelViewportCameraInfo and orbiting.

  • Opening the Save Layouts dialog no longer immediately renames the current layout to "Copy of ", leading to an ever-increasingly long name suggestion in the Save Layout dialog.

  • Fixed a crash due to unhandled cases in SGameFeatureStateWidget::GetDisplayNameOfState(...).

  • Fixed a crash when pasting an empty string, or a string with only newline separators, into a bulk property editor cell.

  • Booleans in EditCondition are now case insensitive.

  • Fixed improper filtering of object path names in AssetUtil::ExtractAssetDataFromDrag.

  • Fixed a bug that prevented the use of the Gamemode Override when calling GEditor > RequestPlaySession. The URL needs to contain the Unreal path for the game mode to be found.

  • Fixed a typo that prevented the bShowHiddenPropertiesWhilePlaying from being changed in the UI.

  • Fixed spline component to correctly compute zero bounds when the spline contains no points.

  • Selecting a spline point in one viewport now updates the other viewports in a multi-viewport layout.

  • Fixed an issue where a mouse click on "Pin Actor" in Scene Outliner entered FSlateThrottleManager's Responsive mode without ever leaving it. This is similar to SSceneOutlinerTreeRow::OnMouseButtonDown.

  • Addressed an issue where the camera velocity was reset when focusing on the camera editor. This fix prevents rubber banding.

  • Custom copy/paste actions now pulse the details row to indicate they were run.

  • Fixed an issue where StaticMesh Foliage would not appear in the Foliage Palette in a World Partition level.

  • Fixed an issue where StaticMesh Foliage Actors would not persist between saves on a World Partition level.

  • StaticMesh Foliage Type is now required to be an asset when working in a World Partition Level.

  • Fixed an issue where launching the Editor with -game would lead to a crash on levels using One File Per Actor.

  • Addressed an issue where Mesh Paint was not allowing vertex painting across all segments of a spline mesh component.

  • Fixed spline Alt-Drag to work correctly with large snapping values.

  • Fixed an issue with FBX Static Mesh reimport, so it now correctly recomputes the spline mesh component collision.

  • Added information to what failed when an edit condition cannot be parsed, indicating whether it was an issue with the type or the value.

  • Fixed an issue with spline Snap to Nearest to snap to the current spline as well as nearby splines and to only snap to valid and visible nearby splines.

  • Fixed vertex painting on Blueprint spline mesh component instances so the vertex data is no longer lost when the construction script is rerun.

  • Fixed an issue where an Ensure message could display in studio analytics during long slow task dialogs.

  • Added a LinearDeltaSensitivity metadata property tag to make it possible for Detail panel sliders without upper and lower bounds to not scrub exponentially.

  • The source control item in the Edit menu now dynamically changes between Connect to Source Control and Change Source Control Settings, depending on the current state of the connection to source control.

  • Fixed the regression where PIE sessions would have Lumen Visualization enabled by default.

  • When converting to FName in Python, there's a guard to verify the name will fit within NAME_SIZE.

  • Fixed the issue where the HighResShot console command would overwrite the file specified in the filename argument from a previous call because it didn't reset the reference when no parameter was given on a subsequent call.

  • Subcategory nodes now hide themselves if no children are visible.

  • Added a new function AddPendingLateJoinClient to fix an assert, if the experimental Late Join feature was bound to a key and the key pressed while in PIE.

  • Alembic import now stores all the import settings used at import so it can use them again on reimport.

  • Fixed the issue where shelved files from another branch were preventing FPerforceGetPendingChangelistsWorker from completing, causing the Changelist Window to refresh.

  • When you search in the Details panel, the Advanced subcategory will now be filtered out if there are no children to display.

  • Basic Python wrapped types now have the representation function repr, which was missing before.

  • Clicking a suggestion in the Engine Console auto-complete list now moves the caret to the end of the selected text, matching the behavior of pressing Tab to select the value.

  • RemoveLevelsFromWorld now checks if the GEditor->Trans pointer is valid before accessing.

  • Fixed the issue where the file history was truncated for moved files in Source Control.

  • Fixed an issue where SRichTextHyperlink was not triggering or navigating when clicked.

  • Fixed an issue where SRichTextHyperlink was not displaying correctly when clicking on the link, moving the mouse away from the link, and releasing the mouse. The link now appears underlined.

  • Fixed the Python plugin to allow resolving USTRUCT Make and Break functions specified with 'HasNativeMake' and 'HasNativeBreak' later. This supports cases where the Make or Break functions are implemented in a C++ module that is loaded after the module declaring the USTRUCT. The implementation postpones resolving missing functions until FCoreDelegates::OnPostEngineInit is invoked. If one or more functions are still missing, the corresponding error(s) are logged.

  • Fixed an issue where the current LOD would not display on static meshes in the Static Mesh Editor.

  • Fixed a crash in EditConditionParser when using an invalid enum or value.

  • Changed how lambda captures the Asset Editor toolkit name for conditional additions to the Asset menu.

  • We now refresh cached menus when the editor selection changes.

  • Fixed an issue where main frame notifications couldn't be dismissed if they were also set to time out, because the pointer would reset.

  • Removed code from the Python build scripts trying to detect if a user-specified SDK is 32-bit or 64-bit. Parsing the Python interpreter output could make the build fail.

  • Fixed source code navigation on Windows not working if "On Demand Symbols Loading" is enabled.

  • Fixed the Editor Python Executor to parse and escape quotes for -ExecutePythonScript command line parameters to allow quoting python arguments containing spaces.

  • Fixed an issue that prevented some options from functioning in an Asset Picker when it is embedded in a menu.

  • Prevented adding non-existing directories to Python 'sys.path'.

  • Fixed an issue causing duplicate buttons to show up for some properties in the Details Panel, such as the Row Struct property in the Data Table Details.

  • Fixed the Editor toolbar dropdown not closing when the user clicked in a non-client area, such as the one between the Help menu and the label showing the project and branch.

  • Fixed a memory leak each time we drag something in the Editor Viewport.

  • Fixed an issue where Preview Rendering Level change was not being applied to either editor-viewport or separate-window in-process PIE.

  • Added FSourceControlFilesDeletedDelegate. We now broadcast that revert or markfordelete operations could require cleanups, for example when packages, assets, or refs are deleted.

  • Fixed an issue where reverting Mark For Add on an asset was preventing you from recreating an asset with the same name in the same editor session. The asset was still present in AssetRegistry.

  • Fixed an issue with preview rendering levels where you couldn't change to a platform that had the same Feature Level as the running Editor.

  • Moved FocusAllViewportsToSelection to FEditorViewportCommands so that it doesn't trigger during PIE sessions.

  • Fixed a potential crash when AddObjectPropertyData was called during a customization.

  • Deprecated functions in the EditorScriptingUtilities plugin now correctly show the deprecation message in the Editor, which contains the location of the replacement functions.

  • Fixed a crash in the updated CurveTableEditor when adding curves.

  • Fixed an issue where Actors spawned with bHideFromSceneOutliner were still visible in the Scene Outliner.

  • Fixed the hit proxy gathering on asset editors that have no world.

  • Fixed saving high resolution Editor screenshots so they are saved as .png.

Content Browser


  • Added support to the Content Browser for migrating selected assets and their dependencies that are inter-referential across content roots. Assets spread across content roots are migrated into the corresponding content root in the destination, if it exists. If any don't exist, we migrate the selection and dependencies to temporary packages into a folder that is migrated to the destination.

  • Updated class folders to use names friendly to plugins.

  • The Content Browser can now sync to levels and maps, making working with these assets a bit easier.

  • Float, Vector, and LinearColor Curve assets can now be imported from and exported to JSON. They also support the following hotfix syntax to hotfix the entire asset:

    • +CurveFloat=;CurveUpdate;""

    • +CurveVector=;CurveUpdate;""

    • +CurveLinearColor=;CurveUpdate;""

  • Asset names are now sorted in a way that handles all trailing numbers, including fully numeric names.

  • Made a slight increase to the Sources panel splitter size and Hit Detection handle in the Content Browser.

Material Editor

Bug Fix:

  • Fixed a typo in the RemapValueRange node for the Material Editor.

Media Framework

Bug Fix:

  • Fixed an issue when ExrImgMediaReaderGpu (ImageMedia) was falling back to default reader when the frame read was canceled, but still successful.

  • Fixed an issue with MediaTexture. There was no interpolation between mip levels for textures with mips generated externally to Media Framework, which created a hard aliased edge. Now there is filtering between mip levels when mip levels are provided from outside.



  • Added Get/SetNaniteSettings functions to StaticMeshEditorSubsystem.

  • Adding Get/SetLODGroup functions to StaticMeshEditorSubsystem.

  • Changed FMeshNaniteSettings to BlueprintType, and its members are now BlueprintReadWrite.

  • Plugins can now add third-party Python scripts within their Content/Python/Lib/site-packages and Content/Python/Lib/{Platform}/site-packages folders, and these will be automatically available for import within Unreal.

  • PythonScriptCommandlet now returns a non-zero value when the script execution fails.

  • Added the Python Foundation Packages Experimental Plugin. Python packages such as NumPy 1.20.3 and PyTorch 1.9.0 will be available in the Python environment when the plugin is enabled.

Static Mesh Editor


  • Improvements were made to the Static Mesh Editor. The quality of 16 bit UV quantization is now rounded instead of truncated when converted from F32. In rare cases, this causes problems with old content, particularly when previous UVs were exported for baking textures. To allow toggling back to the old UV quantization, a new option was added in FMeshBuildSettings called bUseBackwardsCompatibleF16TruncUVs. In the Editor, this option is called "Lower-Quality UVs (UE4 Compatibility Mode)". This is set automatically from the mesh version, so seldom needs to be set manually.

  • The Static Mesh Editor now has the default ModeUILayer tab appear along with the existing docked extension tabs.

Bug Fix:

  • Fixed a crash in the Static Mesh Editor when setting a custom complex collision mesh and trying to select it.

Gameplay Framework


  • Overhauled the Blueprint Debugger by adding rich tooltips to pins when stopping at a breakpoint, and expanded functionality in the Blueprint Debugger tab.

  • Exposed a method to set the Character's CrouchedHalfHeight variable to Blueprints.

  • Added a new Blueprint editor workflow setting to provide the user the choice on how to restore breakpoints when the Blueprint asset is reloaded.

  • Changed the default behavior of the CheatManager so it is completely disabled in Shipping builds. Test builds will now work like the Development build where it can be enabled in multiplayer with the EnableCheats command.

  • Added a PinSelectorFilter to provide users the capability to customize Blueprint pin filtering.

  • Added support for input bindings in components. You can now place Input Action and Input Axis mapping event nodes in components.

  • Implemented a Key parameter for PrintString and PrintText nodes.

  • Added new delegates to the GameViewportClient that allow overriding key and axis input before it is routed to the player controller. This can be used for things like console "Press Start" screens.

  • Increased the default value for the NetPackedMovementMaxBits variable from 2048 to 4096.

  • Implemented Kismet Library utilities for reading an entire Render Target at once.

  • Blueprints can now be associated with a namespace identifier(MyProject.MySubArea). When set, this will exclude it from being loaded in the next editor session by another Blueprint editor context that does not share or otherwise import the same namespace. This feature is experimental.

  • Added a note to Enhanced Input event nodes when an exec pin is connected to an action that will not fire. InputTriggers can override this method to provide their own bitmask of supported types.

  • Support for doubles and int64 types in the Format Text node have been added.

  • Exposed the AffectedByTimeDilation boolean in the InputTriggerTimedBase class to the Input Action editor.

  • Added a ToString method for Input Action Values.

  • Full Parent Names will now display in the Class Settings panel in the Blueprint Editor.

  • Exposed the bForceRebuildImmediately variable to both the AddMappingContext and RemoveMappingContext. This provides users a method to force a rebuild of the control mappings within the same frame of changing their context.

  • Improved the tooltip on the Execution pins of the Enhanced Input action event nodes to give more detail about when to use which pin.

  • Game feature plugins can now modify the gameplay cue paths on the GameplayCueManager.

  • All subobject editor icons are now white. The previous icon colors of green and blue have been removed.

  • Added FindRelativeLookAtRotation function to Kismet Math Library.

  • Added setters for default classes in the InputSettings.

  • Implemented the ability to double click an input action node and have it open the corresponding input action asset.

  • Support to replicate loose gameplay tags and an ability's Activation Owned Tags has been added in the Gameplay Ability System.

  • Games can now specify which Blueprint classes can be edited while playing in the editor. BaseClassesToAllowRecompilingDuringPlayInEditor is an option in both the Blueprint Project Settings for project wide allowances, and Blueprint Editor Preferences for local changes.

  • Blueprint interfaces now use Blueprintable/NotBlueprintable to determine if they can be implemented in Blueprints to match how classes work. CannotImplementInterfaceInBlueprint will still work and is treated like NotBlueprintable.

  • Gameplay Abilities: Exposed a helper method GetGameplayEffectUIData to get the UIData from a gameplay effect class.

  • Exposed GetBuildVersion and GetBuildConfiguration to Blueprints.

  • Added an explicit context to game feature activate/deactivate that allows restricting to a specific world instance. This means that game feature actions can be used correctly by game-specific systems while in Play in Editor.

  • Fixed data loss with Data Registry Ids that point to invalid registries. They will now keep their data but display a warning in the editor.

  • Added support for Niagara camera lens effects to gameplay cue notifies.

  • Re-ordered the message log tokens in Blueprint runtime errors so the most relevant token(node) is displayed first instead of last.

  • Changed the Async Load Primary Asset Blueprint nodes to return all requested and loaded assets instead of only newly loaded ones.

  • Added a PreCreatePIEInstances as a PIE lifecycle event on the editor engine.

  • Added the End Ability Locally function to gameplay ability, this is needed for predicted abilities with animations where you don't want the server ability to end early and miss a callback.

  • Added a display of expected units (cm/s or cm) to various properties in the CharacterMovementComponent class,

  • Added a new version of the PreLoadMap delegate called PreLoadMapWithContext that provides the associated world context for the load map request. This allows registrants to disambiguate which game instance is involved in multiplayer Play In Editor.

  • The target Actor for Add Component game feature actions can now be an abstract class.

  • Added a game feature plugin template that contains a runtime C++ module.

  • The controls for switching Game Feature states now have tooltips about the nature of each state.

  • Changed the LastMovementServerBase pointer on the Character Movement Component to a weak object pointer in case the component gets deleted.

  • Return value pins on async task nodes now attempt to pull tooltips from the underlying delegate declaration providing better user-facing information to be surfaced.

  • Get Subsystem nodes now pull the tooltip from the class declaration of the underlying subsystem.

  • Changed Blueprint functions to behave like the GetPlayerController function, to use a stable index where 0 is always the first local player controller. This stays consistent during map transfers.

  • Most core types (FVector/FMatrix/FQuat, and so on) now support both float and double variants, but will default to double. This enables enhanced precision for Actor placement/orientation, as well as increased world sizes.

  • Added an OnPawnChanged event to PlayerState class.

  • Added an OpenCV helper Blueprint Function Library which adds convenience nodes for ArUco marker tracking and camera calibration chessboard detection.

  • Added the following macros PRAGMA_FORCE_UNSAFE_TYPECAST_WARNINGS, PRAGMA_DISABLE_UNSAFE_TYPECAST_WARNING, PRAGMA_RESTORE_UNSAFE_TYPECAST_WARNINGS to permit control of truncation and narrowing warning state within code blocks that assist with identifying potential Large World precision issues.

  • Made Conversion casts between float and double core type variants explicit.

  • Input Delegate Support inside of Widget Blueprints. This provides users capability to place the normal "Input Action" and "Input Axis" event nodes in a widget and they will behave as they would in an Actor as long as there is an owning Player controller.

  • Improved the state tracking of which keys are Triggered in enhanced input.

  • Added an EnableLargeWorlds boolean variable to the World Settings class for wrapping disabling bounds checks, octree visibility, and octree shadow culling. This can be used for preliminary Large Worlds testing.


  • Reflected references are automatically updated when instances are replaced. UMG widgets with existing instances do not work by default, however games can hook a delegate to recreate their user interface in order to enable support.

  • Improved the error message about duplicate world settings by printing the full path of the Actor and persistent level that has the issue.

  • Better support has been added for different world modes in the Add Components action for creating both client and server components in standalone.

Crash Fix:

  • Fixed a reference replacement oversight during object consolidation to a duplicated Blueprint asset that could lead to an editor crash in some situations.

  • Fixed a crash after choosing to find and replace all node references to a member variable in the Blueprint editor.

  • Fixed a crash when adding an input context that contained a null action mapping.

  • Fixed a crash when pasting a local variable get node in the event graph of a child blueprint.

  • Fixed a crash when pasting a local variable get node from the parent Blueprint into the child Blueprint's event graph.

  • Fixed a crash when activating a non-instanced ability that attempts to call instanced-only functions.

  • Guarded a potential crash in the GetAbilityLevel method from the Gameplay Ability class if the Ability System Component pointed to an Actor whose info has been destroyed.

  • Prevented a crash on shutdown that occurred if the UObject system had already been removed by the time the game features editor shut down.

Bug Fix:

  • Added the AbilitySystemGameFeatureActions plugin, and moved the GameFeatureAction_AddAttributeDefaults class into it from the GameFeatures plugin.

  • Added a space between arguments when parsing multi-axis console commands to correctly parse when initializing from a string in the EnhancedInput class.

  • Fixed propagation to instances when modifying the query in a parent object of a GameplayTagQuery.

  • Fixed the GetClassDefaults Node discarding ShowPins settings during compilation if connected to a reroute node.

  • Added a fix to account for indirect dependencies from a macro graph expansion which could otherwise lead to a script VM crash during PIE.

  • Refreshed user-defined structure editor data on save/compile to ensure default object reference values stay in sync with default structure instance data.

  • Fixed issue where looping gameplay cue notifies were incorrectly flagged as having active effects.

  • Fixed a few destructor typos that attempted to unregister handlers from the wrong delegate interface on editor shutdown.

  • Fixed a regression that incorrectly restricted the Outer input pin on ConstructObjectFromClass nodes to self class subtypes.

  • Fixed an issue resulting in an invalid graph when Promoting a Collapsed Node to Function/Macro is undone.

  • The const Blueprint function attribute is now kept in sync on function overrides when inherited from a parent class.

  • Fixed an uninitialized variable leading to a broken toggle UI on Mac/Linux editor targets.

  • Marked macros being pasted into Macro Libraries as public.

  • Fixed a bug where Blueprint nodes with gameplay attribute pins would not respect redirectors.

  • Fixed an invalid Blueprint compiler warning for generated Blueprint assets that were not otherwise loaded.

  • Marked the enhanced input console commands as ECVF_Cheat to prevent them from being added to any shipping builds.

  • Improved Blueprint thread safety checks.

  • Variable categories in the My Blueprint tab are now properly sorted.

  • Added function metadata that provides users capability to exclude functions from type promotion.

  • Fixed a minor bit packing issue in the generated Blueprint class structure.

  • The real time delta seconds of the world will now be tracked to use as a backup if Time Dilation on the player controller is set to 0. This ensures that timed triggers are still calculated correctly even with time dilation at 0.

  • Fixed an issue where repeated ability-driven montages could fail to be fully replicated on simulated proxies.

  • Prevented memory corruption when appending an array.

  • Added a flag to ignore EnhancedActionKeyMapping's if the Key was down during a rebuild of the Player Control Mappings.

  • Added Check if an ActorComponent is replicated to show an icon in Blueprint.

  • Check if AttachParent is valid when receiving AttachSocketName before updating the attachment.

  • Fixed several issues with Play In Editor with multiplayer games, it now correctly handles URL options like a listen server does across map transitions and the world net mode will be accurate to the current condition instead of the initially launched mode.

  • Fixed several issues with using interface types in blueprints for casting or constructing objects.

  • Prevented a spurious log error when editing CanReferenceTheseDomains in Asset Referencing Policy settings.

  • Fixed the GetDebugDisplayName method from the World class to work properly outside of the scope of 'play in editor' ticking.

  • Improved logging quality in the RawInput class and fixed expected behaviors such as disconnected devices or query results to be logs instead of warnings

  • Changed the user facing display name for GameFeaturesManagerClassName to "Game Feature Project Policy Class".

  • Fixed an issue that prevented certain state transitions in the Game Features editor from working.

  • GetAssetUserDataArray is now implemented for the WorldSettings class.

  • The PlayerController class will now never return a null view target.

  • Editor Only child Actors are no longer implicitly transient.

  • Added an assert to make errors when replicating an attribute set on an improperly set up ability system component more explicit instead of causing an access violation.

  • Prevented self-assignment of Child Actor Components in Blueprint classes.

  • Added detection and repair process for maps that became corrupted with multiple Level Script Actors.

  • Fixed an incorrect doc-comment for the AddFunctionGraph function.

  • Fixed an issue where the Blueprint class default values were not initially propagating to the child classes if created by promotion to a variable.

  • Fixed a bug where additive root motion's influence would be cut in half if applied while falling.

  • Fixed a mouse wheel scroll up and down by manually setting the value of boolean keys that are pressed and released within the same frame.

  • Blueprint-added component archetypes will no longer fail to load when the underlying class type has a non-default ClassWithin value.

  • Fixed an editor access violation crash caused by a reference to a stale property wrapper object.

  • Fixed a failure to regenerate function signatures referenced by call sites after renaming input/output pins on function graph entry/result nodes.

  • Fixed missing import warning on next editor load after renaming a macro in a Blueprint macro library.

  • Ensure that Blueprint graph nodes are always fixed on load as part of the precompile phase, including for fast paths (data-only Blueprints).

  • Blueprints can no longer bind to gesture keys if it is not enabled in the settings. To change this enable the gesture setting in the project settings or delete the problematic node.


  • Deprecated old input scales on the player controller (InputYawScale, InputPitchScale, and InputRollScale).

  • Deprecated the UDynamicClass API and removed all special-case code paths for dynamic types.

  • Deprecated the Always host global Blueprint searches originating from the Blueprint editor's "Find Results" tab in a global tab window.

  • UHT no longer generates the PPO_ accessors that previously used to allow nativized Blueprints to bypass C++ protection levels as Blueprints have different semantics for private and protected.

  • KismetMathLibrary Deprecated MinimumAreaRectangle function, which effectively returns the average of all input points as the rectangle center, and introduced MinAreaRectangle function that returns the proper minimum area rectangle around the input points.


  • Removed the creation of transient TRASHSTRUCT objects as they are no longer required by user-defined struct precompilation in the editor context.

  • Removed underlying framework and support for the Blueprint nativization feature and all related code modules from the engine.



  • Updated the Path Extrude tool to let users choose how to set poly groups on the offset top mesh.

  • The Path Extrude tool can now enable Ramp extrude modes for closed paths.

  • Users of the Path Extrude tool can now enable snap to grid (distance) during width specification.

  • Updated the Path Extrude tool to enable optional rounded corners. This replaces polygon corners with circular arcs. Users can set the desired uniform arc radius.

  • Added a Convex Hull mesh generator option to the AutoLOD tool.

  • Added the ability to add an overlay widget to the viewport.

  • Added a ModeUILayer member to handle mode toolkit hosting StaticMeshEditorModeling.

  • Created a mode and toolkit with AutoLOD and LODManager tools.

  • Added a button to the StaticMeshEditor's toolbar to toggle UMeshLODPluginEditMode.

  • Updated tools to use UnsetTriangle instead of SetTriangle if we know an overlay triangle is invalid. Avoids a checkSlow in SetTriangle.

  • Added the ability to draw unset UV triangles in the Mesh Inspector tool.

  • The Lattice tool no longer allows constrained lattice vertices to be moved, even when not in Soft Deformation mode.

  • When adding a new attribute, or undoing the deletion of an attribute, sets the selected attribute in the UI to the name of the new attribute in the Attribute Editor tool.

  • Added support for open curves in PolygonEdgeMeshGenerator to the Path Extrude tool.

  • Added temporary AActor members to contain UDynamicMeshComponents used as preview meshes in some tools.

  • Updated the Path Revolve tool so when the next click would finish the path, highlights the path in yellow to let the user know.

  • Added output type properties to Boundary Revolve tool.

  • Users can now optionally create new polygroups for refined output faces in the Subdivide tool.

  • Modeling Tools no longer snap the transform gizmo on mouse-down. Now waits for the drag event.

  • Added support for Custom Primitive Data to ProceduralMeshComponents.

  • Added support for Custom Primitive Data to DynamicMeshComponents

  • Updated the Subdivide tool to interpolate Material IDs from input mesh to subdivided mesh.

  • Added Mesh Inspector tool to Static Mesh Editor's modeling tools.

  • Warns the user that new assets might be created when AutoLOD is launched from the Static Mesh Editor.


  • Added AutoLOD tools to the Static Mesh Editor.

  • Shared ownership of StaticMeshViewportClient's ModeTools via the EditorModeManager member.

  • Set up the EditorModeManager's preview scene and selected components when it's copied.

  • Add a set of FStaticMeshEditorToolbarExtender delegates to the module (similar to FSkeletalMeshEditorToolbarExtender).

  • Refactored the Path Extrude tool. Moved FPolygonEdgeMeshGenerator to its own file with other mesh generators.

  • Refactored the Path Extrude tool and replaced planar UVs in the Polygon Edge Mesh generator with a UV strip that follows the input polygon edges.

  • Refactored the Path Extrude tool and removed hacky UV generation for closed-loop ramp case.

  • Refactored the Path Extrude tool and merged two extrude functions into one.

  • Refactored the Path Extrude tool and removed a function of all dead code.

Bug Fix:

  • Fixed a crash when adding a new key/value pair and were using sparse map type in FOptionallySparseIndexMap.

  • Fixed gizmo not appearing in the Lattice tool after lattice vertices are selected.

  • Fixed an ensure when a polygon self-intersection passes exactly through a vertex with the PolyExtrude tool.

  • Fixed the width mode always snapping to world grid, even when grid snapping is turned off in the PolyExtrude tool.

  • When using the Mirror tool, closing a dialog that asks the user if they want to delete a mesh component does the same thing as hitting No.

  • enabled SubdividePoly to handle input mesh with no UV attribute in MeshModeling.

  • Fixed a crash when undoing and then redoing the creation of multiple Brush actors.

  • Enabled snapping to world grid when laying out the path in Path Extrude.

  • When using the Lattice tool, clear any existing deformer constraints when the lattice resolution changes.

  • Allowed for an overlay element to not be incident on any overlay triangles but still have a reference count of one.

  • Maintain UV islands when subdividing with the Subdivision tool.

  • Update the visible attribute lists when undoing/redoing adding and deleting attributes with the Mesh Attribute Editor.

  • If a ToolTarget's MeshComponent has no MeshDescription, return an empty but valid one. Harden various tools to not crash on empty meshes.

  • The Path Extrude Tool now supports a single-segment path.

  • Fixed calling OnRemoveTriangle when it should have been OnRemoveVertex.

  • If a UDynamicMeshComponent's Mesh has no attributes, have GetAutoCalculatedTangents just return nullptr. Otherwise it will return whatever stale data is in AutoCalculatedTangents.

  • Prevents a dragged gizmo from detaching from lattice points when snapping is enabled in the Lattice tool. Control points were not being transformed if the gizmo returned to its exact (pre-drag) starting position. This became apparent with snapping when the gizmo did not smoothly return to its starting position.

  • When trying to modify a built-in editor asset, pop up a notification window rather than display in the viewport

  • Fixed gizmos not being selectable after placing a new mesh in the level.

  • Fixed an ensure in the Dynamic Sculpt tool by allowing the initialize remesher async tasks to finish at the end of each tick.

  • Fixed Volumes not updating player collision model when brush shape is modified or when undoing/redoing brush shape modifications.

  • Set a max lattice resolution for each dimension in the Lattice Deformer.

  • Fixed issue with Enter key not closing the polygon in the BSP Pen Tool.

  • Fixed FPoly::OptimizeIntoConvexPolys creating polygons that fail coplanar check in FPoly::IsCoplanar

Learning Resources

Content Examples

Bug Fix:

  • Fixed a bug in the POM (Parallax Occlusion Mapping) content examples where the POM material function was not casting self shadows.



  • Updated documentation links/parsing to include versioning.



  • Added support for custom FText::AsDateTime formatting patterns

  • FText shared display strings are no longer required to be unique. Deprecated their public access.

    • Added FTextInspector::GetSharedDataId for when you want an opaque key for a unique text instance.

    • Deprecated FTextInspector::GetSharedDisplayString and changed it to return FTextDisplayStringPtr.

    • Deprecated the FStringTableRegistry::FindTableIdAndKey overload that takes an FText, in favor of using FTextInspector::GetTableIdAndKey.

    • Removed the FStringTableRegistry::FindTableIdAndKey overload that took a FTextDisplayStringRef.

    • Removed the DisplayStringsToKeys LUT from FStringTable. The FStringTable::FindKey overload that takes an FStringTableEntryConstRef is now non-accelerated, but also not called from anywhere.

    • Removed the FStringTable::FindKey overload that took a FTextDisplayStringRef.

    • Renamed GetLocalRevisionForDisplayString and DirtyLocalRevisionForDisplayString to GetLocalRevisionForTextId and DirtyLocalRevisionForTextId in FTextLocalizationManager, and updated LocalTextRevisions to key against FTextId rather than FTextDisplayStringRef.

    • Fixed some const-correctness in FTextLocalizationManager.

  • FText is no longer required to have (or be able to have) a shared display string.

    • Removed FTextHistory::SerializeForDisplayString. This data is now handled directly by FTextHistory::Serialize, with FTextHistory::UpdateDisplayString resolving the display string when needed.

    • Added FTextHistory_Generated to provide the common functionality for generated text histories that need to re-build a local display string.

    • Added FTextSnapshot::LocalizedStringPtr to detect if the localized string changed within a history.

    • Updated FStringTable to use FTextKey rather than FString for text namespace and keys.

  • FTextLocalizationManager::FindDisplayString and FTextLocalizationManager::GetDisplayString now return immutable shared display strings.

  • FTextLocalizationManager can now preserve the de-duplicated display string data loaded from a LocRes.

    • Made FDisplayStringEntry::DisplayString const, as shared display strings cannot be mutated.

    • Updated FTextLocalizationResource to preserve its de-duplicated display string data, to be applied within FTextLocalizationManager.

    • Leetification (for debug) now makes unique display string instances (as it cannot modify the shared display string).

    • Removed FDisplayStringEntry::bIsLocalized as it was inconsistently set, and ultimately not significantly used.

Bug Fix:

  • Text localization manager no longer returns explicitly excluded cultures from list of available cultures.

  • Consider all properties within an editor-only class to be editor-only when gathering localization



  • Mobile builds now exclude engine post-process calibration materials and textures.

Bug Fix:

  • Group read/write on created files on Android are now allowed.

  • Fixed handling comments after the section name in .ini files for UnrealPluginLanguage.


  • Removed scene software occlusion. UE5's minimum specs require a device with hardware occlusion queries, which are more efficient than software occlusion.



  • Added the FGenericPlatformMisc::ShowConsoleWindow function as a way to toggle the console on the Android mobile platform.

  • Enabled cached OS page allocator on Android when using MallocBinned2. This reduces the overall amount of Virtual Memory Areas used by the process as they are limited to 65536, and games that use a lot of memory can go over that limit.

  • Added experimental support for NDK 22+.

  • Option to select build-tools version in Android project settings.


  • Increased stability of stack walking code during crashes on Android.

Bug Fix:

  • Android EGL now binds newly created shared surface on game thread after resume.

  • Added protection against null on failure response from Google Play IAP.

  • Fixed OptimizeForSize compile environment option for Android targets. Previously it was always overridden with -O3.

  • Fixed DeviceProfile fragment cvar lookups.

  • Removed patching of cpu-features.c now that ARMv7 is no longer supported.

  • Properly filter out all 32-bit Android includes and libraries.

  • Fixed a check for fallback location SetupAndroid.bat.

  • Fixed issue which caused resizableActivity not to appear in manifest.

  • Changed display of OpenGL 3.1 support to 3.2 for Android project settings.

  • Fixed hlslcc depth fetch support on Android devices not supporting GL_ARM_shader_framebuffer_fetch_depth_stencil.

  • Added a fix for uploading Android 12 shipping builds.

  • Fixed Android x86_64 linking for BinkAudioDecoder.

  • Fixed issues preventing Android ASan builds from working correctly.

  • Does not select unsupported build-tools versions installed. Now checks against min and max version numbers.

  • Fixed incorrect Adreno version checks in Android media players and camera plugin.

  • Added fallbacks for missing commands on older Android, did timing adjustments for StartServer.

  • Added missing OpenXR xml file to binary builds.

  • Fall back to netstat if ss utility is present but not showing connections during StartServer for Android File Server.

  • Added server failure reasons to logging and increased the number of retries on StartServer for AndroidFileServer.

  • Fixed issue with losing Android force feedback due to OpenXR and OculusVR plugins.

  • Fixed handling of AndroidFileServer startup checks where the receiver may not be ready immediately after install.



  • Refactored iOS Icons to create the asset catalog according to the present file.

  • Set a new default shader for Apple platforms and IOS 15 support.

  • Added ios 15 / tvos 15 target and Metal 2.4 flag.

  • iOS icons will auto-generate from the Marketing Icon.

  • tvOS asset catalog support has been added in Unreal Editor.

  • Display the trust popup on iOS and tvOS when using an untrusted device.

  • Added support for the Device Output Window log and console command sending on iOS using libimobiledevice.

  • Made the iOS dSYM generation checkbox descriptions clearer

  • Added four iPhone 13 models and twelve iPad models to device profiles.

  • Fixed deprecation warning in iOS location services.

  • Updated IOS and tvOS assets to UE5 logo and font.

  • Removed perspective-correct shadow depth shader permutation when it is not required on mobile platforms.

CL: 17921199

  • Remove NoLightMap shader permutation for materials that are not using it on mobile platforms.

CL: 17591802

  • Added a project option to disable support for per-pixel material shading models on mobile platforms (r.Mobile.AllowPerPixelShadingModels=0).

CL: 17403931

  • Set FXAA quality to 0 on mobile platforms by default.

CL: 17348846

  • Reflection capture now accounts for reflection capture influence radius when finding closest capture for an object. Fallback to skylight reflection when there are no influencing reflection captures on mobile platforms.

CL: 17093848

  • Added an efficient mobile-specific implementation for auto-instancing and GPU instance culling. Supported on iOS and Android devices. To enable add r.Mobile.SupportGPUScene=1 into DefaultEngine.ini.

CL: 16921709


  • Both OpenGL ES and Vulkan are now enabled by default when packaging Android, and Vulkan will be used on the following devices:

    • Adreno 6xx and 7xx-based devices running Android 9 or later

    • Mali-G72 devices running Android 10 or later, or any Mali-G76, G77, G78 or G710-based device.

    • PowerVR GM9xx-based devices

    • Xclipse 920-based devices

CL: 19089743

Crash Fix:

  • Fixed a crash when disconnecting / reconnecting a bluetooth controller outside of the app.

  • Fixed crash on mobile while rendering custom depth primitives that require scene texture access.

Platforms - iOS

CL: 18581533

Bug Fix:

  • Fixed idevicefs pull call in iPhone Packager.

  • Release the viewcontroller holding the splashcreen storyboard when it's no longer displayed.

  • Removed default brightness and reset brightness on iOS.

  • Fixed iOS Location Usage Description.

  • Fixed enum warning in ios settings.

  • Fixed linker error for IOS Shipping builds when there are spaces in the project path

  • The Windows remote iOS toolchain now removes the old SSH key directory before generating a new SSH key, to fix up any incorrect directory permissions

  • Fixed r.MobileContentScaleFactor being ignored and always defaulting to 1 on iOS.

  • When packaging an iOS app on BigSur/Catalina, it is unable to be installed on an iOS15 device. This fix now sets the "--generate-entitlement-der" flag for 'codesign'.

  • Removed iOS 13 from plist to enforce minimum supported version of iOS 14.

Rendering - Mobile Rendering

CL: 19110691

  • Fixed rendering artifacts on some Qualcomm devices with Android 12.

CL: 18689185

  • PerlinNoise3D texture now correctly initializes on mobile platforms.

CL: 18104390

  • Fixed issues with texture mip generation at runtime on Android devices running Vulkan

CL: 17961893

  • Added access to CustomDepth and CustomStencil textures in a decal materials for mobile platforms.

CL: 17113348

  • Previously, FPlatformMemoryStats.AvailableVirtual was always zero on iOS. This has been resolved by setting it to the same value as AvailablePhysical.

Platform - Mobile - iOS

CL: 19153534

  • Fixed iPhone device names with apostrophes appearing as ???? in Unreal Editor on the Mac.

CL: 19092069

  • Fixed issue where fatal iOS errors were not being written to the log file.

CL: 19237934

  • Fixed problems with iPhonePackager downloading log files from devices with Unicode-character device names.

Platform - Mobile - tvOS

CL: 19284387

  • On tvOS log files are created in /Library/Caches, as /Documents is not avaialble on this platform.

Rendering - Mobile Rendering

CL: 19243809

  • Previously, CSM shadows were broken when Support Static Lighting is enabled but a level's World Settings have Force No Precomputed Lighting checked. This issue has been resolved, and CSM shadows will function normally with these settings.


  • Removed instruments when launching iPhone apps. Instead, the launcher will use idevicedebug.


  • Deleted iOS devices that don't support iOS 14+ from iOS device profiles.



  • Added an option to let connections force all properties to be dirty on initial replication.

  • Added notification paths to other active net drivers of important Actor replication changes.

  • Added Actor flags to make PreReplication and PreReplicationForReplay functions optional.

  • Removed net.UseAdaptiveNetUpdateFrequency=0 from ConsoleVariables.ini file.

  • Added a compare/assign and mark dirty macro (COMPARE_ASSIGN_AND_MARK_PROPERTY_DIRTY) to the push model. This is defined in the #else so it will compile on the client.

  • Support for NetSerialization of a FInterfaceProperty.

  • Added additional CSV file stats/scopes for replication.

  • Added the number of active game driver clients to the engine crash context data.

  • Changed the SetReplicates method in the Actor class to avoid redundant work.

  • Added push model support to the base conversation component.

  • Increased the IPv4 private address space to include 172.16.x.x - 172.31.x.x.

  • Added support for push model dirty tracking to fast arrays.

  • Renamed command line options -DisableHttpWhitelist and -EnableHttpWhitelist to -DisableHttpDomainRestrictions and -EnableHttpDomainRestrictions.

  • Added a Switch Has Authority macro node for Blueprints derived from Actor component.

  • Renamed APlayerState::Ping and associated functions to CompressedPing, and introduced a new getter GetPingInMilliseconds that returns the accurate ping if it is available, or the decompressed replicated ping if not.

  • Added Net Fault Recovery to NetConnection to recover from non-fatal connection faults, and provide detailed analytics/logging for serverside and clientside connection errors.

Crash Fix:

  • Fixed a shutdown crash in the default voice engine implementation.

  • Fixed a crash when forcing a network update during shutdown.

  • Fixed a crash by resetting the NetPushId of an object when the object has no net driver state.

  • Fixed possible crashes from message construction using operator new by using FMessageEndpoint::MakeMessage() instead

  • Fixed a crash initializing object replicator state when the archetype is missing.

  • Fixed misleading unhandled socket error and subsequent crash by calling GetLastError before calling any other function that can clobber the error code that GetLastError returns.

Bug Fix:

  • Added net.ResetAckStatePostSeamlessTravel CVar to reset the package map's AckState on the server after seamless travel. Enabling this may prevent problems with Actors not replicating after travel due to clients missing entries in the NetGUID cache.

  • Fixed instances of missing push model dirty calls in scene components.

  • Moved the call to FlushNetDormancy earlier when removing active gameplay effects. This prevents issues where changes to ActiveGameplayEffects aren't tracked properly on dormant actors.

  • Fixed Fast Array bug where changing values after they are replicated in a single frame can cause them never to send.

  • Fixed an issue where replicated objects with only fastarrays or custom delta replicated properties would be tagged as having no replicated members and thus never replicate


  • Deprecated InstancePreReplication on Blueprint-generated classes since it was not being used.

  • Deprecated FRepChangedParent in favor of a smaller bit array.



  • Changed tracking of deleted startup Actors to avoid unnecessary uniqueness checks.

  • Added a new engine net version to support old replays. Fixed for net serialization compatibility issue.

  • Added the ability to set per object external data through the replay subsystem.

  • Allow replays to record unicast RPCs on Actors with the appropriate net driver name.

  • Added Blueprint accessibility to several replay subsystem functions.

  • Added a delegate for overriding the replay compatibility version check..

  • Added support for checkpoint-deleted Actor serialization to be split over multiple frames.

  • Added a way to request a checkpoint to be recorded immediately.

Bug Fix:

  • Fixed multiple compatibility issues that prevented Actor channels from being cleaned up during playback.

  • Fixed a crash that could occur when remapping playback channels.

  • Fixed a replay playback compatibility issue when an actor component class is missing.

  • Fixed a case where duplicate child actors would be spawned on replay scrub.

  • Fixed a rare scrubbing crash with delta checkpoints enabled.

  • Fixed non-replicated child actors not being cleaned up by their parents.

  • Fixed an issue with respawned startup actors having the wrong role during BeginPlay.

  • Fixed a case where dynamic actors flagged as replay rewindable might not be cleaned up properly after scrubbing.

Replication Graph


  • Added CVar Net.RepGraph.GridSpatialization2DDestroyDormantDynamicActorsDefault to allow Grid2D Replication Graph nodes to specify the default value of the DestroyDormantDynamicActor boolean.

Bug Fix:

  • Fixed dynamically spawned, initially dormant actors not replicating after the first dormancy flush.

  • Added a check to prevent connections from other drivers from being added to the graph.

  • Fixed a case where the graph could open duplicate channels for actors that persisted through a seamless travel.

  • Fixed multiple issues with dormant destruction info processing.

  • Added ensures in ReplicationGraph to detect when a PlayerController will open a channel to a non-owner connection.

  • Fixed GridSpatialization2D nodes in ReplicationGraph not clearing pending actors list on graph reset/level load.


  • Deprecated the PrevDormantActorList as it doesn't support multiple grids, The logic no longer processes dormant Actors for one grid on another grid when you have multiple grids for a connection. To upgrade you'll need to call ConnectionManager::GetPrevDormantActorListForNode to get your PrevDormantActorList and then modify the reference.

Socket Subsystem


  • Replace/remove uses of whitelist/blacklist in WebSockets.



  • Added a new experimental renderer type called Geometry Cache Renderer.

  • Added a new static switch constant for interpolated spawning.

  • Added a new data interface plugin called Example Custom DataInterface. This data interface contains C++ example content that shows how to write your own custom data interface for Niagara. This plugin can be found in Engine/Plugins/FX/ExampleCustomDataInterface

  • There is now a default mode for all new parameters, which is set to "Fail if Unset".

    • See related CL: 17637669: Severity of messages for parameters with default mode "Fail if Unset" can be set via new CVar "Fx.Niagara.FailIfNotSetSeverity".

  • Added a cvar fx.Niagara.DeletePythonFilesOnError to prevent intermediate python scripts from being deleted in case of a version upgrade error.

  • Cascade was updated to support Large World Coordinates. CPU simulations are run with full double precision vectors. GPU simulations use a tile offset to translate world space emitter positions to float precision vectors.

  • Added function scripts to convert between RGB and HSV colors.

  • Added support for dynamic inputs to auto-convert types when dragging parameters in the stack.

  • Added a flag to the audio data interface to turn off audio when not in PIE.

  • Prevent Niagara compilations from accumulating, so there can be at most one pending compile request.

  • Changed derived data requests for compilation to be asynchronous. Also fixed a bug where FNiagaraEditorModule::OnPreExit would crash when trying to complete the compilation.

  • Added support for systems with a fixed tick delta.

  • Added HLSL syntax highlighting for custom HLSL nodes and the generated code view. Also added tab support to custom HLSL nodes.

  • Removed the Highlights feature from the System Overview. It was adding visual noise without having the intended benefit.

  • Groups can now be collapsed in the System Overview.

  • Scratch Pad modules now have a scratch pad icon in the System Overview.

  • The expansion state of the stack in the System Overview is now persistent.

  • Selected parameters can now be configured to show up in module rows in the System Overview. Parameters will show up either as a text-based button or an image-based button. This is configured in scripts via property metadata. Clicking one of the inline parameters will immediately highlight the represented parameter in the stack.

  • Added Category functionality to Niagara systems, to be able to filter the parameters in emitters.

  • Added copy paste for parameter metadata in Niagara scripts. A notification widget will inform the user if there is a duplicate parameter in the destination graph, and will skip copying the metadata. If the source and the destination graph are the same, the metadata paste will be skipped completely.

  • Removed CPU access warning for camera data interfaces as they are no longer valid.

  • Niagara viewport settings are now persistent. "Particles count" is now turned off by default.

  • Niagara's Mesh Renderer now adds its mesh batches to GPU Scene. These instances can be frustum and occlusion culled by the GPU Scene instance culling system. GPU Scene can also use this data to render the meshes in Virtual Shadow Map passes.

  • All GPU stages are now simulation stages. The intrinsic particle stage is now just another simulation stage that can be enabled or not. Iteration count is now dynamic and can be bound to a user variable. Simulation stages can be enabled or disabled dynamically by a user variable.

    • A random seed parameter has been added to system instances. This creates the potential for randomness in System scripts.

  • Created a new data interface for reading properties from UObjects. This allows parameters to be automatically pulled from objects, instead of using Blueprints to pull data manually per frame. A source actor, or an explicit object user parameter binding can be read into the data interface. If the object is an actor, the data interface will look at the root component, or for an component of type 'source actor component class' to bind properties to.

    • Added the ability to iterate over a subset of particles in a simulation stage.

  • Added a setting to allow sprites to maintain a one pixel coverage while applying a coverage 'fade'. The renderer can opt into this automatically, or manually. Currently, the setting only covers translucent and additive when set to automatic. The project can also set whether to opt in or out of this feature when in automatic mode.

  • Changed the system determinism default to false, which matches the default for emitters. Fixed CalculateRandomRange not using system seed information.

  • Added SceneCapture as an option to pull data from the baker. Set the default to use a scene capture in HDR mode, since this will be the most common path. Added a checkerboard display toggle, and an alpha blend toggle. Fixed an issue where StartSeconds was used from generated data to preview, rather than settings to generate data from. Inverted the alpha channel when capturing from HDR + A, so it can be used directly. Allowed alpha to be visualized in the baker.

  • Optimized the Ribbon Renderer FNiagaraRendererRibbons::AppendToIndexBuffer, resulting in 2 - 12x increase in performance.

  • Added an instance and particle transform space. You can use this space to transform in or out of mesh particle and instanced static meshes. Particle mesh space is now hidden, and will be removed later, since this new space covers that functionality.

  • Added support for setting system or emitter fixed bounds per instance.

  • GPU profiler is now hidden, and only required information is exposed outside the plugin. Extended the GPU profiler to capture the stage execution cost. It now passes the data to the particle performance statistics in the debug HUD.

  • Added a new data interface called ActorComponent, to access actors or actor component transforms. This can be set via the ActorSource parameter on the data interface, or via a user parameter.

  • Disabled the creation of render targets if the data interface is not used with an active GPU emitter.

  • We now allow data interfaces to opt out of running beyond PostActorTick. This is important for the collision data interface, since it relies on the async traces being issued this frame.

  • Split indirect argument generation into pre-opaque and post-opaque. This allows Mesh Renderers, sorting, and culling to all fully function on the low latency translucent path.

  • Added an option to sample RVT base color.

  • Added a menu option to show all data interface functions, and allow the HLSL code to be copied to the clipboard.

  • Added support for shared static float buffers that data interfaces can push data into.

  • Added support for getting the parent index of a bone. Added a warning if filtered bones are not required by all LODs, since this could mean that the effect may not play correctly if a lower LOD is used.

  • Added support for the MacroUV node in the Sprite Renderer.

  • Added support for pulling vertex or triangle data from a bind pose.

  • Improved debug element count forcing. Added an optional warning when we allocate GPU buffers beyond a certain threshold.

  • Added options for Niagara auto mip generation

  • We now allow arrays to be an iteration source. Updated the GPU copy when we dirty the data on the CPU, so that we can skip SetElement.

  • We now allow data interfaces to specify how they wish to dispatch, 1d, 2d, or 3d. Cleaned up the shader code generation between particle and iteration interfaces to improve performance.

  • Fixed force solo to not kill the component. When setting custom time dilation, Niagara will change into solo mode, and back out when it is set to 1.0.

  • Cleaned up multi-GPU Niagara code. Added cross-GPU transfer support to Niagara and Cascade. Added a method to Compute Dispatch Interface to allow data interfaces to send resources for transfer. Fixed missing persistent ID buffer transfers with alternate frame rendering (AFR). Fixed PostRenderOpaque transfer location to ensure we capture count updates.

  • Added per mesh rotation to the Mesh Renderer.

  • Add NiagaraID array data interface.

  • We now allow allocations from the count manager outside of the general compute dispatch.

  • Moved Simple Counter to Private, and extended functionality to support more operations and GPU.

  • When adding a module script, we now automatically choose a location in the stack that satisfies all dependencies.

  • Fixed "Set Parameter" menus not having transient parameters.

  • Added support to Cascade To Niagara Converter API to specify a script version when creating Niagara Scripts. UNiagaraEmitterConversionContext::FindOrAddModuleScript(), UNiagaraEmitterConversionContext::FindOrAddModuleEventScript(), and UFXConverterUtilitiesLibrary::CreateScriptContext() now take FCreateScriptContextArgs as an argument; existing python scripts using these methods will need to be refactored to pass their arguments in this format.

  • Added CVar Fx.NiagaraFailIfNotSetSeverity which makes it possible to select the severity of errors emitted when parameters are uninitialized.


  • Improved the colors of Niagara pin types.

  • Improved resolution numeric inputs and outputs. Made type checking stricter for Op nodes.

    • Dynamically enabled bindings for renderers.

  • Improved Dynamic Material parameter name resolution in the Niagara stack.

  • Improved detection for uninitialized parameters may raise compilation errors for existing content.

Bug Fix:

  • Prevent active Niagara compilations from starving all other background tasks. Prevent transient systems from starting compilations.

  • Fix for "ParameterOffsets.Num() should be 0 is 1" warning during cook.

  • Implemented refresh helpers for Convert nodes. Convert nodes will now fix up the paths in their connections to reflect changes made to Blueprint structs. Also fixing an issue when swizzle inputs didn't have a typedef, so the wiring was not shown on the nodes. Niagara bools and ints are now assignable.

  • Fixed a bug where large emitter nodes in the System Overview would vanish randomly.

  • Fixed a bug where UNiagaraFunctionLibrary::SpawnSystemAttached() did not handle EAttachLocation::SnapToTarget correctly.

  • Fixed a bug where changing to a system mid-compile could lead to a crash.

  • Added a module in Cascade to Niagara Converter Plugin to better replicate Cascade's light behavior.

  • Fixed a bug where the "fail if not previously set" default mode would not correctly pick up previous writes.

  • Fixed a bug where the Niagara translator could compile unused parts of the graph, resulting in errors when unset variables were being read.

  • Prevented users from entering a dot (.) character in the name for a static switch parameter.

  • Fixed a bug where inputs with a changed type didn't refresh after versioning up.

    • Ensured we tick instance parameters before building data interfaces, otherwise the GPU tick would have a reference to the wrong data interface.

  • Fixed a few bugs with the search bar in the Generated Code view.

  • Fixed a bug where setting an engine parameter in the stack that had a default binding in a parameter definition caused a compile error.

  • Resolved an issue that prevented playing audio from Niagara in cooked builds.

  • Fixed a bug where several threads would race and cause a crash in NiagaraComponentRendererProperties::UpdateSetterFunctions.

  • The Cascade to Niagara Converter now adds a Solve Forces and Velocity module when converting acceleration modules.

  • Fix memory stomp when loading UNiagaraGraph.

  • Fixed cases in which a Niagara User Parameter binding would either: not work when selected, or entries wouldn't show up at all.

  • "Make" actions are now supported when dragging off an output pin in a Niagara script.

  • The Cascade to Niagara Converter relied on hardcoded type names for converting types. This led to issues when type names changed. The converter now assigns type names directly from their Niagara Type Definition.

  • Updated preview widgets of Niagara Mesh Renderer properties to display meshes instead of their materials.

  • Closing and reopening the stack will no longer cause previous search results to be applied.

  • The Select node can no longer use parameter maps as a type.

  • Niagara Script parameter metadata now gets correctly hidden and shown based on the type of the parameter.

  • Fixed a bug where Mesh Renderers wouldn't show up for mesh renderer bindings.

  • Updated the Niagara Stack Style to correctly show selection.

  • Prevented the type registry from being modified while we are iterating over the array.

  • Fixed a bug in Dynamic Material Parameters, when enabling dynamic parameter 1 also stomped over dynamic parameter 0.

  • Fixed Niagara Depth Sample for Mobile. It now correctly samples SceneDepthAux or SceneDepthTexture.

  • Fixed the count buffer growth while the editor is out of focus.

  • Removed hard-coded ribbon tessellation disable from code. Replaced this with a console variable that can be data-driven.

  • Fixed issue when the socket attachments component is already registered.

  • Ensured we don't use aligned loads on some compilers for VectorLoad with VectorRegister4Float and VectorRegister4Double.

  • Fixed incorrect mip calculation. This also fixed a crash when enabling Generate Mips on a 1x1 render target.

  • We now include layout and uniform buffer changes as part of hash generation.

  • Forced DXC for NiagaraDataInterface shaders for platforms that support DXC.

  • Fixed GPU export count not being correct when going over the limit.

  • Added a missing swizzle on Color Sample.

  • Fixed incorrect bindings for Spline Rotation. Also fixed rotation extraction for Spline Rotation.

  • Fixed various issues with dependency checking for uninitialized parameters when compiling Niagara Systems.



  • Added rules-based ordering of QOS subregions into subspaces, biasing datacenter selection away from subspaces whose performance is not a sufficient improvement over their related subregion. The tolerances to control this can be set in the [Qos.QosRegionManager] section in the engine config on a per RegionDefinition basis, and also enabled/disabled per region. The rules-based comparison may be enabled or disabled overall in the engine config, or overridden with the -qossubspacebias=true|false command-line argument.

Crash Fix:

  • Fixed a hotfix crash when patching a soft object pointer.

Bug Fix:

  • Patchcheck INI configs now refresh with every patch check attempt, instead of only at object construction.



  • There is a new configuration option to limit the amount of concurrent threaded HTTP requests being processed. It can be defined as follows:

[HTTP.HttpThread] RunningThreadedRequestLimit=11

  • New configuration options have been added to HTTP to increase control of Flush time limits. They work within the following categories:

    • Default = when Flush is called with no overriding context

    • Background = when Flush is called because the app is backgrounding. This may not be called on backgrounding on all platforms.

    • Shutdown = when Flush is called because the app is being shut down. Some use cases may want an infinite wait. This may not be called on shutdown on all platforms.

    • FullFlush = explicit request to wait infinitely for all HTTP requests to complete. Some use cases may want to disable infinite waits. Typically not used in game code but may be used by applications or commandlets.

Each one of these categories has soft and hard limits to be defined as follows:

    • Soft Limit = how long to wait in seconds before cancelling active requests. -1 = never cancel. 0 = cancel immediately. Must be < Hard Limit to work. Typically after calling Cancel the HTTP request needs a tick to process the cancel, so it should not be == Hard Limit.

  • Hard Limit = how long to wait in seconds before stopping waiting altogether.

When used in a configuration file, it would look like this:










Online Subsystem


  • The SetSubsystemId function now logs an error when a proper SubsystemId isn't generated.

  • Added an analytics context helper to SocialUser Interaction menus, which are driven from static classes and built with macros. This addition makes it possible to attribute interactions to their respective places in the user interface.

  • Added config options to OnlineIdentityNull which enable emulating different types of platform setups. Changed default behavior to enable logins with no credentials, to match most other platforms.

  • Cached auth codes in online identity interface automatically expire after a set time interval on platforms that implement auth code caching (currently, Playstation 4 and Playstation 5). The default is ten minutes, and may be adjusted in the engine ini file using the AuthCodeTimeToLiveSecs config field.

  • Added IOnlineIdentity::ClearCachedAuthTokenAPI for clearing cached auth tokens in online identity interface, where applicable (currently, Playstation 4 and Playstation 5). On the command line, you can use -CachePsnAuthCode=true or -CachePsnAuthCode=true to override the value in the engine's .ini file.

  • OnlineSubsytemEOS now supports GetLinkedAccountAuthToken.

  • Starting the app from a platform invite or join is now supported when using EOSPlus.

  • Some of the options in the EOS Plus editor settings have been relocated or renamed:

    • "CrossPlay Settings" to "EOSPlus Login Settings"

      • "Use Epic Account Services" to "Use Epic Account for EOS login (requires account linking)"

      • "Use Crossplatform User IDs" to "Use Crossplatform User IDs for EOS Login (doesn't use Epic Account)"

  • Online Subsystem GDK will now use SETTING_SESSION_TEMPLATE_NAME when searching sessions by search handle. It will need to be set in both session creation and session search settings. If none is defined, "GameSession" will be used as a default.

  • The Gamertag Component type in the Online Subsystem GDK implementation used to be set to Modern and could not be changed. A new configuration option has been added to do so, with the following format:

[OnlineSubsystemGDK] GamertagComponentOverride=Classic

Overrides can be: Classic, Modern, ModernSuffix, or UniqueModern. If no override is specified, the system will use Modern.

  • Online Subsystem EOS Plus has a new implementation for the Title File Interface, transmitting all method calls to the base platform interface without EOS mirroring.


  • Moved Online session FNames to a new module called OnlineBase to be shared between OnlineSubsystem and OnlineServices.

Bug Fix:

  • Users are no longer shown as Muted when isListening is set to false in a second channel.

  • Fixed the Epic Online Services Online Subsystem encountering an SDK error when querying the presence of a player's friends.

  • Several fixes to Epic Online Services Online Subsystem (EOS OSS):

    • EOS OSS now batches a player's friends' net ids when querying their external account mappings to improve performance.

    • EOS OSS no longer modifies the net ID of a player's friend after executing the OnFriendsChange delegate with that friend's incomplete net ID.

    • Fixed the EOS OSS always firing the FOnQueryExternalIdMappingsComplete delegate with bWasSuccessful as false even when the operation succeeded.

  • Fixed the Epic Online Services Online Subsystem not registering players that were present in a session at the time the local player joined the session.

  • Moved Hotfix module's dependency on OnlineSubsystem from private to public.

  • Duplicate PIE login credentials are now accepted if the credential's type is Developer.

  • Fixed a connection issue when using Epic Online Services peer to peer with more than 3 peers.

  • An EOS lobby search with no results in the Online Subsystem EOS Session Interface will no longer return as a failure state. Instead, it will return as a success with 0 results.

  • Hosting and joining sessions is now functional for Play-In-Editor game instances when using EOS.

  • EOS Connect Login is now functional for platforms that require the UserLoginInfo field.


  • Functions that used FUniqueNetId or shared pointers directly have been deprecated. We have added function overloads to UOnlineEngineInterface to take FUniqueNetIdWrapper.

Pixel Streaming


  • Updated PixelStreamingAudioComponent in UE5 to support sending audio data from the browser to the engine. This is currently experimental, as audio data arrives after a significant delay; we plan to improve this in future releases.

  • Added experimental support for VP8 and VP9 software encoding. You can select an encoder codec with "-PixelStreamingEncoderCodec". Supported values are "H264", "VP8", and "VP9". The default encoder remains hardware accelerated H264. This is experimental as these software VPX encoders are much slower than the hardware accelerated H264. Specifically, VP8 encodes at roughly 30 frames per second, and VP9 encodes at roughly 15 frames per second.

  • A whole new set of internal WebRTC stats are now exposed to Pixel Streaming for programmatic use and visual inspection through the built-in optional stats HUD. The stats HUD can be viewed by passing "-PixelStreamingHudStats". The stats can also be queried programmatically using the appropriate stat changed delegate in UPixelStreamingDelegates.

Additionally, a number of the settings available in the player.html and app.js have been removed and trimmed down to a subset of settings we believe are genuinely helpful to configure through the web frontend - the rest are now only settable as console variables and launch arguments to your Pixel Streaming application. Following this decision, we have also changed the "Test Latency" button to be a "Get Report" button that reports a subset of stats using the newly exposed WebRTC stats in Pixel Streaming.

  • Added a "Kick Player" Blueprint node that takes a Player ID as input. This replaces the functionality of the "Kick All" button from the Pixel Streaming front end, which has been removed.

  • Introduced a new design within Pixel Streaming to specify video sources, which take texture sources. For example, we now have a FVideoSourceP2P which takes a FTextureSourceBackBuffer. With this new design, users can add more types of texture sources in the future, such as render targets or scene capture textures. This change is transparent to most current users, but should increase flexibility for users who extend Pixel Streaming in C++.

  • Added default simulcast settings to Pixel Streaming to control the resolution and bitrate of simulcast streams. You can pass your own simulcast stream settings on the command line using -SimulcastParameters. The format of simulcast parameters is comma separated triples of: stream scale denominator, minimum bitrate, maximum bitrate. For example, the default is one full resolution video stream and one half resolution video stream, which would be specified as: -SimulcastParameters="1.0,5000000,20000000,2.0,1000000,5000000"

  • Added Pixel Streaming support for Vulkan on Windows.

  • Start-up scripts have been added for Linux. These enable running of SFU server locally, and SFU and CoTURN in docker containers. The containers can be built on demand. Start and stop controls are provided for convenience on top of the docker command line layer.

  • Extended Pixel Streaming and the JavaScript front end to support either the browser being the WebRTC offerer or the Pixel Streaming instance being the WebRTC offerer. By default the Pixel Streaming instance is now the WebRTC offerer, which is the reverse of the case in previous versions. However, Pixel Streaming still remains compatible with the browser being the offeror as it was in previous versions.

  • Updated the GamePlayMediaEncoder.

  • Added Vulkan and Linux support to GameplayMediaEncoder.

  • Support for a Selective Forwarding Unit (SFU) has been added to Pixel Streaming which allows multiple clients to connect with different bitrate requirements.

  • Renamed PixelStreamerInputComponent to PixelStreamingInput to align with our new naming conventions in UE5.


  • Pixel Streaming has been refactored to be more modular and configurable.

  • NVENC encoder plugin has been made more stable.

Crash Fix:

  • Fixed a crash in CUDA module when NVIDIA drivers are present but RHI is running on a non-NVIDIA GPU.

  • Fixed Pixel Streaming bug causing crash for some hardware when using Vulkan.

  • Fixed a crash in Pixel Streaming related to malformed peerConnectionOptions.

  • WebRTC binaries have been rebuilt. Protobuf symbols have been stripped to avoid collisions with other Plugins when building monolithic binaries (ie with UEGame target). This fixes a crash when using WebRTC statistics while building any Debug config.

  • Fixes to GameplayMediaEncoder crash when no encoders are registered to AVEncoder.

Bug Fix:

  • Fix for keyframes being lower quality than the rest of the stream. This was particularly problematic as keyframes are now sent a regular interval by default thus causing the stream to become momentarily pixelated every keyframe.

  • Firefox and TURN on AWS was broken due to the WebRTC cross browser shim, adapter-latest.js being unable to detect Firefox correctly. This was fixed by patching this script in player.html.

  • Tidied and formatted console logging for the Pixel Streaming JavaScript to make it more readable and less redundant, particularly in the case of ICE candidates.

  • Added url parameter ?ForceTURN that discards any ICE candidates that aren't using relay. This is particularly helpful when testing TURN servers with Chromium based browsers.

  • Fixed an issue where the WebRTC data channel would abruptly close when attempting to send large amounts of data over the channel.

  • CUDA failure to initialize will now result in an error message rather than a fatal error. Note that having RenderDocsPlugin enabled when trying to use CUDA will result in CUDA failing to initialize, so that Pixel Streaming will not function correctly while the plugin is enabled.

  • Fixed an issue with incorrect hardware encoders loading when the target GPU is not present.

    • Vulkan/AMF encoding is currently unsupported and has been disabled.

    • Removed a fatal error when trying to use AMF with Vulkan.

  • Fixed installation scripts for Windows and Linux to ensure they occur before starting CoTURN.


  • Removed the following unused console variables from Pixel Streaming:

    • PixelStreamingUseBackBufferCaptureSize

    • PixelStreamingCaptureSize

    • PixelStreamingWebRTCDisableResolutionChange

    • PixelStreamingMaxNumBackBuffers

  • AMF support with DX11 has been disabled. AMF with DX12 is unaffected.



  • Websockets protocols are now configurable in BaseEngine.ini.



  • Added scaling functionality to the buoyancy data so we can scale the pontoon element over time.

  • The following Buoyancy Types were added:

    • FSphericalPontoon::ScaleTimeFrequency (float): Defines how frequently the pontoon scale radius ticks.

    • FSphericalPontoon::ScaleRadiusPerTick (float): Defines how fast the pontoon radius reduces per tick.

    • FSphericalPontoon::MinRadiusToSink (float): Defines the radius required to sink the vehicle.

    • FSphericalPontoon::ScaledTime (float): Defines the tracked scale time as we're scaling.

    • FSphericalPontoon::BaseRadiusBeforeScale (float): Defines the base radius before scaling.

  • Added functionality to Chaos Debugging to draw collision for a single actor instead of all the actors in the scene.

  • The following CVars were added to the ChaosDebugDrawComponent:

    • p.Chaos.DebugDraw.SingleActor - If set to true, draws collision for the actor the camera is facing.

    • p.Chaos.DebugDraw.SingleActorTraceLength - Sets the trace length from the camera that selects the single actor that will be used to draw collision.

    • p.Chaos.DebugDraw.SingleActorMaxRadius - Set the max radius to draw around the single actor.

  • Added the ability to query the attached body names from a physics constraint in Blueprints.

Bug Fix:

  • The GetAngularDriveParams function for Physics Constraints now correctly returns the parameters by reference.


  • The GeometryCollection debug draw classes have been deprecated. The Chaos debug draw console commands should be used going forward.

  • The asset factory for UChaosPhysicalMaterial has been removed.



  • Added the console command p.ChaosClothEditor.DebugDraw to enable / disable the cloth editor visualization mode.

  • Added multiple LOD deformer mapping data to Chaos Cloth. This allows the engine to use raytracing on cloth at a different LOD level than the LOD level used for rendering and simulation.

    • Added the ClothLODBiasMode property to the Skeletal Mesh to define the storage strategy depending on whether multiple LODs deformer mapping data are required or not.

  • Added a new SetBackstop Blueprint function to the Chaos Clothing Interactor to enable / disable the Backstop collisions at runtime.

  • Enabled convex collision for Chaos Cloth on mobile platforms.

  • Ran the Long Range Attachment tether constraints as a pre-iteration step instead as a per iteration step to improve simulation performance.

  • Added global point damping to offer a faster alternative to the current local damping formulation.


  • Improved the way the Cloth wrap deformer deforms the high quality render mesh based on the simulation mesh. It now uses each face connected to a vertex to compute the average normal at that vertex. This average is then used to deform the render mesh, making the deformation more consistent.

  • Improved the binding accuracy between the simulation mesh and the render mesh, which results in higher-quality render mesh deformation.

  • Significantly reduced the initialization time of Chaos Cloth at runtime. This change prevents the initialization hitch by caching the Long Range Attachment tether calculations inside the cloth asset at authoring time.

Bug Fix:

  • Fixed an issue with Chaos Cloth where the MaxDistance and Backstop constraints were not scaling correctly when the skeletal mesh component scale was changed.

  • Fixed an issue where changing LODs while cloth simulation was suspended would result in the cloth and render LODs to become out of sync and cause a crash.

  • Fixed an issue where the cloth simulation data and bounds output was incorrect if the simulation was suspended while the component was moving.

  • Fixed an issue where rendering with an invalid simulation LOD would cause a crash.

  • Fixed an issue with Chaos Cloth visualization where multiple cloth bounds were using incorrect transforms.

  • Fixed an issue where the cloth wrap deformer vertex contributions (which triangles are rendered kinematic or dynamic) were incorrectly updated when using multiple influences and editing the MaxDistance mask.

  • Fixed an issue where the simulation data transform was incorrect when rendering the cloth mesh started after the component's transform had been updated.

  • Fixed an issue where migrating an asset from Nvcloth to Chaos Cloth would result in a stiffness multiplier being included.

  • Fixed an issue where Chaos Cloth would experience hitches in game caused by a smoothing of the time step that was incorrectly applied to the kinematic particles' velocity calculations.

  • Fixed an issue where importing a clothing asset without a matching LOD section would cause a crash.

  • Fixed the suspended simulation positions and bounds by reverting part of changes made in CL18170330 and fixing the local space bounds calculation.

  • Fixed an ensure that would always fire in ClothingAsset.

Physics Asset Editor


  • Added a way to edit the mouse interaction distance inside the Physics Asset Editor. The default distance value has been increased.

  • Added the ability to copy and paste bodies and constraints to the clipboard in a text-based format. This provides a way to copy bodies and constraints between different physics assets.

Bug Fix:

  • Fixed an issue where the preview animation of an asset would be lost after simulating in Physics Asset Editor.

  • Fixed an issue in Physics Asset Editor where the Detail panel would remain empty when selecting all the bodies in the skeleton tree.

    • Fixed an issue where copying a body setup to another one with a different primitive would cause a crash if the user used the Details view.

    • Fixed an issue where the selection was not being properly refreshed after the copy operation.

  • Fixed an issue where the preview animation of an asset would stop when simulation started or stopped.

Rigid Bodies


  • Added the p.RigidBodyNode.UseDeferredTask CVar. Set this to 1 to defer the simulation results of RigidBody AnimNodes by one frame, improving performance by enabling the simulation more time to complete in the background.

Bug Fix:

  • Fixed an issue in RBAN where mesh component initialization may pass through a zero delta time when the node is set to inherit bone velocities. This resulted in an incorrect value being used in the velocity calculation.



  • The device profile editor can now properly add or check out platform-specific .ini files. It will also only save changed values for inherited device profiles. The device profile editor can now create production-ready .ini files that do not need manual fixes.

  • Made it possible to distinguish between controller types when using WinDualshock.

  • Added RunUAT CreatePlatformExtension command to auto-generate plugin and module platform extension files.

    • Examples for using CreatePlatformExtension:

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=MyProject/Source/MyProject.target.cs -project=MyProject/MyProject.uproject

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=Engine/Plugins/Path/To/MyPlugin.uplugin

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=Engine/Source/Path/To/MyModule.build.cs

  • Implement waitfordebugger / waitforattach for console platforms. These command line options allow a game to pause until a debugger is attached.



  • Added ability to query the Parter Center to automatically populate the title settings using the in-editor Project Settings dialog.

  • Added support for custom/modified GDK editions in AutoSDK, signified with an additional suffix. For example: "210603-01" vs "210603"

  • Adding support for launching a title by URI, for example: ms-xbl-[TitleId]://<custom string>. See the GDK documentation for details. The URI is available via FPlatformMisc.

  • Added support for -package -deploy to install GDK packages with UAT automatically.

  • The 480x480 packaging image is no longer considered optional. Previously the dashboard would silently scale up the 150x150 image as a fall-back.



  • Increased Unix Cycles64 resolution to 100ns

  • Fixed Unix crash messages printing a truncated memory address.

  • Added support for asynchronous logging on forked instances

  • SkeletalMeshComponents will now run multithreadable tasks on the taskgraph on forked multithreaded servers

  • Moved FForkProcessHelper code in Fork.cpp.

  • Added FForkProcessHelper::IsForkRequested function. This returns true when the process is set to fork child processes or simulate forking by itself.

  • Implemented FUnixPlatformMisc::GetCPUVendor and GetCPUBrand() for non x64 Linux platforms to read and parse the /proc/cpuinfo file. Added tables for 64-bit arm cpu implementers and part numbers. This table may have further updates in the future.

  • FUnixPlatformProcess::CreateProc no longer requires you to pass an absolute path to an executable. If passed an argument containing a program name but no path separators, it now searches directories specified in the $PATH environment variable in the same manner as the shell would. The underlying API has changed from posix_spawn to posix_spawnp, and failures are no longer treated as fatal.

  • Add Linux -crashhandlerstacksize command line option to set crash handler stack size.

  • Moved stack to mapped memory instead of allocating in the heap. This can set and reduce the size of the 200k stack significantly through the command line.

  • Add DumpGPU viewer script for Linux and Mac. To use this, run the DumpGPU command in the console. This will open a folder to the DumpGPU HTML files and data, plus OpenGPUDumpViewer.sh. If you open OpenGPUDumpViewer.sh, the GPU Viewer will open in your web browser.

  • Updated Linux SDL to 2.0.20.

Bug Fix:

  • Unix's GetCPUTime refreshes the total cpu usage of the process every 250ms (same as other platforms) instead of the incorrect 25ms.

  • Replaced the single ensure crash reporting process handle with a pool of process handles.

  • Made UnixCrashContext for ensures thread-safe.

    • Stopped adding/removing FTicker delegates outside the game-thread.

    • Made the concurrently uploading processes thread-safe using atomic state machine.

    • Added option to limit the number of processes on dedicated game servers .

    • Fixed ensures not getting sent on dedicated game servers.

  • Use reliable messages for local swarm Mac/Linux messages Udp window size is ~64, so when sending large batches of "task completed" messages quickly, several would get silently dropped.

  • Change default optimization level for Shipping from O2 to O3.



  • Added an Import Xcode GPU Debugger Plugin for Mac. This plugin works similarly to the RenderDoc plugin for Windows. Enable the plugin in your project settings, then press Shift+E to trigger a GPU frame capture of the primary viewport. It will automatically open in Xcode once the capture is complete, at which point you can replay the capture, step through it, and perform other operations.

  • Removed MetalShaderCompiler depenencies on DerivedDataCache.

Bug Fix:

  • Fixed incorrect format string in MacToolChain.

  • Fixed XCode GPU programmatic captures missing a file name.



  • Renamed EColorSpace to EOculusColorSpace to prevent confusion with the new engine definitions.

Bug Fix:

  • Fixed an issue where the editor would throttle whenever a VR headset was attached.

  • Fixed UE5 binary failing to package BP projects for HoloLens due to Missing Game Binary. UBT is required to run for all HoloLens packaging because this step generates the final target file used to generate the package.

    • This means you need to have Visual Studio set up to package for HoloLens even for a Blueprint-only project.

  • Fixed a bug which caused the Editor to throttle whenever a VR headset was attached.

  • Fixed an issue where the editor viewport would slow down when a Virtual Reality headset was being used.



  • Display progress of splash screen on the Windows taskbar icon

Crash Fix:

  • Prevent a crash if the web browser component fails to load.

Bug Fix:

  • Force the webbrowser plugin to load when creating the bridge plugin.



  • Added support for emulating "Default User Required" on Windows when the Simplified User Model is enabled, as it is not currently implemented in the GDK. When opting-in to emulating Simplified User Model & Default User Required, the game will block and display a user login prompt on startup. If the user cancels sign-in, the game will terminate. If the user signs out, the game will terminate.

  • Package install batch files are created alongside WinGDK packages.


Bug Fix:

  • Correctly handle MultiView and Variable Rate Shading attachments in the PSO caching system.



  • Added a new Nanite Tools editor plugin, which includes an audit flow to find Nanite meshes with errors, and non-Nanite meshes that could be converted safely to Nanite. The tool performs a Material check to properly categorize error and optimization suggestions. This is the initial implementation and will be improved upon in future releases.

  • Implemented Nanite support for view visibility flags DrawInGame, DrawInEditor, VisibleInReflectionCaptures, VisibleInSceneCaptureOnly, HiddenInSceneCapture, ForceHidden, and others. Also partially implemented a GPUScene version of FPrimitiveProxy::IsShown().

  • Added an initial implementation of per-view primitive filtering in Nanite (such as GPUScene version of IsPrimitiveHidden from the SceneVisibility.cpp). This enables Nanite to support Show Only or Hidden Primitives lists for Scene Captures and other workflows.

  • Added a new debug mode to render only non-Nanite fallback meshes that incorrectly reference coarse static mesh assets. This mode is off by default, and enabled in non-shipping builds with r.Nanite.IsolateInvalidCoarseMesh 1.

  • Lights can now enable ray-traced shadows independently of the standalone Ray Tracing Shadows project setting. There are three options to select from: Disabled, Use Project Settings, or Enabled. For older scenes, lights that had Cast Ray Tracing Shadows enabled are mapped to the new Use Project Settings value.

  • Added a new define ("DXR_ALLOW_EMULATED_RAYTRACING") that automatically compiles out the r.D3D12.DXR.AllowEmulatedRayTracing by default.

  • Enabled Vulkan Wave Operations and use Vulkan 1.1 environment for shader compilation on desktop platforms.

  • Added wireframe viewmode support for Nanite using postfx barycentric coordinates.

  • To improve color management, there is a new Color Space property in the Texture Editor to specify the color space of the source textures.

  • Added compliant 64-bit image atomics in Vulkan, which fixes all validation issues with 64-bit atomics and allows the use of RADV driver (AMD + Linux) for Nanite and Lumen.

    • This change will use STORAGE_IMAGE to read from R64 formats when sampling isn't supported.

    • It leaves high level code and HLSL untouched. Render Dependency Graph will continue to consider them read-only access.

    • Creates a code path for HZB that uses UlongType.

    • Updates shader GUID for Vulkan to force a rebuild.

  • Added scoped CPU markers for CPU profiling for the most expensive parts of "GlobalBeginCompileShader" and "FShaderCompilingManager::SubmitJobs", which includes "FShaderType::AddReferenceUniformBufferIncludes" and "GetInputHash."

  • In the Environmental Light Mixer, Volumetric Fog toggle has been added to the minimal view for Exponential Height Fog.

  • Added a way to handle CopySrc/Dest transitions for depth-stencil targets in Vulkan, which allows the use of AddCopyTexturePass on depth-stencils of the same format.

  • Added Large World Coordinates support for cloth simulation in GPUSkinnedVertexFactory and SkinCache shaders.

  • Added descriptions for the various "stat *" EngineStat commands. Using "stat help" will list all available commands.

  • Added support for Morph Targets to the Motion Blur visualization when Skin Cache is disabled.

  • Modified DumpMaterialShaderTypes commandlet to add FMaterialShader types to the final shader type histogram.

  • Added additional options for linearizing (advanced) source encodings on texture import.

  • Enabled EmitDrawEvents by default when ProfileGPU is enabled, otherwise provide options to enable except in a shipping build to avoid oversights with release builds. Also removed EmitDrawEventsOnlyOnCommandList as it is unused.

  • Enabled cloth rendering on mobile and Windows ES3.1 platforms by default with per-project control. Use the console variable r.Mobile.EnableCloth to set it.

  • Added the ability to set shader defines for global shaders from configuration (*.ini) files.

  • Added new features and improvements to GPU Scene dynamic primitives:

    • Updates to GPU Scene and the GPUSceneCollector to support handling the upload of multiple instances and instance payload data for dynamic primitives.

    • Updates to Virtual Shadow Map caching to support the invalidation of cache pages upon removal of dynamic primitives.

    • Added the ability to provide a delegate to support initializing or modifying dynamic primitives' instance scene data and instance payload data from the GPU.

  • Added uniform buffer names to D3D12 shaders and added validation logging to uniform buffer binding.

  • Implemented Intel extensions for 64-bit atomics.

  • Fixed shader cooker stats showing the wrong shader format names.

  • Added GRHISupportsMapWriteNoOverwrite to check at runtime if RLM_WriteOnly_NoOverwrite is supported.

  • Allowed D3D12 global constant buffer updates to be more dynamic, which removes the shadow data overhead from stages that aren't used in a context. It also allows for global constant buffers larger than 4 kilo-bytes in size.

  • Refactored Vulkan renderpass initialization to allow for either vkRenderPassCreateInfo or vkRenderPassCreateInfo2 paths depending on platform support for the extension.

  • Added an optional MaxLODSize_VT option to Texture LOD Group to clamp cooked Virtual Texture sizes per group.

  • Added support for attaching to PIX on startup. You can either pass "-attachPIX" on the command line or set r.D3D12.AutoAttachPIX=1 in ConsoleVariables.ini. You will still need to manually hit "attach" inside PIX.

  • Added support for vkCreateRenderPass2 and vkCmdBeginRenderPass2 to Vulkan RHI.

  • Added an on-screen notification when Runtime Virtual Texture streaming mips are invalid and therefore likely to be causing a performance regression.

  • Added console variable r.VT.RenderCaptureNextPagesDraws to trigger render captures when Runtime Virtual Textures renders new pages.

  • The Virtual Texture System only updates during Draw Tile Mesh when the Material being rendered actually samples from a virtual texture. Previously, this was introducing lags in processing VT feedback, particularly evident when rendering the water brush which uses lots of Draw Tile Mesh internally.

  • Added single-callback version of CreateStructuredBuffer to automatically infer element size, total size, element count and data pointer (for example, CreateStructuredBuffer(GraphBuilder, TEXT("MyBuffer"), & -> auto& { return BufferSource; });, where BufferSource is a TArray)

  • Added support for uint2 shader parameters.

  • Added ForceTracking flag to ERDGBufferFlags/ERDGTextureFlags : force the RDG to track a resource even if it can be considered as read-only (no UAV, no RTV, etc.) This allows the graph to copy from and to external textures, and handling of the corresponding transitions, for example.

  • Added default pixel format capabilities for platforms that might not be able to poll for support at runtime.

  • Added RHIIsTypedUAVStoreSupported for texture format changes for D3D format queries that need to use the different UAV/Resource formats that are implemented on D3D11 and D3D12. Also, added checks for TypedUAVLoad support on D3D12.

  • Made changes to Landscape Grass type for "ShouldCacheLandscapeGrassShaders" to use "EShaderPermutationFlags::HasEditorOnlyData".

  • Vulkan 1.2 API now supports ray tracing when enabled (on by default) and adds support for ray query extension. Vulkan ray tracing can be set by the console variable r.Vulkan.ExperimentalRayTracing.

  • Added RHIUniformBufferLayoutInitializer and now RHIUniformBufferLayout is a proper FRHIResource. This brings proper RHI lifetime support to RHIUniformBufferLayout so we don't delete the layouts while RHI commands that use them are still in flight. This should fully address UniformBufferLayout and UniformBuffer crashes that randomly happen during shader compilation in the Editor.

  • Added separate RHI capability properties for full ray tracing shaders and inline ray tracing. While most RHIs may support both features, some may only support one.

  • Enable inline ray tracing support for Vulkan on PC via DDPI. Feature remains disabled by default using the console variable r.Vulkan.RayTracing. The minimal set of required ray tracing utility shaders is now always cooked for Windows Vulkan targets, and the "-noraytracing" command line argument can be used to disable ray tracing, which is useful when testing a game that was packaged with "r.Vulkan.RayTracing=1".

  • Added Dynamic Resource heap flags to Root Signatures, and moved static Root Signature text generation to a public file.

  • Added support for GPU asserts in ray generation shaders.

  • Extended Agility SDK support to all Windows family platforms.

  • Added an "Auto" setting to GenerateMips that detects format support before blindly using the compute version. A helper was also added to GenerateMips to tell if you need to add UAV support to a texture based on its texture format.

  • Added ray tracing feature support property to platform settings editor UI.

  • Added an option to disable high-end ray tracing reflection support per-platform. This avoids expensive, time consuming shader compilation for effects that will never be needed in practice.

  • Adding missing RHIValidation overloads for RHIBackBufferWaitTrackingBeginFrame and RHIFlushTextureCacheBOP.

  • Implemented Vulkan top level acceleration structure SRV management and binding. This allows acceleration structures to be used in shaders that perform inline ray tracing on Vulkan platforms.

  • Reduced ray tracing sampler heap allocation's high water mark through better sampler descriptor table duplication. Samplers were previously duplicated using per-thread hash tables, which results in some cross-thread duplicates. This change adds an exhaustive brute force search through the entire global sampler table if per-thread cache did not find a match.

    • This change was tested running a replay which previously reached 1400+ samplers (out of hard limit of 2048). With this change, the maximum sampler allocations are reduced to 400. The performance impact is minimal.

    • Control the duplication scheme with r.D3D12.RayTracing.DuplicateSamplers. By default it's enabled, but can store old behavior by setting it to 0.

  • Added support for compressed textures larger than 2 GiB.

  • Brought DXProgrammableCapture.h into ThirdParty and modified it to not require a NTDDI_VERSION. Cleaned up PixWinPlugin to use the correct header guards, correct types, and correct windows version check.

  • Implemented RHIGetNativeCommandBuffer in D3D11RHI, which returns the immediate context.

  • Updated WinPixEventRuntime to version 1.0.210818001.

  • Added quicker utility for getting a shader type's name. ValidateBoundShader and ValidateBoundUniformBuffer were rewritten to be templates instead of defines to make them easier to investigate.

  • Updated the Agility SDK to version 1.600.10.

  • Removed excessive calls to IsRHIDeviceIntel() to prepare for Gen12+ platforms.

  • The console variable r.Shaders.Optimize can now be set on a per-platform basis.

  • Extended GPU page fault information is now logged in Aftermath crash handler.

  • Resource dimensions and type are now reported when logging live and recently released resources after a GPU crash. This makes it easier to correlate resources reported by Aftermath with the live and recently released allocations in the engine.

  • Added an explicit SPIR-V target environment option to CrossCompiler::FShaderConductorOptions and use Vulkan 1.2 environment when compiling ray tracing shaders and shaders with CFLAG_InlineRayTracing.

  • Added support for accessing triangle indices and vertex positions in Vulkan inline ray tracing shaders. Use FRHIRayTracingScene::GetMetadataBufferSRV to access RHI-specific data associated with the ray tracing scene. This can be used to access vertex and index buffer binding information for inline ray tracing shaders.

  • Added ERayTracingPipelineCompatibilityFlags used by ShouldRenderRayTracingEffect to check if a particular effect can run on the current machine. Some effects may support inline or full pipeline ray tracing and some RHIs may support one or both features.

  • Making more RHISupports functions use FStaticShaderPlatform to take advantage of optimizations on certain platforms.

  • When Forward Shading is enabled, the Shadow Map Method is now grayed out to indicate it has no effect.

  • Implemented multi-platform DumpGPU command line tool for debugging common rendering artifacts. See the DumpGPU Tool documentation for more usage details.

  • Exposed per-project platform setting to control offline BVHs build mode (disabled, Maximize Performance, and Minimize Memory) since offline BVHs generally result in better performance and/or reduce memory usage. In its current state, Maximize Performance versus Minimize Memory controls whether triangle splits are used or not.

  • Added estimated compressed size metrics for Static Meshes in the Static Mesh Editor UI and in Asset Audit.

  • Added support getting transforms from GPUScene when building RayTracing Instance Buffer.

  • Improved the screen space subsurface scattering performance when it only occupies a small region.

  • Added functionality to wrap 1D dispatches into 2D or 3D to avoid API limits, and shader function to get the linear index.


  • Refactored Nanite hardware rasterizer to run as Material shaders, allowing for future Material graph evaluation of features like world position offset, pixel depth offset, and masked Materials.

  • Refactored Nanite Material audit checks into modular utilities, and added auditing support to Nanite Audit Tool.

  • Renamed FNaniteShader to FNaniteGlobalShader to make the base class more obvious.

  • Modified "DumpMaterialShaderTypes" commandlet to support listing Material Shader types, not just Mesh Material Types / Vertex Factories with a layout. Since this currently contributes a lot of unnecessary shader types / permutations, this change also temporarily disables Nanite raster shaders, except for the default Material.

  • Optimized the Nanite Material classify pass, using MaterialResolve to obtain MaterialSlotID directly, instead of obtaining SlotID through VisBuffer and ClusterPageData, and so on, to reduce bandwidth overhead and improve performance. Since MaterialResolve is 16-bit wide and VisBuffer is 64-bit, it can save at least 3/4 of bandwidth. After testing, the performance is improved by 40% on RTX 2070s. This optimization is enabled by default, and toggled with r.Nanite.ClassifyWithResolve.

  • Improved Instance Static Mesh and World Position Offset rendering by adding the console variable r.RayTracing.Geometry.InstancedStaticMeshes.SimullationClusterRadius to buck and sort ISM and WPO simulated instances based on distance to view. Also refactored the console variable code to fix/enable r.RayTracing.Geometry.StaticMeshes.WPO = 2, and fixed issues with current ISM and WPO if the local transform uses a non-identity matrix or if the simulated instance transform is non-identity.

  • Cleaned up shadow passes in order to remove unnecessary command list and feature level arguments.

  • Moved more hardcoded shader platform checks to DataDrivenShaderPlatformInfo.

  • While troubleshooting long compile times, enabled sorting by worker compile time to show the bigger offenders first. Removed instruction count from this display, as it is not a relevant stat in this context.

Crash Fix:

  • Fixed a crash in Procedural Mesh component with ray tracing enabled.

  • Fixed a crash when isolating Material Slots in editor.

  • Fixed a crash in Nanite mesh when reloading the global shader map.

  • Fixed a crash in GPU lightmass when baking an empty level.

  • Fixed a crash in ray tracing with invalid Static Mesh Proxies.

  • Fixed a crash that would usually happen when a Dynamic Material Instance created in a construction script could be unloaded with its owner, even when still referenced by primitives in the world.

  • Fixed a crash when clicking the RenderDoc viewport button, and implemented additional RenderDoc editor improvements.

  • Fixed a crash when using Try Get Shaders on a Material where there's no shader map available. For example, an invalid Material.

  • Fixed a crash that occurred when GPU ightmass was run with "Allow Static Lighting" disabled in the project settings. Now GPU Lightmass only runs when that option is enabled.

  • Fixed a GPU crash that could happen with Ray Tracing Global Illumination's final gather reprojection pixel index calculation and added an explicit bounds clamp.

  • Fixed a crash with landscapes when using the command line argument -rhivalidation that ensures the RHIBuffer is held for the life of the frame because not all RHI backends will have the SRV maintain a hard reference to the source buffer.

Bug Fix:

  • Fixed an issue that caused motion blur to become increasingly blurry when single stepping in PIE.

  • Fixed an issue with Nanite hit proxy selection for Instanced Static meshes that do not have "Has Per Instance Hit Proxies" enabled. Such as, Blueprint Construction Scripts spawning the ISMs rather than a content creator explicitly mutating the instances array.

  • Fixed an issue where ray tracing is not enabled by default in cooked games with r.raytracing set to 1.

  • Fixed an issue that would cause flickering in the Cable Component due to a race condition.

  • Fixed Per-Instance Custom Data and random ID for Nanite Materials and meshes.

  • Fixed an issue in Vulkan RHI when using Hair Strands debug mode 6 in Editor.

  • Fixed an issue when Realtime is turned off in the editor to make sure the RHI resources are flushed even when nothing is rendered to prevent leak in RHI (D3D12/Vulkan).

  • Applied fixes for broken and shuffled Nanite Materials when commands like "FUpdateStaticMeshesForMaterials" call "FPrimitiveSceneInfo::UpdateStaticMeshes", which will re-cache Nanite mesh draw commands (and deriving new Material table indices), but no other change will cause GPU Scene to perform a per-primitive upload, which would also update the global Material tables. This change modifies "FPrimitiveSceneInfo::UpdateStaticMeshes" to trigger a GPU Scene update so the MDCs and the global Material table stay synchronized. Normally, adding a primitive to the scene will mark GPU Scene dirty, but some cases of construction scripts adding to the scene, flushing the upload, but then changing just the Static Meshes or Material assignments wouldn't flush an update before.

  • Fixed an issue in Vulkan RHI to handle mixed sub-resource layouts when moving surfaces (defrag).

  • Resolved an issue where Raytracing Scene captures were using the Reflection Capture's visibility flag instead of the Scene Capture's visibility flag.

  • Fixed an issue with broken Morph Targets CPU update path.

  • Fixed an issue in Vulkan RHI for RHIReachSurfaceData. The bls8bpp use was inverted, Rect param was only partially taken into account, and added more supported formats.

  • In Vulkan RHI, added a barrier in Buffer Unlock to meet the expectation of higher level code that data is ready to read.

  • In Vulkan RHI, fixed FVulkanUnorderedAccessView for FVulkanTextureCube giving the validation error "requires an image view of type VK_IMAGE_VIEW_TYPE_2D_ARRAY but got VK_IMAGE_VIEW_TYPE_CUBE".

  • Vulkan RHI was missing CS lock in Vulkan Memory for when Render Thread (texture creation) overlaps with RHIThread (RHIEndFrame) and both can access the ActivePages.

  • In Vulkan RHI, fixed the Shader Complexity viewmode by adding approximate SPIRV instruction counts during shader compilation.

  • Fixed various issues in the Vulkan RHI with Async Compute. Added a new function to query stage bits supported by a queue that filters stages for barriers sent to async queue. And, avoid unnecessary semaphores when DstPipelines is ERHIPipeline::All.

  • Fixed accidental usage of the Stencil StoreOp for Depth in Vulkan RHI.

  • Fixed an issue in Vulkan RHI where transition batches containing only a single execution barrier were not submitted.

  • In Vulkan RHI, added RenderArea as a criteria for Framebuffer matching when reusing, which fixes some passes that were reusing the same set of targets but different areas.

  • In Vulkan RHI, fixed an issue with hashing in FDeviceMemoryBlockKey.

  • Protect extra GPU Scene instance data arrays from out of bounds access if data flags are incorrectly set.

  • Fixed an issue found in D3D12 sampler BorderColor copy.

  • Fixed issue where child Skeletal Mesh component LOD can be detached from its parent Skeletal Mesh component.

  • Fixed an issue when "LOD to Frame Skip Map" is set to a positive number of frames on Skeletal Mesh that would cause animation to become fuzzy from motion blur.

  • Fixed an issue with hair rendering with AddHairVisiblityCommonPass function using the wrong ViewRect for AddSimpleMeshPass function. This caused hair to not render at all in the right eye in XR and potentially in other situations that use multiple views.

  • Fixed Instanced Static Mesh (ISM) per-instance selection rendering where it used to draw every instance as selected, rather than only the instances that were selected.

  • Fixed CPU morphing broken on cooked mobile builds because its morph data was being stripped during the cook.

  • Restored the old FLightPrimitiveInteraction code. The new code can leak memory and it is no longer needed due to the removal of async LPI creation

  • Fixed hash generation for PC DirectX Shader Compiler (DXC) shaders to use the hash provided by DXC.

  • Fixed an issue where Adaptive Virtual Texture did not process the first allocation request each frame.

  • Fixed a dangling reference in Render Dependency Graph (RDG) blackboard implementation when blackboard struct is not first created.

  • Replaced overzealous check by ensuring when Hierarchical Instance Static Mesh (HISM) component transform or view projection matrix is invalid.

  • Fixed an issue where pooled buffers were not being renamed on reuse in external profilers.

  • Removed validation skipping from the SM6.6 code path as it's a fully supported feature in our version of DirectX Compiler (DXC).

  • Fixed an issue where bUseDiagnosticBuffer would be overwritten by the last used stage.

  • Fixed an issue with query waiting stats which prevented job thread wait times from being added to GRenderThreadIdle.

  • Fixed a bug that caused skeletal mesh rendering to break in forward shading mode when switching from another anti-aliasing mode to Multi-Sample AA (MSAA).

  • Fixed a race condition where multiple threads access a shared FD3D12RayTracingShaderTable::TransientCBVs array. This was solved by giving each worker thread its own version of this array, similar to TransitionSRVs and other such members of the FD3D12RayTracingShaderTable.

  • Fixed an issue where Adaptive Virtual Textures weren't correctly invalidated for regions marked as dirty.

  • Reserve worker threads are taken into account when creating contexts for Windows D3D12 to prevent running out of contexts during heavy loads.

  • Fixed a bug that caused the skeletal mesh LOD to change unexpectedly in the Editor viewport with Realtime viewport update turned on. This bug occurred when 1) hovering the mouse over the level thumbnail in the Content Browser (with bAllowWorldThumbnails enabled in DefaultEditor.ini) and 2) when dragging a rotation axis in the Details panel.

  • Fixed asserts on D3D12 platforms that don't support mesh shaders by excluding mesh/amplification from EShaderVisibility on those platforms.

  • Changed creation of FSceneViewState to require the correct current ERHIFeatureLevel.

  • Added SM6 into RHI LexToString, and fixed a typo in SceneView's LexToString.

  • Resolved an issue where elements of the geometry cache index buffer in FGeomCacheIndexBuffer::Update were not always initialized. This prevents out-of-bounds access of Geometry Cache index and vertex buffers on GPU during ray tracing acceleration structure build (which causes a GPU crash). This change also clamps FRayTracingGeometrySegment.NumPrimitives to ensure that the index buffer itself is not accessed out of bounds. Note that this change does not address the deeper underlying problem that causes a mismatch between FGeometryCacheMeshBatchInfo.NumTriangles and index buffer contents, it only treats the down-stream errors.

  • RDGBuffer objects need to be destroyed with their TFunction members, which fixes a slow leak when using Buffer creation callbacks.

  • Fixed an issue with bilinear sampling of light shaft texture in exponential fog draw step sampling outside the valid region due to dynamic resolution.

  • Fixed velocities on static objects being moved by editor widgets, which in turn fixes Lumen Global Illumination and Temporal Anti-Aliasing.

  • UDIM blocks are sorted by X/Y location This is important when using composite textures, as they require the composite texture's UDIM layout to match the source layout. Previously, block order was partially non-deterministic/related to how the texture was imported, so composite textures didn't always work with UDIMs.

  • Planar reflection now has smooth specular transition. It will start to fade off at roughness= 0.2, and finish at roughness = 0.3 as expected.

  • Fixed incorrect height field data in Global Distance Field. Now, the height field is only included once the texture is done streaming/compiling.

  • Lumen reflection is now working on Mac.

  • Fixed Distance Field Ambient Occlusion ghosting happening in the mesh preview window.

  • Don't include objects with "Cast Shadow" disabled in Distance Field Shadows.

  • Fixed issues related to when "r.AOGlobalDistanceFieldCacheMostlyStaticSeparately" is disabled.

  • Fixed non-Nanite Static Meshes not rendering in ray tracing in some situations (for example, when FarField ReferencePos is changed).

  • Fixed Global Distance Field corruption when the scene only contains height fields.

  • Fixed incorrect Distance Field Shadows caused by invalid Signed Distance Field bricks.

  • Fixed broken HZB culling result readback.

  • Fixed incorrect indexing when building mesh Signed Distance Field culled tile data, which caused flickering and incorrect results in Distance Field Ambient Occlusion.

  • Fixed Nanite meshes not respecting "Cast Shadow" toggle when using ray-traced shadows.


  • Deprecate project settings for Virtual Texture Compression. All virtual texture compression is now handled by Oodle. Only one remaining use case for crunch compression in Runtime Virtual Textures exists, but will be migrated to use Oodle RDO in the future to remove any old compression code.

  • Deprecated RHIGetResourceInfo in favor of FRHIResource::GetResourceInfo.


  • Removed r.SkinCache.ForceRecomputeTangents. It can be achieved equivalently with r.SkinCache.CompileShaders=1 & r.SkinCache.Mode=1 & r.SkinCache.RecomputeTangents=1.

  • Removed r.SkinCache.Mode=2.

  • Permanently enabled r.DoInitViewsLightingAfterPrepass and removed its console variable.

  • Removed usage of "DataDrivenShaderPlatformInfo" from "ValidateShaderParameterTypes".

  • Removed deprecated Distance Field Global Illumination and Heightfield Global Illumination features.

  • Removed editor toggle to manually control Ray Tracing Far Field assignment. HLODBuilder internally sets the flag when necessary.



  • Wrapped FVectorVMContext in Niagara Data Interface Function Context for external functions to facilitate running an experimental VM in parallel. External functions should no longer access FVectorVMContext directly, and instead use the helper member functions in the Niagara Data Interface Function Context class. This should have zero effect without NIAGARA_EXP_VM defined. If it is defined, then it'll use the experimental VM functions.

  • Shader symbol generation and "debug info" generation was split into two different console variables. This allows shader symbol generation post-packaging without generating different shader variants. As a result, you can always generate symbols and still have the final unduplicated shader sizes.

  • NotifyShaderCooked was replaced with NotifyShaderCompiled to prep for upcoming non-cook symbol writing.

  • PC DXC shader compiles only generate debug info when requested, not all the time. PC FXC shader compiles only generate debug info when requested, not just when the console variable r.Shaders.Optimize is 0.

  • Added support for filtering categories by section in modules in the selection stack view.

  • Made some minor improvements to Niagara Debug Hud: system colors are now customizable and applied a fix for colored background tile width.

  • Niagara Components can now have their scalability disabled by Sequencer, which should allow for better reuse of game FX in events/cinematics without having sequencer and scalability fight each other.

  • Niagara components can now optionally check for some relationship with a local player pawn to disable scalability culling. This can help prevent overzealous scalability culling for important player FX.

  • Refactored Debug Hud to allow easier extension. Adding a mode setting for the overview. Now includes the following modes:

    • Overview for existing overview data.

    • Scalability for detailed scalability culling info.

    • Performance for global and per-system performance info. This info can optionally be viewed in table or graph form.

Crash Fix:

  • The editor no longer crashes when you undo changes to a Niagara System after closing the Niagara Editor.

  • Fixed a crash occurring in the Niagara Camera Data Interface when transitioning between levels on a listen server.

  • Fixed for crash when priming Niagara Pools for Systems that needed to be recompiled.

  • Fixed several crashes with undo/redo of edits that cause the system to recompile.

  • Fixed an issue where making a user parameter from a Data Interface input would sometimes cause a crash.

Bug Fix:

  • Fixed an issue where Simulation Stage data interfaces wouldn't update the simulation until a full recompile.

  • Fixed an issue where renamed Static Switches on NiagaraScripts would not preserve the value correctly in existing content.

  • Fixed an issue where an emitter would incorrectly fail to compile if it had the same name as one of the modules it contained.

  • Niagara emitter parent to child merging will now display any issues encountered during the merge in a message on the emitter. Also, it more correctly handles Static Switch inputs.

  • Fixed an issue in Sequencer when using the Niagara System Lifecycle Track where the system would sometimes be missing from the first frame of the Sequence.

  • Applied a fixed for the forward renderer incorrectly premultiplying transparent surfaces by alpha.

  • Fixed an issue with emitter parent to child merging where a renderer would show that it had local changes in the child even though no changes were made.

  • Added a bias to SubUV calculations to avoid errors when 1/ImageCount loses numerical precision (most significantly when it's half precision on mobile platforms).

  • Fixed issue where spawning empty Niagara Systems would cause a memory leak.

  • Fixed an issue where the color picker would immediately close when making an edit to a Color Override parameter on a Niagara Component.

  • Fixed an issue where new user parameters wouldn't be visible in Niagara Components in the world in cases where the system was able to get the compilation data from the DDC.

  • Fixed issue with Niagara Debugger Loop Mode that prevented it working with burst systems correctly.

  • Fixed an issue where initial expanded state set in Details Customizations was ignored when an object was displayed in the Niagara selection stack. Also updated the initial collapsed state to more closely match the Details panel behavior.

  • Event writes from event handler scripts now throws a compile error instead of crashing. Also removing Niagara's own Event Generator modules from the menus for event handlers.



  • Implemented Absorption support for refractive Translucent Materials in the Path Tracer. The absorption color for solid glass Materials can now be configured with a "Absorption Medium Material Output" node in the Material graph. It defines the color change after traveling through 100 units (1 meter) of the Material.

  • Added a "Path Tracing Quality Switch" node that allows customizing a shader's behavior for path tracing without compromising or needing to set up separate Materials for the standard raster path and path tracing.

  • Fixed unnecessary invalidation of Virtual Shadow Maps for dynamic primitives that are culled in the shadow pass. Most relevant case is in editor with the "arrow" gizmos causing invalidations even though they do not cast shadows.

  • Adding Landscape support for Lumen Software Tracing and Voxel Tracing. The console variable r.LumenScene.Heightfield.Tracing (default=1) enables software heightfield tracing for Lumen detail traces.

  • Enabled Distance Field Ambient Occlusion on the Medium scalability level as a fallback from Lumen Global Illumination for games using fully dynamic lighting.

  • Lumen now supports Material Ambient Occlusion. When the variable r.GBufferDiffuseSampleOcclusion is disabled (default), Material Ambient Occlusion is passed through GBuffer.GBufferAO directly and applied to Lumen Global Illumination. When the project has r.GBufferDiffuseSampleOcclusion enabled, ambient occlusion is encoded into the DiffuseIndirectSampleOcclusion, which is the only path that supports Material Bent Normal.

  • Reflection captures are now supported in projects that have Allow Static Lighting disabled for the project. This allows them to be used on Medium scalability when Lumen Global Illumination is disabled. ReflectionEnvironmentAndSky is now run on Reflection Captures to apply Movable Skylight. Movable meshes and lights are now rendered into Reflection Captures.

  • Controllable Lumen settings have been added to the following:

    • Project Settings:

      • Ray Lighting Mode to set project-wide control for ray lighting quality.

    • Post Process Volume:

      • Lumen Scene Lighting to drive Radiosity gather quality.

      • Lumen Scene Detail that drives Lumen culling aggressiveness.

      • Lumen Scene View Distance to control the distance from the camera that Lumen Scene will be maintained.

      • Lumen Scene Lighting Update Speed that drives Radiosity gather convergence speed.

      • Final Gather Lighting Update Speed that drives Final Gather temporal accumulation speed.

      • Max Trace Distance that sets the distance that Lumen features will trace through the scene.

      • Ray Lighting Mode for local control for ray lighting quality.

    • Primitive Component

      • Emissive Light Source to provide a hint to Lumen that the mesh has an important lighting contribution and should not be culled.

  • Added Lumen scalability options to the existing Global Illumination and Reflections engine scalability options. Lumen GI and Reflections works on Epic and High settings only.

  • Lumen foliage over-occlusion was reduced by adding a Coverage channel to the Global Distance Field.

  • Lumen now supports the Two Sided Foliage shading model. Two Sided Foliage is treated like Subsurface, meaning there is no separate lighting gather on backfaces, and Subsurface Color is added to Diffuse Color. The Editor viewport shows a Scalability warning for anything other than Epic, whereas previously it was shown only for levels lower than Epic since Cinematic runs at a lower framerate.


  • Improved performance of the Path Tracer by implementing path compaction to keep GPU lanes more fully occupied as rays bounce around the scene. The idea here is to break up the bounce loop in the path tracer into independent launches so that active paths can be grouped together. This is done with wave ops plus atomics. This implementation renders scene with the path tracer up to two times faster in most scenes.

  • Improved shadow terminator of bump/normal mapped surfaces in the Path Tracer.

  • Improved path tracing denoising results behind sharp reflections and refractions.

  • Improved several self-intersection behaviors in the Path Tracer.

  • Reduced the likelihood of timeout detection and recovery (TDR) occurrences for the Path Tracer on Windows.

  • Raised the quality of Lumen Final Gather when in the Cinematic scalability level.

  • Improved Lumen Radiosity gather with spatial and temporal reuse.

Bug Fix:

  • Fix incorrect geometric normals on path-traced geometry with World Position Offset (WPO) Materials.

  • Fixed an issue where Material Instance changes were not causing path tracer to restart accumulation.

  • Fixed Foliage instances appearing single sided in ray tracing even when the Material is two sided.

  • IES Profiles light complexity now works correctly for lights.

  • Fixed Virtual Shadow Map invalidation issue with boxes parallel to light's near plane. This is most often encountered with Point Lights and axis-aligned boxes in the scene.

  • Fixed a bug to avoid constant path tracer invalidations when PostProcess or UI Materials are being changed as they cannot have an impact on the lighting calculations.

  • Fixed a bug that made the path tracer unable to be toggled through the show command in game viewports.

  • Fixed several virtual shadow map issues when using Large World Coordinates and scenes far from the origin.

  • Fixed a bug where light components fail to propagate certain property changes from Sequencer.

  • Path tracer updates now work over nDisplay and in the editor's picture-in-picture camera previews.

  • Using two sided subsurface Materials with opacity equal to 1 has a somewhat ambiguous physical meaning, so this ensures this is desired versus a lower opacity value. We normal opacity by clamping between classic and virtual shadow map paths. Opacity is clamped to a value slightly less than 1 which causes back faces of two side geometry to not be shadowed now consistently between the two paths.

  • Fixed issues relating to Volumetric Fog results in Reflection Captures not appearing correctly. Added a new console variable 'r.ReflectionCapture.EnableLightFunctions' that enables/disables light functions from appearing in reflection/sky light captures. Disabled by default.

  • Fixed missing light attenuation decoding on forward/mobile code paths, which resulted in incorrect shadows.


  • Changed the name of the Lumen Max Trace Distance console variable from r.Lumen.MaxTraceDistance to r.Lumen.MaxTraceDistanceScale.

  • Removed tiled deferred rendering path as it was superseded by the more general clustered deferred path. This change is prompted because features are increasingly being added to the clustered shading path, such as support for single pass evaluation of multiple lights with Virtual Shadow Maps. In the future the clustered shading path may be enabled by default (r.UseClusteredDeferredShading 1).

  • Removed Geometry Shader path for Point Light shadow rendering that disables Point Light shadows if Vertex Shader Layer is not supported (at runtime).



  • Implemented BxDF energy conservation for the Path Tracer.

  • Added UI for Custom Primitive Data on primitive components that shows each CPD's parameter name as defined in the Material, a color picker (if a vector parameter), warnings for mismatched parameter names, soft warning for undeclared parameters, and a hyperlink that takes user to the owning node in the Material Editor when the parameter name is clicked.

  • Added Blueprint methods for setting scalar and vector values by parameter name on Custom Primitive Data (CPD) and "get index for scalar/vector parameter name" methods. Will prioritize CPD index based on first parameter name found on assigned Material. This makes it conceptually easier for developers to assign CPD values to components like they would a normal Material parameter, but with all of the benefits of CPDs.

  • When the On-Demand Shader Compilation (ODSC) system is processing shader compile results on target, the render state for primitives needs to be recreated to ensure it updates draw commands, which are caching uniform buffers. It also needs to ensure systems which cache data regenerate their results (for example, Lumen). This negatively impacts performance when processing results, but it is necessary work.

  • Added Blueprint-callable functions to Material Parameter Collections to get Scalar and Vector parameter names, get and set default values, and convenience methods to Material Parameter Collection to get parameter indexes by Name.

  • The console variable r.vt.FeedbackFactor that is used to control the size of the VT feedback buffer can now be changed at runtime, no longer requiring restart or shader recompile to happen.

  • Text Render Components now allow use of Decal Materials.

  • Added a Runtime Virtual Texture Sample mip mode that ignores the World Position input in a Material. It calculates the mip based on derivatives of actual world position instead, and gives the same result as 'Default' when no World Position input is used. The use case for this mip mode is when a constant value is being piped into WorldPostion, that happens for things like picking a constant color from an RVT for grass. Without the new mip mode, the engine always computes a mip value of 0 which can be very heavy on the physical texture pool.

  • Added support for setting Runtime Virtual Texture parameters from Blueprint for both Dynamic Material Instances at runtime and Material Instances in editor Blueprint.

  • Static terrain layer weights are no longer treated as Material parameters. They are automatically assigned from The Landscape Component's "Get Combination Material" function, but after that there's no reason for any kind of Material parameter tracking/processing on them. This removes a bunch of code and simplifies/speeds up some logic.

  • The way Material Layer parameters are processed was updated:

    • Previously, parent Material Instances would attempt to remap layer indices, and cache the updated parameters in the derived-material instance's cached data. This worked to some degree but did not cover all cases. Now Material instance overrides are never cached and instead each instance maintains a table to remap layer indices for its parent. This remapping occurs on parameter lookup.

    • Previously, enabling Material Layers sent runtime parameter queries down a slow path, since the default parameter values stored on the shader map were not reliable. This issue has been resolved. When compiling a Material, the default value from the Material Expression is not automatically used any longer. Instead, the current Material Function (which may be a Blend Instance, Layer Instance, or regular Function Instance) is given the chance to override the parameter value. This way, the "correct" default value is now baked into the compiled output. Special code for checking default parameters is no longer required at runtime, which should remove the previous performance tax from using Material Layers.

  • Extended Material Parameter Metadata with Group, SortPriority, and Description. Cache this data inside FMaterialCachedData. UMaterialInterface methods to query this data become non-virtual, instead it's just returned along with other Metadata when accessing the parameter value. The parameter group caching mechanism inside PreviewMaterial.cpp has been removed, it is no longer needed since group lookup now comes "for free" along with other relevant parameter data.

  • Material layer "stacks" (FMaterialLayersFunctions) are no longer considered static Material parameters. APIs/data is changed to reflect the fact that a given UMaterial(Instance) can only have a single layer stack (or no layer stack). This removes some usage of slow/legacy APIs, which should help speed up editor/cooker performance (some additional changes/refactors are likely needed to fully take advantage of this). Lastly, layer stacks as parameters is legacy technical debt from an early iteration of the Material Layer system that did support multiple stacks.

  • Refactored and cleaned up Material Parameters with the primary goal being to reduce the amount of code duplicated across different parameter types, and reduce the amount of boilerplate required to add new parameters. There are new types FMaterialParameterValue, and FMaterialParameterMetadata (both in MaterialTypes.h).

    • FMaterialParameterValue contains a value, along with various editor-only fields that describe how that value is being used. Using this new type, many places that previously included separate APIs for each parameter type collapse to a single API that operates on FMaterialParamterValue/FMaterialParameterMetadata.

    • Code that previously had a black copy/pasted for each parameter type can be replaced with a loop that iterates over all parameter types.

    • This change also includes some API cleanup that should improve editor performance. Previously, the APIs had GetAllScalarParameters, GetALLVectorParameters, and similar others which would return a list of FMaterialParameterInfos for each one of the given type. Code would often query all parameters, then loop over the results and look up each parameter value. Now, with the new API, GetAllParametersOfType returns a list of all FMaterialParameterMetadata of a given type and collects the values at the time the list of parameters is being built. This saves the work of looking up each value individually.


  • Move Material Layer names to FMaterialExpressionCacheData which optimizes accessing layer names (remove previous ad hoc caching scheme), and should allow layer names to be properly stored for Material Layers as well.

Bug Fix:

  • Fixed an issue where landscape and water meshes would not update after forcing an update to them. With on demand shader compilation enabled, there are some scenarios where you do not want to rely on rendering to inform you of what shaders need to be compiled. Specifically scenarios where Materials are used to generate content, such as landscape brushes, thumbnails, scene captures and so on. In these situations, the engine should explicitly compile all shaders and call SubmitCompileJobs which is a straightforward way of compiling missing shaders from a map. Note that FMaterial::CacheShaders does not support this behavior and is too risky to change. Also, SubmiteCompileJobs supports being called multiple times and will not re-compile more shaders.

  • MipLevel sample mode now works when sampling an Adaptive Virtual Texture.

  • Fixed Virtual Height Field Mesh disappearing when used with a Material using Translucent or SingleLayerWater.

  • Fixed interaction between Material Layers and Material Quality Level Switches.

  • Material Instances with layers don't generate their own shaders, unless their layers are different from the parent Material.

  • Resolved an issue where Material Dot expressions allow mixing inputs with different numbers of components.

  • Resolved an issue preventing Material Function Instances from correctly handling parameter overrides when the Material Function INstance has another function instance for a parent.

  • Material autogen derivative code matches coercion logic of legacy code for min/max operations.

  • Fixed "Get All Parameters of Type" so that less-derived instances don't override parameter values in more-derived instances.

  • Ensure Material curve parameters caches the correct value (index of the curve in the atlas), which may not be correctly reflected in the expression's Default Value.

  • Removed a check function for input type to Material CrossProduct (Cross), allowing casting any input type to float3, so that it matches legacy behavior.

  • Resolved an issue where Material Instance parameter overrides are supposed to be ignored for nullptr textures.

  • Material Power expressions result type is driven by left-hand-side input only.

  • The Material transform expression is supposed to accept a scalar input value when input is tangent space. This was changed to accept both MCT_Float and MCT_Float1, rather than just MCT_Float1. Most places that generate scalar values use the MCT_Float type.


  • Removed the dipole parameterization for Separable SSS in Subsurface Profile. All separable SSS parameters are automatically upgraded to Burley. Add Tint to Burley's profile (the same to the original Subsurface Color). It introduces the capability to add non-physically-based rendering into an SSS profile. You can stay within the bounds of physically based rendering by using the default value (white).

Mobile Rendering


  • The mobile deferred and forward lighting calculations are now unified.

  • Added an option to use high quality BRDF on mobile, same as with PC.

  • If a light shading model is not supported on mobile, it will now fall back to the default light shading model.

  • Use EnvBrdf for mobile deferring lighting pass.

  • Mobile now supports the Subsurface and PreIntegrated Skin shading models. Subsurface Profile shading on mobile uses preintegral burley diffusion on ring, just like the PreIntegrated Skin but could be generated at runtime based on Burley inputs.

  • Vulkan now uses G8 format for mobile Ground Truth Ambient Occlusion (GTAO). Enabled mobile AO and PPR on high-end mobile devices.

  • Added support for Mobile Deferred Rendering mode on Android OpenGL ES.

  • Integrated Signed Distance Fields to Mobile Deferred Renderer.

  • Added GL_MAX_TEXTURE_BUFFER_SIZE to OpenGLES.h to not depend on the extension GL_MAX_TEXTURE_BUFFER_SIZE_EXT.

  • The variable r.MobileNumDynamicPointLights is now read from the platform .ini file instead of from the project console variable. The console variable r.MobileNumDynamicPointLights was added to the shader keystring.

  • Disabled Parallel RDG for Mobile Platforms from the RenderGraph.

  • Hair Materials now directly use the Hair Shading Model instead of doing so with a FeatureLevelSwitchExpression, improving hair Shading Model support on mobile.

  • Added support for a Skin Cache on mobile platforms.

  • Set Fast Approximate Anti-Aliasing (FXAA) quality to 0 on mobile platforms by default.

  • Added an option for projects to disable support for per-pixel Material shading models on mobile platforms. Use the console variable r.Mobile.AllowPerPixelShadingModels=0.

  • Account for Reflection Capture influence radius when finding closest capture for an object. Fallback to skylight reflection when there are no influencing Reflection Captures on mobile platforms.

  • Removed perspective correct shadow depth shader permutation when its not required on mobile platforms


  • Removed NoLightMap shader permutation for Materials that are not using it on mobile platforms.

Crash Fix:

  • Fixed a crash on mobile while rendering custom depth primitives that require scene texture access.

Bug Fix:

  • Fixed an issue where the brightness of the Reflection Captures couldn't be changed at runtime on mobile.

  • Fixed the specular artifacts that would occur on Snapdragon 845 devices.

  • Disabled mobile MSAA if DepthFullPrepass is enabled.

  • Fixed an issue where depth was not stored with fullprepass enabled.

  • Fixed an issue with incorrect depth stencil access flag in mobile multi-view rendering.

  • Integrated mobile Static Lighting when Distance Fields are enabled.

  • Enqueue FrameSyncEvent ReleaseResource on the Render Thread when in the RHI thread in OpenGLViewport.

  • Resolved a Depth issue with Editor Primitives in Mobile Preview.

  • Implemented a Binary Cache fix for the Compute shader and fixed calculation of ShaderLib Processing time.

  • Fixed a bug that caused Editor to stall in the Material Editor while in Mobile Preview.

  • Fixed Custom Stencil and Depth on mobile by making them not always memoryless. This changes the logic back to the way it was implemented in SceneRenderTargets.

  • Resolve issues with texture mip generation at runtime on Android devices running Vulkan.

  • Resolved an issue preventing PerlinNoise3D texture from correctly initializing on mobile platforms.

  • Allow access to CustomDepth and CustomStencil textures in Decal Materials for mobile platforms.


  • Removed IsMobileDistanceFieldShadowingEnabled.

  • Removed the shader define MOBILE_PROPAGATE_ALPHA, and temporarily removed premultiply alpha. FXAA luminance calculation was moved from the tonemapper to FXAA when MobilePropagateAlpha is enabled.

  • Removed the OpacitySceneCapturePass from MobileSceneCapture since Depth is now stored in a different Render target. Moved everything to the shared SceneCaptureRendering file and removed MobileSceneCapture.usf.



  • Moved all Nanite defines shared between C++ and shaders into a common header file, removing all the "keep this define in sync with this file" cases all over the code. This makes the code a lot more maintainable. Common definitions now have a NANITE_ prefix to disambiguate global symbols.

  • Changed the name of the Nanite Proxy mesh to Nanite Fallback mesh. Fallback settings are now largely error based with a new property FallbackRelativeError. Nanite builder now provides the LOD fallbacks for all auto-generated LOD levels, which is far faster than generating them from scratch.

  • Added KeepTrianglePercent and TrimRelativeError properties to the Nanite static mesh settings. These properties trim detail from the Nanite data that is stored to disk, and can be used to optimize disk size after import. This is useful toward the end of production.


  • Optimized Nanite by streaming directly from DDC when running in editor, which eliminates the need for memory copy.

  • Optimized Nanite with several minor changes that result in 10-20% faster Nanite rasterization and culling.

Crash Fix:

  • Fixed a crash when importing a Nanite mesh with texture coordinates that are unreasonably large or contain floating point specials.

  • Fixed a crash that would happen when importing flat Nanite meshes.

Bug Fix:

  • Fixed an issue where Materials with pixel depth offset would cause severe visual artifacts when applied to Nanite meshes.

  • Fixed a bug where Nanite streaming would sometimes fail to settle on nDisplay setups.

  • Fixed edge artifacts when using lightmaps, shadow mask, or ambient occlusion with Nanite meshes.



  • BlueNoise texture is loaded on demand, which saves around 2.6MB when not running with Lumen Reflection or Lumen GI.

  • Moved InstanceUpdateCmdBuffer from UPrimitiveComponent to UInstancedStaticMeshComponent. It is only used by the derived class so this code is safe. It saves 48-bytes (40-bytes from the removed member and 8-bytes of padding).

  • On Demand Shader Compilation (ODSC) - Only compile shaders that are used to draw instead of compiling every shader in each Material's shader map on PostLoad. This is an experimental feature that is still being developed. This change ensures the editor only compiles shaders it needs to render, resulting in approximately 60% less shaders being compiled and faster start-up times for the editor when opening maps.

    • This feature is disabled by default. Enable it with r.ShaderCompiler/JobCacheDDC 1.

  • Added a new transient allocator implementation supporting PC and consoles with Render Dependency Graph (RDG) integration.

  • Added parallel recording of Render Dependency Graph (RDG) pass execution onto command lists.

  • Enabled Vulkan fragment shading rate functionality when supported.

  • Added an option to render Distance Field Shadows using async compute. This also fixes an issue where a ray traced distance field Projected Shadow Info is rendered for all views instead of just its dependent view.

  • Added a NoRef Streaming LOD Bias setting for Static and Skeletal Meshes, which is a LOD bias that is only applied when a mesh doesn't have any component reference. The default value is -1, which means it uses the value of "r.Streaming.DefaultNoRefLODBias." When the console variable is greater than or equal to 0, then the specified value is used. The setting is implemented as a per-quality level variable so that users can specify different values for different quality levels. Quality levels can be selected by using the console variable "r.Streaming.NoRefLODBiasQualityLevel" under the ViewSitanceQuality sections in platform scalability configuration (*.ini) files.

  • Added attachment variable rate shading (VRS) for Vulkan. It goes through all required stage flags, access masks, layouts, renderpass attachments, and so on for the VK_KHR_fragment_shading_rate extension. The logic used to gather VRS properties (tile size, data type/format) have been fixed up. Also, a templated version of VkFragmentShadingRateAttachmentInfo is attached to renderpasses where supported and when attachment is provided.

  • Added the ability for UAVs to be mergeable between AsyncCompute and Graphics pipelines to allow compute shader overlap between them.


  • All DebugViewMode shaders have moved into a single shader, DebugViewModePixelShader.usf, and are dynamically picked based on a uniform. If you've added your own debug shaders or have modified one of the existing debug viewmode shaders, you will need to make similar changes to the DebugViewModePixelShader.usf file.

    • Removes FComplexityAccumulatePS, FLODColorationPS, FRequiredTextureResolutionPS, FMeshTexCoordSizeAccuracyPS, FPrimitiveDistanceAccuracyPS, FMaterialTexCoordScalePS

    • All shader code is now contained in DebugViewmodePixelShader.usf. Individual visualizations are contained within separate functions.

    • All the C++ interface code has now been folded into a single implementation.

    • Previously each implementation kept track of its name, and whether it needed local VF, if it needed Material properties and needed instruction count. Since every implementation is in the same shader we need all those features. To simplify the code all this has been removed.

    • We only keep track of a single FDebugViewModeInterface singleton to use for all debug modes.

  • Implemented D3D12 Shader improvements.

    • Duplicate D3D12 shader data and runtime code was consolidated to help with maintenance.

    • Platform specific code and data was reorganized to reduce overhead on platforms that didn't need it.

    • Moved FShaderCodeFeatures booleans into the bit flags EShaderCodeFeatures and added more D3D12 feature flags.

Bug Fix:

  • Fixed D3D11 hitches caused by unpaged memory returned from the Map. This was solved by having UnifiedBuffer create brand new resources instead of updating existing ones.

  • Fixed longstanding excessive stalls on RenderThread where the RHI thread would not yield fast enough on Windows.


  • Added a new console variable r.VelocityOutputPass to replace r.BasePassOutputsVelocity. If you were using r.BasePassOutputsVelocity=0, the equivalent setting is r.VelocityOutputPass=1. In both cases, it is recommended to use a r.VelocityOutputPass=0 and only revert to the old behavior if you encounter issues.


  • Removed deprecated "Set Shading Rate Image" functions that were marked as deprecated in Unreal Engine 4.27.



  • Improvements to eye adaptation (auto exposure) readback that cause it to always readback the most recent available exposure value and use a variable number of readback resources to prevent overwriting inflight requests.

Bug Fix:

  • Fixed an issue with the post processing sequence of the after-pass system to allow chaining multiple passes in the same location.

  • HighlightsMin values greater than 1.0 are now allowed by the Editor. A new parameter was added called HighlightsMax, which helps define the transition region from Midtones to Highlights in a way that allows high brightness pixels (>1) to be considered Highlights.

  • Fixed an issue causing the Auto Exposure toggle in Project Settings not to work.


Crash Fix:

  • GPU Lightmass no longer crashes when debug mode is enabled.



  • Added different clock sources when recording with Take Recorder, including specifying the default Recording Clock Source in the Project Settings.

  • Added command to snap sections within the Sequencer timeline according to their TimecodeSource property.

  • TimecodeSource will now be set when creating new skeletal animation sections in Sequencer with custom timecode bone attributes.

  • Clicking or dragging MMB in the Sequencer timeline will move the Playhead to that time but not evaluate Sequencer, allowing you to key the current state at that new time.

  • Added command when right-clicking on Control Rig sections for collapsing/baking all sections to a base section.

  • Added command when right-clicking on on additive Control Rig sections where you can set Zero or One keys or weights.

  • Subsequences and skeletal animation tracks now use the desired frame display format and zero padding from the sequencer settings.

  • Basic setting classes can now be created in Blueprints by inheriting from MoviePipelineSetting_BlueprintBase. This allows for creating custom properties that will be visible in the job configuration and can be fetched in a custom burn in.

  • UMovieSceneSequencePlayer::PlayTo API now supports inclusive or exclusive time to be specified.

  • MoviePipeline: Added DWAA and DWAB compression methods for multi-layer-enabled EXR's.

  • Added Remove Root Option to Take Recorder settings so that you can specify whether to include root motion in the sequence when recording.

  • Added support for {project_dir} as a Movie Render Queue format string so that export paths can be made relative to the project instead of the engine.

  • Added an experimental panoramic capture Render Pass to Movie Render Queue which should support temporal sub-sampling. This is enabled from the Movie Render Queue Additional Passes plugin.


  • TimecodeSource in Take Recorder is now better handled to prevent inconsistent Timecode values when recording and processing different Takes.

  • Moved TimecodeSource property from UMovieScene to now be stored on UMovieSceneSections.

  • The FMovieSceneTimecodeSource struct is now defined in MovieSceneSection.h instead of MovieScene.h.

  • Movie Render Queue now produces a warning when the Override Frames setting is used to create a zero length range, such as [0, 0].

  • Matinee actors upgraded to Level Sequences will have their sections set to 'Keep State' to more closely match original Matinee playback.

Bug Fix:

  • Fixed an issue with Sync Sections using Source Timecode so that trimming and other edits are now accounted for.

  • Restore State now correctly works for Control Rig sections and tracks.

  • Fixed a scenario where Movie Render Queue would fail to detect shots when a Subsequence had a start offset that pushed the evaluation range completely outside of the original playback bounds.

  • Fixed an issue in UMovieSceneSequencePlayer::PlayTo which caused events and other setup from frames after the current time to be triggered during low framerate situations.

  • Fixed Movie Render Queue's png output from having a speckled alpha channel caused by image quantization.

  • Updated Movie Render Queue example python scripts to use UMoviePipelineQueueSubsystem so that Sequencer's 'Auto-bind to PIE' setting does not cause duplicate objects while rendering.

  • Fixed several instances where auto tangents were not being set correctly in the Curve Editor.

  • Fixed FIntermediateColor not converting correctly from FColor.

  • Movie Render Queue's Job Author field can now be left blank and it will default at runtime to the local user name. This fixes an issue where loading a queue saved by another user would use the previous user name as author, and not the user who was actually running the job.

  • Fixed {shot_name} or {camera_name} format strings resolving into an incorrect folder name when clicking the hyperlink in the Output column.


  • The Motion Trail plugin has been replaced by the new Motion Trail Control Rig plugin.



  • Added support for UObject scopes to be reported to Unreal Insights when namedevents are enabled.

  • Added a CsvCategory command in the engine that provides the capability to change the active CSV categories. The syntax to use it is CsvCategory <CategoryName> [Enable/Disable] (toggles if the second argument is omitted).

  • Created new WorldPartitionRenameDuplicateBuilder class that provides capability to Rename or Duplicate a WorldPartition map without loading it all at once.

  • Created a new WorldPartition: Foliage builder class that provides the capability to change grid size.

  • Replace References can now consolidate different subclasses of a UPhysicalMaterial together.

  • Added a "minimum" formula to summary stats, to use for shared memory.

  • Introduced Screen Reader and Slate Screen Reader plugins to Win64, Mac, Linux, IOS, Android, PS4, PS5, XboxOne, XboxSeriesX, WinGDK and Switch platforms.

  • These plugins provide developers with C++ and Blueprint tools to provide blind end-users an accessible means of navigating around UI elements. These plugins can be used to comply with CVAA requirements. This feature is still experimental.

  • Added DeveloperSettingsBackedByCVars as a base class for developer settings which contain one or more variables with ConsoleVariable metadata.

  • Output log category improvements. You can now choose to color-code entire log lines by category, or just by the category itself (located in the CategoryColorizationMode in the editor appearance settings). You can choose to highlight all messages for a particular category by right-clicking on a line.


  • Updated the Server CSV ReportTypes with improved categories and colorization.



  • Updated VSIX for 1.62.

  • Implemented a RunningDocumentTable and created an onSave callback to cover all edit/save operations.

  • Updated new version 1.62 of assembly info.

  • Added a new annotate command.

  • Enabled warnings as errors.

  • Added further hooks for operations that require a checkout before being saved.

  • Added a UBT menu add CompileSingleFile and PreprocessSingleFile.

  • Converted the ReconcileExtensions function to use local paths.

  • Added option to allow async checkout.

  • Added UpdateInstructions command for future engineers.

  • Added library to respond to C# feedback.

  • Added functionality to the PreprocessOnly to publish the output file path to the log used by unrealVS.


  • Improved coding guidelines and fixed Diff titles.


  • Moved CompileSingleFile back into the stub menu allowing UnrealVS.CompileSingleFile. Added all other commands into the same stub which provides a simple commandline/binding mechanism.

Bug Fix:

  • Resolved a bug that occurred when running many commands at once.

  • Resolved issue where Checkout on Edit was not honoring the user option.



  • SlateInsights now shows SWidget::Paint events.

  • Added the LayerId to the WidgetReflector.

  • Added a context menu in Slate Insights to search for the selected widget. This provides information about the lifetime of the widget.

  • Added a menu in the WidgetReflector to display the different runtime validation test.

  • Added a menu with timing for each SWidget update to SlateInsights.

Bug Fix:

  • Added null check for Game Viewport in FCommonAnalogCursor::HideCursor.

  • Removed an ensure in MarkPartyMemberAsDirty as it is valid to have a nullptr SocialUser in the event that the local user is logged out. When logging out of an account, the SocialToolkit clears the 'UsersBySubsystemIds' map which is used to find users with FUniqueNetIdRepl.

  • Fixed the settings of SColorPicker.



  • Add test to see if widgets have a valid LayerId. You can enable this with Slate.VerifyWidgetLayerId.

  • Added a W component to SVectorInputBox.

  • Upgraded some SWidgets to use TSlateAttribute (SExpanderArrow).

  • Upgraded some SWidgets to use TSlateAttribute (SExpandableButton, SFxWidget, SRadialBox, SSafeZone, SSplitter, SUniformGridPanel, SUniformWrapPanel).

  • Added the 'Source' name to the tooltip in the Widget Inspector, as the tooltip often covers up the source name.

Crash Fix:

  • Fixed a crash related to text glyphs accessing invalid memory.

Bug Fix:

  • Fixed unused SLATE_ATTRIBUTE arguments:

    • STextEntryPopup

    • SSuggestionTextBox

  • Previously, right-clicking outside of the current selection in editable text boxes would fail to update visuals, so menu options would appear broken or disabled. This issue is resolved by deselecting the text box and moving the cursor to the right-click location. This matches the behavior of text boxes in other environments.

  • Fixed a division by 0 error in UniformWrapPanel layout code.

  • Previously log colors such as Log Highlight, Log Text, and Log Command would not be available to programs other than the Editor. These are now available.

  • Fixed the Overlay ZOrder and ConstraintCanvas ZOrder in invalidation. The child widgets' order needs to match the order they are painted in for the Global Invalidation to work.

  • Fixed SWidgets that were not incrementing their LayerId correctly.

  • Fixed all mouse inputs being offset when fullscreen at resolutions that were not the same ratio as the native screen resolution.

  • Removed unnecessary error warning firing when dragging in widget archetypes derived from C++ UserWidgets. Warning no longer relevant with changes to widget template generation.

  • Fixed issues with scrollbox padding not applying if padding was less than width of scrollbox.

  • Added additional glyph logging. Speculative fix skip glyph if invalid or not visible.

  • Fixed 5.0 regression where transparent buttons got UI borders where they were not present before.

  • Fixed SSugestionBox failing to update with newly entered text properly.

  • Fix SSuggestionTextBox not closing the suggestion list when the user clicks outside it.

  • Fixed an issue where tall menus would jitter at certain applications' scales.

  • Fixed an issue where menus would flash white briefly at certain resolutions / applications scales.



  • Added a function to change keyboard type: UEditableText::SetKeyboardType.

  • Added bCurrentlySwitching variable and const getter to UCommonAnimatedSwitcher.

  • Added DisableNativeTick metadata to UCommonActivatableWidget.

  • Exposed the Slate overflow policy to UMG RichTextBlock

  • Enabled Widget Library by default. Fix widget library locking up when scrolling edge is just before a new asset view.

  • Added CommonUI functionality to better support blueprint-only workflows.

  • Added functions to bind visibility to widget activation. This exposes GetFocusTarget on activatable widgets to Blueprint.

  • *Bug Fix:** Fixed warning when using default back actions. Since we no longer use CommonActivatablePanel.

  • Added Animation drawer to UMG editor. This can be opened from the hotkey Ctrl+Shift+SpaceBar.

  • Implemented GetOptions restrictions for gamepads.

  • Added ability to select CommonUI gamepads via dropdown.

  • Added limited support for gamepad type autodetection based on any active FInputDeviceScope

  • Allow Selection of base class for Widget Blueprint.

  • Fixed Common button group disabling buttons unnecessarily.

  • Removed CommonUI widget samples in favor of content examples.

  • Added GetChecked and HasVisibilityTag helpers to UCommonUIVisibilitySubsystem.


  • Added URichTextBlock::RefreshTextLayout method to support refreshing text layout on demand.

  • When creating a new WidgetBlueprint, it will no longer add a Canvas Widget at the root of the Hierarchy and let the user choose to add one instead.

Common UI

  • Added limited support for gamepad type auto-detection based on any active FInputDeviceScope. You can define the detection criteria in gamepad assets. This is limited because XInput can't distinguish between different controller types (other plugin sources will still work), so to preserve the ability to set a preference in Project Settings, the logic prefers to stick with an existing match rather than switching to something else. Otherwise it will prefer the first match found in the controller asset list.


  • Added a Wrap Widget operation in the Hierarchy to support wrapping multiple widgets at the same time. When selecting widgets that are not all in the same branch of the tree, each group of widgets in a specific branch will be wrapped in a different wrapper Widget.

  • You can now use keyboard arrow keys to move Widgets that are in a Widget Panel, such as Horizontal Boxes, Vertical Boxes, and Grids. For example a user can select an element in a Grid and move it to another cell in the specified direction in the Grid.

Common UI

  • Reworked and re-named hardware features into platform traits. This consists of the following changes:

    • Changed various references from Hardware Featureto Platform Traits. This includes the tag namespace, which is now "Platform.Trait."

    • Added the ability for games to enable or suppress tags debug globally using SetDebugVisibilityConditions.

    • The PlatformHardwareFeatures setting is now called PlatformTraits. It is an array of tags instead of a tag container to allow for .ini inheritance to work, which doesn't work correctly in the current config hierarchy editor. This will be improved in a future release.


  • Added UAssetActionUtility to Picker Common Classes.

Crash Fix:

  • Fixed 5.0 regression where drag drops in the UMG hierarchy would result in a crash.

  • Fixed a crash that can happen when an Editor Utility Widget asset is deleted while it is in use.

Bug Fix:

  • Implemented a fail-safe check in DynamicEntryBoxBas::AddEntryChild.

  • Fixed missing add keyframe button that was missing in the UMG editor.

  • Fixed widget spinboxes font foreground color.

Common UI

  • When you re-name a widget in UMG Designer, you can now change from a generated name back to its original name.

  • Previously, UMG could make all widgets in a Widget blueprint invalid when using undo on a Replace Child operation. This issue has been fixed.

  • You can now select Abstract Classes as a base for a UserWidget.

  • Fixed an issue in EditorUtilityWidgetBlueprint that prevented the World from being marked dirty when opening or changing a property on the EditorUtilityWidget object.

  • Fixed crash when calling Add Item on a List View in PreConstruct of an Editor Utility Widget. UListView doesn't support duplicate or null items, and adding either causes a crash. We now report a warning and stop the erroneous input from crashing.

  • Fixed regression that caused animations to be re-evaluated for widgets that were not ticked.

  • Fixed issue where editor utility widget style changes would not save correctly.

Virtual Production


  • Added a Tools menu to Switchboard which has shortcuts to launch Unreal Insights and a local Switchboard Listener.

  • Created the CVAR nDisplay.render.show.visualizationcomponents for toggling the visibility of visualization components in nDisplay renders.

  • Provided a CVAR Preset for CVARs used commonly on Virtual Production stages by stage operators.

  • OpenColorIO in Unreal Engine now has in-editor support for Mac and Linux.

  • When capturing traces, Switchboard automatically enables vblank monitoring, which adds vblank bookmarks to traces for nDisplay. You can also enable this functionality for traces with bookmarks captured outside of Switchboard with the CVAR nDisplay.sync.diag.VBlankMonitoring.

  • Updated the OpenColorIO library to version 2.1.

  • Added an option in Switchboard to disable handling ensures in nDisplay. Ensures are non-fatal but when they happen it can cause hitches and issues during a shoot. We are now disabling them by default, but you can choose to enable them for debugging purposes.

  • You can override the render sync policy of an nDisplay cluster in Switchboard now. There is also an option to use the sync policy specified in the nDisplay config file, so you can use custom sync policies.

  • Added option to rebind all properties exposed to Remote Control Preset for an Actor.

  • Added option to rebind a property exposed to Remote Control Preset on a different Component.

  • Stage Monitor now has an activity filter for max age.

  • Stage Monitor settings, such as filters, are now saved.

  • Made Text3D more accessible to Blueprints by allowing access to underlying kerning and mesh components and removing the final keyword from public headers.

  • Moved OpenCV library and helper module into its own plugin.

  • Added Provider Role filtering to Stage Monitor activities.

  • Updated OpenCV library to version 4.5.5.

  • Added option to export a ULensFile Asset to a .ulens file so you can use your created ULensFiles in other projects.

  • The OpenCV library now supports Linux.

  • Added Live Link transaction filter for improved Multi-User setup workflow.

  • You can now optionally set the image dimensions for a LensData Asset. Note that these are not essential for current virtual production workflows.

  • Live Link VCAM iOS app now supports multitouch. Users can operate multiple elements on the Remote Session at the same time.

  • The Level Snapshots plugin content now includes default Level Snapshot Blueprint Filters.

  • UDP and TCP messaging now support hostnames in addition to IP addresses.

  • Main Switchboard UI now has start and stop controls for the Multi-User Server.

  • You can now transact the metadata for Takes over Multi-User.

  • Added a quick access setting to Switchboard so you can configure Unreal Insights and enable captures.

  • You can now quickly increment the Multi-User Session Name from the Switchboard UI.

  • Level Snapshots now support subobjects.

  • Switchboard Listener now has Unreal Insights tracing.

  • You can now override the Switchboard Listener inactive timeout value, which defaults to five seconds.

  • Added hitch detection and logging to both Switchboard and Switchboard Listener.

  • Switchboard Listener now integrates with Unreal's standard crash logging and reporting facilities.

  • Incremented Switchboard Listener version to 2.0.0 for Unreal Engine 5.

  • Switchboard now includes a cross-platform setup script, sb_setup.py. This unifies the Switchboard installation process for different host operating systems, and includes functionality for detecting and repairing a corrupt Switchboard Python virtual environment.

  • Switchboard now works on Linux.

  • Switchboard now uses a higher port number that does not require root privileges for its internal rsync server by default.

  • Rebroadcast Subject is set to true by default for Live Link XR Subjects.

  • The Subject Representation for LiveLinkComponentController now has a Blueprint getter and setter.

  • The Subject Representation for LiveLinkComponentController now emits a Blueprint event when the component's controller map changes.

  • You can now sort by the provider column in Stage Monitor.

  • Added vertical bars to the buffer visualization in Timed Data Monitor to show the location of each frame in a subject's frame buffer.

  • Removed the Save Lens Information button from the Lens Info step of the Lens File Editor. Any changes to Lens Info are saved automatically now.

  • Updated MessageBus protocol and CBor serialization backend to support communication between Large World Coordinates (LWC) and non-LWC endpoints. Previous protocol versions in Unreal Engine 4 are assumed to be non-LWC.

  • Created the CVAR LiveLink.Component.EnableLiveLinkEvaluation to specify whether all Live Link Components should evaluate their Subject.


  • Remote Control Presets detect changes to exposed properties modified by Blueprint calls, and can now include changes to the root component.

  • Asset searches from the Remote Control Web API now use Blueprint native class filters.

  • Machine names are now used for sorting after the source names are sorted to create a stable Live Link source list.

  • Exposing something to the Remote Control Preset is now logged.

  • You can now control Reflect Editor Level Visibility in Game from Switchboard and the Unreal Editor.

  • Improved first-time setup of the Switchboard dependencies, as well as creation of desktop and start menu shortcuts for both Switchboard and Switchboard Listener.

  • Improved smooth evaluation with Engine Time for Live Link Sources by adding a timing offset to avoid jitter-related buffer overflows.

  • Fixed the squishing of UI elements in the LensFile Editor by adding scroll boxes to multiple panels.

Crash Fix:

  • The Editor no longer crashes when you change the map while the Remote Control Web Application is connected.

  • Fixed a crash that occurs while resolving binding when a world can't be found.

  • Fixed a crash that occurs when changing editor layout while a Remote Control Preset is open.

  • VPFullScreenWidget in the VirtualProductionUtilities plugin no longer crashes when loading a new level.

  • Fixed a crash that could occur if garbage collection started while recording a Cine Camera with a Live Link Camera Controller in TakeRecorder.

Bug Fix:

  • Fixed stale OpenColorIO color space and preset selection after the underlying configuration changes.

  • The Stage Monitor role constraint is now only verified for auto starting the monitor. If your Unreal Editor doesn't have an allowed role, you can still start monitoring manually from the UI.

  • Assets no longer have to be loaded in the Unreal Editor before you can use them in the Remote Control Web Application.

  • Previously, timecode and timespan conversions were rounding the framerate in a non-drop timecode format. There's no need to make a distinction so the framerate is now used as is.

  • The selected group in the Remote Control Preset is now correctly highlighted.

  • Fixed reset to default not working on properties that didn't exist on a Class Default Object.

  • Remote Control works on Mac now because the WebSocket receive buffer size is reduced if the platform is not Windows.

  • Disabled Live Link Component from ticking in Editor Previews, such as in the Blueprint Editor, by default to avoid breaking the root component.

  • The Live Link Remove All Subjects option is now added back to the Virtual Subject context menu.

  • The default Live Link Preset will now be applied on launch.

  • Fixed inconsistencies with Remote Control rebinding where the incorrect Actor was associated with the properties being rebound.

  • Fixed Remote Control bindings getting invalidated when changing sublevels.

  • Live Link rebroadcaster is now removed when there are no more Live Link Subjects.

  • Fixed unresponsive touch controls for the Animation Preview in the VCam UI.

  • You can now filter assets by the Img Media Source type in the Content Browser.

  • Transactions over Multi-User are now delayed until after you finish editing a text field.

  • When creating sublevels for a persistent level during a Multi-User Session, the sublevels are now correctly named and referenced in the Levels window. This fixes the cases where the levels wouldn't save their content properly.

  • Fixed a logic error in Switchboard's ListenerClient class that would lead to keepalives being sent at more than 10 Hz rather than the intended 1 Hz.

  • Switchboard Listener handles non null-terminated buffers better while attempting UTF8_TO_TCHAR conversion and logging them.

  • The Recipient field for Switchboard Listener's PresentMon process is now initialized, which prevents log warnings of the form "Trying to send message to disconnected client" (endpoint = 0xCDCDCDCD)".

  • Fixed a race condition related to launching short-lived processes through Switchboard Listener.

  • In Switchboard, fixed outdated references to the UE4Editor.

  • Updated the path to UnrealBuildTool in Switchboard.

  • When running the Unreal Editor with Vulkan, nodal offset calibration no longer produces NANs for the camera pose.

  • Switchboard now queries device host platform when initiating build actions, rather than assuming all devices are Win64.

  • Switchboard now uses the correct path to the engine's Python executable on non-Windows platforms.


  • The Lens Distortion plugin is now deprecated. Update your project to use the features of the Camera Calibration plugin instead.

  • The Timecode Synchronizer plugin is now deprecated. Update your project to use the features of the Timed Data Monitor plugin instead.


  • The nDisplay for Level Snapshots plugin functionality was added to the Level Snapshots plugin, so the nDisplay for Level Snapshots plugin was removed from the ICVFX plugin.



  • Avoided resetting loaders while renaming duplicated actors for a runtime level cell as it flushes async loading.

  • When converting a World Composition map to World Partition, all Actors now go in a single runtime grid. Removed the creation of 1 spatial hash runtime grid per world composition layer.

  • Prevent rotation of water bodies in X,Y and scale on Z as they are not supported transformations for water bodies.

  • Added support for iOS and Android platforms to GeoReferencing plugin.

  • Added support for Level Instances to have a folder hierarchy in the World Outliner. Actor Folders can now have a root object which serves as a context for folder hierarchy.

  • Exposed SingleLayerWaterRefractionFullPrecision show flag to scene captures.

  • Exposed GetCollisionComponents on the WaterBodyComponent.

  • Add support for runtime/in-editor visibility flags for water bodies.

  • Added a collision height offset property to water bodies to allow extending the height of the collision box above the surface of the water.

  • High precision Cartesian Coordinates are now based on the new engine Large World Coordinates Vectors.

  • Added Methods to convert from Engine to Geographic Coordinates.

  • Added a Round-Planet Pawn to allow for Ellipsoidal movement around the Planet, avoiding Roll.

  • Added a sample for a Latitude/Longitude/Altitude placed Actor.

Bug Fix:

  • Fixed ActorPlacementUtils::IsLevelValidForActorPlacement to always return true for a partitioned world as checks don't apply. (bPromptWhenAddingToLevelBeforeCheckout / bPromptWhenAddingToLevelOutsideBounds).

  • Fixed broken Undo/Redo of create/delete Layer in ULayersSubsystem.

  • Fixed WaterMesh override boolean not being exposed to the UI.

  • Fixed mesh override on river water bodies.

  • Fixed custom water body materials that could be transparent.

  • Fixed r.water.WaterMesh.EnableRendering to allow/disallow all water meshes to be displayed, in-game or not.

  • Fixed memory corruption induced by invalid water materials.

  • Fixed undo behavior for water component.

  • Fixed Waves not appearing in the Wave category and some missing Wave parameters.

  • Fixed Word Partitioned Actors not being properly registered to the water brush.

  • Fixed custom water bodies being invisible when dynamically spawned.


  • Changed GetWaterBodyType to no longer be virtual. Instead, users should prefer setting the value of the WaterBodyType property in water body constructors.

  • All Water body functions and data have migrated from the actor itself to a dedicated component. Any place where a function was called or data was modified on a Water Body Actor now needs to first access the respective component.

  • The Water Mesh Actor class has been renamed to Water Zone.

Data Layers


  • Added Data Layer Hierarchy support.

  • Removed per-view editor Data Layer visibility show flags.

  • Added functionality to Data Layer Outliner (now very similar to world outliner).

  • Added show filters (hide Editor/Runtime Data Layers, hide actors/unloaded actors).

  • Added mechanism to lock editing of Runtime Data Layers.

  • Added Data Layer picker that reuses FDataLayerMode (shows hierarchy).

  • Added wp.Runtime.SetDataLayerRuntimeState to set any of the 3 Data Layer runtime states.

  • Modified wp.DumpDataLayers to also dump the whole Data Layer hierarchy with initial/target/effective state.

  • Added option to choose representing world in Data Layer Outliner.

  • Moved the "Allow Runtime Data Layer Editing" flag from the EditorPerProjectUserSettings to the AWorrldDataLayers actor so that the state persists for all users.

  • Added buttons to quickly add/remove selected actors to/from Data Layers.

  • Added the option to allow setting Data Layer runtime state recursively from parent to children.

  • Split contextual menu option "Create New Data Layer" into 2 options to allow creating Data Layers under a selected Data Layer or directly at root.

  • Fixed Data Layer details view not refreshing properly when toggling its "Is Runtime" flag.

  • Added column Initial Runtime State in Data Layer Outliner.

  • Fixed World Partition CheckForErrors not properly resolving invalid Data Layers.

  • Data Layer is considered not visible when it's marked as unloaded in the editor.

  • Fixed missing case in FDataLayerHierarchy::CreateParentItem.

  • Added Data Layer highlighting based on editor selection.

  • Added Data Layer / Actor filtering based on editor selection.

  • Fixed bug in Data Layer outliner where newly created actors, once saved, were showing a second unloaded version of the same actor.

  • Replaced old Data Layer placeholder icons with official ones.

  • Removed Editor Data Layers at cook and for game worlds.

  • Added ID Name column in Data Layer Outliner.

  • Fixed bad lambda captures in Data Layer Outliner context menu.

  • Reset Data Layer User Settings are now in the Advanced menu and always apply to all Data Layers.

  • Prevent pasting/importing/moving AWorldDataLayers actor.

  • Fixed detection of dirty actors newly assigned to a Data Layer that is about to be unloaded in the editor.

Bug Fix:

  • Fixed undo of Data Layer transactions when user cancels saving of dirty actors before unloading editor cells.

  • Fixed Data Layer Label tooltip.



  • Added debug name to Landscape component Edit Layers data, so that we can display a more readable name when a component is referencing an invalid edit layer.

  • Changed Landscape map check warnings to info messages, since the system is able to automatically cope with the problem.

  • Added Landscape Material to Edit asset context menus.

  • Changed grass height/weight data storage. Now uses a single continuous array to minimize slack waste.

  • Put the thumbnails on the left side of the paint layer names to prevent misalignment when importing a Landscape.

  • Added button to Landscape Details panel to create RVT volumes for all set RVT assets.

  • The context menu when right-clicking on the Heightmap layer in the Landscape Sculpt mode now points to the Manage -> Import tool instead for Landscape Heightmap import and export.

Bug Fix:

  • Clear selected Landscape components in the Details panel when clearing the selection.

  • Prevent Landscape Material Instances validation/recompilation if not in the editor or a commandlet (we cannot re-build material instance constants otherwise).

  • Fixed incorrect landscape normals computation.

  • Fixed crash in landscape resampling method. Regions in ResampleData are specified in quads, not vertices.

  • Fixed missing ShowForTools in Landscape Import/Export tool.

  • Refresh layer list from target when in Landscape Import tool

  • Fixed padding on property detail in Landscape Import/Export tool.

  • Added detection of discrepancies between the Landscape Material Instance's TerrainLayerWeightParameters and the Landscape component's weightmap allocations.

  • Renamed visibility layer name to "LANDSCAPE_VISIBILITY" to centralize/simplify the handling of that special layer's name.

  • Added resource streaming tracking system to Landscape in order to ensure RVT pages affected by a given heightmap/weightmap get invalidated each time it gets fully streamed in in the editor.

  • Fixed crash when going in Landscape mode after it was marked for pending deletion.

  • Fixed various copy/paste issues with Landscape and Textures.

  • Fixed grass maps not being able to detect that the grass map Material is finished compiling.

  • Fixed missing row of vertices when using the rendered WPO code path for landscape static lighting.

  • Fixed Landscape Edit Layers preventing Landscape to properly be carried over when converting a map to World Partition.

  • Fixed black landscape material thumbnails.

  • Fixed crash when converting old Landscape to Edit Layers or when deleting invalid paint layers in the Landscape panel and re-abilitating them after.

  • Fixed crash when creating new Landscape with no Material.

  • Added all of the current Ray Tracing Shader variations to the list of excluded Shader types for Landscape thumbnails.

  • Made TUniformGrid::Cell safe from internal precision errors. TUniformGrid::CellUnsafe was added and matches the old behavior of TUniformGrid::Cell.

  • Fixed Landscape waiting indefinitely on Landscape Brush Shaders on recompile.

  • Fixed assert that occurred randomly when undoing Landscape operations.

  • Added check to make sure Weight Blend Layers are never normalized.

  • Fixed race condition in FLandscapeEditLayerReadback when the GPU fence of 2 of its internal readback tasks get written in between their respective Tick.

  • Fixed warning "Leaking Landscape Edit Layer read back tasks." Won't process readback tasks when the Landscape is prevented from updating.

  • Fixed grass map being re-read over and over again.

  • Fixed bug where Runtime Virtual Texture settings made on a Landscape Actor did not propagate to the proxies.

  • Retopologize Tool was breaking navmesh generation.

  • Prevented continuous nav mesh updates when moving the mouse if the Flatten tool is active.

  • LandscapeGizmoActor is not shown anymore in the Scene Outline.

  • Fix VT update to happen with rest of Landscape painting tools (Smooth, Flatten, Noise).

  • Fix Landscape GetXYOffsetData to take mip level into account.

  • Get static parameter values prior to updating static permutation for Material Instance in Landscape components.

  • Fixed assert when updating heightmaps of different sizes when merging Landscape Edit Layers.

  • Fixed crash when deleting Landscape components.

  • Properly delete Landscape Edit Layers heightmaps and weightmaps when deleting Landscape components.

  • Fixed assert when cooking Landscape components on mobile and creating Materials.

One File Per Actor


  • Call IsPackageExternal instead of manually testing for RF_HasExternalPackage.

Bug Fix:

  • Deleted empty/invalid external actor packages on OpenWorld template map.

World Partition


  • Disabled building of static lighting in World Partition maps, It will be properly supported in a future release.

  • Fixed invalid bounds computed for ActorClusterInstance when cluster mode is set to Embedded.

  • Resaved OpenWorld with reduced actor packaging scheme and enabled actor folder objects.

  • Actor Folders Objects. When enabled, folders are actual objects and modifying a folder won't affect Actors (more compliant with OFPA).

  • Actor Folders Objects enabled by default for World Partition and Level Instances.

  • Can be enabled on regular levels through the experimental feature 'Use Actor Folder Objects'.

  • If Level uses OFPA, Actor Folders Objects are saved in their own package (but will use ExternalObjects root folder).

  • Generalized saving object in an external package (different from its outer package).

  • World outliner support for old folders and Actor Folder Objects.

  • Levels using the Actor Folder Objects will show a root Level node (like Level Instances).

  • WorldPartition now sorts level streaming using Level Streaming's priority so that UWorld::UpdateLevelStreaming processes making visible levels and call AddToWorld in the right order. This results in a more efficient usage of the AddToWorld time limit.

  • Moved World Partition Editor and Data Layer Outliner under same Level Editor Category.

  • WorldPartition now has its own max world size (value is currently equal to UE_OLD_WORLD_MAX).

  • Actor Folder Objects feature is no longer active while cooking or while running with -game.

  • For PIE partitioned worlds, propagate PersistentLevel's used Actor Folder Objects in each generated runtime level. This allows it to remove fallback to persistent level in ULevel::GetActorFolder.

  • Modified actors in partitioned worlds are now in the correct folders in PIE.

Bug Fix:

  • Removed next preferred level to process in AddToWorld and replaced by filter function that will skip non critical streaming levels when streaming performance is poor.

  • Fixes UWorld::BlockTillLevelStreamingCompleted not always waiting for all streaming levels that were making visible to become visible.

  • Fixed optimization using s.LevelStreamingAddPrimitiveGranularity : Support cases where AActor::PostRegisterAllComponents triggers code that either unregisters or re-registers components pushed in FRegisterComponentContext.

  • Fixed UWorld::BlockTillLevelStreamingCompleted to make it call Begin/End StreamingPauseDelegate only once .

  • Fixed bad management of unsaved level instances in world partition PIE. This was causing Level instance content to be added twice in the PIE world and caused a crash when exiting PIE.



  • Created the OpenXR function GetControllerTransformForTime to query velocity and acceleration of the controller at a specified time.

  • Added a mechanism to use OpenXR chain structs in OpenXR extension plugins.

  • You can now define a swapchain and renderbridge in an OpenXR extension plugin.

  • Added infrastructure to OpenXR for playing haptics on a VR HMD.

  • XR HMD plugins can now override Android device profile names.

Bug Fix:

  • Fixed issues related to OpenXR runtimes not supplying tracking data of various types. If data isn't being provided, it should not be copied out because it might be incorrect, and it is better to preserve the last cached position than overwrite with zero or identity values.

  • Runtime data is now per controller and the constant bulk data is shared by all controllers in the OpenXR APIs. This fixes the issue where you couldn't apply the same haptic effect on two devices simultaneously and have them behave correctly.

  • Fixed an issue where the VR Console Command window aligned off the player's view on several VR platforms. Now the debug canvas is drawn to an internal texture, and so no longer applies DPIScale from the viewport.

  • ShadowProjection passes no longer check for reused LoadBalancers if Instanced Stereo Rendering is enabled.

  • Changed the filename of the retrieved Android manifests by adding the prefix "Retrieved_" so they don't override the already generated manifests.

  • ETextureCreateFlags for resolve and target are now unified in OpenXR because only one texture is ever allocated. There is still the issue of IStereoRenderTargetManager exposing both sets of texture flags, and the concrete classes that utilize RHICreateTargetableShaderResource* still require the flags separated.

  • Deferred culling contexts are no longer used when Instanced Stereo Rendering views come in.

  • OpenXR HMDs now use custom OpenXR XrReferenceSpaceType from OpenXR extension plugins.

  • Fixed startup error in the Unreal Editor if the Windows Mixed Reality plugin is enabled and the Windows build is later than 2004. This is an interim fix, since the WMR plugin is tagged as deprecated in 5.0 and will be removed in a future version.


  • The Windows Mixed Reality plugin is deprecated in Unreal Engine 5. Update your projects targeting Windows Mixed Reality and HoloLens devices to use OpenXR.


Bug Fix:

  • The Windows Mixed Reality RHI now uses a non-null display adapter when creating D3D11 devices.

  • Set the macro PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION to 0 on HoloLens to prevent failures.



  • The Oculus VR plugin was updated to v33.

Bug Fix:

  • Fixed the issue where SceneCapture was enabling stereo when it shouldn't because it doesn't own a viewport. Since SceneCapture shouldn't be enabling stereo, CreateSceneRendererForSceneCapture explicitly disables stereo.

Upgrade Notes


Upgrade Notes:

  • Code that accesses recast / detour code directly or through deprecated functions. In the latter case, compiling code may create double to float conversion or deprecation warnings. Unless you are making use of large world coordinates (LWC) directly, the warnings can be ignored. To be fully compliant with LWC, conversion to FReal for UE / Game code, or dtReal / rcReal / duReal for recast library code, will be required.


Animation Tools

Upgrade Notes:

  • In Control Rig, Gizmo was renamed to Shape. All API calls which previously included the term "gizmo" have been renamed to "shape". Python scripts can be upgraded by using a simple text search and replace.


Upgrade Notes:

  • Refactored Audio::TScopedComPtr to TComPtr.


Upgrade Notes:

  • Moved the FResourceSizeEx into its own cpp file so modifying the header isn't a full recompile. Wherever possible convert the usage of FResourceSizeEx to use the tracking functions which accept a named tag such as:

    • AddDedicatedSystemMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes);

    • AddDedicatedVideoMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes);

    • AddUnknownMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes); The "Shared" version of these functions have been removed and should be replaced with one of the options listed above.

  • Projects which have engine modifications using raw pointers will need to update those modifications to use TObjectPtr instead of T*. Note that this only applies to engine changes; plugins and projects are not affected.


Upgrade Notes:

  • AlphaCoverage scaling was on by default for all textures, but now it defaults to off. It should only be used for punch-through transparency. Texture has a new bool, bDoScaleMipsForAlphaCoverage, to control this. The new config option "EnableLegacyAlphaCoverageThresholdScaling" can be set to true to keep the legacy behavior. Textures with AlphaCoverageThresholds at the default value of (0,0,0,1) now have AlphaCoverage scaling off by default.


Upgrade Notes:

  • The deprecated USDImporter module is now fully deleted from the USDImporter plugin, along with old, unsupported Python scripts. Users should update their code to use the USDStageImporter module instead.


API Change:

  • IContentSource::GetCategory() has been renamed to GetCategories() and returns an array of category names instead of only one.

Upgrade Notes:

  • Upgraded engine version of the third-party Alembic libraries to version 1.8.2, we are dropping support for HDF5.

  • The bForceRDOOff setting in the [TextureFormatOodle] Engine.ini section has been deprecated. Projects with RDO enabled (i.e. bForceRDOOff=false) will need to enable RDO in Project Settings -> Texture Encoding.

  • Users may need to resave Blueprint assets using MakeTransform with the default values. The default values saved as string with the asset changed from "1,1,1" to "1.000000,1.000000,1.000000", and this generates a Blueprint Compiler warning.


  • The CVAR r.Editor.OpaqueGizmo has been replaced by ShowFlag.OpaqueCompositeEditorPrimitives to be scene-specific. This means the Editor Gizmo dithering can be controlled per-scene now.



Upgrade Notes:

  • FAndroidPermissionDelegate is now a multi-cast delegate, to allow multiple callbacks to be bound. Any callbacks bound to FAndroidPermissionDelegate with a Bind function will error; replace these with calls to Add functions instead.


Upgrade Notes:

  • The various Vector_NetQuantize types no longer clamp the scaled vector components to a specific number of bits. The only values that are considered invalid are non-finite ones which are still replaced with a zero vector during serialization. Precision has also been improved by not scaling values unless it's certain that the precision can be improved by doing so. If clamping of values in Vector_NetQuantize types is desired, make sure to clamp them before replicating. This also makes sure the server and clients have the same perception of what the values actually are.


API Change:

  • A ChannelName parameter has been added to the IVoiceChat's FOnVoiceChatBeforeRecvAudioRenderedDelegate callback to disambiguate which voice channel the audio is from. Existing callbacks bound to FOnVoiceChatBeforeRecvAudioRenderedDelegate will break due to the signature change. To resolve this, you will need to add the new parameter to the signature of your callback functions.

Online Subsystem

API Change:

  • MAX_LOCAL_PLAYERS has moved from the OnlineSubsystem plugin to CoreOnline.

  • Removed the duplicate ToString function for ESocialRelationship type. If code fails to find ToString, use LexToString instead.

  • Removed ESocialFriendRequestMethod because it's the same as SubsystemType RequestMethod.

Upgrade Notes:

  • EOS Stat name inconsistencies are now fixed by converting to upper case before calling API methods. As a result, stat names that you define in the EOS Dev Portal should be all upper case.

Pixel Streaming

API Change:

  • Class names in private sections of the Pixel Streaming plugin have been moved into a "PixelStreaming" namespace.

Upgrade Notes:

  • Renamed a number of classes to use the phrase "PixelStreaming" instead of "PixelStreamer", specifically, PixelStreamerInputComponent to PixelStreamingInputComponent. Any projects directly accessing Pixel Streaming C++ will need to be updated to use the new naming conventions.

  • The HardwareEncoders Plugin needs to be enabled whenever using AVEncoder (GameplayMediaEncoder) otherwise there will be no encoders registered to AVEncoder.

  • Renamed PixelStreamerInputComponent to PixelStreamingInput to align with our new naming conventions in UE5. This change may break blueprints using the old PixelStreamerInputComponent. While we have put in active redirectors into the Pixel Streaming plugin in some cases these Blueprints will not upgrade, in such cases the old PixelStreamerInputComponent will have to be deleted and the new PixelStreamingInput component can replace it.


Upgrade Notes:

  • Platform input customization cvars have been unified to use an "Input." prefix. For example: "Input.EnableMouse" instead of "[PlatformName].EnableMouse". Check your project's .ini files and migrate these as necessary.


Upgrade Notes:

  • HoloLens packaging support modules have been moved from the "HoloLens"/"HoloLensAR" plugin into the engine to align with other platform implementations. The now empty "HoloLens"/"HoloLensAR" plugin was deleted. Existing projects that enabled the plugin will trigger a "HoloLensAR plugin missing. Continue/Cancel" dialog. Select continue and the deleted plugin reference will be removed from the uproject file. Any references to the deleted plugin should be removed, but most code references modules rather than plugins and should continue to work as expected.


Upgrade Notes:

  • Cleaned up render target pool system by deprecating legacy MSAA split-texture creation and removing the old event viewer. Projects should use RDG when allocating MSAA render targets which require resolves.


Upgrade Notes:

  • RayTracingAO is now disabled by default, affecting existing projects. Projects that actually intended to use RayTracingAO will need to re-enable it in the Post Process Volume settings.

Virtual Production

Upgrade Notes:

  • Moved common parameters from FOpenCVLensDistortionParameters from the Lens Distortion plugin to the OpenCV plugin so other plugins can easily use them.

  • Live Link's animation-related classes were moved to their own runtime module to better isolate from the Unreal Editor.

  • Live Link functions GetSubjectRole and DoesSubjectSupportRole have been deprecated and replaced by new thread-safe Live Link functions GetSubjectRole_AnyThread and DoesSubjectSupportRole_AnyThread.

  • Moved generic OpenCV convenience functions into OpenCVHelper so they're not scattered across multiple Virtual Production classes.


Upgrade Notes:

  • The double precision structure Cartesian Coordinates is now deprecated and has to be replaced by Engine Vectors


Upgrade Notes:

  • The OpenXR HMD functions DrawHiddenAreaMesh_RenderThread and DrawVisibleAreaMesh_RenderThread no longer check the render thread and have been renamed to DrawHiddenAreaMesh and DrawVisibleAreaMesh. The relevant platform runtime functions were also updated with this change.

  • MRMesh (Mixed Reality Mesh) now uses Chaos physics for runtime async collision cooking. This is used by AR devices to represent the real world geometry scanning features in Unreal.

  • World meshing from the HoloLens using the Windows Mixed Reality plugin now writes floats instead of doubles to work with the new Large World Coordinates feature.

  • Moved the functionality for Oculus plugin-specific haptic data resampling into the Oculus plugin.


Upgrade Notes:

  • Common stereo-enabled logic was moved to FSceneViewExtensionContext.

Known Issues

For a complete listing of known issues affecting Unreal Engine 5.0, please see the Unreal Engine Public Issue Tracker.

Help shape the future of Unreal Engine documentation! Tell us how we're doing so we can serve you better.
Take our survey