Unreal Engine 4.27 Release Notes

Overview of new and updated features in Unreal Engine 4.27

Choose your operating system:




What's New

Unreal Engine 4.27 brings features and updates for all creators offering a production ready feature set for Virtual Production and newly added functionality for AEC and manufacturing users which continues to put Unreal Engine at the forefront of technology. Unreal Engine 4.27 provides the right tools and workflows to get the job done.

GPU Lightmass provides high-speed baking for same day lighting and layout changes and Multi-GPU support enables wider camera and simultaneous dual camera shooting scenarios for In Camera VFX. Production ready pixel-streaming gives our users greater creative freedom and more choice over how to deploy Unreal Engine. RAD Game Tools has joined Epic Games, and the Oodle Compression Suite and Bink Video are now included for all Unreal Engine developers.

Unreal Engine 4.27 will be compatible with UE5 when it becomes available next year!

Unreal Engine 4.27 is not compatible with UE5 Early Access.

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

ayumax, bailehang,colinpy,dendnk, drichardson,HSeo, fieldsJacksonG (Microsoft), igor-kondratiev, JDCruise, Josef-CL, kidsmurf2000, kihl, kristjanvalur, KristofMorva, liang47009, moppius,NexusEast,Punlord,rlabrecque,,Skylonxe,tinyogre, triboud, Ultrahead,wrflemin, X-Stuff,ZeroEightSix

Virtual Production

Visual nDisplay Configuration and Improved Workflows

This release, we focused on improving the user experience of setting up and operating an nDisplay cluster, the heart of many workflows such as In Camera Visual FX. Starting with an in-engine 3D nDisplay Configuration editor to set up your nDisplay system. A new nDisplay Root Actor consolidates all nDisplay-related features and settings into one UAsset, allowing for smoother production operations and repeatable setups.

To get started with nDisplay in 4.27:

  1. Create a new nDisplay Root Actor in the Unreal Editor

  2. Configure your nDisplay Root Actor in the nDisplay 3D Config Editor

  3. Drag the Root Actor into the level viewport to preview your project's content from the cluster's perspective

  4. Launch your project onto your physical nDisplay setup with Switchboard

This new workflow replaces the previous method of modifying configuration text files outside of the engine to create your nDisplay network. You can import previously created .cfg and JSON configuration files to convert them to the new UAsset format.

Improved mGPU Support in nDisplay (Beta)

The mGPU support in 4.27 allows for the simultaneous use of multiple cameras, larger frustums to support wider angle lenses and a more efficient balance of hardware deployment. A GPU can be dedicated to the inner frustum allowing for more complex content to be displayed. When using multiple cameras the underlying mGPU technology is backed by a workflow for the setup and operation of the multiple cameras.

nDisplay Overscan (Experimental)

With overscanning, you can now achieve continuity across multiple nDisplay render nodes for visually impactful post-processing effects such as bloom, ambient occlusion, and motion blur. Overscanning does come at a configurable performance cost.

This feature works with simple screens and projection policies, but more advanced policies, such as Mesh, are currently not supported.

Linux Support in nDisplay (Experimental)

We added preliminary support for Linux in nDisplay and its tools ecosystem. Linux support is dependent on graphics card drivers, and some rendering features, such as ray tracing and Vulkan, are not currently supported.

image alt text

nDisplay Synchronization

Leveraging previous work in 4.25 and 4.26 releases, we made improvements to Sync Policy #2 in both performance and usability. Improvements include:

  • NVIDIA drivers 461.72 and later that support non-blocking present

  • A refined internal sync render-thread barrier management, which will fix crashes and timing issues

  • Exposed cvars to help with debugging

OpenColorIO Support in nDisplay

The combination of UE rendering, LED processors, LED panels and finally production cameras creates a complex scenario for repeatable and precise colour workflows. Therefore, we added support for OpenColorIO in nDisplay to enable accurate color calibration that connects content creation in Unreal Engine to what the real-world camera sees on the LED volume allowing content artists and DPs to work together with a common reference of the final captured image.

image alt text

Easier to set up and use Remote Control Workflows and Enhanced API (Beta)

image alt text

Curated sets of controls driven by a tactile control device allow more people to interact with Unreal Engine in a live production environment. There have been several improvements so that you can control more properties and functions, and replicate them properly with an easier set up process.

Remote Control Presets now support:

  • Per-property metadata

  • Rebinding properties so you can use the same preset across multiple levels

  • Ability to expose custom events

  • Actor functions

  • Thumbnail previews over WebSockets

  • Remote Control Replication over nDisplay

UI Builder and Improved UX for the Remote Control Web Application

You can now quickly build complex web widgets without any code using the new drag-and-drop interface. We also redesigned the widget interfaces, and added more widget types focused on virtual production scenarios, including:

  • Stage Position

  • Wall Color Corrections

  • Light Cards

  • Level Snapshots

  • Sequencer

  • Green Screens

image alt text

Remote Control Plugins for DMX, OSC, and MIDI

You can now use existing live show protocols, such as DMX, OSC, and MIDI, with the Remote Control system in Unreal Engine.

Remote Control C++ API

The Remote Control system now includes a C++ API to provide more ways to access and control the engine remotely. Previously, you could only access properties in the engine through web applications that used the Remote Control's HTTP and WebSocket APIs. With the C++ API, you can now also control the engine and use the exposed Remote Control properties in external desktop applications.

Introducing Level Snapshots for level variation management (Beta)

Live production and more specifically In Camera VFX often require small changes to a common level on a scenario by scenario basis. This creates a data wrangling challenge which slows down the speed of stage operations. With Level Snapshots, you can record the current state of the level in a snapshot without forcing a permanent change into your project or source control. Later, you can choose what to restore from that snapshot to update the level. This tool is especially useful for stage operators on an In Camera VFX shoot because you can accommodate complex restore requests from filmmakers, such as "Go back to Take 6 and move all the trees, except for these five.". It is also useful for artists who might want to create a variety of scenarios to show for creative approvals.

image alt text

Expanded Virtual Camera System

Whether being used for virtual scouting or recording organic camera moves the new Virtual Camera system introduced in Unreal Engine 4.26 is now Production Ready.

The Virtual Camera system features include:

  • Multi-User support in the Editor.

  • A redesigned user experience.

  • Extensible core architecture for developing Virtual Cameras.

  • Ability to route the output of the Virtual Camera to Composure, Media Framework, Editor viewports, or any devices running the Unreal Remote app.

  • Ability to overlay custom UMG controls over the output and interact with them in the Editor or on a device.

  • Built-in support for controllers and other hardware input in addition to touchscreens.

  • A Modifier system to manipulate camera data with custom effects such as filtering, tracking, and autofocus.

  • Ability to switch to any tracking system connected through Live Link.

  • A desktop operator panel to help facilitate the camera operator.

New Virtual Camera iOS App

We also released a new iOS app, Live Link VCAM, that is dedicated to virtual camera functionality and offers a more tailored user experience than the Unreal Remote app.image alt text

Improved Unreal pipeline support via Universal Scene Description (USD) improvements

The Universal Scene Description (USD) interchange format continues to be a popular format in the Media and Entertainment industries.This release features several enhancements allowing for deeper pipeline integration, with the largest focus being additional export options. Unreal Engine 4.27 also features additional support for multi-user editing and additional options at runtime.

image alt text

Export to USD Enhancements

The USD Scene Exporter has been expanded and includes several new options:

  • Edit USD Attributes from the USD Stage Editor: You can now edit most USD attributes directly using the USD Stage Editor Details panel.

  • Export Levels and Sublevels to USD: You are now able to select a level that is loaded in Unreal and export it as a primary USD file. Any sublevels or assets in the level, such as Static Meshes, Skeletal Meshes, Lights, Foliage, or Landscapes, are exported as separate USD files referenced by the primary file.

  • Export animation sequences to USD: Animation Sequences can now be exported to several USD file formats. The new export action will export both animation preview mesh and the animation, as well as bind them together. This includes all bone and blendshape tracks.

  • Texture baking and material export: Materials with textures can be baked down and exported with levels. The materials then can be read by other applications with USD support.

USD Importer Enhancements

Now when you import a USD Stage, animation tracks will now be imported into the Content Browser along with any other assets. This workflow is similar to how FBX is used with all assets converted to uAssets on disk allowing for a full Unreal set of workflows.

Direct USD Workflows and Scene Cache

The USD Stage Actor allows for the loading of USD scenes within Unreal. The information is kept as USD information which can be altered and saved back to USD as edit layers. The USD assets are converted to uAssets in memory with a cache allowing for accelerated loading on subsequent sessions. This is the workflow of choice when USD Data needs to transit through Unreal but will continue to be used in other DCCs with USD support.

Support for Nvidia MDL

Support has been added for the Nvidia Material Definitions Language (MDL) schema and MDL surface materials. For more information, see the Nvidia MDL Schema documentation.

Additional USD Support at Runtime

Several USD features are now available at runtime, allowing for the creation of applications that can load and display the contents of a USD file.

Multi-user Support for USD

Multi-User Editing is now supported for most USD Stage operations.

UpdatedAlembic CacheSupport with Improved Groom Workflows

Unreal Engine continues to expand support for Alembic, a standard for caching animation data that is widely used in the Media and Entertainment industries. The robustness of alembic cache support as well as improved hair and fur workflows are part of this release.

Improved Alembic Groom Support

We have expanded support for hair and fur by making it possible to bind Grooms to GeometryCache data imported from Alembic. No longer do you have to go through the awkward workflow of binding a groom to a Skeletal Mesh. Both grooms that are targeted to drive the Unreal groom system or full hair caches simulated in other DCCs are supported.

You can now import an animated groom directly from Alembic to a GroomCache asset that can be used as part of a GroomComponent.

For more information, see our Alembic for Grooms documentation.

Improved Alembic Cache Support

In addition to the improved hair and fur workflows Alembic caches now have better support for sub-frame samples, non-consistent topology caches, and caches that start with empty frames. This allows better results when working with alembic simulation caches.

Datasmith Exporter Plugin for Archicad

Unreal Engine 4.27 brings with it a new Datasmith Exporter for Archicad, the popular architectural CAD software by Graphisoft. The plugin provides support for the Datasmith Direct Link workflow, allowing Archicad users to synchronize their application with Unreal Engine and Twinmotion; as well as the ability to export data in the .udatasmith file format.

image alt text

The plugin maintains high fidelity between Archicad data and Datasmith with support for:

  • Geometry and hierarchy data exported in a structured way with Metadata

  • PBR Materials

  • Lights

  • Camera Properties

  • Layers

  • Hot Links and Xrefs

  • Actor Tags

Datasmith Exporter for Sketchup

The Datasmith Exporter for Sketchup has been completely rebuilt from the ground up. The new version features a number of improvements and now provides support for the Datasmith Direct Link workflow, which allows users to synchronize their Sketchup application with Unreal Engine-based applications and Twinmotion.

To support these enhancements, a new Datasmith Toolbar has been developed.

image alt text

This new toolbar provides access to the Direct Link feature, as well as the option to export your data as a .udatasmith file.

We have also updated the exporter with new support for PBR materials, bringing it more in line with our existing plugins.

Additional Improvements:

  • Support for Sketchup 2021

  • New PBR Material graph

  • Batch exporting using Ruby script.

Datasmith Exporter for Rhino

The Datasmith Exporter Plugin for Rhino has received a number of improvements. With this release, we have added Direct Link functionality between Rhino and Unreal Engine-based applications, such as Twinmotion.

image alt text

With 4.27, we have added support for Worksessions. When a Rhino worksession is imported into Unreal Engine, the multiple overlaid models are structured into an easy-to-read hierarchy.

image alt text image alt text

Additional Improvements:

  • Support for Rhino 7

  • Support for a wide range of new Rhino geometry modifiers

  • Named views are now exported as Cameras

Improved Datasmith Exporter Plugin Stability and Application Support

4.27 brings the release of several enhancements and quality of life improvements to our existing Datasmith plugins. Beyond improvements to plugin stability and reliability, we have added support for new versions of Revit, 3ds Max, and Navisworks.

  • Improved pivots points for ceilings

  • Support for Revit 2022

3ds Max
  • Support for 3ds Max 2022

  • Support for Navisworks 2022

Datasmith for Solidworks (Experimental)

image alt text

The new Datasmith for Solidworks plugin brings the ability to export files to Unreal Engine and Twinmotion to the widely popular CAD software. Export your material and product geometry to the .udatasmith file format or create a live connection between Solidworks and an Unreal Engine-based application with Datasmith Direct Link.

Improved Visual Dataprep Workflow

Visual Dataprep provides the ability to automate the process of importing and preparing your 3D data using a variety of operators and selection filters. In this release, we have made a number of enhancements and quality of life improvements:

image alt text

image alt text

  • New Filter options: Several new filtering options have been added with this release. Create a new filter from a selection of Actors or filter a selection using all the visible Actors from a set of Actors. You can also create a filter that selects Actors that are overlapping a set of Actors.

  • New Operators: A variety of new operators have been added, such as Plane Cut, Set Collision Complexity, and Set Max Texture Size.

  • Support for Actor Components: We have added support for Components to all operators and filters.

  • File format specific import options: Users can now set file format specific input options for Dataprep input.

  • Scene Statistics panel and Simplified Stat Overlay: The Scene Statistics panel and the Stats overlay have been redesigned to improve readability.

  • UI Improvements: Users can now collapse a group of actions and resize Action nodes horizontally.

Datasmith Runtime Import Support

Several Datasmith features are now available at runtime, making it possible to create applications that can import Datasmith files, and manipulate them using a variety of Blueprint operations.

image alt text

image alt text

image alt text

A "Datasmith Runtime Import Options" variable is now accessible on the Datasmith Runtime Actor that expose parameters for the import process such as:

  • Build Hierarchy, parameter to expose more or less of the hierarchy of the file. More detailed hierarchy will increase the load time and the rendering time.

    • None: the hierarchy is stored in the runtime actor (4.26 behavior) user cannot access the individual nodes

    • Simplified: hierarchy is simplified, some intermediary nodes are removed. That allows exposing objects so that applications can modify their properties while limiting draw calls due to the high number of actors in the scene.

    • Unfiltered: raw hierarchy as coming from the CAD model or datasmith file.

  • Build Collisions: No Collision, Query Only, Physics Only, Collision Enabled (Query + Physics). Query is usually used for Pawn navigation and collision with walls / floor and picking of objects.

  • Collision Type: Project Default, Simple and Convex, Use Simple As Convex, Use Convex As Simple. Since we cannot fine tune the collision generation of individual parts, using "Use Complex Collision As Simple" might be necessary if you desire precise collision while navigating the scene.

  • Import Metadata: read and add metadata to the actors. Increase load time.

Accurate lens representation via Camera Calibration (Beta)

You can now drive lens distortion on cinematic cameras using calibrated camera data, enhancing the look of your live compositing workflows. You can calibrate your lens using the new camera calibration and nodal offset tools, or bring in external calibration data in the form of ST maps.

In this release, we added a few new asset types and support for lens distortion in Unreal's tools:

  • Store calibrated lens data at multiple focus and zoom positions in the new LensFile asset.

  • Apply the new lens distortion post-process material to cinematic cameras.

  • Add a LensDistortion Component to a Cine Camera directly.

  • Apply distortion to Composure's CG Layers.

  • Evaluate a LensFile in your Live Link camera subjects based on live focus and zoom values.

  • Use the new Live Link Lens Role to stream pre-calibrated distortion data directly from certain camera tracking systems.

Live Link FreeD Plugin (Beta)

Live Link now supports the FreeD data protocol, which is a commonly used protocol for camera tracking and Pan, Tilt, Zoom (PTZ) cameras. Many PTZ cameras, such as the Panasonic AW-UE150 and the Sony BRC-X1000, are now supported through this protocol, and can be a cost-effective way to add tracking data to your projects.

Live Link VRPN Plugin (Beta)

VRPN is a commonly used protocol for virtual reality and virtual production. Previously, VRPN was only compatible with nDisplay. The new Live Link VRPN plugin is a more general solution and allows multiple tracked devices to be distributed and replicated in Unreal Engine. We removed the VRPN input from nDisplay to avoid duplication with the Live Link VRPN plugin.

image alt text

Live Link Face

We've made a few improvements to the Live Link Face iOS app to improve facial capture and how you record your data.

Live Link Face Calibration

Tune facial capture with Live Link Face to the individual performer and improve the quality of the animation data streamed to Unreal Engine with the new calibration feature in Live Link Face. This enables a neutral — or rest pose — expression to be set, which is used by the app to offset the data from ARKit and provide a more tailored result that is a closer match to the actual performance.

image alt text

Live Link Face for iPad

While Live Link Face was always fully functional on iPads with TrueDepth front-facing cameras, its display and proportions were not tailored for iPad-sized screens. We've updated the app to officially support iPads as well as iPhones, making it more accessible for users who prefer the tablet form factor.

Frame-Accurate Sync of Videos with Sequencer and Movie Render Queue

Playback of videos with Media Framework will be frame-accurately synced to the timeline in Sequencer independently of the media player's real-time behavior. Sequencer internally handles communication and setup for this synchronization with the media player.

Currently, only ImageMediaPlayer supports this new synchronization. If you use a media player that doesn't support this feature, playback will start or stop close to what is indicated by the Sequencer timeline; however, frame-by-frame alignment could be random.

EXR Mipmap Support for Image Sequences in Media Framework

Media Framework's image sequence playback now supports mipmapped EXR images. Mipmaps can be used in image sequences to reduce the amount of data loaded in. In UE, the mip level is selected based on an estimated pixel-to-texel density for each object displaying the image, unless otherwise set in the settings.

For more details, see Image Sequence Mips.

Improved DMX Performance and Integration

We continued to improve the DMX plugin, increasing its overall performance and stability under stress conditions, including improvements to protocol, Blueprint, and sACN. We also added integration with other engine features, such as Remote Control and nDisplay, and replaced Controllers by Ports with the new network settings DMX Ports.

Pixel Mapping (Beta)

We revamped the Pixel Mapping UI panel and core functionality. You can now effectively drive low-resolution panels or matrix fixtures by fetching the scene buffer, or any live texture, to generate the required DMX data at high performance.

Per-User Take Recorder Control in Multi-User

You can now control which nodes in a Multi-User session contribute to a Take Recorder capture. This means you can set nodes as recording nodes that contain additional simulated or animated data that is not visible to the Multi-User main operator.

New Design Configurator Template and Product Configurator Template Updates

The Product Configurator Template was initially released with Unreal Engine 4.25 in the Automotive category as a way to help users quick-start their interactive product configurators. The template features best practices for the use of the Variant Manager and ways to dynamically generate UMG-based interfaces.

With Unreal Engine 4.27, we have released the Design Configurator template.

image alt text

This new template is available in the Architecture, Engineering, and Construction category, and demonstrates the same interactive features and best practices for buildings as the Product Configurator template demonstrates for products.

Both templates also contain the following UI enhancements:

  • Button Size: adjusts the size of the variant buttons.

  • Button Size Outline: Adjusts the width of colored outline around buttons.

  • Button Outline Normal Color: Sets the default button outline color.

  • Button Outline Hover Color: Sets button outline color when mouse is over button.

  • Button Outline Pressed Color: Sets button outline color when button is pressed.

  • Popup Line Color: Sets color of the line under the UI text.

  • Popup Text Color: Sets color of the UI text.

LiDAR Point Cloud Plugin Improvements

Unreal Engine 4.27 brings several enhancements to the LiDAR Point Cloud plugin that improve the import and manipulation of point cloud data.

This release contains the several improvements:

  • Better point size algorithm: The scalable algorithm has also been improved and a fixed point mode has been added. This new mode can be especially useful when working with a noisy asset.

  • Improved Performance and Stability: Several improvements to the processing and streaming of the point cloud data have significantly improved performance for the end user.

  • Improved Save/Load Performance: The serializer and streaming mechanic has been significantly improved.

  • Simple Gap Filling: Points are enlarged and rendered using a new technique that minimizes visible overlap.

  • Disable Frustum Culling: It is now possible to disable Frustum Culling which can help with the data stream delay when shooting cinematics.

  • New Selection methods: New Polygonal, Lasso, and Paint selection methods have been added.

Pixel Streaming

image alt text

With Unreal Engine 4.27, we are pleased to announce that the Pixel Streaming plugin is now ready for production! Pixel streaming provides new options for deployment, making it possible to stream Unreal's first-class realtime rendering to a wider array of devices and users than ever before. While the workflow for setting up pixel streaming applications is fundamentally the same, this release comes with several key improvements and new configuration options.

Linux Support for Pixel Streaming

You can now deploy pixel streaming applications with Linux server instances, which provide many advantages in efficiency, scalability, and overall ease of deployment.

AMD Encoder Support

Pixel streaming now supports the AMD Advanced Media Framework hardware encoder, making it possible for instances using AMD GPUs to use pixel streaming on both Windows and Linux.

Improved Stability and Quality With Upgraded WebRTC

We have upgraded the WebRTC used by the pixel streaming plugin to version M84. This improves the latency and quality of streams, and prevents them from degrading over time, and improves compatibility with most web browsers, including Firefox and Safari.

Browser Audio Input Support

The improved WebRTC also provides support for audio input from users' browsers, making it possible to capture microphone input in pixel streaming applications. What's more, captured audio can be spatialized or processed once it is in the engine.


Expanded GPU Lightmass Feature Support (Beta)

The GPU Lightmass system continues to improve its progressive lighting baking with support for more features of Unreal Engine 4.

Improvements in 4.27 include:

  • Support for more light parameters such as attenuation, non-inverse-square falloff, and rect light barn doors

  • Support for baking Level of Detail (LOD) meshes.

  • Support for colored translucent shadows.

  • Improved Multi-GPU (mGPU) support.

    • Requires Nvidia graphics cards that support NVLink and SLI.

  • Irradiance Cache is now enabled by default and is significantly faster for real-world scenes, and solves issues present in UE 4.26 that now benefit all users.

  • Set a new default for Full Speed that benefits all users by preventing the occasional GPU timeouts (or TDRs) that could occur. The new default halves the speed to 8 instead of 16. The speed can be adjusted as needed in the GPU LIghtmass settings panel in the System section.

  • Resolved many issues and stability fixes.

image alt text

For more information, see the GPU Lightmass documentation.

Path Tracer (Beta)

The Path Tracer is a progressive rendering mode in Unreal Engine that can render the scene without any additional setup needed. The Path Tracer closes the feature gap of the real-time Ray Tracing features with physically correct and compromise-free global illumination, physically correct refractions, feature-complete materials within reflections and refractions, and super-sampled anti-aliasing.

image alt text

The Path Tracer requires Windows 10 with a DXR-capable graphics card.

For 4.27, the Path Tracer sees many improvements that make it a viable candidate for use in common rendering scenarios, with focus on AEC, automotive, and product design.

Improvements in 4.27 include:

  • Support for all Material Shading Models except Hair, Eye, and SingleLayerWater.

  • Support for refraction and all Material Blend Modes.

  • Transmission of light through glass surfaces, including approximate caustics.

  • Support for random-walk sub-surface scattering

  • Support for most light parameters, such as area size, penumbra, attenuation, Rect Light barn doors, Rect Light textures, IES profiles, and more.

  • Support for nearly unlimited number of lights.

  • Improved sampling techniques, resulting in less noise with similar rendering times.

    • This is still an ongoing area of development and will continue to improve in future releases.

  • Support for Orthographic cameras.

  • Improved support for Movie Render Queue.

For more information, see the Path Tracer documentation.

Improved Hair and Fur Rendering Visuals and Performance

The Hair and Fur rendering and simulation features of Unreal Engine. Many of the improvements for visuals and performance have been driven by the MetaHuman Creator, starting with Unreal Engine 4.26.

image alt text

For 4.27, there are two new cache-related features:

  • The ability to attach a hair groom to an Alembic Cache.

  • The ability to import a groom that has already been simulated and contains cached per-frame hair data.

    • A cached groom can be bound to either a Skeletal Mesh or an Alembic character.

    • Playback is supported in Play-in-Editor, Sequencer, and Movie Render Queue, but not yet for packaged projects.

During import of an alembic groom, the importer detects if the groom has animation. If so, it automatically generates two Groom Caches, one for the strands that have been animated and one for the guides that have been animated, which uses simulation to animated the strands being rendered.

The Groom Cache can be assigned to the Groom Component using the Groom Cache assignment slot.

For more information, see the Hair & Fur Rendering and Simulation documentation.

Expanded Coverage and Improved Workflow for Ray Tracing

Ray tracing features continue to expand coverage and improve workflows for existing supported features. This release includes the following improvements and additions:

  • Instanced Static Meshes (ISM) and Hierarchical Instanced Static Meshes (HISM) now support World Position Offset in ray tracing features, such as reflections and shadows.

  • Niagara particles in reflections now support particle-driven material attributes, such as BaseColor. Previously, particles seen in reflections were missing all per-particle features in their materials.

  • Refraction is now controlled from the Refraction input on the main material node rather than derived from the Specular input. This now matches traditional raster methods for controlling refraction in transparent materials.

  • Re-enabled Transparent objects shadow casting which was disabled in Unreal Engine 4.26. Real time ray traced shadows of transparent objects can only be opaque. Partially translucent ray traced shadows remain limited to baked static lights. Shadow casting for transparent objects can be disabled:

    • Per-material using its Details panel in the Material Editor to disable Cast Ray Traced Shadows.

    • Per-object using the Level Details panel to disable Cast Shadows.

For more information, see Real Time Ray Tracing documentation.

RAD Game Tools

RAD Game Tools has joined the Epic Games family and many of its technologies are now included as part of Unreal Engine.

Oodle Compression Suite

image alt text

Oodle Data compression provides the fastest and highest ratio compressors for game data. This product family provides four compression algorithms to best fit your project's needs. Oodle Data decompression is significantly faster than other codecs and the algorithms run on all Unreal Engine-supported platforms.

Oodle Data Compression is now enabled by default in Unreal Engine, providing significant compression and faster loading for packaged projects.

Oodle Texture compression are the fastest and highest-quality encoders for block-compressed BC1-BC7 textures. Oodle Texture's Rate Distortion Optimization (RDO) encoders can make high visual quality encodings that are 2 to 3 times smaller than the non-RDO encoders!

Oodle Texture compression is enabled by default in Unreal Engine and RDO encoding can be enabled in the Project Settings (RDO encoding is off by default).

Oodle Network compression is a unique solution for real-time compression of network traffic, greatly reducing the bandwidth required by game servers. This solution works on all TCP and UDP network packets and significantly reduces the minimum bandwidth required for multiplayer games.

Oodle Network compression is used by Fortnite already, and can be turned on and trained for your game's own network streams.

Bink Video: The fastest video codec for games

image alt text

Bink Video is the most popular video codec for video games and now it's built into Unreal Engine. It is a performance-designed video codec - decoding up to 10 times faster than other codecs, and using 8 to 16 times less memory. On some platforms, Bink decoding can also be offloaded onto GPU compute shaders for even faster performance. Bink Video is completely self-contained (nothing else to install) and has an easy-to-use Unreal Engine plugin interface.


OpenXR Plugin is Production-Ready

The OpenXR framework is the multi-company standard for VR and AR development. With the OpenXR plugin, you can target multiple XR devices with the same API in Unreal Engine. The OpenXR plugin also supports extension plugins from the Marketplace so you can add functionality to OpenXR without relying on Engine releases.

image alt text

Credits: OpenXR and the OpenXR logo are trademarks of the Khronos Group Inc.

In this release, we added support for the following features in Unreal Engine's OpenXR plugin:

  • Stereo Layers

  • Splash Screens

  • Querying Playspace Bounds

  • Motion Controller Visualization

The platform-specific plugins are still available in 4.27. By default, the engine will prioritize the plugins based on device compatibility, in the following order:

  • OculusVR

  • SteamVR

  • OpenXR

If you'd like to develop specifically for OpenXR, disable the OculusVR and SteamVR plugins.

Redesigned VRTemplate

We built the new VRTemplate using the OpenXR framework. The template is designed to be a starting point for all your VR projects. It includes encapsulated logic for:

  • Teleport Locomotion

  • Snap Rotation

  • Grab Component

  • VR Spectator Camera

  • Menu

The VR platforms currently supported by VRTemplate include:

  • Oculus Quest 1 and 2

  • Oculus Quest with Oculus Link

  • Oculus Rift S

  • Valve Index

  • HTC Vive

  • Windows Mixed Reality

See VR Template for more details.

Redesigned Handheld AR Template

This project template replaces the previous AR Handheld Template, and is designed to be a starting point for developing AR apps on the ARCore and ARKit platforms.

Features include:

  • Out-of-the-box easy setup for iOS and Android

  • Basic UI and touch interface

  • Ability to take snapshot images

  • Ability to move, rotate, and scale the model

image alt text

Collaborative Viewer Template Improvements

The Collaborative Viewer is a template project that enables experimentation with CAD/BIM 3D models in VR or on desktop, and with multiple users for collaborative design reviews.

Improvements in 4.27 include:

  • Multi-scale support

  • Section tool

  • Works with Datasmith runtime

  • Input of text notes

image alt text

Fixed Foveated Rendering (Experimental)

With fixed foveated rendering, you can use image-based variable rate shading in VR headsets to adjust the shading rate for a target. Fixed foveated rendering delivers a performance boost with little perceptual degradation in image quality. There are four levels of fixed foveation provided: disabled, low, medium, and high.

This feature is currently only supported on Windows platforms with DX12 and GPUs that support VRS Tier 2.

Container Deployment (Beta)

Image courtesy of Michael Wallace

Image courtesy of Michael Wallace

Starting with 4.27, Unreal Engine now officially supports container deployments. Containers provide an option for packaging applications and their dependencies into a single, portable unit that can be deployed either on a local machine or through the cloud. This works similarly to virtual machines, but containers are more computationally lightweight, facilitating a larger number of concurrent deployments.

Based on the open-source infrastructure developed by TensorWorks and the Unreal Containers community initiative, Unreal Engine supports two types of container images: development images, which contain Unreal Editor and its build tools, and runtime images, which can run packaged Unreal Engine projects. This makes it possible to widely deploy your development tools or your end-user applications to the cloud.

For more information about the many ways you can take advantage of containers and container images, refer to our Containers documentation.

Gameplay Framework and Scripting

Enhanced Input (Beta)

Enhanced Input is a streamlined but highly configurable input handling system supporting runtime input remapping and complex, customizable trigger rules. In 4.27, the Enhanced Input plugin has expanded to offer full Blueprint visual scripting support, so developers can use all of its features without writing C++ code.

image alt text

Data Registries (Beta)

The experimental Data Registries plugin helps developers create efficient, global storage spaces for struct-based data tables. With Data Registries, you can access data synchronously or asynchronously, load data on demand, set up caching rules, and even extend the system to write your own indirection rules. You can use Data Registries in combination with the Game Features and Modular Gameplay plugins to bring in whole Data Registries or data sources to populate existing Data Registries.

image alt text

The Data Registries plugin currently supports both standard data tables and curve tables.

Unreal Engine as a Library

Unreal Engine as a Library makes it possible to build the UE4 runtime as a library and interact with it through a minimal, built-in API with the following capabilities:

  • Runs UE4, optionally accepting a command-line and a client window where the engine should send its output.

  • Updates (or "ticks") the engine, giving you control over when it runs.

  • Receives Windows messages for interprocess communication with the engine.

  • Shuts the engine down when you are done with it.

You can also expand the API to suit your needs, exposing existing or new functionality for external use.


The Georeferencing plugin associates physical locations, like an area of a planet's surface, with virtual locations, like UE4 levels. UE4 supports geographic, geocentric, and projected Coordinate Reference Systems to map real or fictional locations, including support for systems such as latitude/longitude and UTM coordinates, to your in-engine levels. You can convert coordinates between four coordinates systems:

  • The Unreal Engine coordinate system.

  • A Projected Coordinate Reference System (CRS) of your choice.

  • A Geographic CRS of your choice.

  • The standard Earth-Centered, Earth-Fixed (ECEF) CRS.

image alt text

Because the system is not limited to real-world, or even realistic, locations, you can use it to describe locations in any large world, round or flat, with consistent spatial relationships.


Online Subsystem EOS Plugin

The Online Subsystem interfaces in UE4 now support Epic Online Services (EOS). Implementations are available on desktop, console, and mobile platforms, and support cross-platform online functionality for games that want to use these features. Some of the available functionality includes:

  • Authentication flows both with and without Epic Account Services (EAS) as well as authentication through third party providers.

  • Functionality for the Epic friends list, including social interactions supported by the overlay UI along with player info and presence updates.

  • Managing and joining sessions, using both matchmaking and direct invites.

  • Multiplayer lobbies.

  • Stats, leaderboards, and achievements offer player progression.

  • Title-generated files and per-user cloud saves.

  • Store product enumeration and purchase checkout functionality for in-game commerce.

  • Dedicated servers and player hosted matches, along with built-in support for peer-to-peer connections.

Voice Chat EOS Plugin

UE4 now supports the new EOS voice service using the available Voice Chat interfaces. The implementation is available on desktop, console, and mobile platforms, enabling cross-platform voice communication.

With the new Online Subsystem EOS plugin, you can activate voice chat for lobbies, which will enable participants to automatically join the corresponding voice channel. The system automatically creates an IVoiceChatUser interface that you can access through Online Subsystem EOS for further interaction and updates with the lobby voice channel.

Users migrating from the Vivox VoiceChat plugin should see that EOS VoiceChat plugin implements the same IVoiceChat and IVoiceChatUser interfaces, and can be driven in the same way.


Quartz for Dedicated Servers

Quartz can now run without an audio device. This new feature provides the ability to run Quartz on a dedicated server. If there is no Mixer Device present, Quartz clocks will be updated by UObject tick instead of the Audio Engine.

Quartz Quality of Life Updates

Quartz has new Clock Handle Blueprint functions that provide audio designers with quality of life improvements - including starting, stopping and pausing the current clock. Quartz can also start another clock on a sample accurate boundary, so audio designers can switch between the two clocks at runtime. This can be used to facilitate time signature changes by seamlessly switching to another clock.

"NONE" has been added as an option to the Quantization enumeration to allow Quartz commands to execute as soon as possible. This can be used in conjunction with the new "Reset Transport Quantized'' Blueprint function to hard-reset the clock to stay in sync with external devices.


FXAA and TAA for Mobile

Fast Approximate Anti-Aliasing (FXAA) and Temporal Anti-Aliasing (TAA) are both now available in the Mobile renderer. You can use these by enabling Mobile HDR and following the same steps to use these anti-aliasing post-processes on a desktop device.

Improved Mobile Deferred Renderer Performance

The Mobile Deferred Renderer's performance and stability are significantly improved, and it runs on a wider range of Android devices. It also now supports Light Functions, IES light profiles, and simple lights.

Visual Studio Debugging for Android

Android projects can now use the Visual Studio debugging workflow. When you install Google's AGDE plugin for Visual Studio, Unreal Engine will enable it internally when you create an Android project. You can then use it to deploy and debug projects directly from Visual Studio.

Android Memory Profiler Support

Unreal Engine 4.27 now exposes Unreal's memory allocators to the Android memory profiler via Google's development library. This makes it possible to use the Android memory profiler for Development, Test, and Debug configurations without the need for workarounds. For more information about how to use the memory profiler in Android Studio, refer to Android's documentation on the Native Memory Profiler.

Android Quality of Life Updates

When you generate a project for Android Studio, it automatically sets the debugger type to Dual (C++ and Java), and sets up native visualizers for Unreal data types. This fixes issues with native string visualization in Android Studio, and makes Unreal data types available without needing to perform any extra setup in your Android Studio projects.


Movie Render Queue

image alt text

A new export format has been added to the Movie Render Queue in the form of the Command Line Encoder. The Command Line Encoder can be used to create your own output format from 3rd party software, such as FFmpeg.

image alt text

The Object ID render pass has been improved, adding support for grouping ID's in a variety of ways. You can now group your objects based on actor name, material, folder, and more.

image alt text

Sequencer Interface Changes

To improve ease of event track navigation, we have added a shortcut to opening the Event Track's Director Blueprint in the sequencer toolbar.

image alt text

In addition to the Start Record button in the Take Recorder tool, we have now also added the button to Sequencer's playback controls. Sequencer's record button allows recording of any selected Actor into the current sequence, and does not require the Take Recorder window to be open.

image alt text

When the Movie Render Queue plugin is enabled, you will now have the option to choose which renderer you want to open when clicking Sequencer's Render button. You can either specify Movie Render Queue or the legacy renderer.

image alt text

Template Sequence Property Multipliers

Template Sequences now support multiplying properties. Property multipliers will allow your template sequence instances to have varied intensities, while still referencing the original asset.

Gameplay Cue Track

A new track has been added to Sequencer to allow for triggering notify states on Actors built using the Gameplay Ability System. Like notifies, the Gameplay Cue Track can utilize range-based events or trigger-based events.

image alt text

Various options exist on the cue to customize how it is triggered, including controls for the instigator, location, or attachment.

image alt text

The Gameplay Cue Track requires the Gameplay Abilities Plugin to be enabled in order to use.

image alt text

Niagara Visual Effects

Module Versioning

You can now version a module, function, or dynamic input. This gives you flexibility when making your own modules, since you can set the functionality and then save it to a version number. When you create new versions of a module, those new versions become available to users.

The first time you add the module to your Niagara system, it will use the version designated as exposed. As new versions are added to that module, you will have the option to upgrade to new versions or revert back to previous versions.

image alt text

This feature also includes python integration to automatically transfer existing inputs to any new module version on upgrade.

For more information, read the page Module Versioning in Niagara. [Insert link to new feature page]

Behavior Examples

Starting in Niagara 4.27, when you create a new Niagara System you will see a new tab called Behavior Examples. These examples are designed as very simple Niagara emitters that show one aspect of Niagara. This can help new learners to understand the technology.

image alt text

Niagara Debugger

A new panel has been added to the Level Editor called the Niagara Debugger. This panel gives you the ability to understand and debug Niagara simulations in your level and see what is happening at runtime.

image alt text

You can toggle the Debug HUD on the viewport to display information about the Niagara simulations in your level.

You can pause the simulation, or play it at slow speed to see what is happening over time. When you activate slow motion in the Niagara debugger it only slows down the Niagara particle simulations in the level, the rest of the level plays at regular speed. You can also turn on a data readout of each individual particle.

Debug Drawing

There is a new Debug Drawing option on some modules such as Sphere, Box, and more. When enabled, it will show a visual representation of the module. You can then debug your system and adjust the parameters of the module as needed.

If Debug Drawing is available on the module, a blue box will appear to the left of the checkbox on that module. To enable Debug Drawing, click on the box.

image alt text

If you have Debug Drawing enabled on more than one module, you will see a drawing for each shape.

Debug Drawing can also be used to track the path of individual particles. The below example shows what it looks like on a fluid simulation.

You can also add Debug Drawing to your own custom modules.

To find out more, refer to Debug Drawing [add link to Feature page].

Mesh Arrays in a Mesh Renderer

You can now add more than one mesh to a Mesh Renderer. By adding more than one mesh, you are creating a Mesh Array. You can either randomly spawn particles of those meshes, or you can use them in a sequence as a flipbook.

To add more than one mesh, select the Mesh Renderer. Click on the plus sign to add an additional mesh to your renderer. You will notice that each mesh is assigned an integer value starting with 0.

image alt text

To create particles randomly using meshes in the array, click on Initialize Particle. You can now set Mesh Renderer Array Visibility Mode to Random and select the renderer you want to use in Source.

image alt text

You will now find the attribute particles.meshindex which you can drag into your Niagara system. For example, if you want to have the particles change randomly over time then you can drag particles.meshindex into the Particle Update group. You can then set the MeshIndex parameter to Random Range Integer and have it cycle through as many integers as you have meshes set in your renderer.

In the Mesh Renderer there is a section for you to set the array as a flipbook if you have a series of meshes that should cycle over time. The meshes should be named matching the Flipbook Suffix Format, which by default is set to _{frame_number}.

image alt text

To further explore this you can add a Behavior Example called Mesh Array to your Niagara System.

Curve Editor Workflow Enhancements

The Curve Editor within Niagara has been updated to match the curve editor used in Sequencer. This gives you more advanced editing tools to adjust keys and retiming.

The Curves panel has been redesigned to show a hierarchy of all the curves in the system. You can search through the hierarchy and pin curves that you want to have quickly accessible. Double-clicking on a row in the curve overview will open up that module in the Selection panel.

image alt text

Inline curve editors, which are displayed in the Selection panel, have also been updated.

image alt text

image alt text

Click on curve Templates to quickly apply commonly-used curve shapes. You can also navigate quickly through keys using the arrow buttons at the bottom of the Curve editor.

You can also create your own curve templates in the Project Settings if you have a commonly-used curve that is not already a preset.

There have also been performance improvements on the Curve Editor in this version, resolving an issue that was causing slowdown when dragging keys.

Parameter Definitions

There is a new asset in Niagara called Parameter Definitions. You can create a Parameter Definition to define default values and descriptions for any number of System, Emitter, or Particles namespaced parameters. These default values and descriptions can be referenced in Niagara Emitters, Systems, and Scripts.

Any reference to a Parameter Definition in another Niagara asset is automatically subscribed, or linked, to any changes made to the parameter in the Parameter Definitions asset. For example, you could use this to automatically push changes to a parameter's name, default value, and description out to all references of that parameter.

Ribbon Shape Presets and Customizability

In previous versions, the Ribbon Renderer would always output a flat plane for the ribbon. Now, you can choose between a plane, multiple planes, a tube, or input vertices for your own custom shapes.

To enable these options, see the new section in the Ribbon Renderer called Ribbon Shape.

image alt text

Depending on the type of shape you have selected, different options become available to adjust the shape. Keep in mind when trying these options that you may want to set the Facing Mode in the Ribbon Renderer to Custom instead of Screen.

image alt text

In the Initialize Ribbon module, you should set Ribbon Width Mode and Ribbon Facing Mode to be Direct Set.

image alt text 4

Along with these additional options, you can also set new parameters to help reduce artifacts in ribbons. When Ribbon Shape is set to Plane or Multi Plane, you can adjust the Width Segmentation Count to add additional vertices to the mesh so that it deforms more smoothly. When Ribbon Shape is set to Tube, you can adjust the Tube Subdivisions to add more vertices to the tube.

Script Stats Panel

You can use the Niagara Script Stats panel to compile your Niagara system for different platforms within the Niagara editor. This will give you information on any platform-specific errors without the need to cook. This is particularly useful when working on GPU systems where PSSL is more strict.

image alt text

Select Node

There is a new node for Niagara scripts called the Select node. This replaces the now-deprecated IF node. You can specify a selector type (integer, bool, or enum). You can also select various values at once. Depending on the value that is input into the Select node, it will output a value.

image alt text

The above example shows a Select node set to boolean. It will check to see whether a given input is true or false.

If the Select node is set to Int32, then you can click on the + sign to add an integer or the - sign to remove one.

image alt text

You can also create a Select node from a list of Enums. In this following example, the Select node is created from Scale Sprite Size. It is then populated with all of the options that Scale Sprite Size could be set to.

image alt text

Hash Functions

There are two new nodes for hash functions, Hash Integer and Hash Float. By providing a set of integer inputs, they will output a random value. The difference between the Hash functions and the Seeded Random is that given the same inputs, Hash will always output the same value even across function calls. In contrast, Seeded Random will generate a consistent value per function call.

image alt text

Niagara User Experience Updates

There have been a number of user experience improvements across the Niagara editor. This is included but not limited to:

  • Auto-fill all options is now available in the Filtered Bones and Filtered Sockets lists for Skeletal Meshes.

  • Hotkey support for Niagara: J and K to cycle forwards and backwards in playback. S to isolate selected emitters. D to disable selected emitters.

  • New and improved menus for Niagara scripts, modules, and dynamic inputs.

  • Added a Library Only checkbox to the script actions menus.

  • Suggested feature that lets you pre-label an asset as Suggested. These actions will appear at the top of the list as a section during search. In the case of dynamic inputs and modules they show at the top without searching.

  • Many of the data interface functions now show helpful tooltips.

Platform SDK Upgrades

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

image alt text

  • Windows

    • Recommended:

      • Visual Studio 2019 v16.5

    • Minimum:

      • Visual Studio 2017 v15.6

    • Windows SDK 10.0.18362

    • NET 4.6.2 Targeting Pack

  • IDE Version the Build farm compiles against

    • Visual Studio - Visual Studio 2017 v15.9.4 toolchain (14.16.27023) and Windows 10 SDK (10.0.18362.0)

      • Minimum Supported versions

        • Visual Studio 2017 v15.6

    • Xcode - Xcode 11.1

  • GDK

    • Windows SDK: 10.0.19041.0

    • GDK: April 2021 QFE2

    • Firmware Version: Recovery May 2021 QFE1 10.0.19041.7772

    • Supported IDE: Visual Studio 2019

  • Android

    • Android Studio 4.0

    • Android NDK r21e

      • NDK r20b is also supported to address compatibility issues on some low-end devices.

  • ARCore

    • 1.24

  • ARKit

    • 4.0

  • Linux "SDK" (cross-toolchain)

    • v18 clang-11.0.1-based (CentOS 7)

  • Oculus

    • 27.0

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.6.2

  • Lumin

    • 0.24.1

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 12.3.2 + optional NEX 4.6.6

    • Minimum Firmware Version: 12.0.2-1.0

    • Supported IDE: Visual Studio 2017, Visual Studio 2019

  • PS4

    • Orbis SDK 8.508.001

    • System software 8.508.021

    • Supported IDE: Visual Studio 2017, Visual Studio 2019

  • PS5

    • Prospero SDK

    • System Software

    • Supported IDE: Visual Studio 2017, Visual Studio 2019

  • XboxOne

    • XDK: July 2018 QFE-13

    • Firmware Version: Recovery February 10.0.18363.9135

    • Supported IDE: Visual Studio 2017

  • macOS

    • Supported

      • macOS Catalina 10.15.7, Xcode 12

    • Recommended

      • macOS Latest Big Sur, Latest Xcode

    • Minimum

      • macOS Mojave 10.14.6, Xcode 11.3.1

    • 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

    • Recommended

      • Latest Xcode 12

    • Minimum

      • Xcode 11.3.1

    • Supported Target SDK versions 12.00 - 14.xx+

Release Notes



  • AIPerceptionSystem's class method RegisterAllPawnsAsSourcesForSense has now been marked as virtual.

  • Added an optional "FName Tag" to AISense_Damage, which gets propagated to the PerceptionSystem from AIStimulus.

  • The Environment Query Editor is now an engine plugin that is enabled by default; Individual users are no longer required to enable it through the experimental settings. The editor is still considered experimental and disabling the plugin will remove access to the feature.

  • Moved AI domain automation tests to 'System.AI' over from 'System.Engine.AI'.

  • Removed AIController dependencies of the AIPerceptionComponent and now it can be used with non-AI agents.

  • Made the UE4ML plugin public. Engine/Plugins/AI/UE4ML/README.md contains the basic documentation.

  • Switched AIPerceptionSystem's stimuli aging from previously using a timer to now counting elapsed time. In normal circumstances this doesn't make any difference, however, this change does help when trying to use the perception system in replays where UAIPerceptionSystem::StartPlay ends up not being called.

  • Added a blueprint-callable function to AIPerceptionComponent.GetPerceivedHostileActorsBySense and the native alternative GetHostileActorsBySense in addition to a new flexible filter GetFilteredActors that can use any arbitrary predicate for filtering.


  • Bit fields located in the PawnAction class have been optimized to pack into a single 32 bit allocation.

  • Added a tiny optimization to avoid calling AIPerceptionSystem.OnNewPawn when the perception system is configured to not care about new pawns.

Crash Fix:

  • Fixed a crash which occured when a new empty generator is added to an EQS query template while an EQSTestingPawn is using it.

Bug Fix:

  • Dynamic EnvQuery graph node titles will now update correctly when properties in their details panel are changed.

  • Initializing AI related USTRUCT data types will no longer have uninitialized fields.

  • Fixed calling AIPerceptionComponent methods SetSenseEnabled and UpdatePerceptionWhitelist when there is no SenseConfig registered.

  • Fixed UAIPerceptionStimuliSourceComponent's issues with unregistering from all senses if RegisterForSense has already been called during its lifetime.

  • Fixed issues in AIPerceptionComponent where perceptual data associated with actors were no longer valid and being broadcasted through delegates.

Behavior Tree


  • Tick text on Blueprint BT Services that don't have a Tick implementation are now hidden.

  • Added the capability to categorize Blackboard Variables.


  • Added validation on instance arrays (aux nodes, parallel tasks and memory) to update stats properly and to prevent modifications while iterating through them.

Bug Fix:

  • Added minor BTDecorator_Loop fixes:

    • Loop will now force at least 1 execution.

    • Prevented the number of remaining executions from becoming a negative value.

    • Remaining time is now properly displayed.

  • Fixed an issue where iterating through active nodes would sometimes cause a node to be deactivated.

  • Fixed an issue where the BT evaluation of a Conditional Flow Abort skips a higher priority state if the evaluation triggers another Conditional Flow Abort in the previous state.

  • Fixed an issue where a BT task was being executed even though it had lower priority than another task higher in the hierarchy.

  • Fixed a computation issue of a child execution index of a composite node when the child is a task node with services.

Debugging Tools


  • GameplayTasks debug data is now available when being compiled with developer tools.

  • Added the ability to select the local player for debugging in GDT through the command "gdt.SelectLocalPlayer".

Bug Fix:

  • [VisualLogger] Timeline fixes:

    • Prevented a freeze when trying to pan after zooming in.

    • Prevented panning below 0 by initializing the clamp range to the view range.

    • Prevented changing the zoom factor while panning outside the clamp range.

    • When using the right mouse button the Timeline will no longer snap to the closest element as it interferes with panning.

    • Removed the zoom sensibility due to the possibility of becoming stuck at a given zoom factor.

  • Fixed a bug in FVisualLoggerFilters::MatchCategoryFilters that resulted in log lines being filtered out if their category couldn't be found in FVisualLoggerFilters.Categories.

  • Fixed an issue where the EQS composite generator was not displaying CPU stats correctly.

  • Fixed an issue where clearing debug data would not properly clear the stored EQS debug drawing text.


  • Added an option to debug draw poly flags and area flags in Recast Debug draw.

  • Added documentation tips to optimize Navmesh generation speed.

  • Added a templated RecastAStarGraph implementation so users can modify pathfinding logic using Recast Navmesh data.

  • Added the Console variables ai.debug.nav.refreshinterval and ai.debug.nav.displaysize to control the refresh rate and the size of the displayed area in the Navigation Mesh.

  • Added logs to track the geometry added when generating navmesh tiles.


  • Fixed the convex element export in the NavModifierComponent to improve the precision of navmesh generation around those elements.

Crash Fix:

  • Fixed a crash that occurred when changing navmesh generation parameters.

Bug Fix:

  • Fixed an issue where the Navigation Mesh was making the current map "dirty" on load without any user action.

  • Fixed an issue where unloaded levels were being added to the NavOctree, impacting the Navigation Mesh.

  • Fixed NavMesh method ‘closestPointOnPolyInTile' from returning the incorrect height.

  • Fixed missing Navmesh tiles when cooking Maps from the Editor's 'Launch' option.

  • Fixed the computation of the vertice count between mesh and detail mesh when creating the BVTree in DetourNavMesh.

  • Prevented the Navigation Mesh from being removed when a level is saved without a Navigation System.



  • Added debug draw control support to the Control Rig Component.

  • Added support to bind a groom on a GeometryCache.

  • Added support to frame interpolation for subframe sampling to USD mesh animations.

  • It is now possible to import an animated groom through Alembic as a GroomCache asset and play it back on its associated Groom asset through the Groom Component.

  • Converted SkinWeightProfile scalability settings to CVars in order to be set through Device Profiles rather than Scalability settings.

Crash Fix:

  • Fixed a potential crash with Level of Detail Material mapping which occurred during a Skeletal Mesh merge.

Bug Fix:

  • Fixed Cyclic Coordinate Descent Inverse Kinematics (CCDIK) rotation limits in Control Rig Component.

  • Fixed virtual bones being generated on animations that don't animate them.

Animation Assets

Crash Fix:

  • Removing unused bones from the Skeleton no longer causes a crash.

  • Disabled Supplemental Streaming SIMD Extensions 3 (SSSE3) instructions, which was causing crashes when loading MetaHuman Creator assets on older CPUs that don't support SSSE3.

Bug Fix:

  • Fixed a CHECK_PUREVIRTUALS error in AnimMontage.h

Animation Blueprints

Crash Fix:

  • Fixed a crash ending PIE when a sequence is playing and is driving an Animation Blueprint with a Spring Bone Controller active.

  • Prevented a crash when re-selecting a group of trail nodes.

Bug Fix:

  • Output pose now initializes when no sources are present.

  • The Animation Blueprint Transition warning when the rule is bound is fixed. Pins are automatically disconnected if they are replaced with a bound rule.

  • RandomPlayer anim node will now support blend in times that are less than the frame delta, including 0.

  • Re-ordered AnimInstance's property access class method to copy after Event Graph methods in order for properties to be correctly transformed when accessed from Blueprint functions.

  • Fixed an uninitialized struct member in Property Access.

  • Fixed curve weights out of bounds access in the Inertialization node.

  • ControlRig AnimNode's exposed pins will now have the correct default values as specified in the source Control Rig Blueprint.

  • Fixed warnings about missing variables making property accesses non-functional.

  • Prevented memory corruption caused by unconnected pins on Control Rig nodes.

  • Fixed Animation Blueprint compiler issues occurring with collapsed graphs and isolated errors in state transitions.

  • Property Access nodes will now be able to generate unique property names.

Animation Tools

Crash Fix:

  • Fixed a crash from occuring when re-opening an Asset Editor after a new preview mesh is applied.

Bug Fix:

  • During the retargeting process, curves now copy correctly on child Animation Sequences.

  • Fixed Asset import path issues during the retargeting of Animation Sequences.

  • Fixed debug drawing of raw animation bones in Persona when component has post process or sub anim instances.

  • Changed layout of Animation Graph overrides to improve readability.



  • Improved motion blur for GeometryCache.

  • Improved support for GeometryCache starting with empty frames, such as fluid simulation, explosion, and other effects.

Crash Fix:

  • Fixed crash that would occur when importing a SkeletalMesh from Alembic with the "Merge Meshes" option.

Bug Fix:

  • Removed invalid Motion Vectors when importing GeometryCache with the option "Import Abc Velocities As Motion Vectors". This results in cleaner subframes.

Skeletal Mesh


  • Added ENGINE_API Macro to Export SkeletalMeshVertexClothBuffer's Initialization method.

Crash Fix:

  • Fixed a crash which occured from concurrent access to a Skeleton's smart name map.

Bug Fix:

  • Fixed a conversion issue between signed and unsigned integer structs.

  • Added additional safety checks to ensure the bone transform is not being accessed out of bounds.


  • Removed deprecated Skeletal Mesh Component check for Lerp Curves.



  • Enabled the deletion of existing Quartz Clock Actors from Blueprints.

  • Added more efficient search options for Audio Streaming Cache.

  • Added Audio Modulation support for Sound Submixes from their Output Volume, Wet Level, and Dry Level properties.

  • Added new static gameplay functions to prime sounds for audio stream caching.

  • Updated Quartz with the ability to query for the duration of time that a given number of Quantization Type events will run based on the clock's sample rate and time signature settings.

  • Made Blueprint-accessible versions of audio-utility functions that were previously only available in C++, including:

    • GetFrequencyFromMIDIPitch

    • GetMIDIPitchFromFrequency

    • GetPitchScaleFromMIDIPitch

    • GetGainFromMidiVelocity

    • ConvertLinearToDecibels

    • ConvertDecibelsToLinear

    • GetLogFrequencyClamped

    • GetLinearFrequencyClamped

    • GetFrequencyMultiplierFromSemitones

    • GetBandwidthFromQ

    • GetQFromBandwidth

  • Added radius as a channel position parameter within the sound field format API.

  • Added a new log category for stream caching to independently control log levels from the logaudio category.

  • Added a Quartz function to return the current transport in a human-readable format.

  • Added a Quartz function that returns the time since a specified Quartz clock was last reset.

  • Added booleans to enable Base Submix, Submix Sends, and Bus Sends on Sound Base objects. These booleans replace the previous "Output to Bus Only" parameter. Assets created prior to 4.27 will be updated automatically.


  • Reduced memory overhead when using SoundCues by pruning branches that do not match the cooking target's quality level.

  • Added major optimizations for exhaustive search code path in Audio Stream Caching.

  • Raised maximum value for max global pitch scale.

Crash Fix:

  • Fixed crashes in Quartz when calling FQuantizedPlayCommand::OnFinalCallbackCustom().

  • Fixed crashes caused by race condition when adding new clocks to low-rate Quartz.

  • Fixed crash issue when Audio Modulation is enabled in an editor running using -nosound.

  • Fixed an issue where using a Submix Effects chain in Blueprints would cause a crash if no Submix Effects Preset was found.

Bug Fix:

  • Fixed issue where Sound Classes would sometimes load before certain referenced types could be known, breaking those referenced assets

  • Added fix to prevent rare memory stomp within 2DChannel map.

  • Fixed issue where sometimes a "divide by zero" check would get triggered if Quartz was using very high BPM.

  • Fixed ensure caused by clocks not being removed during Quartz Clock Manager shutdown.

  • Fixed issue with Vorbis in which it failed to load streamed data before the initialization phase was over. This primarily impacted Multichannel streams where the initial pages couldn't fit into 6 KB.

  • Fixed issue that caused activated reverbs to not be set.

  • Fixed channel-order issue when using 5.1 and streaming sounds.

  • Fixed an issue where the multi-channel source bus was using the number of frames instead of the number of samples.

  • Fixed a wrap-around issue on imported .ogg Vorbis files.

  • Fixed issues when importing audio files with higher than 16 bits.

  • Fixed an issue where restarting in virtual mode would not properly reset the active sound cue and playback time.

  • Fixed an issue where the multi-channel TSampleBuffer was using the number of samples instead of the number of frames.

  • Added a warning when applying a submix effect to a submix that doesn't exist.

  • Fixed an issue with "soloaudio" persisting in the Content Browser.

  • Added a fix for NaN appearing within the GetLogFrequencyClamped and GetLinearFrequencyClamped functions.

  • Added DLL exports to Audio Modulation statics.


  • USoundBase::GetDefaultSoundClass() has been removed. Any references can be replaced with USoundBase::GetSoundClass() or UAudioSettings::GetDefaultSoundClass().



  • Added a Perforce helper to revert / delete multiple files at once.

Bug Fix:

  • Fixed the Replace All Reports feature in the Test Automation window not functioning the first time it is used.

Control Rig


  • Prevented duplicate curves from being added when importing curves into Control Rig

Crash Fix:

  • Fixed a crash that occurred in cook builds that contain Full Body IK and Control Rig nodes.

  • Fixed a crash in Control Rig Editor that occured when connecting a sub-pin of a Get Variable Node to a Set Variable Node's value pin.

Bug Fix:

  • Changing pin values in Control Rig will now trigger the necessary recompile.

  • Control and Space will now work correctly with the "Add Mapped Elements" Blueprint function for the Control Rig Component. \

  • Fixed jittery movement animation when using Control Pin Value on the ModifyTransform Node's pin.

  • Prevented watched pins from causing ControlRig Editor to keep marking a ControlRigBlueprint as dirty after being saved.



  • Commandline argument "-buildmachine" now propagates to subprocesses (like ShaderCompileWorker) started by the engine.

  • The package difference test commandlet now produces a hexdump when differences are found.

  • In the editor preferences the "Enable Live Coding" option no longer requires an editor restart to take effect.

  • Improved feedback to Live Coding when it would not start due to a prior hot reload.

  • Added messaging about delays to live coding to accommodate cases where the Unreal Editor has stopped in the debugger when a system using a large number of processors.

  • Improved live coding feedback in the Unreal Editor when compiling is initiated using the keys Ctrl-Alt-F11.

  • Updated messaging when live coding is enabled after using hot reloading.

  • Moved live coding warnings from the live coding window to the log.

  • Fixed misleading comment on PostLoadMapDelegate function.

  • Added a UTickableWorldSubsystem as a base class for all world sub systems that need to be ticked along with their world. This is now the preferred method for UWorldSubsystem that also inherits from FTickableGameObject as it prevents some common pitfalls. By default:

    • It implements FTickableGameObject::GetTickableGameObjectWorld to return the subsystem's world.

    • It prevents the subsystem from ticking as soon as the subsystem is deinitialized.

    • It prevents the subsystem's CDO from ever ticking.

  • Improved performance for Unreal Insights Timing View when having a large number of frames.

  • Editor asset tagged property loading is now more resilient by seeking the expected end position and logging an error, as opposed to setting the archive into an error state.

  • Added new WIN32_WINDOWS macro to avoid a compiler error in SwitchBoardListener.

  • Added support for UE as a Library, which enables external applications to run and control their own UE4 instance.

  • Operator new overloads will now always allocate at least one byte.

  • Added new alignment-aware C++17 new/delete operator overrides.

  • Extended FGenericDataDrivenShaderPlatformInfo settings to support "opt-out" settings by adding the ability to set default values.

  • Setting GIsRequestingExit on the start of Engine Tick is now disabled unless SET_REQUEST_EXIT_ON_TICK_ONLY is enabled.

  • IoStore Diff command - helper is a command to diff two sets of container files. An example use:


  • Added FPackageName overloads for FAnsiStringView.

  • A new package option to specify the URL to where crash reports will be sent, in cases where the crash report client is packaged with the game. This option can be found in the advanced package options, by default crash reports from the Editor are sent to Epic unless otherwise specified.

  • Support for single quotes around attributes has been added in the FXmlFile.

  • IoStore command to List container files to csv. An example use:

    -List=<ContainerFileNameOrWildcard> -csv=<filename> Outputs <PackageId, PackgeName, Filename, Container, Offset, Size, ChunkHash>

  • Included the name of the slowest unit test in a warning log for when a less than two second smoke test run time is executed.

  • Added coarse parallel name batch loading.

  • Added C++17 structured binding support for TTuple.

  • The TWeakInterfacePtr<T> class now has an API that is more consistent with the weak object pointer class.

  • Enabled comparison of string views of different types Compare, Equals, and the associated operators are now supported for any pairs of string views and C-style strings that FPlatformString has a comparison function for.

  • Added additional descriptive information to FMallocBinned2 asserts when they fire.

  • The Engine can now build successfully with CHECK_PURE_VIRTUALS enabled in order to verify that all PURE_VIRTUAL functions are correctly implemented in subclasses. UClasses that use PURE_VIRTUAL must be marked abstract and UStructs that use PURE_VIRTUAL must have the WithPureVirtual trait set.

  • Added RetainedRef Template to be used as a function parameter when the reference will be held beyond the length of the call, causing a compile error when passing an rvalue.

  • Added find functions for string views.

  • In FPropertyTextUtilities, the TextToPropertyHelper method can now have PortFlags specified.

  • Extended MakeValue and MakeError to take a variable number of arguments.

  • Added FNameBuilder to simplify passing FName to functions that take FStringView.

  • Changed DDC CachedDataProbablyExists to skip slow cache backends.

  • Allow copy constructor and assignment of ValueOrError template.

  • Smoke test responsible for finding uninitialized struct members will now also try to construct all structs with 'new FMyStruct' syntax to find properties that are uninitialized despite their struct having a custom default constructor.

  • Added const access to source in the String Reader.

  • Added command line options to PerfReportTool "-Add -cleanCsvOut <filename>", for writing out a standard format .CSV file with events stripped.

  • Added wildcard support to PerfReportTool for metadata filter values.

  • Recompiled CSV tools as 64-bit.

  • Added PerfReportTool SummaryMetadata disk cache support. This skips CSV processing entirely for files already in the cache, which is significantly faster for bulk queries.

  • Added PerfReportTool Scrollable summary tables with the command line option "-scrollableTable". This makes the summary table scrollable, with frozen first rows, columns, and automatic colorization. These are useful for historical data tracking.

  • Added Csv.bin compression support. Run CsvConvert with pass -binCompress 1 or 2 to enable compression on .csv.bin files.

  • Updated clang atomics to use newer atomic functions in favor of sync and added support for 128-bit atomics for platforms that support it.

  • Added Support for multiple wildcards in arbitrary positions has been added to CsvTools. Wildcards can be used for PerfReportTool reports and CsvToSvg stat lists.

  • Added a checkpoint heartbeat hang detector to help diagnose issues such as infinite loading screens.

    • This detects cases where all the main threads are ticking but the high level logic is stuck.

    • Adds calls to ThreadHeartBeat class methodMonitorCheckpointStart and MonitorCheckpointEnd to use.

    • If it takes longer than the threshold to reach MonitorCheckpointEnd, a fatal error will be thrown.

  • Added MakeBinaryConfig commandlet. This will optionally run at stage time to generate a BinaryConfig.ini, which if present at runtime will load up ini files.

    • Can be enabled in Packaging settings, or -makebinaryconfig option to BuildCookRun.

    • Can use -textconfig at runtime to go back to non-binary config files.

  • Added const access to source in String Reader.

  • Removed several low-value/high-frequency profiling scopes to improve performance and stability while capturing.

  • FObjectIterator has now the option to lock the global UObject array when it's iterating over it to prevent thread safety issues when iterating over all objects while other threads are creating new UObjects.

  • Added cvar ‘Engine.DelayTrimMemoryDuringMapLoadMode' that will delay calling TrimMemory until the end of LoadMap.

  • a CsvProfiler stat for 2d camera speed has been added to Profiling.


  • Asset registry optimizations have been made to reduce Engine initialization time.

  • Optimized the time required to resolve call stack symbol names on Windows OS. The Engine now loads and caches the debug symbols on demand rather than loading all debug symbols at once on the first request.

  • Asset registry optimizations have been made to reduce Engine initialization time.

  • Optimized FName batch loading and added FArchive batch serialization

  • Saved one-hundred and twenty milliseconds to next gen load time by removing superfluous sleeping on a critical path.

  • Optimized Cooked AssetRegistry loading optimizations.

  • Improved performance of GetSubSystem calls from C++ code.

Crash Fix:

  • Fixed crashes when running commandlets with -noshadercompile argument.

  • Fixed crash when polling to see if a UTexture is ready for PostLoad while it is processing it's texture data on a background thread.

  • Fixed a crash that could occur if an imported package was garbage collected during loading.

  • Fixed hot reload crash caused by EInternalObjectFlags' PendingConstruction function.

  • Fixed possible crashes when loading Blueprints with circular dependencies.

  • Fixed a crash in UnrealHeaderTool when parsing a BlueprintImplementableEvent with an int64 return type.

  • Fixed a crash that occurred when working with map instanced properties if the map's sparse storage has gaps.

  • Fixed a crash from occuring when decryption of a pak signature fails.

  • Fixed a crash which occured when running commandlets with the -noshadercompile argument.

Bug Fix:

  • Fixed an issue where files were not getting cleaned after hot reloading.

  • Fixed debugger support in Live Coding to properly display FName values.

  • Garbage Collection will now treat cluster objects with Internal Object Flags set to Garbage Collection Keep, the same way as if they are in the root set to prevent them from being destroyed while being referenced by the async loader.

  • Fix for non-unity build of BuildPatchTool.

  • Fixed automated test compiler error in shipping builds.

  • Fixed hot reloading where a change would not be detected due to a mismatch between how Unreal Editor and Unreal Build Tool formatted the module name.

  • Fixed an error where changing projects from the Unreal Editor which had been "Quick Restarted" from the live coding console would result in the Unreal Editor failing to start properly.

  • Fixed multiple issues where live coding would fail to compile code changes.

  • Fixed issue where live coding fails to compile changes when both the editor and game are running.

  • Fix for uninitialized variables.

  • Fixed the building of the live coding console in non-unity builds.

  • Fixed a compile issue in the live coding console when building without pre-compiled headers.

  • Fixed misaligned noexport structs.

  • Fixed Missing initializers for bool members in source control.

  • Added a missing call to the EngineSubsystemCollection Deinitialize method when on engine shutdown is invoked.

  • Missing initializers for bool members in template project defs.

  • Fixed potential race conditions when calling GC'd objects' destructors.

  • GC weak references will now be cleared after gathering unreachable objects as more objects become unreachable during the process.

  • Fixed FString class method SanitizeFloat from returning "0.0" when built under the /fp:fast command.

  • Fixed a hot reload assert when reloading an Engine-derived type.

  • Fixed POSIX platforms not honoring the -log= parameter in forked processes.

  • GarbageCollection: Changed InternalObjectFlag priority to make sure that objects are not being destroyed while being referenced by the async loader.

  • Fixed a memory stomp that occured when comparing file paths.

  • Improved instanced propagation.

  • Creating an FName with FNAME_Find no longer asserts if the name length exceeds the maximum name size.

  • Fixed code generated by UnrealHeaderTool when a const UObject pointer is returned by a UFUNCTION.

  • Fixed a problem in ArrayProperty's SerializeItem method when using a user-defined structured archive formatter, caused by a mismatch between the saving and loading branches when doing unversioned property serialization.

  • Fixed a UnrealHeaderTool error when building a project inside a .tmp folder.

  • FMallocBinned3 will now try to allocate memory from a bigger pool to avoid Out of Memory crashes.

  • Fixed perfect forwarding in the PimplPtr header.

  • Fixed a possible buffer overflow when reporting a failed 'ensure'.

  • Due to Windows 7 no longer being supported by Microsoft, the bundled version of DbgHelp.dll is no longer compatible.

  • Added a missing call to AsyncLoading's class method PumpEssentialAppMessages when processing loaded packages PostLoad and CompletionCallbacks on the GT.

  • TArray's conversion constructor now enables library templates to work correctly.

  • Fixed a parse error in UnrealHeaderTool when a UENUM is deprecated.

  • Fixed a race condition in FMallocLeakDetection.

  • Fixed backward compatibility with 32-bit platforms for LLM tags tracing.

  • Prevented an object from being accessed from weak pointers after it's been destroyed and fixed a race condition between FWeakObjectPtr and Garbage Collection AsyncPurge.

  • Changed the checkSlows to checks in theFixedAllocator template to allow them to detect user error in Development builds.

  • Added static assert to detect inherited Structs which are not polymorphic unless inherited base struct also is polymorphic. If this happens, there are two options:

    • Add a vtable to the superclass (and a virtual destructor), or

    • Remove any virtual methods from the derived struct

  • Fixed IsContiguousContainer template concept checking compile error.

  • We now check that cache keys are valid before they are shortened in the Derived Data Cache.

  • Avoided a stack overflow in FOutputDeviceRedirector.

  • CsvToSVG will no longer throw an exception in multiple CSV mode if a single CSV has missing metadata.

  • Fixed edge cases with stripping by events.

  • Fixed a bug causing an exception in graph generation when the temp directory contained spaces.

  • OutputDeviceRedirector's buffered lines will now only be emptied if there are any output devices to redirect to.

  • Fixed a bug that prevented the PkgInfo commandlet from loading UAsset files.

  • Fixed a potential concurrency issue when renaming objects and enabling UObject hashing error asserts in development builds.

  • Fixed a rare case which a compressed IO read re-using a cached buffer that wasn't intended.

  • A Compiler error with Visual Studio 2019 has been fixed.

  • Async loads from the async loading thread during the final async loading flush will now also be allowed to prevent a safeguard from firing.

  • Async loading will no longer be allowed after the final async loading flush to prevent crashes on exit.

  • Fixed a typo of "Tuesday" in FDateTime.

  • FPackageReader will now copy the Editor only filtering flag from the underlying reader archive to the owning package reader.


  • Deprecated UPackage::Guid.


  • Removed safety check from FUObjectAllocator's FreeUObject constructor.



  • Reduced memory usage of EDLCookChecker in Cooker memory.

  • AssetRegistry EditorOnly dependencies. This change adds different Game and EditorOnly dependencies to the AssetRegistry.

  • Added command -NeverCookDir option to the cook commandlet.

  • Added a cooker parameter which allows DLC cooks to override the platform name used to find and load the development asset registry. Allows different platforms to use a single registry where that makes sense.

  • Added a "-BasedOnReleaseVersionPathOverride" parameter which can be used to override the value generated by GetBasedOnReleaseVersionPath.

Bug Fix:

  • Fixed pathing mismatches in DLC cooking when the cooker executable is built with a unique build environment, so it is not rooted in the Engine/Binaries/<platform>.

Network Profiler

  • Re-added a "Check All Connections" checkbox functionality in network profiler that got removed by mistake.

  • Fixed issues with network profiler graph view not loading if there are fewer than 30 frames worth of data in the profile.

  • Fixed anchoring to work with the "Check All Connections" checkbox.

Unreal Insights


  • Network predication traces can now be examined using the external Unreal Insights application.

Bug Fix:

  • Fixed issues when tracing data from multiple threads.

  • Fixed a crash in NetworkPredictionInsights when jumping in time for a live session.


  • Signed pak files now ensure the validity of the pak file's index.



  • Actor visibility attribute is now serialized. An exporter can decide to export hidden actors that way.

  • You can now add a .neu.* extension (.neu.1, .neu.2, and so on) to a Creo neutral format.

  • A Datasmith scene can now declare new materials that inherit existing Material Instances and override their parameters.

  • Dataprep has been enhanced to allow operators/filters cards to look in the graph.

  • The Dataprep operators/filters palette has a new look and feel.

  • The Dataprep string array in filters has a new look and feel.

  • Cleaned up statistics displayed in the Visual Dataprep 3D viewport.

  • A Plane Cut operator was added to Dataprep.

  • The UI for Dataprep stats has been improved for easier visibility and use.

  • Dataprep now has the ability to horizontally resize action nodes.

  • Dataprep can now collapse a group of actions.

  • Dataprep has a new operator to set collision complexity.

  • The Datasmith Revit Exporter now corrects Structural Steel Connection pivots.

  • In Dataprep, you can now set format-specific import options.

  • Dataprep has a new operator to resize textures.

  • A panel was added to visualize, browse, and select components in Visual Dataprep.

  • Dataprep now has the ability to create a filter from a selection.

  • You can now disable/enable groups of actions in Dataprep.

  • In Datasmith Revit exporter, you can correctly export hierarchy based on Super Component.

  • Datasmith Revit exporter provides Floors and Ceilings pivots at scene origin instead of at their own local pivots.

  • Added support for thin translucency shading models on the Datasmith UE PBR (physically based rendering) materials.

  • Facade now includes an exposed variant API, with bCleanupUnusedElements parameter to FDatasmithFacadeScene::ExportScene().

  • Added AP242 XML Step, XPDM, SolidEdge formats in Datasmith supported file types.

  • Add support for reading FBX metadata into Datasmith when importing scenes from DeltaGen and VRED.

  • Fixed a memory corruption issue on export of scene in 3dsMax exporter.

  • Revit Datasmith exporter now exports luminance color temperature.

  • A processing time control in CADWorker has been added. This prevents a DMU from not being imported due to a referenced file looping. The processing max time is based on the size of the file to process, and its format. Only the blocked file is canceled. This can be disabled with cvar r.CADTranslator.EnableTimeControl=0.

  • In Dataprep, the filter is now updated from Selection with a simpler UI, and uses object/actors path as the unique ID.

  • Update of KernelIO dll with 2021 sp1.2 version. With this new release, the supported version by format are:

    • CATIA V5 (.CATPart, .CATProduct, .cgr) R10 → R31

    • CATIA V6 (.3Dxml) 2011 → 2013X

    • 3D Experience (.3Dxml) 2014 → 2020X

    • Inventor (.ipt, .iam) All → 2021

    • JT (.jt) 7.0 → 10.5

    • Pro/Engineer part files (.prt, .asm) ProE 13 → Creo 7

    • Pro/Engineer neutral files (.neu) ProE 13 → WF5

    • SAT : ACIS (.sat) All → R27

    • Solid Edge (.par, .asm, .psm) All → 2020

    • Solidworks (.sldprt, .sldasm) 99 → 2021

    • STEP (.stp) 203/214/242

    • XT Format (.x_t) All → 32

    • NX / Unigraphics (.prt) 11 → CR 1957

  • Navisworks 2021 is now supported by the Datasmith Navisworks exporter.

  • For PLM XML files, some error messages have been replaced by warning messages when files are prevented from parsing.

  • Added new Collaborative Viewer content: two new templates in Collab Base that use shared resources.

  • Support has been added for a multilingual installer for the Revit exporter.

  • For the Navisworks importer, Mesh Actors for merged geometry are now re-pivoted to the bottom center of the bounding box.

  • Added a Mobility property to the Datasmith Area LightActor:

    • The Datasmith Area Light Blueprint now sets its components (mesh/light) for mobility in construct in accordance with this.

    • Dataprep Set Mobility supports setting ADatasmith Area Light Actor (in addition to the usual Scene Component).

Crash Fix:

  • A crash no longer occurs when an asset referenced by a captured UObject property in the Variant Manager is swapped with an asset of an incompatible class.

  • Fixed a crash that occurred when trying to capture Variant Manager thumbnails from the viewport during standalone mode.

  • No longer crashes when a landscape is imported by Dataprep or reimported from Datasmith.

Bug Fix:

  • Fixed the Variant Manager spawning function director outer ALevel Variant Sets Actors so they always spawn on the persistent world levels instead of on the vestigial worlds of sublevels.

  • Fixed the Variant Manager function directors that were unnecessarily collected and recreated repeatedly.

  • It is now possible to set nullptr values on UObject property captures in the Variant Manager.

  • User-set Material overrides are no longer replaced when reimporting Datasmith scenes in some scenarios.

  • Fixed support for Variant Manager thumbnails using transparency.

  • For DataSmith Content StdMasters:

    • Fixed normals when using triplanar mapping.

    • Fixed POM when using rotated UVs.

    • Added double-sided support to normals.

    • Reduced cost and complexity of triplanar mapping.

    • Tweaked glass master default values.

  • Fixed an issue where Variant Manager visibility changes were not applied to the viewport on some scenarios when the viewport's Realtime property was set to Off.

  • Added the newest decals to be on par with Twinmotion, and fixed a POM issue.

  • Updated decal material usage to avoid material compile failure.

  • FDatasmithSceneCleaner::Clean() will no longer remove materials that are referenced only by a variant.

  • Fixed incorrect exported joint indices when exporting skeletal meshes to USD if the skeleton has a different number of bones than what is used by the skeletal mesh.

  • Fixed an issue in the material generation by a datasmith import. The expression names in the material functions used by a Datasmith-created material are now unique.

  • Emissive master now uses the alpha channel of the Luminance Filter Map as an opacity mask.

  • Tweaked triplanar projection, added panning in triplanar, tweaked glass default values, and added decals material permutations.

  • The following fixes have been made to the Automotive and Architecture Collab Viewer templates:

    • 3D cut plane no longer cuts the model.

    • Added creation of bookmarks at Runtime.

    • You can now load saved states in the editor.

    • Changed the title of the popup window of datasmith runtime load.

    • Removed the Transmission hierarchy in the architecture template.

    • Fixed Reset and Reset All Fail on the Collab Viewer with data imported through runtime Datasmith.

  • Fixed a broken documentation link on the import help button and added an automated test to make sure the link stays valid.



  • Added a custom solution section to allow Visual Assist to identify the solution as an Unreal solution.

Bug Fix:

  • The full path to the VsCode compiler is now specified, as well as command line arguments in the format expected by the compiler.



  • The automated tests report is now more resilient in cases of critical failure or timeout.

    • The JSON report is saved after each test execution.

    • Test artifacts are now copied after each test execution.

    • The HTML report now displays not run and in process test states.

    • Removed the undocumented command line option checkpoint.

Bug Fix:

  • Corrected an issue with degenerate artifact creation. Attempting to create files with the same source and destination folder hierarchies when the Role was null would lead to file errors. These required five 30-second timeouts each to skip when ending runs using -skipserver

  • Fixed an issue with NullPointerExceptions on run when the Configuration's "Build" was null.

  • Fixed automation and gauntlet tests exit code on Unix systems (docker).

    • FPlatformMisc::RequestExit(force = true) caused editor exit with code 1 due to implementation for the UNIX platform.

    • This led to problems in the CI pipelines, the CI stage was sometimes assumed to have failed despite the fact the tests were ok and the tests' status code was 0.

    • Added a simple call of RequestExitWithStatus to correct the problem.



  • Added the AdditionalIoStoreOptions parameter to the UAT ProjectParams class, which lets you supply extra parameters to the iostore commandlet when staging a build.

  • Fixed an incorrect default value being applied for the skipiostore parameter in UAT.

Bug Fix:

  • Corrected the handling of the -skipdeploy UAT \ UBT command. This now reduces the time it takes to Launch the game from the Editor.

  • Fixed staging chunk assignment failing when there were case mismatches between paths in the staging manifest and the pak chunk lists.

  • Corrected a case during project param creation where we still assumed there was a single editor target per project.

Memory Profiler

Bug Fix:

  • FileCache memory is no longer attributed to the first caller.



  • Fixed issues when running UBT in a build environment without a local data directory, by falling back on the Engine folder.

Bug Fix:

  • Corrected module dependencies not working when a module has no source files.

  • Fixed IsHostOnVpn() always returning false, so Incredibuild isn't used for building C++ over VPN.


  • The ExpandEnumAsExecs metadata now properly handles spaces in a comma-delimited list of parameters.



  • When toggling sub-level visibility on the Levels Editor, Multi-User editing now reflects the corresponding game flags so that -game nodes will properly display updated visibility. Users can opt-out of this behavior by disabling the Reflect Level Visibility to Game option in the Multi-User project settings.

  • The spline point property editor now allows toggling between absolute and relative position and rotation.

  • Added Copy and Paste options to the context menu on each field of the spline point property editor.

  • Specific fields and interp types for subclasses of USplineComponents can now be disabled.

  • Reworked water actor sprites to a more dynamic system.

  • Water actor sprites are now replaced with an error icon if certain checks fail.

  • Added new icons for the WaterLandscapeBrush and WaterMeshActor.

  • Package save events are now captured when running in -game mode. This is to support remote recording of takes on headless nodes.

  • Transaction events on Multi-User are now synchronized on nDisplay nodes.

  • Added an API ConcertSyncClient module that enables users to participate in transaction filtering. API users can indicate if a UProperty or UObject should be included, excluded, or have default behavior applied to it.

  • Added support to nDisplay to properly synchronize Multi-User activity stream when the nDisplay nodes first connect to the session. All nodes will coordinate their activity sync and they will finalize simultaneously. Note: If a node reconnects during an active session after initial synchronization, it is no longer possible to synchronize it. All nDisplay nodes should be restarted if synchronization is required.

  • Implemented a custom asset editor for waves assets which shows a preview of the resulting waves.

  • Multi-User take recording is now automatically available when connected to a Multi-User session. Previous versions required you to enable a special CVar.

  • Added a new Editor preference (Check References on Delete). When disabled, Unreal Engine no longer checks actor references when deleting actors from the World Outliner or warns about possible lost references. This can reduce the delay of initial deletion for levels that contain a lot of soft references.

  • Users can now control the maximum transmission rate for packets on a UDP connection. The default value is 1 Gbit/second. This value can be adjusted in the Project Settings for UDP Messaging.

  • Users can now use new controls in the Take recorder to specify who is recording and who provides the source data to nodes connected in a Multi-User session. This feature is only enabled when connected to a Multi-User session.

  • FNames can now be initialized with a string that starts with an underscores in the Editor.

  • Reference Viewer now has an option to show only the filtered node.

  • Reference Viewer now has a Compact Mode that hides thumbnails on the graph nodes and reduces the space taken by each one.

  • Added an Editor delegate that is broadcast from ObjectTools::AddExtraObjectsToDelete. It allows the insertion of secondary assets that should be deleted at the same time as the ones selected by the user.

  • Added icons for landscape BP brush actors.

  • Added an option to UTextureFactory to specify the source image color space. This saves processing time when importing MDL materials by creating the textures with the right color space at the factory level.

  • You can now load a material from a module path and a definition name instead of loading it from a file.

  • You can now add and remove MDL module search paths for the MDL importer.

  • Very large (2GB+) skeletal meshes can now be imported into the Editor.

  • Name resolution can now be performed on TCP Message Bus and File Server connections. You can use IPv4 style addresses or a named address.

  • The Reference Viewer no longer displays the graph state overlay.

  • 16-bit grayscale PNGs are now imported as 16-bit gray textures.

  • Added support for changing the aspect ratio axis constraint when the viewport is locked to an Actor.

  • If there is a still pending open transaction when trying to launch PIE, UE now cancels the transaction instead of preventing PIE from being launched.

  • Added -BulkCheckout and -GarbageCollectionFrequency=X options to the ResavePackages commandlet. -BulkCheckout causes all assets likely to be saved during the commandlet's run to be checked out of source control before loading packages. This reduces the number of source control operations needed when working with large numbers of files. -GarbageCollectionFrequency=X helps control how often garbage collection happens, which also helps when operating on a large number of Assets.

  • Changed the spline SnapToPoint / SnapToActor default hotkeys to Shift+P / Alt+Shift+P to avoid conflict with viewport navigation hotkeys.

  • Added spline point selection buttons to the spline details panel "Selected Points" category.

  • Plugins for remote control protocols (DMX, OSC, MIDI) now have their own icons.

  • Fixed a regression in Editor loading time when using GameplayCues.

  • Added support for negative values in CurveAtlas when color adjustments are disabled.

  • DDC - Added detailed stats about the DDC that are browsable in the Editor.

  • Added an Editor setting that writes to the engine global setting key/value storage instead of the environment variables. If you're already using the global DDC environment variables, these will remain in use.

  • Added per-project settings you can configure to recommend the setup of a globally shared DDC. These settings are off by default.

  • Added code support for using the gameplay tag UI in other Editor customizations via GameplayTagsEditorModule.

  • Added a new SGraphPinStructInstance class to make it easier to build custom UI for struct pins in Blueprints.

  • Added support for non-square resolutions in Curve Atlas.

  • Added default color and grayscale calibration chart materials to Engine content and BaseEngine.ini project settings.

  • Added the -FrameproEnableContextSwitches command-line interface argument to turn on context-switch tracking in Framepro captures.

  • For the MDL Importer, imported material graphs no longer contain unused constants and parameters.

Crash Fix:

  • Fixed a crash that happened when moving Light Cards on an nDisplay Stage Actor.

  • Fixed a crash that was caused by an uninitialized FBox in BaseMeshPainComponentAdapter causing infinite recursion.

  • Removed a message dialogue from skeleton processing to fix a crash with destroying SAssetPicker while it is rendering thumbnails in its Tick().

  • Fixed multiple crashes related to selecting options from Event Graph context menus.

  • Fixed how the base address was being calculated in FPropertyValueImpl::EnumerateObjectsToModify. This caused a crash with UObjects that use Sparse Class Data.

  • Fixed SVN integration crashing the Editor on Mac because libserf-1.dylib was not found.

  • Fixed a crash that happened when right-clicking certain elements in the source control history.

  • The editor no longer crashes when importing a corrupted EXR image.

  • Fixed a crash that happened when dragging new elements onto arrays of Actor instances.

  • Fixed a crash when reimporting a UDIMs base texture that was renamed.

  • Fixed a crash caused by Replace References.

  • Fixed a crash that occurred when trying to use Blueprints derived from AUsdStageActor in standalone mode.

Bug Fix:

  • Fixed a bug with the CSVToSVG tool that caused invalid HTML to be generated when system locale used commas as the decimal separator.

  • The Multi-User actor no longer displays in raytraced reflections when running in -game mode.

  • Fixed an issue where water actor sprites would not load due to Water Subsystem being nullptr in the actor constructors.

  • Client windows no longer spawn in a position where their title bars are hidden.

  • Fixed a bug where the first texture imported in an Editor session could have the wrong settings applied to it.

  • The type of first texture imported in an Editor session is now correctly identified.

  • ConfigureEnabledPlugins() now reports success when plugin count is zero.

  • The Ctrl + Alt + Shift + P keyboard shortcut now works while in Play In Editor mode.

  • Fixed an issue with a sub-level not being garbage collected properly when creating a new world from a template.

  • Fixed a sub-level offset issue that happened when loading a top-level world in World Composition when that sub-level had been already loaded.

  • Added a missing water sprite category in the viewport options. Billboard components now need to be added to the CDO in order to be detected by the Editor as proper sprite categories.

  • Fixed an issue that caused the icon for river water body actors to appear oversized the first time a water actor was placed in the level.

  • Fixed two separate issues that prevented the Goto Definition Editor feature from working in relocated Installed Builds.

  • Added support for displaying floats greater than e18 in the Editor, and removed cast losing double precision.

  • Fixed a bug that prevented reporting when not using the crash reporter.

  • SDetailsViewBase now allows deferred actions to call EnqueueDeferredAction. These additional deferred actions are then immediately processed in the same frame.

  • Fixed a bug with instanced objects not updating the reset to default state in the parent object when changed.

  • Fixed a bug where explicitly setting the IsEnabled attribute of an FDetailWidgetRow would not be respected, because SDetailSingleItemRow was only checking IsBound(), not IsSet() as well.

  • The Paint tool is now correctly grayed out when painting textures with mesh paint if the mesh has no paintable textures to cycle through.

  • Fixed an issue that caused Fixed FApiContext::AddSearchPath to register a folder's parent folder to the MDL path instead of the folder that was requested.

  • Fixed an issue that caused a missing portable call stack in the crash report generated when the Editor had more than 256 threads and the crashing thread was not in the first 256 threads visited by the OS.

  • Fixed an issue that caused the Editor to deadlock randomly while reporting a failed ensure().

  • Fixed an issue that caused sublevel components to fail to toggle when changing sublevel visibility in the Editor.

  • Fixed an issue that caused the crash reporter UI to sometimes take several minutes to process and display crash information after an Editor crash.

  • Fixed a bug that caused HighRes Screenshot SetResolution to ignore Resolution Scale.

  • Improved the messaging for file I/O errors in JSON deserializer that usually happened when users ran the Editor from a network drive that disconnected or failed to read.

  • Fixed an issue where specifying multiple TCP connection endpoints from the command line did not work.

  • Fixed a bug that prevented Camera Shake Actors from previewing correctly.

  • Range selection in the Persona tree view now behaves correctly when the initial selection is made from the viewport and the second selection is made from the tree view.

  • Updated string table CSV export to apply the .csv extension.

  • Fixed a bug that caused disabled toolbar combo buttons to incorrectly appear enabled when shown in a sub-menu.

  • Fix loading map status text displaying the word "loading" twice.

  • Fixed duplicated transactions when pasting sub-objects

  • Fixed an issue where some Asset editors would end up in a non-functional state after a window closing request was canceled, including the Blueprint Editor showing 'Unrecognized Tab' panels.

  • Preview widgets are now marked as being in Design mode before being destroyed, to prevent them from invoking NativeDestruct in the Editor.

  • Added ConditionalPostLoad call before building collision on a display mesh, fixing a potential issue where complex collision meshes didn't work properly in PIE.

  • Transient Actors spawned through BP are now also transactional.

  • Fixed an issue with FBX exporting where multiple meshes with the same material would receive the default material instead.

  • Camera piloting now takes into account the camera component's additive offset.

  • Fixed issue where SkipProperty wasn't being passed to WriteRow in the data table CSV writer.

  • Fixed a vulnerability due to an integer overflow and a heap overflow when loading a modified TGA file.

  • Fixed 'More Actions' menu items not doing anything when using the embedded gameplay tags editor within the Blueprint editor details panel.

  • Fixed an issue where transform changes were applied twice to attached Actors when selecting both the Actor and its parent.

  • SGraphEditor now correctly returns the value of GetSingleSelectedNode.

  • Fixed an issue where expansion state was not being properly retained in trees with more than 500 items

  • The new mesh paint mode is now correctly hidden if legacy mode is set in the Editor preferences.

  • Fixed an issue that caused map built data to be marked dirty too aggressively (for example, when placing an invisible / logical actor that did not affect lighting in the Level).

  • Fix a crash that happened when syncing out of date Assets in the Editor if a dependency package was not found.

  • Fixed a crash that happened when importing an OBJ file and using the create instanced materials option.

  • Updated AdvancedCopyPackages to pass the bShouldSuppressUI flag in headless mode.

  • Fixed FEditorModeTools::IsSelectionAllowed to allow selection if any Editor modes do instead of just checking the last mode in the list.

  • Fix an issue that caused a duplicate copy of a package to remain on disk with the old name when renaming the package.

  • Open Color IO UI: Fixed a UI issue where Colospace Index was not serialized into string and therefore appeared as invalid on instanced objects.

  • Fixed a bug that caused DPI adjustment to be incorrectly applied to the new window spawned when starting PIE.

  • Fixed an issue where socket snapping didn't work unless the component was the root component.

  • Base brush properties (size, strength, and falloff) are now correctly restored after leaving and re-entering Mesh Paint mode.

  • Fixed an import problem with FBXs containing LODs with meshes which could not be triangulated (for example, due to being non-manifold). Problematic meshes will be omitted and a warning will be generated. If a LOD cannot be imported at all, it will be auto-generated instead.

  • Fixed a hang during startup when a Blueprint-based Trace Source filter was active.

  • Fixed a bug with spline component Undo/Redo when the component was selected, rather than the Actor.

  • Reimporting a .FBX file no longer deletes custom metadata on the reimported assets. Only the FBX metadata are now affected by the reimport.

  • Fixed an issue where the FBX import would wrongly assume the importing of a skeletal mesh when the FBX file contained animation but no skeletal mesh.

  • Fixed a potential failure in the FBX collision mesh import.

  • When importing a FBX file, fixed an issue where some custom curves configurations were not properly imported, causing incorrect tangents.

  • Fixed a bug in the editor which would open the file selection window twice when reimporting an asset with the "reimport with new file" option.

  • In MDLimporter, clears the log error when an .mdl file can't be imported because the plugin was built without MDL SDK.


Crash Fix:

  • UParticleModule is now marked as within ParticleSystem to prevent instancing with other outers, which caused several crashes.

Content Browser


  • Asset tooltips now display data tags based on the asset's parent class.

  • Added a Writable Content filter to the Content Browser.

Bug Fix:

  • Fixed a bug that prevented any type of Haptic Feedback assets from being created in the Content Browser.

  • Fixed a bug that prevented the creation of Sub UV Animation assets from the Content Browser.

  • Fixed a bug that prevented the creation of UForceFeedbackAttenuation assets from the Content Browser.

  • Fixed a bug that prevented native classes from appearing in the Content Browser Collections.

  • Fixed a bug that caused thumbnails for child Blueprints which override parent Blueprint data to render incorrectly.

  • Updated SetPrimaryContentBrowser in FContentBrowserSingleton to verify that the browser can be set as primary.

  • Fixed an issue where files could not be dragged into new folders in the Content Browser's column view.

  • Optimized source control operations when renaming Assets to fix a large stall when renaming or moving a large number of files.

  • Advanced copy will now find all dependencies, even if they are not in memory.


  • Prevent crashes when creating mesh sections in ProceduralMeshComponent with out-of-bounds vertex indices or non-unique vertex indices within a triangle.

Material Editor


  • Added tooltips for Scalar parameters in the Material Editor.

  • Added support for texture arrays with TextureSize material expression.

  • Added local variables and portal nodes to Material Graph.


  • Sped up opening material editor for material instances with many parameters.

Crash Fix:

  • When a material function changes, all in-memory material functions are now checked to see if they use that function, and recompiled if they do.

Bug Fix:

  • Vector parameter children should now be editable as expected when the vector parameter is overridden.

  • Stopped unnecessary recompilation of shaders when changing texture compression.

Media Framework


  • Overhauled AMF support, including support for Linux.

  • Media Capture: Added support for unconventional pixel formats such as R, RG, RGB10A2, and BGR.

  • Merged alpha manipulation function into one shader. Media capture options allow you to force the alpha channel to be set to 1. This is useful if the render target doesn't have an alpha channel.

  • Upgraded NVENC to version 10.0.

  • Overhauled AVEncoder to support Linux and Windows with both NVENC and AMF.


  • Added GetLevels in EditorLevelUtils for Blueprint and Python scripting.

  • Added a function to EditorStaticMeshLibrary for setting material slot assignment for LODs.

  • Exposed UEditorLevelLibrary::ReplaceSelectedActors to Python.

Bug Fix:

  • Updated Editor utility widgets to not dirty the level when reinstancing.

  • Fixed an issue where utility widgets could fail to spawn properly on Editor startup.

Static Mesh Editor

Crash Fix:

  • Fixed a crash that happened when the Preview Scene Settings tab was spawned before the Viewport tab.



  • Added support for the treatAsPoint attribute on UsdSphereLights. This attribute will change how the light surface is calculated when converting USD light units to physical light units.

  • Added support for the UsdLuxShapingAPI schema. If a sphere light has the schema, a spot light component will be generated in UE and its cone angle will be set according to the cone angle attribute.

  • Added support for USD render contexts. When parsing materials, Unreal Engine will now load the shaders associated with the requested render context.

  • User code can register new render contexts to display in the USD Stage Editor.

  • Added the ability to export an Anim Sequence asset to a USD file.

  • Added progress display to the USD Stage asset creation steps.

  • Added support for the UsdLuxLight exposure attribute when calculating the light intensity for Unreal.

  • Added support for the EmissiveColor input when parsing UsdPreviewSurface materials.

  • Improved the conversion from Unreal skylight components to UsdLuxDomeLights. The cubemap will now be written out as relative to the USD layer Unreal Engine is writing to.

  • Attributes will now be written out to the default time code instead of at the UsdStageActor time.

  • Added an asset cache to speed up reloads for USD Stage actors. Textures can be persisted in the cache and won't be recreated unless the source file has changed since the last time it was processed.

  • Added support for the USD MDL Schema in the USD importer. This enables referencing MDL materials in a USD file and importing those in Unreal.

  • Updated the USD SDK to version 21.05.

  • Added a script to convert USD lights to the new USDLuxLight schema in USD 21.05. The script is located in "Engine\Plugins\Importers\USDImporter\Content\Python\usd_unreal\update_lights_to_21_05.py". Detailed instructions can be found within the script itself.

  • More warnings and feedback have been added for when the prim configuration is incorrect for the parsing of LOD meshes from USD files.

  • Persistent support was added for muting tracks and disabling sections on the Level Sequence Asset generated when opening a USD Stage.

  • Improved the undo/redo and multi-user support for USD stage manipulation via the USD Stage Editor window. Most operations and attribute changes are now tracked.

  • Added Blueprint and Python functions to fetch prim/component/asset correspondence for opened USD Stages via the USD Stage Editor window.

  • Allows editing other properties via the prim properties panel on the USD Stage Editor window.

  • You can now use tags to correctly handle USD-style pruning visibility when toggling Scene Component visible flags and prim visibilities in the USD Stage Editor.

  • There has been a complete rewrite of the level exporter to USD to add support for exporting foliage, landscapes and sublevels, and to update legacy scripts to Python 3.

  • In-memory stages are now created when using File > New on the USD Stage Editor instead of immediately presenting the Save prompt.

  • Stabilized behavior of AUsd Stage Actor when it is a Blueprint parent class.

  • Allows exporting Static/Skeletal Meshes and scenes to USD using dedicated payload files.

  • Back light and camera component property changes are now written to the opened USD Stage when edited on spawned components.

  • Removed the dedicated stage info panel on the USD Stage Editor. This now shows (along with more data) when no prim is selected; additionally, the stage now shows as the root prim entry on the stage tree view.

  • Synchronizing prim selection on the USD Stage Editor window with viewport selection is now allowed by picking Options > Selection > Synchronize with Editor on that window.

  • A dedicated asset cache has been created to store the assets generated from opened USD Stages to the AUsdStageActor.

  • Added static and skeletal mesh export options when exporting to USD to allow setting of Meters Per Unit and Up Axis.

  • Changed how the Usd Stage Actor binds stage loading and unloading to actor lifecycle functions. This provides more predictable behavior in complex scenarios like level streaming, switching levels during PIE, and Movie Render Queue operations.

  • Added support for loading USD files at runtime.

  • Changed the USD material import workflow to use master materials instead of generating new materials on each import.

  • Support has been added for renaming prims via the USD Stage Editor.

  • Added an export options dialog when exporting UAnim Sequence assets to USD.

Crash Fix:

  • No longer crashes during reimport of a material from USD when the original replaced material is currently in use on the scene.

  • Trying to import LOD meshes out of some elaborate prim hierarchies in USD files no longer causes crashes.

  • Sequencer no longer crashes if an opened USD Stage has animations and startTimeCode < endTimeCode.

  • Fixed a crash that occurred when loading a project with the USD Stage Editor window open in the layout along with a startup level without an AUsd Stage Actor.

  • Fixed a crash that occurred when handling mesh components with material overrides on LOD meshes from USD Stages.

  • A crash no longer occurs when switching levels after opening USD Stages that generated UGeometry Cache assets.

  • Fixed multiple crashes when parsing LOD meshes out of USD variant sets while opening a USD Stage.

Bug Fix:

  • Fixed an issue that caused texture file names to be lost when importing from USDz packages.

  • Fixed an issue that caused only one texture to be imported from USDz packages.

  • Fixed an issue where the cubemap was not getting assigned to the SkyLightComponent if the texture was already cached.

  • On the USD Stage Editor window, fixed the right-click interactions on prims inside variant sets.

  • An issue where USD AnimSequence exporter was not, in some cases, finding a preview mesh to export with has been resolved.

  • Fixed incorrect skeleton matching when exporting AnimSequences/SkeletalMeshes to USD in some instances, such as when the mesh's skeleton differs slightly from the skeleton asset.

  • Fixed the USD stage sometimes failing to close after interacting with prims on the stage tree view (left pane) of the USD Stage Editor window.

  • Fixed an issue where the USD stage would unnecessarily close or open when the USD Stage Actor was in a persistent level that was hidden or shown.

  • The stage now properly closes and reopens when the USD Stage Actor is in a streamed sublevel that is hidden or shown.

  • Fixed the Post Edit Change Property so it no longer forces the USD stage to load when already loaded.

  • A warning now displays if cubemap is not found on the filesystem when setting it onto a USD prim.

  • Incorrect color space conversion was corrected when importing vertex colors from USD geom meshes.

  • Fixed an issue so skeletal meshes are no longer visible on the viewport in some scenarios after exporting UAnimSequence assets as USDs.

  • The USD Stage Importer now uses the provided import options if triggered from an automated task.

  • Fix camera transform orientation compensation when writing back camera transforms to the USD stage.

  • Spawned components are no longer left in an invalid state after undoing a transaction where their owning AUsd Stage Actor is deleted.

  • Fixed a stationary light overlap problem for lights imported or spawned from USD files.

  • Fixed an issue where USD Stages and layers remained open even after being closed via the USD Stage Editor window.

  • Fixed the AUsd Stage Actor trying to use a deleted Level Sequence in some scenarios.

  • Fixed an issue where normal maps would disappear in the MeshEditor tab of the Static Mesh Editor for some meshes imported from USD files.

  • Added support for material overrides on Point Instancer prototypes when opening/importing them from USD Stages.

  • Fix an issue of spawned actors and components being visible for an AUsd Stage Actor in a hidden level or layer opened a new USD Stage.

  • It is now possible to mute/unmute USD layers via the USD Stage Editor window if the root layer is within the project's folder. This fix included a way to add USD layers as a sublayers of themselves.

  • Fixed some USD meshes that were losing their UV sets when opened with the USD Stage Editor and imported with Actions > Import.


Crash Fix:

  • Disabled the placement of VR editor mode gizmo actors from the place actors panel. This prevents the VR gizmo actors from saving into a level and causing a crash when that level is deserialized.

World Browser

Bug Fix:

  • Fixed an issue where the Level Browser would lose folder information when switching streaming type.

Gameplay Framework


  • Added GetSquaredHorizontalDistanceTo function to Actor class.

  • Added FindNearestActor function to Gameplay Statics class.

  • Added BindKey with key signature delegate to Input Component class.

  • Can now hide all unused pins when using Blueprint Make Struct nodes.

  • PlayerState Actor's IsOnlyASpectator function is now exposed to Blueprints.

  • Action level modifiers and triggers are evaluated in a second pass, after all mapping level modifiers and triggers. \

  • Added new Blueprint Compiler options and internal reinstancer flags to allow users to enable delta serialization.

  • Camera modifiers; including Camera Shakes, will now affect post-process settings. Matinee Camera Animations are played directly by the Player Camera Manager.

  • Moved legacy Matinee Camera Shake into the new GameplayCameras plugin. This makes it possible to add a Sequence shake pattern onto this class, because Matinee is deprecated and will be removed in a future version.

  • Moved Camera Shake implementation in a "shake pattern" class, leaving the base class as a container. This is to make it easier for artists to change a shake completely without having to make a new one, as well as for programmers to write new shake behaviors that can work with existing ones.

  • Game feature action for adding a Data table or Curve table as a Data Registry source.

  • Modified UGameplayAbility's PreActivate method to optionally take in trigger event data.

  • Newly placed comment nodes will no longer show comment bubbles when a graph is zoomed out.

  • Applied limits to Camera Shake Rotation when not using headsets.

  • When restarting a single-instance camera shake that was blending out, the current blending weight will transfer into a blend-in if appropriate.

  • Camera shakes with a custom duration can provide a "hint" of that duration.

  • Camera shake time-keeping and result handling logic have been refactored for reusability. \

  • Added new method ‘GrantAndActivateAbilityOnSelfWithParams' which allows Designers to pass in FGameplayEventData when granting and then activating an ability from Blueprint.

  • Sequence camera shake can now animate post process settings, and better handles the difference between focal length and field of view.

  • Added support for a custom camera shake initializer.

  • Added API for scrubbing camera shakes. This results in better support for putting shakes inside sequences.

  • Removed an unused virtual method ‘ApplyStackingLogicPostApplyAsSource' in the ActiveGameplayEffectsContainer class and made the destructor of the ActiveGameplayEffectsContainer class non-virtual.

  • Changed the Gameplay Cue Interface to pass Gameplay Cue Parameters Struct by reference.

  • Added more support to filter Gameplay Tags in the Editor using a project-specific filter. OnFilterGameplayTag supplies the referencing property and the tag source, so you can filter tags based on what asset is requesting the tag.

  • Improved Asset Manager to support virtual paths like AssetSearchRoots that can be replaced with dynamically set paths. Additionally, several new utility functions have been exposed as part of increased support for data registries and game plugins. \

  • Added OnActorPreSpawnInitialization delegate which is broadcasted before the Actor and its components have been initialized.

  • Exposed SourceObject to GameplayAbility's K2_CanActivateAbility method.

  • Native Gameplay Tags. Introducing a new FNativeGameplayTag, these make it possible to do one off native tags that are correctly registered and unregistered when the module is loaded and unloaded.

  • Improved Scalable Floats in the Gameplay Abilities plugin to support dynamic lookup of curve tables from the new Data Registry system. Added a ScalableFloat header for easier reuse of the generic struct outside the abilities plugin.

  • Added option to preserve the original captured SourceTags when GameplayEffectSpec's class method SetContext is called after Initialization.

  • Editor-only references are no longer followed when assigning management references in the Asset Manager.

  • Improved UI for registering Gameplay Tags from specific plugins. The new tag UI now lets you select a plugin location on disk for newly added Gameplay Tag sources.

  • Exposed AddControlPointPosition and ResetControlPoints to Blueprint in the InterpToMovementComponent.

  • The script execution recursion limit is now stored in a cvar named bp.ScriptRecurseLimit. The default value on desktop is now 120 to match consoles, instead of the previous value, 250. You can set this value higher in the [Console] section of DefaultEngine.ini file if you need to keep the limit at 250 on desktop.


  • Improved member packing on FHitResult to reduce size from 148 bytes to 144 bytes.

  • Made several performance improvements to loading and regenerating the gameplay tag table were implemented so that this option would be optimized.

Crash Fix:

  • Fixed a crash when calling CanSelectActor on an Actor that is not in a level.

  • Fixed a crash that occurred on loading placeholders iteration.

  • Fixed a crash that occurs when dragging and dropping a Geometry Cache asset into Blueprint Editor viewport to instantiate a Geometry Cache Component.

  • Fixed a crash which occurred when applying instance changes to a Blueprint while a child Blueprint with different properties is also present in the level.

  • Fixed an Editor crash that could occur when reparenting a Blueprint with at least one Blueprint-added component to a duplicate of the Blueprint as the new parent class.

  • Fixed crash when diff a blueprint asset which contains an enum variable while the enum class has been moved to another file/ folder.

  • Fixed a serialization crash that could occur when a previously-compiled function's outer Blueprint class object had not yet been freed by Garbage Collection.

  • Fixed an ensure that occured when running in-game when a Text3D component was added in a Blueprint.

  • Fixed a crash when reinstancing a Blueprint with an abstract outer.

  • Fixed a crash that could happen when compiling a Blueprint after loading it for a diff.

Bug Fix:

  • In the Kismet Math Library, BlueprintAuthority has been removed from MinimumAreaRectangle .

  • Prevented the CharacterMovementComponent from continually sending client location corrections when World Origin is rebased.

  • Any Completed or Canceled action event delegates will now report proper timing data.

  • The upper threshold clamp on the input system's deadzone modifier is now applied correctly.

  • AxisConfig settings from the old input system are now ignored for all devices, except for mouse axis scaling.

  • Fixed a case where a Level Blueprint would not run during Play In Editor (PIE) sessions after the Editor had been restarted.

  • Linkage to UStaticMesh when inheriting from your own module has been fixed.

  • GamePlayEffectsContainer's SetActiveGameplayEffectLevel method will no longer dirty FastArray if setting the same EffectLevel.

  • Added null checks to prevent Garbage Collection crash in ChildActorComponent's DestroyChildActor class method.

  • Fixed Actors who are attached to the World Outliner as a Child Actor from becoming detached when a level is reloaded.

  • Improved the display of structs when watching their values in Blueprint.

  • Fixed split pin defaults from being wrong when splitting nested user defined structs.

  • Fixed a root motion source issue where a networked client could crash when an Actor finishes executing an ability that uses a constant force root motion task with a strength-over-time modifier.

  • Property chains will now resolve when old and new objects are not of the same class.

  • Fixed missing struct-typed TSet and TMap default value overrides in a dynamically-instanced Blueprint-added component when "optimized Blueprint component instancing" is enabled for an Actor class in a cooked build.

  • Added an additional check in GameFrameworkComponentManager while dealing with an AddComponentRequest call so we don't hit an ensure before the Actor has begun play.

  • Fixed an edge case in gameplay effect mixed replication mode where Actors not explicitly owned by the net connection but who utilize that connection from GetNetConnection will not receive mixed replication updates.

  • Fixed a case where cyclic dependencies could cause default values to be unloaded.

  • When checking if a Blueprint variable is in use, the Editor will now consider references from other Blueprints as well, Additionally this is used when attempting to delete a variable.

  • Fixed an endless recursion occuring in GameplayAbility's class method EndAbility which was called by calling EndAbility again from K2_OnEndAbility.

  • Allow wildcard connections to the wildcard pins in the Format Text node so that it can be used inside of macros.

  • Gameplay tags Blueprint pins will no longer be silently cleared if they are loaded before tags are registered. They now work the same as gameplay tag variables, and the behavior for both can be changed with the Clear Invalid Tags option in the Project Settings.

  • Improved thread safety of Gameplay Tag operations.


  • Deprecated SimpleConstructionScript's class method GetAllNodesConst FBlueprintEditorUtils::FindSCS_Node, which now returns the USCS_Node pointer and not the index to the node.

Learning Resources

Content Examples


  • DMX Fixtures - DMX spot lights now correctly emit constant total energy distributed over a dynamically changing cone area (steradians). This better mimics a real spotlight with zoom and affects both the light and the light beam.


  • FText::AsCurrencyBase now takes an optional additional parameter that can be used to override the number of fractional digits.

  • ICU timezone data has been updated to v2021a.

Bug Fix:

  • We now rebuild the package localization cache for all current cultures when the culture changes. Previously, we would only rebuild the cache for the current language, which could leave the asset group cultures uncached and lead to the incorrect localized package being used.



  • Added profile-guided optimization (PGO) to optimize build options to Android Toolchain. PGO-optimized builds can be up to 10% faster in some CPU-bound scenarios.

  • The Editor Preview Rendering Level mode now activates the IOS or Android device profiles in the editor, allowing mobile-specific console variables to be set.

  • In DefaultDeviceProfiles.ini, the PreviewAllowlistCVars and PreviewDenyListCVars arrays can be used to specify the CVars that will be applied when Preview Rendering Level is enabled.

  • Android now calls the Memory Warning Handler when triggered via Java-side on Memory Trim callback and memory advisor state changes.

  • Android GLES has a new texture LRU system that is enabled by default. 2D textures are now held in system memory until required for draw calls. The textures are returned to system memory after 500 frames of non-use.This reduces the GLES memory footprint for most devices; however, it can have an impact on performance, and should be disabled if many new textures are frequently required in a single frame. Setting r.OpenGL.DeferTextureCreation to 0 will disable the GLES texture LRU.

Crash Fix:

  • Fixed a crash in FSkeletalMeshObjectGPUSkin::GetSkinVertexFactory when no valid LOD render data is available — for example, due to platform MinLod.

Bug Fix:

  • Fixed the stat Draw Count mobile preview in the editor. It now displays correct draw count statistics

  • Android Java logging callback is now initialized earlier to capture more messages at startup.

  • When handling a fatal log message, Android now calls out to FCoreDelegates::OnHandleSystemError and FCoreDelegates::OnShutdownAfterError as well as filling GErrorExceptionDescription with the actual error string.



  • Added an option that allows DOM storage on Android WebView.

  • The CPU per-core frequency is now exposed to CSV Profiler and Unreal Insights.

  • HWC Pipe (GPU performance counters for ARM Mali) is now only enabled when -hwcpipe is specified in UE4CommandLine.txt.

  • Java can now pass logging to Unreal with NativeCalls.UELog* on Android.

  • While the editor is running, Android devices now maintain a port forwarded over USB to allow Cook-on-the-Fly (COTF) network file server and Unreal Insights to work without requiring WiFi connectivity. Specifying the IP address will now allow Insights or COTF traffic to work across the USB cable.

  • Improvements for Memory Advisor include an updated crash reporter state at once instead of per property, and a 10-second delay on reporting less critical states.

  • Exposed the Memory Advisor's Memory Warning state (from 0, OK, to 2, Critical) to CSV Profiler and Unreal Insights.

  • Added a per-project Gradle-warning filter with Build/Android/GradleFilter.txt (see an example in Engine/Build/Android/Java).

  • SoC temperature and\or thermal notifications are now exposed to CSV Profiler and Unreal Insight. This information might be unavailable on some devices.

  • Exposed Android Memory Trim messages to the CSV profiler.

  • Added config rule variable access to Android's Device profile-matching rules. The SRC_ConfigRuleVar source type is now available to Android's Device Profile Selector. \ The 'MatchString' must be in the format of MatchString="<configrule.txt variable name>|<desiredmatchstring>". The <desiredmatchstring> will be used for the CMP operation against the actual value contained in <configrule.txt variable name>. \

    • Example: \ +MatchProfile=(Profile="Android_DeviceA",Match=((SourceType=SRC_ConfigRuleVar,CompareType=CMP_Equal,MatchString="DeviceA_Enabled|true") \ Thus Android_DeviceA will be matched if the config rule variable 'DeviceA_Enabled' CMP_Equal's 'true'.

  • Added preliminary support for DualSense controllers on Android.

  • Added support for alternate mouse events on Android to support DualShock4/DualSense controller touchpads.

  • Unregisters listeners from SensorManager when not being used to reduce the SensorManager battery cost.

  • Updated to use AndroidX instead of older support libraries.

Crash Fix:

  • Fixed crashes with the Android Web Browser Widget that were due to event delegates being called from the wrong thread.

Bug Fix:

  • Fixed the GooglePAD handling of disable checks.

  • Changed the handling of the Android console history to work with Android 11 (buttons instead of a swipe).

  • Updated Android distribution install scripts to use /data/local/tmp instead of /sdcard/Downloads for staging OBB files.

  • Fixed a permissions issue with access to UE4Game directories.

  • Updated the default icons and splash screens.

  • Fixed an issue with releasing previous media samples.

  • Corrected the per-file cost calculation of an OBB that is used to determine how to split up PAK files between OBBs.

  • Fixed an issue where the editor's Preview Rendering Level menu only showed the first Android preview platform even when OpenGL ES and Vulkan were both enabled.

  • Fixed high refresh rate support on Android 11 devices.

  • Fixed backup log saving on Android—now registers the log file in the UFS/NonUFS manifest after it is created so that it can be correctly backed up later.

  • The timestamp is now removed from the UFS/NonUFS manifest when a file is deleted on Android.

  • Fixed a GLES assert that could fire during PSO cache processing if the incoming PSO had already been rendered/instantiated before PSO cache loading began.

  • Fixed an issue when UE failed to detect Samsung's family of Exynos SoCs, and would not set Big\Little core affinity masks for threads.

  • Included a config rules version in logging.

  • Now uses proper line endings for Android install scripts based on the target platform.

  • Fixed Android gyro rotation.

  • Fixed ProGuard to keep defaults for AndroidX annotations.

  • Added cleanup of previous APK/AAB before the packaging step to fix an issue with package size growth.



  • Added an option under Project Settings > IOS, to allow you to override the path on the remote build Mac where iOS builds are performed. This is useful for saving space on the primary hard drive on a remote Mac.

Crash Fix:

  • No longer crashes when destroying text entry fields on iOS.

  • Fixed a crash that occurred when trying to open a new dialog while an existing dialog is transitioning in or out.

Bug Fix:

  • Fixed a texture leak related to movie player on iOS devices.

  • Fixed some capitalization issues with iOS in plugins. When using Whitelist Platforms inside a uplugin file, the correct syntax for iOS is "IOS" not "iOS". Using the incorrect case can cause dependency problems.

  • iOS now uses a default compressed format for textures set to BC7 compression instead of falling back to uncompressed formats.

  • Fixed a path-quoting issue linking Frameworks that caused link errors for IOS when using the Launcher binary build.

  • Fixed a bug in iPhonePackager Mach-O handling by updating signatures to use SHA-256. This resolves a problem where iOS apps built on a PC or re-signed by iPhonePackager would fail to load on iOS 14.5 or later.

  • Fixed build errors when compiling iOS C++ on Mac using Unreal Engine installed from the Mac Epic Games Launcher.



  • Updated PacketHandler components so that they can be added from non-engine C++ using a delegate.

  • Added a maximum number of retry-attempt settings for message bus UDP messaging auto repair mode.

  • Updated IpNetDriver‘s maximum time budget check in the packet reception iterator to correctly check only after a specified number of packets

  • Added optional logging of synchronous loads triggered by the replication system.

  • Modified the "LogNet: NotifyStreamingLevelUnload" to verbose by default to prevent log spam.

Crash Fix:

  • Fixed crashes when trying to clone adapter addresses when none are available.

  • Fixed issue causing potential crashes in SetNetDormancy.

  • Fixed crash issue caused when UDP message errors are received after the UDPMessaging module is unloaded.

  • Added null check to GetLevel() in UNetConnection::UpdateLevelVisibility.

  • Fixed potential crashes in server NetDriver code.

Bug Fix:

  • Fixed issue in which DTLS packet handler failed to connect under high-packet-loss conditions.

  • Fixed a potential underflow error in the DTLS packet handler.

  • Fixed issue in which invalid authentication tags prevent the AESGCM packet handler from connecting.

  • Suppressed expected warnings triggered by NetPacketNotifyTests.

  • Fixed issue in which fast array struct delta serialization does not properly resend on NAK.

  • Added a check to detect RPC calls from non-game threads.

  • Fixed issue where UniqueNetIdRepl replicated when the net ID string is numeric and contains the + or - character, or has an odd number of digits.

  • Fixed a rare hash collision within shared property serialization.

  • Optimized the building of LevelsToTick list in LevelCollection to reduce build time.

  • Prevented InitConnect from failing during IpNetDriver's garbage collection.


Crash Fix:

  • If an OnlineBeacon attempts to destroy the NetDriver while the NetDriver is ticking, the destruction operation will be deferred to PostTick to prevent a crash.

Network Emulation


  • Added Net.DisconnectSimulatedConnections cheat to disconnect simulated connections.

Bug Fix:

  • Prevented SimulatedConnections from destroying PlayerController when disconnected.



  • Added a path export table to network GUID cache serialization in checkpoints to reduce its size.

  • Added option to not reload the default map after a replay stops.

  • Added a flag to replay headers indicating recording connection type.

Crash Fix:

  • Fixed crash issue during delta checkpoint loading.

  • Fixed a replay crash when scrubbing in the editor.

Bug Fix:

  • Updated ReplaySubsystem::PlayReplay to use WorldOverride in StopExistingReplays.

  • Fixed regression where information about net startup Actors destroyed prior to recording start were lost.

  • Added broken channel cleanup during playback.

  • Added handling for serialization errors when reading net field export groups from a replay checkpoint.

  • Prevented replay delta checkpoints from recording unnecessary property data.

  • Prevented replays from incorrectly forwarding RPCs during playback to other drivers.

  • Fixed network path remapping when using duplicate level IDs.

  • Fixed delayed replication when using replay connection recording.

  • Fixed an issue when recording DORM_Never Actors into checkpoints.

  • Prevented delta checkpoint recording from overflowing the changelist history.

  • Fixed an issue with reused destroyed channel index in amortized checkpoint recording.

  • Fixed cleanup for broken Actor channels that never spawned.

  • Fixed uninitialized members of FMulticastRecordOptions.

  • Prevented inactive property changelist from being modified by replay checkpoints.

  • Fixed a replay ensure by using the base function when finding the layout for a received RPC.

  • Fixed issue when the server could stop replicating based on the position of the replay connection.

  • Removed unused checksums from replay GUID serialization.

Replication Graph


  • Exposed the LogReplicationGraph category.

  • Optimized DormancyNodes in ReplicationGraph using a configurable setting to improve RepGraph performance when adding or removing dormant Actors after multiple clients disconnected.

  • Added number of total connections replicated during a frame to the FFrameReplicationStats.

  • Updated ReplicationGraph to send statistics on replicated Actors on every frame that must be collected using PostServerReplicateStats.

  • Optimized ReplicationGraph by allowing ConnectionDormancy nodes to be considered obsolete if they have not been gathered for a specified time.

  • Added the ability to log statistics on all RepLists held by RepGraphNodes using Net.RepGraph.Lists.Stats.

  • ActorList nodes will now empty their RepList on TearDown.

  • Added TearDown support to StreamingLevelListCollection.

Bug Fix:

  • Updated the DynamicSpatialFrequency node's ActorChannelCloseFrameNum to prevent dependent Actors from being prematurely destroyed.

  • Fixed an issue where multicast RPC channel opens ignored Actor's bOnlyRelevantToOwner flag.

  • Fixed issues when a join a progress client reused the pointer of a disconnected client.

  • Fixed RemoveClientConnection not removing the proper GraphConnection if it was in the PendingConnection list

  • Fixed the GraphConnection's ConnectionId potentially clashing after removing a NetConnection


  • Renamed GraphConnection's ConnectionId to ConnectionOrderNum. This is to prevent users from thinking the ID persists across the lifetime of the object. It is only unique during a single tick of the RepGraph and will change during a session as clients join and disconnect.

  • FActorRepListRefView::ResetToNull is deprecated and has been renamed to TearDown.

  • Deprecated the FActorRepListRawView struct in favor of the new FActorRepListConstView, which uses a cleaner interface to the allowed operations when parsing a gathered list.

  • Updated DependantActor lists to use a TArray instead of a FActorRepListRefView which reduces the number of allocated lists in the list pool.

  • Updated FActorRepListRefView to use TArrays to store its replication list instead of FActorRepLists which increases its overall performance by up to 10 times.

  • Deprecated IsValid and PrepareForWrite.

  • Deprecated Remove() in favor of RemoveFast and RemoveSlow.

  • Deprecated the PreAllocateRepLists function.

Socket Subsystem


  • Added a warning to BSDSockets for when the destination protocol does not match protocol.

  • Added a warning to FUdpSocketReceiver when MaxReadBufferSize limit is reached.


  • Added new Asset type "Niagara Parameter Definitions." The Niagara Parameter Definitions Asset allows defining a set of parameters, and those definitions are shared with all Niagara Scripts, Emitters and Systems in the project. The intended use for Niagara Parameter Definitions is to predefine a name, type and description for parameters used in Scripts, Emitters and Systems, and automatically synchronize changes to the parameter definition's name, default value, and description with all parameters it is linked to.

    • Menus to add parameters in Niagara Scripts, Emitters, and Systems are now populated by all Parameter Definitions in the project.

    • Parameters that share the same Namespace, Name and Type with a Parameter Definition are now linked to the Parameter Definition. The description, default value and name of the Parameter Definition are synchronized to all Parameters it is linked with.

    • Parameters have a new default value mode "Definition". Parameters that are linked to a Parameter Definition can choose "Definition" as the default value mode. This automatically copies the Default Value Mode and Default Value of the linked Parameter Definition to the parameter.

    • Parameters created before a Parameter Definition but which share the same Namespace, Name and Type with the Parameter Definition will become linked to the Parameter Definition. The Parameter's description will be overwritten with the description of the linked Parameter Definition. If the Parameter default value is different from the default value of the linked Parameter Definition, the Parameter retains its default value; otherwise, the Parameter has its default value mode set to Definition, and its default value will be overwritten with that of the linked Parameter Definition.

  • Users can now handle a buildup of render ticks inside the batcher in a user-selectable way. Use "fx.Niagara.Batcher.TickFlush.Mode" to select the mode (Do Nothing, Process, Kill). Use "fx.Niagara.Batcher.TickFlush.MaxQueuedFrames" to decide how many frames before you need to flush.

  • Added a new Select node that can use an Index type for its selector pin (bool, integer, enum). This is used to select one or more values at runtime, based on the input of the selector pin.

  • Previously established output types in the Select and Static Switch nodes can now be altered by using the "Pin Type Selector" next to its respective output pins.

  • A wildcard pin type in the Select node now allows changes to the existing pin types using drag-and-drop.

  • Added to Mesh Arrays:

    • Added the ability to choose multiple Static Mesh resources for the Mesh Renderer (selectable via Particles.MeshIndex).

    • Added "Mesh Flipbook" feature to fill the array with a sequence of Static Mesh assets.

    • Added a Mesh Renderer Info data interface, to enable systems to query info about their mesh renderers (such as the number of meshes selected and the bounds of each).

  • New menus and features have been added to the Niagara Editor. This includes options for better filtering, as well as a "Suggested" section in the modules, dynamic input, and Script action menus that will list often used actions at the top. Scripts and Modules can be marked as "Suggested" in the metadata.

  • Exposed Collision Material Surface ID on Niagara's CPU Collision Module.

  • Added a random seed offset to Niagara System instances, to allow for variance between duplicated deterministic systems (this must be set on either the component or from Blueprint before activating the system when spawning).

  • Curves can now be exposed to material bindings.

  • The Select and Static Switch nodes driven by an enum will now automatically refresh when the enum is changed. This excludes Static Switch nodes created before this release.

  • Render target Data Interfaces can now be an iteration source. You can not read from the render target, as they do not handle flipping buffers correctly, so they are considered write-only.

  • You can use a Define to control partial write code generation; this enables you to keep the same functions for reading in, making it compatible with CustomHLSL. It also means Niagara doesn't rely on the compiler to strip out the bindings for input values, which has been unreliable on some platforms.

  • Added "Source Mode" to the Skeletal and Static Mesh Data Interfaces, so users can more explicitly identify where the source mesh should come from.

  • Added support for tooltips on Data Interface function inputs and outputs.

  • Niagara now supports configurable playback speeds in its editor settings.

    • New shortcut: S key isolates all currently selected Emitters.

    • New shortcut: D key disables all currently selected Emitters.

  • Added options to control how many bits we use to store probability/alias buffers for uniform sampling. The default is set to 24 bits, triangle 8 bits probability, allowing for 16.7 million triangles.

  • For Niagara 2D gas fluids, added offset to the Advect Scalar Module, to allow for the parent velocity to be used without it integrating into the sim's local velocity grid.

  • Added Niagara Texture 2D Array Data Interface.

  • If a Static Switch is switching on an enum that isn't registered yet, it now can be registered as a Niagara-wide enum using the new context option.

  • Added the "Set Fixed Bounds (System)" command in the "Bounds" section of the toolbar. Previous command for Emitters is now only available if any Emitter is selected (in a System); it is always available when in an Emitter Asset.

  • Added a new Waveform Module and Dynamic Input which can be used to generate and combine many different waveforms, including: triangle, square, sawtooth, trigonometric functions and multiple spline variants.

  • In Niagara 2D Fluid, added a world space noise option to the turbulence field module (the default is "Off").

  • Added an option to the Light Renderer to scale light brightness by color alpha.

  • Added support for overriding textures used with UNiagaraDataInterface2DArrayTexture.

  • Added "Renderer Visibility" to the Component Renderer, and fixed a bug where components would be deactivated but not set to invisible when a particle dies.

  • Added the ability to collide with custom depth in the Collision Query Data Interface.

  • Grid3D Updates: Added a preview.

  • New: Grid3D Updates: Users can now expose user parameter/render target binding to materials.

  • New: Grid3D Updates: Added an override for material/resolution selection.

  • New: Grid3D Updates: Added Details so users can display Attribute names (when hooked up).

  • Added mip map generation options to Niagara Render Target 2D.

  • Added a variable binding for the Pivot Offset of Niagara sprites.

  • Added an Inherit Source Movement module which emulates the Cascade Source Movement module.

  • Added "Default Exponent" (value to use when a variable is not bound) and "Renderer Visibility" to the Niagara Light Renderer.

  • Added Distance Culling and Renderer Visibility to the Niagara Sprite Renderer.

  • Added GPU support for GetFilteredSocketTransform.

  • Added symbolic search capability (+,-,*,/) in the search filter for common math dynamic inputs such as add, divide, and some boolean operations.

  • Added Show Flag for Niagara.

  • Improved Niagara's indirect dispatch argument buffer allocation scheme (the buffer that is used for GPU systems and for culling and sorting meshes and sprites).

  • Niagara now allows Particle Reader to be used as an iteration source.

  • Added "Pivot Offset" to the Niagara Mesh Renderer.

  • Exposed CustomDepth to the gbuffer interface.

  • Added support for the 2D Array Render Target.

  • New Static Switch nodes that switch on an enum will now automatically refresh upon load, or if it's open. Old Static Switch nodes will not do that, they do not break existing usages. CVar "Niagara.StaticSwitch.EnableAutoRefreshOldStaticSwitches" has been introduced to enable refreshes on old static switches as well.

  • New: Enum context options for Select and Static Switch when user performs a right-click on these nodes.

  • Added the ability to right-click and select "Auto-fill all options" on various array properties in Niagara (such as "Filtered Bones" on a Skeletal Mesh Data Interface).

  • Added unused attribute trimming for Niagara particle scripts. \ This improves the existing heuristics for figuring out which particle attributes are not needed (either by a renderer or an external reader), and adjusts the generated code so that the attributes can be stripped. This results in a ~25% reduction in particle payload for typical scripts.

  • Made updates to static VectorField. CPU data is now stored as a half3 (instead of float4) when ISPC is available, and an ISPC kernel has been added to the Niagara DI for sampling. For supported platforms, it reduces memory cost (from 16 bpp to 6 bpp) and improves sampling time (2x speedup).

  • Refactored significance handling. This now allows for various metrics such as Age and Distance. Projects can also define their own game-aware significance calculations. Spawn Only EffectTypes also have the option to consider the significance of Systems when spawning.

  • New: Systems with Dynamic Bounds can now make use of visibility culling.

  • New: Exposed fx.Niagara.Quality level as a System constant.

  • New: Added a new Data Interface that allows checking of the current platform. As an example, this can drive specific behavior that only works on a certain platform.

  • Optimized FNiagaraScalabilityManager for cases where there are large numbers of registered components. It now tries to meter out updates to scalability state over a number of frames, limited by a new cvar (fx.ScalabilityMaxUpdatesPerFrame) and based on the frequency of updates. It cleans up how significance is processed, so that it is done only for necessary components. It updates how we consider the component state to be dirty, which limits how often Niagara tries to unnecessarily activate/deactivate components.

  • Added a new instance count culling option, to cull for each System as well as for each effect type.

  • Updated the GridCollection2D and GridCollection3D node APIs to be more descriptive and consistent. Older paths still operate, but they are suppressed from creation.

  • Added a new experimental feature to Niagara Skeletal Mesh Data Interface, for generating and querying a quadtree mapping UV to the vertex index. A quadtree is created on demand for a given Skeletal Mesh when referenced by the Data Interface.

  • Prevented byte code generation by particle scripts for GPU emitters; this reduces runtime memory costs and compile time costs, and eliminates some edge cases where shader warnings can be generated.

  • Implemented RibbonRender DistanceFromStart to allow for correct train track-style UV tiling with minimal effort; spawn modules are being updated to set this by default.

  • Added a new module to the Skeletal Mesh Data Interface supporting adjacency information. A buffer containing up to 8 adjacent triangle indices for each vertex is created at runtime. Currently two methods are supported (on GPU only): one for retrieving an indexed element from the buffer, and one for finding the first adjacent triangle.

  • Niagara now supports reading barycentric coordinates and adjacency information. This allows users to traverse Skeletal Meshes using those values.

  • Implemented tessellation across ribbon width, this helps reduce stair stepping in UVs.

  • New: Implemented multiplane/sheet rendering for ribbons, similar to Cascades "Sheets".

  • New: Implemented tube ribbons with 3-16 sides, and custom shaped ribbons with 3-16 sides.

  • NiagaraPlatformSet now has the ability to select platforms based on arbitrary Float, Int or Bool CVars.

  • Added the ability for the Spline Data Interface to be driven by a User object variable.

  • Changed "Simulation is invalid..." message to "No active preview..." to better reflect the meaning of the message, which is that you don't have a preview simulation running, not that there's something actually wrong with the emitter.

  • The collision module now supports post-solve collisions.

  • Added a new mode "Fail if not previously set" to defaults; it makes Niagara generate a compile error if the variable hasn't been set previously. This is optional within graphs, but is set any time a variable is linked in the stack. This is only for new changes, as old Assets in the field "work" but will likely be using these defaults unintentionally.

  • Implemented Emitter mode rendering for the Mesh Renderer. Implemented material parameter binding for both the Mesh Renderer and the Ribbon Renderer.

  • Added an optional property to NiagaraParameterCollections to allow a MaterialParameterCollection to drive values in Niagara. Parameters are automatically created when an MPC is assigned, and the backing parameter store is updated as changes are made to the MPC.

  • Niagara Outliner tab in the Niagara debugger now allows gathering and display of information about the current state of Niagara systems on the connected debugger client.

  • Fixed an issue with disabling simulation stages; they will no longer generate a shader for the stage.

  • Updated debug draw UI, so it only shows the option to turn it on or off if the module contains debug switches.

  • The Collision Module now returns the material type index when CPU ray casts are used.

  • Added the ability to output compiler metadata, called Compiler Output Tags. This will allow users to get named metadata, like MaxLifetime or bIsImmortal, out of a complicated particle System.

  • Added a category field for Niagara Emitters, to specify a sorting category when adding an Emitter using the New Asset wizard or the asset picker.

  • Niagara Outliner can now display performance information about Systems on the connected client.

  • Moved Niagara's SkeletalMess Generated Data to a more generic implementation so it can be used by other Systems.

  • Niagara now contains all of Pivot Painter's functions, except the full foliage simulator.

  • Tweaked the HLSL shader generation for GPU particle simulations to reduce the burden on the HLSL compiler. Added preprocessor directives to limit the scope of FSimulationContext for simulations using shader stages. Reduced compilation time by 20x (for serial compilation, about 10x for regular usage in the editor).

  • New features have been added for timed Niagara effect notify.

    • GetSpawnedEffect returns the system spawned for a given mesh component.

    • GetNotifyProgress returns a 0-1 progress value between the notify's beginning and end for a given mesh component.

  • Added a unified FX Budget. You can now track and budget Cascade and Niagara runtime costs together. Niagara has some new scalability features to act upon this, such as reducing cull distances and max instance counts when budget usage is high. Projects using the Significance Manager with Cascade or otherwise driving SetRequiredSignificance calls into Cascade can use the result of the FFXBudget function, GetWorstAdjustedUsage, to influence calculations. This function returns the worst current budget usage for GameThread, Concurrent Threads or Render Thread work. It also has some decay on the value to help prevent fast oscillations that could cause FX to turn off/on repeatedly.

CL: 16199909 (Niagara)

Bug Fix: Fixed a bug where linked module outputs could be renamed to a wrong namespace.

CL: 16223604 (Niagara)

Bug Fix: Dialogs and graph pins now correctly show tooltips for intrinsic Niagara parameters.

CL: 16355938 (Niagara)

Bug Fix: Fixed a crash caused by checking compile results when the rendering thread is suspended.

CL: 16369575 (Niagara)

New: You don't need to create full copies of scripts and graphs when compiling. You can reuse objects instead, using an object pool that increases compile performance.

CL: 16386669 (Niagara)

Bug Fix: Fixed a bug where the Parameters panel would show all attributes and not filter by Static Switch selection.

CL: 16389995 (Niagara)

Bug Fix: Fixed a bug where propagating a Static Switch would delete it from the Parameter panel.

CL: 16400325 (Niagara)

Bug Fix: Fixed a bug where the Script.Usage and Script.Context Static Switches would generate an error if a new default value was defined behind one of its branches.

CL: 16410927 (Niagara)

Bug Fix: When duplicating a parameter in the module editor, metadata is also copied.

CL: 16518408 (Niagara)

Bug Fix: Fixed an issue where the Simulation Stage iteration source was showing unrelated items in the dropdown. Also fixed a problem with Simulation Stag iteration sources not updating on rename.

CL: 16531962 (Niagara)

Bug Fix: Fixed a bug where a deleted renderer's name remained in the Editor data.

CL: 16590157 (Niagara)

Bug Fix: Fixed a bug where tooltips for Map Get were not showing the parameter description from the metadata.

CL: 16590574 (Niagara)

Bug Fix: Fixed a bug where creating a duplicate parent created a redirector instead of a new Emitter Asset.

CL: 16590726 (Niagara)

Bug Fix: Fixed a bug where resetting a NPC instance caused a crash.

CL: 16605005 (Niagara)

Bug Fix: Fixed a bug where various engine constants were not displayed. Also improved sorting in the "add" menu.

CL: 16605005 (Niagara)

Bug Fix: Fixed a bug where various engine constants were not displayed. Also improved sorting in the "add" menu.

  • Updated Niagara sprites and meshes so they provide precise motion vectors for motion blur and temporal anti-aliasing by default (as opposed to the prior linear motion approximation).

  • A project setting was added to the Niagara project settings (Default Motion Vector Setting) to globally choose between the previous behavior and the more precise new behavior; the setting can also be overridden individually for each renderer.

  • Added Niagara GpuReadback Opengl optimization.

Crash Fix:

  • Fixed a potential crash in Niagara meshes when sections have materials with invalid indices.

  • Fixed a crash in Niagara sprites.

Bug Fix:

  • Fixed bugs occurring with Niagara Mesh Particle distance and frustum culling in Point, Spot, and Rect light shadow.

  • Fixed issues occurring with Niagara mesh shadows when the shadows are frustum culled, or culled using VisibilityTag.

  • Fixed crashes related to Static Mesh Data Interfaces being assigned a mesh that was marked Pending Kill.

  • Fix a crash that could occur when cooked out Niagara Emitters reset on some platforms.

  • Fixed crashes that could occur in the Niagara Mesh Renderer when reloading the Static Mesh Asset, and then changing the mesh.

  • Fixed bugs in Niagara occurring with Instanced Stereo for VR.

  • Fixed an issue in Niagara Blueprint functions caused by passing None in for various objects.

  • Exposed the Position for Point Attraction as an Input, but defaulting to Particles.Position.

  • Fixed an issue causing incorrect skeleton calculation when a master pose is used on CPU.

  • Fixed crashes that occurred when re-importing a static mesh that was being used by a Mesh Renderer.

  • Fixed frame-behind issues with the Niagara Component Renderer.

  • Fixed Z-axis sampling for Niagara curl baked fields.

  • Added copy-paste support for comments in the Niagara Overview graph. Emitter node positioning has been updated to be consistent with comment nodes when pasted, and will be pasted at the cursor location.

  • Fixed an issue occurring when trying to sample a Skeletal Mesh that has no valid LOD data streamed in.

  • Added the memory used by the 3D Neighbor Grid Data Interface to Niagara's GPU memory stats.

  • Fixed a bug where occlusion queries did not take perspective into account.

  • Dynamic Parameters beyond Cascade's range now return the material default value rather than the same value for all inputs.

  • Fixed a bug with culling/visibility shader for GPU emitters, where it would attempt to cull dead particles.

  • Fix a tear down/GC issue where the FFXSystem would be destroyed before the particle components that reference it.

  • Fixed a bug causing crashes when setting nullptr Asset.

  • A bug was causing incorrect removal of instances from the SpawningDataSet when they were in the MainDataSet; this has been fixed.

  • Bug Fix: Fixed a potential race that occurred when removing from pending spawn.

  • Fixed bugs caused by Particle Read Data Interfaces referencing emitters that are excluded when cooking for the target.

  • Wait for all simulation to complete before performing tick group update, to avoid potentially accessing simulation data that is still running concurrently.

  • Fixed an issue causing a crash when applying vertex painting to a Static Mesh that was being used for a Mesh Renderer in an active Niagara Editor.

  • Fixed issues that occurred with GC and pooled components when debugging was not enabled. The objects were created with the wrong outer, allowing them to be garbage-collected while playing.

  • Bug Fix: Removed strong reference from pool debugging to avoid confusion between different build configs; originally this was causing the shipping config issue to be masked due to the strong reference.

  • Bug Fix: Fixed HandleTimelineScrubbed so it uses UFXSystemComponent to handle all FX component types (Mainly Cascade and Niagara).

  • Previously, it was possible to use rapid iteration parameters in a worker thread while also accessing on the game thread. This has been resolved.

  • Niagara can now handle SkeletalMesh changes on a SkeletalMeshComponent when more than one Niagara System is referencing them.

  • Made RandomTriIndex more robust against missing or invalid data.

  • Ensured that pool prime does not occur inside PostLoad. It is not safe, as UStaticMesh does not ConditionalPostLoad the materials we need access to.

  • In certain cases, such as when there is no Asset set, a crash could occur. This has been resolved.

  • Fixed a crash that occurred when CalculateTickGroup is called from the SystemSimulation, as the prereqs were not updating.

  • Fixed a bug where local-space simple lights would render with a frame-old transform.

  • Fixed an issue where dump was not working with cooked out Emitters; modified the dump command so that we can perform a full dump of all Systems.

  • Fixed an issue with unmatched LODIndex between Register and Unregister. Also fixed potential nullptr access to SkelMesh.

  • Fixed an issue that could lead to transient namespace variables leaking between Emitters in a Niagara System.

  • Fixed the normals for Ribbon MultiPlane. The default is to flip normals on the standard two-sided render based on the view direction. An option has been added in renderer properties, to duplicate geometry with correct normals for opposite face and to re-enable backface culling for any material that doesn't behave correctly with the flipping normal. Updated test to show normals.

  • Optimized the Generated Code window in the NiagaraEditor.

  • Fixed a crash in the Scalability Manager.

  • Fixed an issue with dynamic bounds calculations for Niagara components with negative coordinates.

  • Fixed an issue where Niagara renderers were trying to update while their dependent objects (System/Emitter/Script) hadn't finished loading (RF_NeedsPostLoad). Since PostDuplicate is called before PostLoad, we need to defer any work on the renderers till after PostLoad. This existing work is handled by the System on load.

  • Fixed a problem where SpriteRenderer ParticleAlignment and ParticleFacing parameters were not respecting the LocalSpace setting on Emitters, and were defaulting to Worldspace. Regression from prior behavior.

  • Fixed issues with Niagara's compute shader generation.

    • Moved some string properties to Editor-only.

    • Now it skips deferred deletion of scripts unless they actually have cached shaders.

    • Moved FNiagaraShaderProcessorTickable to an FTickableGameObject so that compute shaders will be properly handled in -game situations.

  • Fixed an issue for a non-determinism cook with Niagara Renderer properties.

  • GPU Simulations were continually spawning the previous contents of their SpawnInfo struct if they became inactive. This has been fixed.

  • Fixed VectorVM assembly debug output.

  • Fixed an issue where device profile preview would not set correctly, because its device profile had not been loaded from its platform INI file.

  • Bug Fix: Fixed an issue where a Niagara-specific override console command would override the DP but would not set the fx.Niagara.QualityLevel cvar.

  • Bug Fix: Fixed an issue where after setting a DP preview, you could no longer properly use engine scalability.

  • Fixed a problem with the Niagara Matrix Multiplication node; made it actually a mul() rather than per-component scaling.

  • Fixed an issue causing a race condition in processing Niagara shaders. Now they are only processed when they have been released from the FShaderCompilingManager. BReleased has been added to the job, which is flipped when the job has actually been fully processed by the compiling manager.

  • Fixed an issue where internally complete Emitters would still render their final frame's data.

  • Fixed an issue for pooled Niagara components; components marked hidden in game would remain hidden when re-used from the pool.

  • Fixed a crash that happened when passing large text blobs into Niagara scratch pad names. Limited names to 256 characters.

  • There was a problem with Niagara VM bytecode compilation where self assignments had rvalues replaced in all expressions: A = A + B; OutputFloat(A); This has now been fixed.

  • Prevented some Niagara logspam in server builds.

  • Fixed an issue that could cause an incorrect component tick state for Niagara components.

  • Fixed uninitialized struct values for the Niagara plugin.

  • Fixed the initial bounds on fixed bounds systems.

  • Fixed an issue that could lead to incorrectly culled effects, due to the LastRenderTime not being reset early enough in Activate.

  • Fixed an issue where Ribbon Rendering with 2-3 particles was causing invalid UVs; these were either flipped or zeroed unless EdgeMode was set to Locked, due to same-age particles. Updated several Ribbon tests based on UV fixes with same-age particles, like beams, to show fixed UVs now. Updated some naming/descriptions, and the edit conditions of Ribbon UV Properties, to better reflect meaning and show what affects what.

  • Fixed a crash that occurred when you changed the size of a user-provided RenderTarget2D.

  • Made several Niagara shader compilation logging improvements.

    • Downgraded the importance of some of the logging.

    • Added system names to VectorVM logs so that they are more actionable.

    • Added NiagaraTrace channel.

  • Fixed a crash caused by a race condition in the unbinding of the GPUExecContext combined parameter store.

  • Fixed graph convert node pins so they properly dirty the graph.

  • Fixed a crash that occurred when spawn event handlers kill particles.

  • Ensured we don't try to resolve Niagara NPC references during PostLoad.

  • Fixed an issue with non-deterministic cooking with the Texture Asset backing Niagara curves. Added UTexture::SetDeterministicLightingGuid to be used for assets generated during cooking.

  • Fixed up UNiagaraComponent::GetDataInterface so that it just uses the existing implementation for the user parameter Data Interface (rather than the very specialized implementation that would only support the first GPU emitter).

  • Fixed ribbon indexing issues with multi-segment ribbons and initialization order of FNiagaraRibbonShapeCustomVertex.

  • Fixed an issue with resetting GPU Systems in some situations.

  • Fixed a bug with Niagara VM bytecode compilation for swizzled mask on LHS: MyVec3.yz = float2(1.0f, 2.0f);.

  • Fixed Niagara VM bytecode compilation for preserving original swizzle mask during self-assignments.

  • Ensured that NPC are fully loaded before we access them which was causing an issue if a compile was triggered from the PostLoad of a script/emitter/system.

  • Fixed crashes and bugs with Niagara Data Interfaces that must rebind their VM functions after a reinit.

  • DDC was getting polluted with NiagaraScript results when rapidly generating compile requests. This fix ensures that the data cached is associated with the source request rather than the current CompileId of the UNiagaraScript.

  • Fixed FNiagaraDataInterfaceArrayBool to use a Buffer<uint> on the GPU.

  • Fixed a problem for some cases in the Editor where CVars changed at runtime weren't applied correctly. Also created a threadsafety fix for CVar changed callback handles.

  • Fixed an issue causing Niagara crashes with -noshadercompile.

  • Fixed Niagara's Pow node to clamp the base to zero; it now matches materials and prevents divergent behavior between platforms.

  • Fixed a use-after-free bug within Cascade GPU simulations.


  • Deprecated If node, Usage Selector node, and Sim Target node in favor of the new Select node and the old Static Switch node. Deprecated nodes will continue working, but are no longer offered in the action menu.



  • Updated libstrophe for android with openssl-1.1.1x support

  • OpenSSL has been upgraded to openssl-1.1.1k for Windows, macOS, iOS, and Android. All older versions of openssl for the Windows platform have been deprecated and removed from the source tree.

  • Added an ini-based setup for TestLeaderboardInterface, allowing ShooterGame to test its own leaderboard keys instead of using test keys.

  • Re-enabled Steam when running Single Process Play-In Editor, but disabled Steam Sockets. This will keep the connectivity path using local TCP/IP.

  • Pixel Streaming CVars can now be set using command line arguments. See documentation for specific arguments.

  • Multiple Pixel Streaming improvements such as parameterisation of many encoder settings, AMF encoder, and better pixel streaming stats.

  • Added indexed cache storage functionality for Switch Indexed cache storage support.

  • To use Indexed Cache, set [/Script/SwitchRuntimeSettings.SwitchRuntimeSettings] CacheStorageIndexMax to the max index of cache storage that will be used.

  • Fixed a clang issue with LPTSTR conversion.

  • Changed LogHotfixManager default verbosity from Verbose to Display. Significant log lines were updated to Log.

  • Engine bundled WebRTC upgraded to Release M84 for Windows and Linux. Engine Opus version upgraded to 1.3.1-12 on Windows and Linux to match WebRTC. Developers using the old bundled WebRTC directly, instead of through the Pixel Streaming plugin, will need to manually link the old WebRTC or upgrade their custom implementations to utilize the new WEBRTC library.

  • Moved Party Beacon crossplay restriction definitions to ini.

  • Added additional platform information to the Social Platform Description in order to to group similar platforms.

  • Improved functionality of Pixel Streaming web player, including more statistics data.

  • Added a CVar to allow guest accounts on GDK account picker. To use it, add [OnlineSubsystemGDK] bAllowGuestLogin=true

  • Added a configuration option to perform or skip the XBox Live Gold check. Defaults to XBox Live Gold account required.

  • Promoted LogHotfixManager lines to "Log" due to community feedback that they are commonly used as a reference.

  • Added Exec function to SocialToolkit, SocialManager now attempts to call Exec on all its SocialToolkit instances.

  • Quality of Service (QoS). Quality of Service pings are now performed using non-blocking sockets on a single async task thread. Spawns one socket per protocol type such as IPv4 and IPv6, based on the list of target host addresses supplied.

  • Promoted IsFriendRestricted from Protected to Public to allow for quick usage by Game implementations.

  • Added configuration options to enable or disable EULA and waiting room checks on PC/Mac.

  • The Engine Framebuffer Pixel now formats automatically.

  • Commandlets are now configured to function correctly if rendering is enabled or when passing -AllowCommandletRendering.

  • Made SocialUser's class method ValidateJoinTarget virtual, in order for it to be overridden at the game level.

  • Adjusted MarkupTag code to no longer use TypeName.

  • Added virtual "GetMarkupTagForPlatform" function to SocialUser class, so that games can override the icon or platform.

Crash Fix:

  • OnPartyJoined delegate listener will now clear on user logout. This fixes a crash observed when the local player changes.

  • Fixed an ensureMsgf crash that occurs when an Interaction Type is not recognized.

Bug Fix:

  • Audio over Pixel Streaming is now of higher quality and correctly plays in stereo.

  • Fixed platform specific issues in Party Platform Session Monitor.

  • Improved parsing of RTC ice server configuration for Pixel Streaming

  • Fixed instances of UserPlatform being constructed with an empty string which triggers an ensure.

  • Secondary local players can no longer be promoted by primary players.

  • Fixed connecting to Pixel Streaming session from browsers running on Mac or iOS.

  • OnApplicationActivationChanged now correctly fires on application reactivation

  • Changed GetCachedAchievements in Sony interfaces so they return an array of readable values.

  • SocialManager no longer marks itself as PendingKill on shutdown. Instead it sets a "bShutdownPending" bool.

  • Added ABORT_DURING_SHUTDOWN macro that checks the bShutdownPending bool, then displays a log message, and immediately returns. This macro is used in all SocialManager callbacks that might fire after a Shutdown occurs.


  • The VivoxVoiceChat plugin is deprecated as of Unreal Engine 4.27, and is scheduled for removal in Unreal Engine 5.0.

  • Deprecated old versions of WebRTC that were not used by any of the projects.

  • Added new version of ProcessRequest (and derivative methods) that returns void instead of bool. Deprecated the previous versions for 4.27.


  • Removed STUN/TURN server binary as it is no longer maintained.



  • Added configurable time limits for the flushing active HTTP requests when shut down or suspended. This aids compliance with platform requirements for shutdown and suspend times.

  • The trusted root certificate bundle used by the SSL module has been updated.

  • Added a new "Optional Object" JSON Serialization Macro.

  • HTTP Request Interface. The IHttpRequest interface has been modified so that a timeout can be specified on a per-request basis.

Bug Fix:

  • Resolved a non-thread safe execution pattern when handling request progress updates in AppleHTTP.

  • ProcessRequest and CancelRequest completion callbacks always fire on the main thread for all HTTP implementations.

  • Added ability to cancel all requests in progress when suspending.

Online Subsystem


  • OnlinePurchaseInterface FinalizePurchase method now takes ReceiptInfo as an optional parameter.

  • Included party data in QueryPartyJoinability response.

  • Implemented GetSocialPlatformName method in the OnlineSubsystem Interface for use in labeling a platform's friend list.

  • Added a missing enum "VoiceChatResults" to the LexToString function in the VoiceChatManage class.

  • Modified the User Search to use the new "withUserGuid" endpoint.

Bug Fix:

  • Fixed OnlineEncryptedAppTicketInterfaceSteam using a unicast delegate where a multicast delegate was intended.

  • FUniqueNetId Thread Safety: It is now possible to use ESPMode's class method ThreadSafe with FUniqueNetId shared pointers and references by opening CoreUObject.Build.cs and changing the UNIQUENETID_ESPMODE public definition from ESPMode::Fast to ESPMode::ThreadSafe, then recompiling. The FUniqueNetIdPtr/FUniqueNetIdRef typedefs in CoreOnlineFwd.h are provided to help migration. For example, you can replace TSharedPtr<FUniqueNetId> with FUniqueNetIdPtr to cause it to use the appropriate ESPMode.


  • Deprecated Online Subsystem Twitch. The web API has not been kept up to date. This will be removed in a future engine release.


  • Deprecated old versions of OpenSSL for all platforms.


Bug Fix:

  • LWS Web Socket connections will now use a dynamic string buffer size when dealing with UrlPaths.



  • XMPP Jingle has been deprecated, licensees must move over to using the updated XMPP Libstrophe system for their message handling.



  • Added Element Index to the Blueprint Break and Make hit result functions.

  • Added PopFutureOutputData_External to SimCallbackObject to get all physics thread outputs, including outputs past the current time.

Bug Fix:

  • Fixed Sweep_Geom to calculate the correct transform for queried shapes when querying from a component with multiple shapes like a skeletal mesh component.

  • Corrected SyncBodies logic for scenes with multiple custom Chaos solvers to correctly sync back results to components.



  • Chaos Cloth - Added fictitious centrifugal forces to compensate for when the Velocity Scale is reduced.

  • Chaos Cloth - Added a new Continuous Collision Detection mode. This is more accurate than sub-stepping, but can be more taxing on performance.


  • Added ISPC optimizations.

  • Improvement: Removed inactive LOD constraint rules from the simulation.

  • Re-enabled geodesic long range attachment and deprecated bUseGeodesicDistance.

Bug Fix:

  • Chaos Cloth - Fixed a crash caused by constraint map re-allocations.

  • PhysX Cloth - Fixed a crash when applying a higher definition LOD 1 cloth than the one used in LOD 0.

  • Cloth Painter - Reduced the long pause / delay before being able to interactively preview the simulation (while pressing on the H key) while in the cloth paint editor mode.

  • Chaos Cloth - Fixed an issue causing a bad simulation impulse at startup.

  • Chaos Cloth - Fixed issues that were occurring when a non unit scale was used on the owner component.

  • Chaos Cloth - Removed collision tests from collision particles that are not in the active LOD.

  • Cloth Painter - Fixed lag that was occurring after each paint stroke.

  • Chaos Cloth - Corrected an issue that occurred in cases where the simulation data was queried before the simulation's first step.

  • Chaos Cloth - Fixed an issue with the AnimDriveSpringStiffness parameter effect on the simulation that occurred when its value was changed in the Chaos Clothing Config UI.

  • Cloth - Added tapered capsules to the primitive lists to pass as external cloth collision sources.

  • Chaos Cloth - Fixed a crash in multi-cloth simulations caused by a race condition on the offset creation.

  • Chaos Cloth - Fixed a crash that occurred when a Skeletal Mesh asset with more than one LOD had only one cloth LOD.

  • Chaos Cloth - Fixed an overzealous collision LOD deactivation that was preventing external collision source updates.

  • Chaos Cloth - Fixed missing Animdrive stiffness and MaxDistancesMultiplier updates.

  • Chaos Cloth - Fixed a bad local space simulation impulse at simulation startup, that only became apparent with a lower than one Velocity Scale.

  • Cloth - Fixed an issue where sometimes the Undo function would reset the cloth LOD. \

Collision Detection


Physics Asset Editor

Bug Fix:

  • Fixed simulation sometimes starting unexpectedly in the Physics Asset Editor when editing asset properties.

  • Keyboard navigation in the Physics Asset Editor skeleton tree view is now properly ignoring hidden elements.

  • The Physics Asset Editor 3D viewport and skeleton tree view are now properly synchronized when the selection changes in one or the other.

Rigid Bodies

  • Fixed the Rotation of Mass computation in all oriented implicit geometries to properly account for the rotation of the geometry axis compared to the Z axis.




  • Unreal Engine now ships with Dockerfiles and example code for official Docker container images.

  • The Steam SDK has been updated to 1.51.

  • Refactored Platform TextureFormat classes to be subclasses from a new FChildTextureFormat class that handles compressing with other modules, and then runs a post-process on it.

  • New: Pulled GetPixelFormatForImage out into a separate function in ITextureFormat, so that child formats can inherit a parent format that generates without needing to compress a test texture.

Bug Fix:

  • Added the function UserHomeDir to FGenericPlatformProcess, so that TestPAL could be updated to test UserHomeDir on Linux without breaking other platforms.



  • For GDK Pass-type entitlements, acquiredDate is appended to the receipt ID format, so that your game service can tell separate purchases apart. If your game services parse receipt IDs, or you have already stored receipt IDs in your game services, please consider migrating to this new format.

Bug Fix:

  • Fixed a potential block that occurred when checking account privileges.

  • Stopped the creation of search handles for sessions that aren't meant to be searchable.

  • Fixed a thread safety issue that could arise when the user was querying consumables on the platform store.

  • Fixed a crash that occurred when the user joined a multiplayer session with verbose logging enabled.

  • Removed the memset of a shared pointer in FOnlineAsyncTaskGDKQueryAchievements.

  • Fixed an issue with AutoPIX not working on GDK.

  • Fixed a crash that occurred while toggling between constrained and running applications. Added thread safety when handling responses from multiple checks.



  • Moved to LLVM 11.0.1

  • When dynamically loading libraries under a Unix platform, the engine now also checks the global path.

  • Android support added for Installed Builds on Linux.

  • Added support for returning the last measured CPU time on Windows and Linux platforms. UnixPlatformTime can now update the CPU time independently of the fixed 250ms threshold.

  • Forked Process - Added DEFAULT_FORK_PROCESS_MULTITHREAD definition thats sets the default multithread behavior of a forked process (the default is singlethread).

  • New: Forked Process - Added -DisablePostForkThreading cmdline option that disables MT if the default is true.

Bug Fix:

  • Time moving backwards has been changed to a warning over a fatal error. This allows that time to be clamped and provides an opportunity for the system to recover.

  • This fix ensures that our ClockSource is always initialized.

  • LinuxAArch64 is now allowed to build and package CrashReportClient.



  • macOS Catalina and above now supports Apples Game Controller framework for connecting the latest console controllers.


Bug Fix:

  • Previously, when using more than one monitor and switching from Window mode to Fullscreen mode, if the window was partially outside the virtual screen one monitor switched to Fullscreen and the other monitor only showed a single frame of the game. This has now been fixed.

  • GetWorkArea on Windows now correctly supports Remote Desktop.



  • Added support for D3D11 RHI.

Bug Fix:

  • Fixed an issue that occurred with Visual Studio project generation after installation of February GDK. This prevents the Visual Studio solution from failing to load due to a duplicated project item MGCCompile error if the UWP component is installed in Visual Studio.


Crash Fix:

  • Fixed a crash that happened when no HOME environment variable was set.



  • Ray traced ambient occlusion, shadows, reflections, GI and skydome passes use a new sampling sequence that converges faster and diffuses the visible error in screen space.

  • The path tracer now performs anti-aliasing with a multi-pixel filter kernel for improved quality. The width of the filter can be set in the PostProcessVolume settings. Settings such as TAA are automatically disabled while the path tracer is active.

  • Improved the support for using the path tracer with Movie Render Queue.

  • The path tracer supports per light show flags and can isolate direct vs. indirect lighting.

  • The path tracer now applies backface culling to camera rays to match raster modes.

  • Orthographic cameras are now supported by the path tracer.

  • Updated the Vulkan SDK to from

  • Added Scene Capture visibility flags.

  • MovieRenderPipeline and DLSS - Added support for the DLSS Plugin to MRQ and for the supporting UI to control quality settings.

  • Adding logging of the before and (attempted) after states to viewport resize failure logging.

  • Enabled RenderDoc in cooked builds.

  • Added support for PIX GPU captures on Windows with a new plugin.

  • Added an option to disable ray tracing for old drivers.

  • Adding logging of the GPU status when a query timeout is hit.

  • Hair passes and hair shaders shouldn't have any performance impact on runtime when the HairStrands plugin is disabled.


  • Added bIgnoreTranslucentMaterials to TraceMaterialRay.

  • Added extra logging for CreateSwapChain failing with E_INVALIDARG.

  • Fixed hair transmittance applied on hair cards in forward rendering.

  • Movie Render Queue: Users can now set overscan to work in combination with EXR output.

  • Added a cvar to set the minimum Windows version to enable ray tracing in DX12.

  • Added adaptive voxel allocation to avoid overallocation, allowing for a large set of grooms casting shadow.

  • Added support for screen percentage in ray-tracing skylight.

  • Changed the hair cards sampler to use anisotropic sampling for better rendition.

  • Added Blueprint methods to create volume / array textures.

  • Added a project setting to enable / disable auto virtual texture import. The setting defaults to enabled to match existing functionality.

  • Updated the hash functions Rand3DPCG32 and Rand4DPCG32 to have higher quality and faster GPU runtime performance.

  • Moved the location of virtual texture feedback per frame. Previously, we sampled the same location for feedback each frame, now we jitter the location over the virtual texture feedback tile to ensure we touch each location over time.

  • Added new optional hair strands composition points (after the separate translucent pass, and before the translucent render after DOF). \

  • Added an option to cull objects by distance and solid angle behind the camera in ray tracing.

  • SortedIndices and SortedIndicesOffset in NiagaraMeshVertexFactory are now part of FNiagaraMeshUniformParameters instead of being separate resources. This is needed for ray tracing hit shaders, which should always be uniform buffers or loose parameters.

  • Added ray tracing support for per instance attributes such as color for Niagara meshes.

  • Refactored per-vertex attribute interpolation in ray tracing shaders to reduce register usage. Attributes are now interpolated explicitly inside the per-vertex loop. Removed a few variables that are no longer used.

  • All ray tracing shaders now explicitly share the global root signature. This allows separate pre-compilation of ray tracing pipeline collection objects containing only hit shaders.

  • Added support for AMD HitToken extension.

  • Added clear coat approximation to the experimental ray-traced reflection shader.

  • Added cvars to globally control ray tracing shadows for different light types. All light types are enabled by default and are still controlled by r.RayTracing.Shadows as well as per-light settings. The new cvars are intended for global easy overrides, allowing fine grained control over quality vs performance in games, without content changes. New cvars:

    • r.RayTracing.Shadows.Lights.Directional

    • r.RayTracing.Shadows.Lights.Point

    • r.RayTracing.Shadows.Lights.Spot

    • r.RayTracing.Shadows.Lights.Rect

  • Moved pixel coord into an explicit field of the ray-tracing payload. This grows the payload structure to 64 bytes and invalidates all ray-tracing shaders.

  • Added r.RayTracing.Shadows.AcceptFirstHit CVar that adds RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH to shadow rays, allowing the ray tracing process to terminate before the real closest hit point is found. This improves shadow ray tracing performance, but may theoretically result in worse shadow denoising quality.

  • Added various improvements for the experimental ray-traced reflection shader:

    • Implemented support for the reflection capture fallback.

    • Excluded unlit and hair pixels.

    • Now respects cvars for direct and indirect lighting.

  • Implemented a roughness threshold for skipping any-hit shader invocation in the experimental ray-traced reflection shader.

  • Implemented a roughness bias for experimental ray-traced reflection, controlled by r.RayTracing.Reflections.ExperimentalDeferred.SmoothBias (default = 0). This can improve reflection performance in certain scenes by forcing ray directions to be more coherent. Additionally, this allows globally controlling RT reflection appearance without content modification.

  • Ray-tracing shader creation is now skipped when run-time ray-tracing support is compiled out. This replicates logic from FShaderCodeArchive::CreateShader in FShaderMapResource_InlineCode::CreateRHIShader.

  • Added the r.D3D12.DXR.MinimumDriverVersionAMD cvar to allow banning ray tracing on drivers that may be too old or have known issues. The default is 0, which allows any version.

  • Implemented an optional non-blocking ray-tracing PSO compilation mode, eliminating CPU time spikes at the cost of rendering some objects using a fallback shader (opaque black). \ The new cvar r.RayTracing.NonBlockingPipelineCreation can be used to opt-in to non-blocking mode (default=0, preserving previous PSO creation behavior). Non-blocking mode should only be used in the game where hitches are not acceptable. Any offline engine use cases, such as cinematic rendering, should use a default blocking mode to avoid any artifacts due to fallback shaders.


  • Improved the sampling pattern used by the path tracer to speedup convergence.

Crash Fix:

  • Corrected a crash with invalid ISM indices and ray tracing enabled.

  • Fixed a crash caused by a null pointer dereference in distance field generation while cooking assets.

  • Corrected a RHI Bypass crash caused by RHI Resources losing their reference counts before being used in a draw.

  • Fixed a Lightmap Density view mode crash when using tessellation.

  • Ensured that adaptive virtual textures allocation happens before any virtual texture flush. This fixed an intermittent crash bug when using adaptive virtual textures.

  • Fixed a crash when enabling r.RayTracing.ExcludeDecals because ray tracing instances were skipped but VisibleRayTracingMeshCommands had already been registered.

  • Fixed a crash with hair strands when running in split screen / VR due to VR not being supported yet.

  • Fixed a crash when deleting a groom asset while it is still being used.

  • Fixed a crash when ray tracing shadows is the only active ray tracing effect and r.raytracing.shadows is set to 0. While the "r.RayTracing.Shadow" cvar is thread safe, it is bound to the GRayTracingShadows variable, which is not. This could produce a scenario where the variable was still set to 1 when the cvar was already 0, and therefore the RenderRayTracingShadows function would be called when it should not have been.

  • Fixed a crash in SingleLayerWater when using the forward renderer.

  • Fixed a ray-tracing-related crash on startup when running on an old windows version or an old driver. The version checks must be done much earlier during initialization.

Bug Fix:

  • Fixed possible NaN values from UniformSampleDiskConcentric.

  • Corrected washed-out appearance in path traced images at high exposure values.

  • Fixed UI clamps of Path Tracing related scene settings.

  • The path tracer output is invalidated in more cases such as object deletion and setting changes.

  • Fixed the LockStructuredBuffer to work correctly with the OpenGL RHI thread.

  • Fixed a case where per-instance data size did not match a number of instances the Hierarchical Instanced StaticMesh Component was attempting to render.

  • Corrected a hair strands precision issue that occurred when a groom was attached to a skeletal mesh whose bounding box was too large.

  • Fixed the groom property override and reset on component. This allows a clearer view of what properties are overridden by a Groom asset compared to a Groom component.

  • Fixed forward lighting on hair strands rendering.

  • Fixed bad BC compression of the Runtime Virtual Texture mask channel.

  • Fixed a missing uniform buffer in custom depth passes.

  • Disabled occlusion meshes for primitives that only render to runtime virtual texture.

  • Fixed a D3D12 Race condition for ActiveGenerations having dequeue called concurrently in WaitForCompleteion and CleanupActiveGenerations, resulting in an incorrect double pop, causing an unrelated sync point to be dropped from processing (this fixed random meshes flickering, random GPU crashes / hangs, possibly fixed numerous texture corruption cases).

  • Copied strings being registered to FVisualizeTexture, because it can accept textures with dynamic string names allocated with FRDGBuilder::AllocObject, while GVisualizeTexture outlives the RDG builders.

  • Fixed an issue where pending barriers wouldn't always be submitted in DirectX12.

  • Enforced respect for the existing virtual texture setting on texture reimport. Previously a texture might change from a regular to a virtual texture simply because of a reimport, which is usually not desirable.

  • Configured the procedural mesh object to accept ray tracing updates.

  • Fixed virtual texture pages not being unmapped for virtual textures with a non-zero FirstMipToUse.

  • Fixed handling of null SRVs in RHI Validation.

  • The RHI command list is now flushed if we are using null RHI and are exiting the RHI just in case commands have been queued up.

  • Fixed the graphic corruption caused by streaming levels reloading in combination with the DisplayCluster module.

  • Format support is now checked before using display formats.

  • Fixed RTAO to work correctly when SSAO intensity is set to 0

  • Fixed a compilation warning for material referencing the hair attributes node.

  • Fixed RenderTarget validation.

  • World Origin shifting for Runtime Virtual Texture volumes is now supported.

  • Fixed an uninitialized texcoord value for LoadVertexFactoryInputForHGS in GeometryCacheVertexFactory.

  • Corrected a missing application of pre-shadow onto the hair strands shadow mask.

  • Added some checks in RHIGetAvailableResolutions around GetDisplayModeList returning DXGI_ERROR_NOT_FOUND.

  • Fixed disable section in ray tracing that was not working with cooked content.

  • Re-added missing SSR Visualization.

  • Fixed an issue where ray-traced reflections were not being accurately represented in multi-view (such as split-screen) when material sorting for ray tracing is enabled.

  • Fixed an issue with querying for local video memory in DX12.

  • Now correctly use anisotropic filtering instead of bilinear by default for runtime virtual textures.

  • Remapped virtual texture ancestor pages when doing an Evict. This fixed an issue where unmapped pages were still referenced in the page table leading to incorrect rendering for a few frames when the physical page was reallocated and written.

  • Fixed RHIReadSurfaceFloatData ignoring the mip / array index.

  • Fixed the resource size calculation for streaming virtual textures. The size should be based on the memory footprint, not the disk footprint. Note that any streamed data ends up in a fixed-size pool.

  • Corrected RenderDoc captures asserting when running with -onethread.

  • Fixed transforms of CPU Niagara meshes instances in ray tracing.

  • Fixed the IsRotationNormalized() assert in Niagara meshes with ray tracing enabled.

  • Fixed a possible deadlock in the ray-tracing PSO compilation tasks on machines with low CPU core counts. Ray-tracing PSO compilation tasks used to run on high priority threads and would internally create additional tasks and immediately wait on them. The inner tasks also use high priority, but they may never get to run as WaitUntilTasksComplete does not execute anything itself and all HP threads already run the outer tasks. The solution is to make the outer tasks run at normal priority (or lower), so that inner tasks will always run on other task threads.

  • Fixed DeprojectScreenToWorld inaccuracy when the camera is very far from the world origin (for example, painting clouds on earth from space when using the Volumetrics plugin).

  • Texture - Stopped logging an invalid data warning for DDC misses.

  • The stencil buffer is now cleared prior to the distortion accumulation pass to prevent unintended screen distortion.

  • Clamped the frame sync slack amount to not exceed one frame interval.

  • Fixed dynamic memory allocation every time FStaticMeshSceneProxy::GetLOD is called in development builds.

  • Fixed a potential use-after-free issue when RenderData is null, because the static mesh name did not live long enough.

  • Fixed the MeshBatch.SegmentIndex assignment for procedural ray tracing meshes.

  • Fixed a potential deadlock on shutdown in the FRHIFrameOffsetThread.

  • Corrected the handling of the mip tail in Texture2DArrays. FTexture2DArrayResource was not respecting the mip tail count, and CreateTexture was not correctly copying the bulk data.

  • Output pixel coordinates are now explicitly passed to ray-tracing hit shaders through payload instead of using DispatchRaysIndex to emulate SV_Position. This fixes dithering effects in ray-tracing shaders when ray sorting is used.

  • Fixed a race condition that occurred when initializing FormatVersionMap for FShaderCompileUtilities::DoWriteTasks.

  • A BitMask template function is now used to avoid bugs when creating masks where the number of bits requested equals the type bit size.

  • Added a fix to prevent the pre-loadscreen pumping of render thread ticks when RHI is suspended.

  • Fixed incorrect validation of the stencil plane in DSV surfaces. SRVs were always set up to validate against the depth plane, even for stencil SRVs, causing the validator to miss some barrier errors.


  • Deprecated the PreviousLODLevel in UStaticMeshComponent. This member was added back in 2005 and all uses of the member have since been removed.

  • The groom length clip property is now deprecated and will be removed in a subsequent release.

  • Deprecated the unused function UStaticMeshComponent::UpdatePreCulledData



  • Open Color IO - Now when a user makes any external changes to the raw OCIO config file or any related files, UE4 will bring up a dialog prompting the user to reload the related config file.

    • These files will also be reloaded on UE4 start.

    • Added a button to reload the raw config file manually.

Bug Fix:

  • Fixed an issue with texture resources being deleted before being released.



  • The path tracer now implements multiple-importance sampling for all light and material types to improve sampling quality across the full range of light source sizes and roughness values.

  • The Source Length attribute on point and spot lights is now supported by the path tracer.

  • Skylight is now hidden from view in the path tracer unless real-time capture mode is active.

  • Textured Rect Lights are now supported in the path tracer.

  • The path tracer now approximates caustic light paths to reduce noise on scenes with glass and shiny metals by default.

  • Non-shadow casting lights, objects, and materials are now supported in the path tracer.

  • The path tracer now supports barn doors on Rect Lights.

  • The path tracer now supports the attenuation radius falloff controls.

  • Added MaxPathExposure to PostProcessVolume to clamp path tracer fireflies.

  • Added a setting for the path tracer to control if emissive materials affect other surfaces or not. This is enabled by default, but can be turned off to reduce noise if those surfaces are already represented by lights.

  • The Path Tracer now supports more than 256 lights. Performance will vary based on the amount of overlap in the attenuation radius.

  • Ray-traced shadows from Skylights now support the real-time capture mode.

  • Improved sampling quality for Skylights.

  • IES profiles are now supported in the path tracer.

  • An OpenImageDenoise-based plugin is now provided for the Path Tracer to reduce visible noise after the target sample count has been reached.

  • Added Sky Atmosphere functionality to recover the atmosphere transmittance from Blueprint (for a Directional Light).

  • The LMGPU panel is now forced to refresh on starting and stopping building to enforce CanEditChange settings.

  • Added a shadow source angle factor for ray-traced shadows from directional lights. This allows artists to vary the penumbra shape without changing the light shape.

  • Contact shadows now respects the "cast dynamic shadows" flag

  • Added ray tracing global illumination improvements to the final gather method.

  • Added support for ray-traced, subsurface shadows. This emulates raster, subsurface shadows by casting a secondary ray from the point-of-view of the light source. A homogenous volume is extruded from the furthest occluder to the shading point where the density of this volume is proportional to the shading model's opacity.

  • Subsurface falloff is now applied to contact shadows similar to the PCF path. This replaces the ad-hoc lightening of transmission shadows

  • Added a new flag for "cast contact shadows", which is stored in Gbuffer and respected (as much as possible) when applying contact shadows.

  • Added cvars to enable / disable ray-traced global illumination contribution by light type.

    • r.RayTracing.GlobalIllumination.Lights.DirectionalLight (default = 1)

    • r.RayTracing.GlobalIllumination.Lights.PointLight (default = 1)

    • r.RayTracing.GlobalIllumination.Lights.SpotLight (default = 1)

    • r.RayTracing.GlobalIllumination.Lights.RectLight (default = 1)


  • Adjusted barn door visualization to match how lighting is computed from Rect Lights

Bug Fix:

  • Fixed shading of points inside the barn door volume of Rect Lights

  • Fixed path traced shadow artifacts on point lights with tiny radiuses.

  • Ray traced shadows from point lights are now more robust for small radiuses.

  • Fewer auxiliary passes are rendered when the path tracer is active, speeding up render times in complex scenes.

  • Fixed lighting inconsistency with point lights of 0 radius.

  • Materials tagged as sky are now skipped for indirect rays by the path tracer to prevent double-counting against the skylight. Ensure that any such materials have the "Is Sky" checkbox enabled.

  • PostProcessVolume and Skylight now respect the different editor Hidden flags (Outliner, DataLayers, Level).

  • Fixed DFAO artifacts when the global distance field is disabled.

  • Fixed multi-view rendering for the Path Tracer.

  • The Indirect Lighting Intensity factor is now respected when computing ray-tracing global illumination.

  • Made Distance Field Ambient Occlusion (DFAO) mutually exclusive with Ray Traced Ambient Occlusion (RTAO).



  • File containing stable shader keys used for PSO cache is no longer text (scl.csv) but a binary (.shk)

  • Performance of "expand" step during the PSO cache collection has been greatly improved.

  • ShaderCompiler will print a warning if it detects that a shadermap is taking too long to compile.

  • ShaderCompiler will print out a warning when a shadermap is taking too long to compile and can crash the build if configured so (useful to prevent the builds from being stuck indefinitely).

  • For a chunked build, shader library is now also split into chunks, so the shader code is there for the assets that need it.

  • Mapping between the assets and shader code will now be copied to build's Metadata after the cook.

  • Added an in-memory cache of shader compile jobs, which reduces the amount of shaders needed to be compiled.

  • "Missing cached shadermap" string now includes more information about the asset, including the DDC key hash.

  • The path tracer now supports Subsurface and Subsurface Profile materials with a random walk approach.

  • The cloth shading model is now supported in the path tracer.

  • Improved sampling quality for the shading models supported by the path tracer.

  • All material blending modes are now supported in the path tracer. Translucent materials will produce (rough) refraction when a non-unit IOR is provided.

  • The Thin translucent shading model is now supported in the path tracer. This produces colored transparency by default, and when refraction is specified, will produce (rough) thin refraction.

  • An error is now thrown when a translucent material with 'Output Velocity' enabled (in which case it writes to depth buffer) contains material nodes reading from the depth buffer, as it cannot read from and write to the depth buffer at the same time.

  • Added an option to blend skylight cubemap on forward shaded elements. Disabled by default to preserve performance.

  • Added Supports Anisotropic Materials as a DDPI setting to disable anisotropic materials on a per-platform basis. By default, Supports Anisotropic Materials is false.

  • The "missing cached shadermap" string now includes more information about the asset, including the DDC key hash.

  • ShaderCompiler will now print out a warning when a shadermap is taking too long to compile and can crash the build if configured so (this is useful to prevent the builds from being stuck indefinitely).

  • Added an in-memory cache of shader compile jobs, which reduces the amount of shaders needed to be compiled.

  • Added a Blueprint API to query material statistics.

  • Removed the dedicated logic around compiling debug view mode shaders on demand, instead they are now included in the regular shader map, and now compiled on demand by the new system used for all shaders.

  • Added the ability for shaders to check whether the editor is being targeted in ShouldCompilePermutation.

    • This now excludes debug view mode shaders from non-editor paks. Previously, debug view mode shaders were never cooked into .pak files, so this should match previous behavior.

    • This means more compile jobs will now be submitted in-editor, since debug view mode shaders jobs are now submitted by default, but this shouldn't affect overall editor performance, since important shaders should still compile on demand at a higher priority.

  • Now, when a 'ForceLocal' shader compiler job is prepared, if an existing job for the same key has already been started on an XGE worker, a copy of the job is also kicked with the 'ForceLocal' priority.

  • Added on-demand shader compiling:

    • Rendering from potentially incomplete shader maps is now allowed, as long as all required shaders are present.

    • Attempts to access missing shaders will now kick compile jobs on demand.

    • Shader compiler interface was refactored to better handle lots of (potentially duplicated) jobs being submitted from multiple threads.

Bug Fix:

  • Relaxed PSO cache filtering logic as to prevent it from flagging valid cases (particularly with packed normals in vertex declaration).

  • Fixed GPU skin vertex factory using too many TEXCOORD semantics.

  • Fixed non-deterministic name sorting in memory images that resulted in spurious build differences.

  • Fixed non-determinism in material shader maps (reduces patch sizes).

  • Added a saturate node to the parallax bomb material function to prevent Max Steps potentially exploding, which can hang the GPU.

  • Added support for sampling Eye Adaptation in decal materials.

  • Fixed the generation of material texture scales, used for texture streaming.

  • Fixed debug texture scale rendering.

  • Debug view rendering now takes the blend mode from the original material, which fixes flickering translucent materials.

  • Information from FDebugViewModeInterface is now considered when deciding whether or not to compile specific debug view mode shaders.

  • Fixed inheriting static material parameters from one material instance to another.

  • Fixed various problems related to material layer parameters.

  • Added changes to clear coat shading model, addressing several UDN issues:

    • Corrected ClearCoat not properly modifying roughness for specular contribution of the under-coat when lighting with area lights.

    • Fixed an issue with bottom-normal not initializing all context dot-products needed by some lights.

    • Now prefers NoL for the geometry term to have closer parity with DefaultLit when ClearCoat=0.

    • Now respects GBuffer.Specular for reflection specular contribution when ClearCoat=0.

    • Reverted the application of NoL to the refracted specular lobe.

    • Now apply the Fresnel term to the non-refracted bottom coat to handle cases when ClearCoat<1.

  • Relaxed PSO cache filtering logic to prevent it from flagging valid cases (particularly with packed normals in vertex declaration).

  • Trying to compile/render debug view mode shaders is now skipped, if FMaterial::ShouldCache returns false for any of the required shader types. This fixes a failed check / crash which occurred when trying to compile landscape debug shaders, as landscape material resources have a complicated ShouldCache override.

  • Various fixes related to material layer inheritance

  • Ensured FMatExpressionPreview::ReleaseResource happens on the render thread.

  • Ensured the Lambda that assigns RenderingThreadPendingCompilerEnvironment holds a ref-count


  • Volumetric Cloud prototype: Disconnected the material connection to the volumetric cloud .ush file that was causing cook errors on some platforms. Please use the Volumetric Cloud actor, or reconnect the pins in the prototype material.

Mobile Rendering


  • Vulkan is now allowed on devices with Adreno5xx GPUs running Android 10 or a newer Android version.

  • Added an onscreen warning for mobile for a misused Sky Atmosphere. This will help to identify why Sky Atmosphere is missing on mobile platforms.

  • DepthPass FullOpaque is now added when SDF or AO are activated on mobile.

  • DepthPass is now decoupled from BasePass when SDF or AO are active.

  • Removed reprojection from basepixel, it is no longer needed as we are now using current frame depth.

  • The TC_ReflectionCapture setting is now hidden.

  • Added support for Panini projection on mobile.

  • FXAA mobile is now available, it can be enabled with r.DefaultFeature.AntiAliasing=1

  • Added a SSAO technique to the mobile forward renderer.

  • Added a config cache for a per-platform toggle of MobileNumDynamicPointLights.

  • Implemented DistanceField Shadow on mobile (no GL / Metal for now).

  • Added support for the ASTC decode mode on GL.

  • Updated Metal version to 2.1 for the iOS desktop renderer.

  • Enabled Manual Vertex Fetch on the iOS desktop renderer.

Bug Fix:

  • Reducing the number of supported dynamic point lights on mobile (r.MobileNumDynamicPointLights) will now correctly reduce the number of bound constant buffers.

  • Read-only buffers are now explicitly marked as read-only in Vulkan shaders to improve device compatibility.

  • Fixed incorrect usage of Vulkan sub-passes while MSAA is enabled.

  • Fixed a case where unbuilt static objects were not affected by indirect lighting on mobile.

  • Generated Vulkan shaders will no longer initialize variables to zero where it is not required.

  • Added a missing DBuffer Emissive blend mode remapping for a mobile decal rendering.

  • Fixed runtime mipmaps generation on mobile.

  • It is now possible to opt out Encoded TextureCube from the package if the platform doesn't need EncodedData.

  • Fixed modulated shadows so that the Modulated Shadow option is greyed out if the Light is not Stationary.

  • Made fixes to the VK_EXT_ASTC_decode_mode extension.

  • Corrected the VertexInterpolator material node so that it functions correctly when used in a mesh particle material.

  • Fixed the DisableFlipCopyGLES logic that inverted scene captures with Android GLES RHI.

  • Fixed the Vulkan CPU readback.

  • Fixed a thread deadlock between ray tracing and RHI.

  • The calling context is now passed down during defrag instead of accessing the global context.



  • Added ray-tracing-specific ambient occlusion parameters in the post process volume.

    • Intensity: A scalar factor applied to the ambient occlusion score.

    • Radius: Adjusts the world-space radius of occlusion rays.


  • The following improvements have been made to Cubemaps to introduce better prefiltering that limits excessive blur from occurring from the sources:

    • Cubemaps generated from .hdr long-lat sources were being strongly blurred in cases when mipmaps were enabled. This happened originally because such cubemaps were intended for use only with the "Ambient Cubemap" lighting feature, and their mips were generated using angular filtering. Skylights now have many mechanisms for visibility and shadowing, causing that feature to become obsolete. Angular mipmap filtering for long-lat textures is disabled, and therefore mipmaps for cubemaps no longer introduce significant blur.

    • Cubemaps generated from long-lat originally were low quality because their maximum size was set to 512 pixels by default. This limitation has been removed, and resolution of generated cubemaps is now determined by the size of the source long-lat texture.

    • Imported .hdr textures were incorrectly marked as sRGB, even though they were internally processed as textures using linear color space. Now, they should have sRGB mode automatically disabled when imported.

    • Cubemaps generated from long-lat sources can now use the texture adjustment settings of the Texture Editor.

Bug Fix:

  • Color Correct Regions - changed the Regions refresh method to better support environments other than Editor.

  • Regions that occupy less than 1 pixel on the screen are no longer rendered.

  • Fixed a color correction issue where shaders with Highlights assumed that max Scene color was capped at value 1.



  • Implemented a Camera Shake upgrade tool to convert any legacy Matinee camera shake asset to a Sequence animation. Shakes with no CameraAnim asset are left untouched.

  • The Dummy Camera Manager now enables you to see the camera shake FX in the Camera Shake Previewer tool.

  • Added per-material support for each Object ID instead of per-component in Movie Pipeline. Additionally, per-material support now applies to Instanced Static Meshes, such as foliage. Individual materials are not supported on instanced static meshes.

  • The "Write all Samples" debug option moved from HighRes settings to the new Debug Setting in MoviePipeline.

  • New options in Control Rig enable ticking on all skeletal mesh components and warm up frames when baking an animation sequence.

  • FK Control Rigs are now masked in all sections when a Control is inactive.

  • Add an aspect ratio axis constraint accessor on the IMovieScenePlaybackClient.

  • Add a serial number on bound object caches.

  • The Level Sequence playback context picker now lets you pick actual level sequence actors instead of just worlds.

  • Add support for previewing camera shakes' post process settings to the camera shake previewer tool.

  • Added track pre-compilation parameters. This lets tracks alter the default metadata at compile time for all the entities that will be created by their sections.

  • Added the HasAnyData method to non-float channels

  • Debug visualization now supports more component types for the new core evaluation system.

  • The asset picker in the Camera Animation Track now remembers your toggled preferences for showing / hiding outdated assets.

  • Added a component flag to CopyToOutput for the new core evaluation system.

  • Added an API to get the list of sequence IDs in a hierarchy.

  • Added a utility function to find a related sequence instance in a given hierarchy.

  • The Entity Import metadata allows a property track to use a different property binding that can also be computed during compiling.

  • The Camera Cut Track can now blend out to a parent sequence's camera cut track. Blend times are affected by sub-sequences time dilation.

  • The Frame Time Range conversion helper now includes a frame number range.

  • You can now directly load an Animation Sequence into a Control Rig Section at the current time.

  • Added return value to OnSectionMoved to know when a moved section caused other sections to be added/removed.

  • The interrogation linker now has a utility function to get the animated value of a property.

  • Camera Shake track now uses the base shake class instead of the (deprecated) Matinee shake class.

  • Camera animation sequences can now be toggled between the camera component and cine-camera component.

  • Added network masks to sub-sections allowing for server and / or client only sub-sequences. This optimizes cinematic assets such as FX or audio when playing back on dedicated servers.

  • Sequencer can now be emulated as a client or a server using the Networking section of the settings menu in the Sequencer UI.

  • High performance ECS-based evaluations now support Byte, Enum, Integer, Vector, and Color properties. This includes the following:

    • Byte, Enum, Integer, Vector and Color properties all now run through the ECS supporting greater parallelism and efficiency.

    • Vectors and Colors both leverage metadata components for the number of vector channels and the color type, respectively.

    • Both types run their own derived property component type handler (FVectorHandler and FColorHandler) for initializing their metadata components.

    • Automatic overriding of PostProcessing properties is now supported. This means that users no longer need to manually override PP settings when animated through Sequencer for them to apply to the camera.

  • Entity systems can now run in multiple phases. Systems can check the currently executing phase by checking Linker > GetActiveRunner() > GetCurrentPhase().

  • Trait Classes for runtime metadata simplify the runtime process, and removes the need for using the PropertyType and OperationalType template parameters. This includes the following improvements:

    • Built-in property accessors are refactored to correctly utilize a trait's class.

    • The API now uses traits which supports the specification of metadata components for switching property types at runtime. This lays the foundation for also using Vector and Color property types.

    • Traits now specify the conversation layer from storage type to the UObject property application for custom accessors, fast PTR offsets, and track instance bindings. This includes the storage type and the required metadata components.

    • Blend Output entities now also contain an FMovieScenePropertyBinding, which is copied from the contributors.

  • Added Read/WriteComponent methods to FEntityAllocation to make custom component access now return a scope-locked wrapper around the component data.


  • There are several new improvements for Sequencer playback.

    • Playback speed is now configurable per sequencer instance by using a delegate. Defaults to previous values.

    • Shuttle Backward/Forward now uses speeds from the delegate.

    • Added the Restore Speed command to restore the speed to the designated playback speed. No default binding.

    • TogglePlay now actually toggles play and no longer calls PlayForward.

  • Upgraded boolean property tracks to use the new evaluation core.

  • Resizing and moving camera cut and shot track sections are more streamlined and easier to do.

  • Files converted from Matinee to Sequencer are now broken into multiple files.

Crash Fix:

  • Duplicating a Control Rig track in Sequencer no longer crashes the Editor.

  • The Matinee to Level Sequence converter plugin no longer crashes Editor.

  • The Editor no longer crashes when playing / rendering level sequences that contain template sequences.

  • Dragging track sections over each other or completely overlapping other sections no longer crashes the Editor.

  • The Editor no longer crashes when you switch worlds with Sequencer open.

Bug Fix:

  • The Output Directory in MRQ now correctly uses a local file path.

  • Template Sequences now correctly have no hierarchical bias. This allows Template Sequence animation to blend with any animation set directly on the same object.

  • Fixed various minor issues with the Matinee to Level Sequencer Converter tool.

  • The camera cut global start times are no longer changed when new global times start.

  • Don't stomp the global start time of camera cuts when new ones start

  • FBX Export options can now correctly be created in Blueprints.

  • The FOV blending preview in Editor now displays correctly when scrubbing/playing over a blend-out at the end of a cinematic.

  • Non-Linear Animation now correctly only caches root transforms when an offset transformation is set.

  • Blending preview code is now viewable in the modifier callback. This solves problems with cameras who have look-at constraints and problems with system dependencies in the new core evaluation system.

  • Zero-frame-wide sections are no longer created when converting Matinee files to Sequencer.

  • Template Sequences now correctly use base classes instead of child classes for compatibility with other Template Sequences.

  • Resolved an issue that prevented a sequence from playing more than once.

  • Exiting a camera cut now correctly goes back to the previous Editor location for blending cuts.

  • Sequencer now correctly counts property composites in the non-float method in the new core evaluation system.

  • BlenderType component values now correctly copy child entities in the new core evaluation system.

  • The warning Number of TAA samples is no longer hard coded in MoviePipeline, and it now respects the actual variable set.

  • Camera shakes with a custom duration no longer incorrectly shows a warning on the shake track.

  • Ease in and out is now correctly enabled for the first and last sections on the Camera Cut track.

  • Easing durations are now automatically reset if auto-easing is not allowed for the given section.

  • Sequencer no longer incorrectly fails to animate an object's properties.

  • World depth green channels now have the correct values for view-relative depth in MoviePipeline. The values now represent the distance from the camera by direction-to-pixel.

  • The latent action setup is now simplified and correctly handles re-entrancy in latent actions.

  • Fixed an issue in MoviePipeline where using Camera Cut for Motion Blur caused camera motion vectors to be incorrect for motion blur.

  • The Camera Shake Previewer is now compatible with Matinee shakes.

  • Selections between Template Sequences and the Editor Viewport now synchronize correctly.

  • Fixed camera jitter problems related to camera blending after a blend has finished.

  • Sequencer: Can now Bake Anim Sequences from a loaded sub sequence.

  • Resolved various outlier issues with Camera Cut blending.

  • The Camera Shake previewer tool now correctly cleans up the completed camera animations and initializes the base FOV.

  • Correctly clean-up finished camera anims and initialize the base FOV in the camera shake previewer tool.

  • Event tracks now correctly rebind to the Sequence Director when copy / pasting tracks.

  • Initial Values are now correctly shared between FSequencer instances and Interrogators. This ensures that exports and trail rendering share the same initial value data, despite objects potentially being in animated states when an interrogation is performed.


  • You can no longer use ForEachAllocation task callbacks for resolving access to component data. The task internals already handle the callbacks and the lock is maintained correctly for the duration of the task.




  • Updated AutoSDK to allow unprivileged execution of the install / uninstall hooks when possible.


  • SRadialBox : Added support for Radial sectors with a central angle smaller than 360 degrees.


  • Added Custom Safe Zone support for runtime builds.

  • Added debug callstack to root Invalidation Widgets in Slate Insights plugin.

  • Added a new Slate.bAllowNotificationWidget console variable to enable / disable the display of notification widgets.

Crash Fix:

  • Fixed a crash related to Preload Screen multi-thread protection.

Bug Fix:

  • Fixed an issue where mouse input was ignored when the application ran in Standalone mode or after packaging when FSceneViewport wasn't associated with UGameViewportClient.

  • Fixed a bug with the Component Visualizer Manager that prevented right-clicks in the Editor from being reported correctly.

  • Fixed a possible bad reinterpret cast in WidgetRenderer.

  • Fixed an issue that caused combo boxes to sometimes start capturing keyboard or gamepad input upon construction, even though that was not intended.

  • Updated the Slate LetterSpacing property to take font scale into account. Zooming on the UMG designer no longer causes text with line spacing applied to change (relative) size.

  • OnItemScrolledIntoView can no longer be called if the item provided doesn't correspond to a valid Widget.

  • Fix to a possible deadlock in Slate Loading screen code.

  • You can now use the CVar, Slate.Font.AsyncLazyLoad, to force fonts marked as LazyLoad to be loaded on a background thread. This prevents IO hitches in font loading.

  • When reflowing the UI based on Right To Left, the pivot point is now also mirrored about the middle.



  • UWidgets that had their SWidget component garbage collected now have a (No Slate Widget) label in the Debug Filter of the Blueprint Debugger.

  • The SetSelectedItem function in UCommonRotator (part of the experimental CommonUI plugin) is now virtual.

  • Added a Cvar to limit the Render target size used for Widget Components (4K size by default).

  • Renaming a UMG animation to a name longer than 100 characters now issues a warning and prevents you from submitting that name.

  • Added a new function to allow updating the render target on the UWidgetComponent even if ticking is disabled.

Crash Fix:

  • Fixed a crash that happened when trying to paste multiple items on a Widget that only supports one child if it already has one.

  • Fixed an issue that caused WidgetComponent to try accessing deleted resources in the render thread.

  • Fixed an issue that caused a crash on iOS when entering Korean text.

Bug Fix:

  • Copying and pasting a widget no longer pastes the copy as a child of the original.

  • Fixed a copy-paste issue where editing the text on the copy also changed the text on the original.

  • Fixed an issue that made it impossible to undo changes if window focus was lost while dragging a slider (for example, by using a keyboard shortcut to switch to a different window).

  • Fixed an issue that caused LongPress touch events to end prematurely when the finger or mouse didn't move.

  • Fixed a UMG bug that prevented Widgets from being dragged in the Designer view.

  • Added a null check in RichTextBlock's SetTextStyle.

  • Fixed an assert when renaming UMG animations to strings greater than 1023 characters

  • Fixed crash that could happen when pasting a Widget in UMG Editor.

Virtual Production


  • Performance improvements are now in place for handling large files in Multi-User Editing. This means users can now sync light bakes, take recordings, and other heavy package data efficiently. These files now transfer in seconds on local networks.

  • Multi-user servers will do asynchronous writes with large files instead of serial processing. This improves multi-user servers and reduces possible timeouts when processing large files. \

  • We added Multi-User support to Virtual Camera Actors and authority is configured via the roles assigned in VPRoles.ini.

  • Overall cluster and per-viewport Post Process settings were added to nDisplay clusters.

  • Live Link FreeD is a plugin that allows cameras and other devices that send the FreeD protocol over UDP to be utilized as a Live Link source in the engine. The FreeD protocol sends a combination of device position, orientation, and/or FIZ (Focus, Iris, Zoom) data. These are combined into a Live Link Camera Role that can easily be used in the engine.

  • Live Link VRPN is a plugin that allows connection to a VRPN server to fetch device data as a Live Link source in the engine. VRPN device types that are currently supported are Analog, Dial, Button, and Tracker. Analog, Dial, and Button device types are seen as a basic Live Link role as an array of labeled floats. Tracker device types are seen as a Live Link Transform role.

  • Support has been added for Live Link rebroadcast to virtual subjects.

  • Timestamp functionality was added to Blueprint Live Link virtual subject.

  • Virtual subject Take Recorder support is now available.

  • Added a way to intercept requests before they are handled by the Web Remote Control.

  • The nDisplay plugin now includes a LightCard Blueprint Actor. The LightCard Actor is a customizable card used to provide practical lighting on nDisplay stages.

  • Improved Switchboard config file management allows subdirectory-based organization.

  • Added the ability to access exposed preset entities by ID through the web API.

  • Added a way to get, set, and delete exposed entities metadata, which shows up in the Remote Control Details panel.

  • You can now make Remote Control API requests by using either preset ID or preset name.

  • Improved Remote Control support in -game and packaged games. Properties or functions that can't be used in -game will be marked in the Remote Control Panel, which can be disabled by a project settings. \

  • Added rebinding to the Remote Control Preset, which allows you to re-use presets across levels.

  • The function-picker search is now reliable in the Remote Control Preset.

  • Added a Details panel for exposed fields in the Remote Control Panel.

  • For Switchboard, added autodetection of project and engine paths:

    • Looks for Unreal Editor processes and projects in their command lines for detection.

    • If UE isn't running, then it will try to fill out the engine directory that Switchboard is running from.

  • For Time Management, added a genlocked, fixed-frame rate, custom timestep. It is very similar to the Fixed Rate in Project Settings implemented in UnrealEngine.cpp, except that it keeps up with platform time by accounting for any missed frames when the fps drops below the specified fixed rate.

  • For Camera Calibration, prepared NodalOffsetAlgoPoints to become a base class for algos with machine vision.

    • Now that OpenCV doesn't crash, an extra copy of the media frame was removed.

    • Moved ReadMediaPixels to the step controller so that it can be used by any step without reimplementation.

    • Changed methods and member variables in NodalOffsetAlgoPoints from private to protected because they need to be accessed by derived classes.

    • Added a button to apply the nodal offset to the calibrator parent.

    • Improved a few user-facing error messages.

  • For Switchboard, added local P4 settings detection. These settings can be detected when P4 is enabled in the new Switchboard config dialog, but will respect existing values (if there are any), or if the new Detect button is pressed, in which case it will replace existing values with any values found.

  • Added Multi-User support to nDisplay.

  • In Movie Render Queue, added a stills automation editor utility called Still Render Setup Automation. This automates the creation of a sequence with a still for a given camera. The Python script required a plugin dependency to Sequencer Scripting.

  • The Composure ICompElementManager is now public.

  • RCWebUI: Added a command line option "-RCWebInterfaceDisable" to prevent the WebApp from starting. This is useful when starting instances of the same project that are not meant to run the web server.

  • VPUtilities: Created a Blueprint library function for virtual production rendering-related functions. Added a functor generator to activate a given Scene View Extension when it is:

    • A PIE viewport.

    • A SIE viewport.

    • The active editor viewport.

    • The game primary scene viewport.

    The initial use case is to be able to set an OCIO config in BP.

  • Added Line Wrap and Auto Scroll controls to the log pane in Switchboard. Enabling Line Wrap breaks long messages into multiple lines, ensuring you can read them in their entirety without needing to scroll horizontally. Auto Scroll causes the view to follow the newest messages as they're appended to the bottom of the log, but can be disabled to make it easier to inspect older log messages (and is disabled automatically when you drag the scroll bar).

  • SwitchboardListener now caches the mosaic topologies reported via NvAPI, which change infrequently and can be expensive to query, rather than updating them every second. A Refresh Mosaics button was added to Switchboard's nDisplay Monitor to manually trigger an update.

  • Switchboard now includes the ShaderCompileWorker target when performing compilation on Unreal and nDisplay devices.

  • Switchboard now uses a new Python script called sbl_helper to perform Perforce syncing, rather than the Unreal Automation Tool Sync Project. Syncing is now faster, with better progress reporting, and build versioning is more consistent with UnrealGameSync. sbl_helper laying the groundwork for additional planned improvements.

  • Added Linux support for Blackmagic.

  • Switchboard now includes a toggle setting for nDisplay devices (labeled Unattended, and enabled by default) to include the -unattended argument on the command line, suppressing undesirable interactive UI and notifications.

  • The Switchboard toolbar options, Install Listener and Uninstall Listener, were replaced with a checkbox labeled Launch Switchboard Listener on Login, which more accurately describes its behavior, and a bug in creating the corresponding registry entry was fixed.

  • Added an editor command line argument "-AutoDeclinePackageRecovery" to bypass the Restore Packages prompt and discard autosaves. This is controlled by a corresponding Skip Package Recovery checkbox in Switchboard's Unreal device settings. This can be useful in multi-user editing scenarios, where restoring autosaved packages may not be desirable.

  • Switchboard will send the local nDisplay cluster configuration Blueprint asset to nDisplay devices upon launching them, which simplifies iteration and testing of these configurations without the overhead of submitting to and syncing from version control.

  • Added a new Blueprint editor, the nDisplay Config Editor, specifically for creating nDisplay assets. You can create a cluster, assign projection policies, and model 3D previews of the complex configurations of physical displays. The assets created here are now Blueprint Actors which you can drag and drop into levels. Once instanced in a level, properties can be exposed to Remote Control and replicated with Multi-User. Assets from UE4 4.26 will update to the new version provided that the imported JSON config file is available and at the location where the old asset was imported. It is still possible to import old JSON config files manually by dropping them into the content browser.

Crash Fix:

  • Fixed a crash in the Virtual Camera remote output provider.

  • No longer crashes when force-deleting a Live Link remap asset.

  • Live Link virtual subjects API no longer crashes when multi-threaded.

  • Fixed a crash that occurred when loading a preset with an exposed BP function.

Bug Fix:

  • Fixed an issue with Multi-User Sequencer playback where scrubbing the timeline would result in playing game nodes.

  • Playing back a sequence on a game node no longer results in the spawned objects persisting when closing the Sequencer Editor.

  • Fixed a bug in the Live Link Transform Axis Switch preprocessor that caused incorrect mappings in some cases. The UI was also simplified to use standard Front, Right, and Up axis notation to match other available tools and software. Position and Orientation offsets were added as well to shift the incoming tracking origin to match the desired world origin.

  • The default OCIO 3D LUT file size was increased to 65x65x65.

  • The Camera component frustum now updates when driven from Live Link.

  • Added a way to avoid applying data coming in from Live Link on camera, and to force using the camera component's range instead of relying on the lens file.

  • Fixed the Timed Data Monitor timecode provider display.

  • Added getters for raw animation static and frame data from the Blueprint helper struct SubjectFrameHandle.

  • Fixed an issue where LiveLinkComponent selection based on role did not go down the hierarchy.

  • Resolved an issue with the Timed Data Monitor stage events type that made it unfilterable.

  • Updated the static assert to catch wrong base types for stage events.

  • Added a validity check when updating the Source Framerate from the first enabled Subject with valid data.

  • Fixed the TimedDataMonitor MediaIO input GetDisplayName, where player base SetRate would always return false, causing it to not play back correctly.

  • Composure is now allowed to run packaged builds.

  • Fixed presets with the same names not displaying when querying presets.

  • It is now possible to expose custom events in the Remote Control Preset.

  • In OpenCV, added cv::unreal module. This adds functions to override new and delete operators, so that UE can replace them with its FMemory implementations and avoid crashes when UE passes containers (such as std::vector<T>) that OpenCV populates, then UE tries to release the container memory.

  • Fixed an issue with Switchboard's multi-select combo boxes that could sometimes cause them to show a stale string after all items had been deselected, and improved their handling of mouse clicks.

  • Fixed several instances where malformed JSON commands could cause SwitchboardListener to crash, and added diagnostic logging indicating when required command fields are missing.


  • Removed a property in FixedFrameRateCustomTimeStep that has been deprecated since 4.21.


  • We removed old Virtual Camera tools and assets. Users should now use Simple Virtual Camera or VirtualCamera2 Actor.

  • All references to the deprecated VirtualCamera actor have been removed from the Virtual Camera Showcase project.


Bug Fix:

  • Fixed a race condition happening due to the render thread accessing the materials in the main thread.

  • The transient actor UBuoyancyManager is now hidden from Scene Outliner (it will eventually become a subsystem).

  • Deterministic fixes for water:

    • Deterministic names are now used for all automatically-generated UObjects generated by water body actors.

    • Hack around UBodySetup's BodySetupGuid, which generates random GUIDs each time a new UBodySetup is created (this can happen on construction for lake and ocean collision components).

    • With deterministic names for collision components, they can be made net-addressable. This is a solution for warnings occurring on the server about replicated references not being net-addressable.

    • Generated objects have been made NonPIEDuplicateTransient to work around a check in NewObject, which can happen when saving as a map. Otherwise, a duplicated and named object marked for NeedsPostLoad might end up being reused without the flag being cleared.

  • GC collector was not properly tracking materials used by WaterMeshComponent, and this caused a crash. This issue has been fixed.

  • Fixed an issue causing an assert when the debug information for underwater materials was displayed.

  • Fixed an issue where river spline point parameters were getting out of order when the user added new points; it now uses the ordered list of spline mesh components from the river water body, instead of relying on the Actor's GetComponents function which returns components in an undefined order.

  • Fixed a reentrance crash with UWorld::UpdateLevelStreaming.



  • Added an HLOD build option "-MapCleanup" that will delete any invalid LODActor.

  • Added the ImpostorBaker Plugin to Plugins\Experimental.

  • HLOD - Added support for per-level custom HLOD baking transform; this allows materials with WPO to be baked properly for the HLOD.

  • HLOD Rebuild Commandlet - Added a "-SkipSubLevels" option to allow building HLODs only for the persistent level.

Bug Fix:

  • Material Baking - Fixed a color constant conversion issue in FMaterialUtilities::CreateProxyMaterialAndTextures. This will only affect the "Bake out materials" tool in the Static Mesh viewer, with no change to HLODs.

  • Fixed a bug causing some Actors with multiple static mesh components to be excluded from the HLOD generation by error.

  • HLOD Clustering - Meshes excluded from HLOD volumes were not considered by the next HLOD level; this is now fixed.

  • HLOD - Ensured that all ISMC instances are properly added to the LODActor instances.

  • Fixed an issue with unbuilt HLOD detection being too sensitive.

  • Mesh Merging - Lightmap UV generation is now skipped if no free channel is found.



  • Added a render capture tag for each landscape brush being rendered.

  • Reduced runtime virtual texture invalidation during landscape editing. Editor now invalidates the brush region instead of full components.

  • Deferred readback of landscape edit layer textures to the CPU, to avoid stalling on GPU during landscape layer editing.

  • Neither selecting landscape components nor locking/unlocking landscape layers will dirty world packages anymore.

Bug Fix:

  • Fixed a problem where heightfield data was not being updated when the water brush was updated; if a heightmap/weightmap readback modification was detected during the frame, and the component was not requesting that the collision data be updated, it would fail to update the collision data when a later request was made and no modification was detected at the time of the later request.

  • Fixed an issue where the landscape layer reserved for spline was being lost upon resize.

  • Edigrated CL 14156485 - Fixed a crash that occurred when using the Smooth tool in landscape mode.

  • Edigrated CL 14193183 - Fixed a rare crash that occurred during landscape painting. LandscapeComponent's SceneProxy was recreated while RenderThread was accessing it through the component. Now it makes its copy first.

  • Fixed a problem with landscape component bounds being invalidated when using the water brush; the components were first updated with the ELandscapeComponentUpdateFlag::Component_Update_Approximated_Bounds flag, (temporarily) invalidated the bounds, and then were updated with the IsUpdateFlagEnabledForModes(ELandscapeComponentUpdateFlag::Component_Update_Heightmap_Collision) flag, but the bounds weren't updated if the heightfield was actually unchanged. Now, the bounds are not invalidated (with an approximate bounds computation) if no change is actually detected on the heightmaps.

  • Edigrated CL 14187664 - Fixed a crash occurring in RenderLandscapeComponentToTexture_RenderThread when LandscapeComponentSceneProxy is null. Added ensures at a couple of places to help track rare crashes.

  • Default landscape grass inputs to zero now, instead of throwing a compile error when not connected. Previously we threw an error as soon as node was created but not set up.



  • Added CVars landscape.RenderCaptureLayersNextHeightmapDraws and landscape.RenderCaptureLayersNextWeightmapDraws to trigger a render capture during the next heightmap/weightmap draw calls.


  • All landscape edit layers, render targets, and draw calls now have a proper debug name.

  • Replaced CVar landscape.OutputLayersDebugDrawCallName, which was forcing the layers to update, with landscape.ForceLayersUpdate, which does the same thing but more explicitly.

Bug Fix:

  • Fixed an issue where landscape layers were incorrectly compositing/decompositing heightmaps when a heightmap was shared between multiple landscape components and not entirely covered by its components (for example, 3x4 components).

  • Generation of landscape normals now matches the CPU version.

  • Fixed an issue where deleting a layer from the Landscape would have no lasting effect when Edit Layers was enabled.

  • The landscape scale XY constraint is now respected when using the viewport gizmo.

  • bFillCollisionUnderLandscapeForNavmesh and bUsedForNavigation were not propagating from landscape streaming proxies to their components when setting the property. This has been fixed.



  • Added the -xrtrackingonly command line parameter to start OpenVR in a mode where frames are not submitted to the renderer. This allows for reading the tracker and device info separately. It also allows multiple instances of the engine to run on a single machine, and for all instances to share incoming tracking and input data.

  • Added support for StereoLayer Quads to the OpenXR plugin.

  • Took OpenXR out of Beta and set it to On by default.

  • Implemented OpenXR Controller Visualization.

  • Implemented missing Head Mounted Display Blueprint nodes for OpenXR.

  • Updated the OpenXR loader and headers to version 1.0.17.

  • OpenXR doesn't support 10-bit sRGB swapchains, so we're forcing 8-bit sRGB swapchain format in OpenXR.

  • Added support for late updating the projection of each stereo view. This ensures that you are projecting for the latest field-of-view information from the headset.

  • Added WebXR standard controller models to OpenXR plugin content. The OpenXR plugin now includes all commonly found XR controller models. \

  • Added Linux support to the OpenXR plugin.

  • Added Head Mounted Display Blueprint nodes to query play space size.


  • For OpenXR, improvements were made to swapchain pipelining.

Crash Fix:

  • Editor no longer crashes when opening a project with OpenXR enabled if an HMD is not attached.

Bug Fix:

  • Start Session/Stop Session in OpenXR plugin now uses exclusive locks so frame calls can't overlap session calls.

  • Fixed the swapchain timeout by increasing retry count, adding a timeout for stereo layers, and increasing the timeout value to 100ms by default.

  • Get Camera Intrinsics for WMR was implemented.

  • Windows Mixed Reality Anchor Store case-sensitivity problems were resolved by setting all IDs on the way into WMRInterop to lowercase.

  • Added Hand Mesh as an AR Capture type for use in WMR and OpenXR.

  • WMR Hand Mesh now hooks up to XRVisualization.

  • WMR's Hand Mesh has been decoupled from spatial mapping. Previously, the Hand Mesh was part of the MRMesh, would only show if spatial mapping was enabled, and could leave zombie hands in view as the hands lost and regained tracking.

  • XR now allocates backing MSAA targets from XR runtimes.

  • Temporarily disabled ScreenSpaceDiffuseIndirect rendering for VR.

  • OnControllerButtonReleased now triggers when isActive becomes false.

  • Fixed ShadowSetup incorrectly checking for Multi-Viewport instead of Mobile Multi-View.


  • The deprecated Mono Culling Distance variable was removed from World Settings.



  • Live Link was updated to handle a tick from OpenXR hand tracking.

  • HoloLens apps can now launch a website from an existing Unreal interface in an Edge pop-up.

  • A quality-of-life improvement has been added for using an EHandKeypoint directly as an input in arrays from FXR Motion Controller Data. Previously, developers could cast the EHandKeypoint byte to a 32-bit int using built-in math conversion Blueprint functions, but this was not discoverable, and is not automatically suggested when dragging an EHandKeypoint to a Blueprint integer input.

  • A Scene Understanding update adds an Occlusion Hint OpenXR extension that could return different meshes with different levels of detail for the same surface. This could be a higher detail visible mesh, an occlusion mesh that is not meant to be visualized, or a mesh for collision.

  • Since multiple meshes could be returned for the same surface, we now ensure that only the collision meshes are used with the physics system. The user can set materials on the meshes based on what the mesh usage type is. This also fixes a bug where the trackable added event was firing before the spatial mesh was initialized. Meshes now have an appropriate material applied or added to a particular list when the mesh is first added, rather than waiting for the first update.

  • Add NV12 texture format support for DX11 and DX12 RHIs for HoloLens

Crash Fix:

  • WMR Spatial Mapping has been fixed so that it no longer crashes on Stop/Pause in an AR Session.

Bug Fix:

  • AR Actor types are now cached so the AR Session is not used erroneously in Update.

  • Plane finding in OpenXR no longer checks that spatial mapping meshes exist before processing planes. This allows updating plane finding if spatial mapping is not being used. This has been fixed by making the check predicated on the list of planes.

  • The function SupportsMultipleRenderTargets() now returns true (instead of false) for the Magic Leap OS Lumin.

  • UXR Visualization Function Library methods are now accessible via C++.

  • The ability to toggle Spatial Mapping on and off at runtime without needing to stop/resume the ARSession is now exposed. Toggle failures return false for each of WMR's AR Captures (QR, PV, SR) so a toggle retry can be made.

  • Updated WMR Toggle AR Capture to work before Start AR Session.

  • Added an option to write depth to translucent materials for HoloLens devices.

  • ARCore now uses parent class FDefaultXRCamera for SetupView.



  • The Oculus OVR plugin has been upgraded to v25 (v1.57). Some deprecated API usages were also fixed.

  • Enabled the Mobile Phase Sync for mobile Oculus devices in the Oculus VR plugin.

  • Update HMD priority list to be in this order:

    • Oculus VR

    • OpenXR

    • WMR

    • SteamVR

    Since SteamVR also works with the Oculus Rift and Windows Mixed Reality, give priority to the native Oculus and Windows Mixed Reality plugins before trying SteamVR.

OpenXR is production-ready. If enabled, it should be the priority plugin. In 4.27, the native Oculus plugin still requires higher prioritization to address runtime features that are required for shipping by Oculus but not yet supported in OpenXR .

Crash Fix:

  • Fixed a crash on startup with Oculus when -nohmd was specified in the command line.

Bug Fix:

  • Oculus HMD Module can now set up the Oculus Plugin Wrapper when the Oculus Service is not installed or broken.

  • Redundant OVRPlugin.dll verification has been removed from the Oculus Editor Module.

  • For the Steam VR Input Device, unchecked static_casts to FSteamVRInputDevice were fixed.

Upgrade Notes


Upgrade Notes:

  • The signature for IAISightTargetInterface::CanBeSeenFrom has changed to give users more information about the previous visibility state, and provide access to a userdata payload. Please update your code accordingly.


Upgrade Notes:

  • If you have an existing project using the USDImporter plugin on platforms other than Win64, Mac, or Linux, you may get and error like this:

"ERROR: USDImporter.uplugin is referenced via YourProject.uproject with a mismatched 'SupportedTargetPlatforms' field"

To fix this, open the .uproject file for the project, and change the USDImporter entry in the plugins section from this:

     "Name": "USDImporter",
     "Enabled": true

To this:

     "Name": "USDImporter",
     "Enabled": true,
     "SupportedTargetPlatforms": [


  • This introduces a breaking API change for classes inheriting IPersonaPreviewScene or ISkeletonTree that override SetSelectedBone, and for user code that binds to their SelectionChanged event. These now take an extra argument to route the cause of the change (user interaction or direct code) through to the UI elements.



  • Updated the Niagara system and emitter asset tag generation code. There are multiple new tags that can help in mass-analyzing content, but these tags will only be available on assets from UE4 4.26 or earlier after resaving the assets in UE4 4.27.


Upgrade Notes:

  • Matchmaker and Signalling server have been moved from Engine/Source/Programs/PixelStreaming to Samples/PixelStreaming. References to these paths will need to be updated. Both Signalling server and Matchmaker can now log to a file.


  • Deprecated PixelStreamingIP and PixelStreamingPort in favor of the new PixelStreamingURL command line parameter to specify Signalling Server url using ws:// or wss:// Users should replace -PixelStreamingIP <ip> and -PixelStreamingPort <port> with -PixelStreamingURL=ws://<ip>:<port>



Upgrade Notes:

  • Profile Guided Optimization is now available on Windows. Build the client with -PGOProfile and -PGOOptimize to create Profile Guided Optimization executables for improved performance.


Bug Fix:

  • Default maximum texture size for cubemaps generated from long-lat sources has been changed from 512 to unlimited. Cubemap textures saved before upgrading to UE4 4.27 will be explicitly set to 512 on asset load to preserve their old behavior, but new generated cubemaps will base their resolutions on the sizes of their source long-lat textures.

  • Previously imported .hdr textures were processed in linear color space but marked as sRGB, which could lead to incorrectly using "Color" sampler type instead of "Linear Color" in texture expressions. This can cause incompatibility between new textures and old texture expressions; to resolve this, update the texture expressions to use "Linear Color" sampler type when referencing newly imported .hdr textures.



  • WidgetInteractionComponent's PointerIndex variable is now an integer; it used to be a float.

Virtual Production

Upgrade Notes:

  • The LiveLink camera controller has been moved to its own plugin, called LiveLinkCamera. You must enable this to get LiveLink camera controller functionality. Previously, the controller was automatically added when enabling the LiveLink plugin.


  • To improve performance of Multi-user in situations of large files, we have added heuristics to the message construction to use compression. With this change, the system only compresses messages between 512 bytes and 3 megabytes. This is a major update to the session database, and existing sessions will be incompatible.

Known Issues

For a complete listing of known issues affecting Unreal Engine 4.27, 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