Unreal Engine 4.24 Release Notes

Release notes for Unreal Engine 4.24

Choose your operating system:




What's New

With the release of Unreal Engine 4.24, we continue our journey to help you build the most realistic worlds with tools that make you more productive than ever. Teams of any size should be able to create believable worlds and experiences that draw users in and keep them engaged. We have added numerous tools and improved workflows across the board to help you bring your vision to life.

The new nondestructive, layer-based Landscape workflows enable you to build more interesting and engaging outdoor environments where the terrain automatically adapts to other elements in the world. The Sky Atmosphere component generates a physically-accurate sky that can be updated dynamically depending on the time of day, and it can be viewed from the ground or from the air to create realistic-looking planetscapes. The new experimental strand-based hair and fur system brings characters to life with realistic, flowing hair. With Screen-Space Global Illumination, you can achieve natural light-filled spaces using fewer resources.

Datasmith is now available to all Unreal Engine users, bringing high-fidelity, whole-scene conversion to the masses! The new Visual Dataprep makes automating data preparation workflows more accessible so smaller, design-focused teams can benefit from them. The Live Universal Scene Description (USD) Stage Actor creates a direct link to the USD file on disk for faster iteration and better collaboration. Project creation workflow now includes a wizard-style workflow centered around the industry or type of project you are creating so you only see relevant settings and tools.

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

Morva Kristóf "KristofMorva", "projectgheist", Rémi Bismuth "Grouflon", "cmsmithio", "erikdubbelboer", Paul Greveson "moppius", Homer D Xing "homerhsing", Lukasz Baran "iniside", Cedric Neukirchen "eXifreXi", Nick Edwards "NEdwards-SumoDigital", Mike Slegeir "tehpola", "Next Turn", bd "bdiamond", Muhammad A.Moniem "mamoniem", Cristiano Carvalheiro "ccarvalheiro", Doğa Can Yanıkoğlu "dyanikoglu", Igor Karatayev "yatagarasu25", Alvaro "vorixo", "Filoppi", Seokjin Lee "Othereum", Joe Best-Rotheray "cajoebestrotheray", doublebuffered, Andy Maloney "asmaloney", Thomas Miller "tmiv", dorgon chang "dorgonman", Akymbo, Mikhail Zakharov "zzz77", Doug Richardson "drichardson", Cameron Angus "kamrann", David Nadaski "GlassBeaver", Zachary Burke "error454", "CyberKatana", "treilhes", Ari Arnbjörnsson "Flassari", "mastercoms", Marat Yakupov "moadib", Jin Hyung Ahn "zenoengine", "KrisRedbeard", Sam Bonifacio "Acren", Xu Nie "niexuchina", Minseok Lee "codeonwort", "vrachels", "improbable-valentyn", Roberto De Ioris "rdeioris", Clinton Freeman "freemancw", "Monsho", Alexander "DecoyRS", Evan Hart "ehartNV", Alessio Sgarro "cmp-". Const* UKaosSpectrum "KaosSpectrum", Arvid Hansen Díaz "DonHansonDee", "SammyJames", Maxim Marinchenko "mmarinchenko","solaslin", The Coalition

Major Features

New: Landscape Nondestructive Editing (Beta)

The workflows for nondestructive editing of Landscapes have been significantly improved and expanded to make creating outdoor environments more flexible and efficient!

Landscape Edit Layers

Landscape Edit Layers (previously Nondestructive Landscape Layers) enable you to add multiple layers to your Landscape and edit them independently from each other in a nondestructive manner.

You can enable the Landscape Edit Layers feature by checking Edit Layers under the Manage Layers tab.

For updated documentation on this feature, see Landscape Edit Layers.

Landscape Blueprint Brushes

Landscape Blueprint Brushes enable you to create and manipulate arbitrary terrain regions using shapes defined entirely in Blueprint. You can add multiple overlapping brushes and the system composites them together to display the final result.

Landscape Blueprint Brushes consist of a 2D spline shape and a collection of properties enabling you to specify Materials, meshes, falloff, and more. You can also apply effects such as blurring, noise, and curves. Optionally, you can inject heightmap and layer weight data into a brush by overriding its Render event.

To use Blueprint Brushes, you must enable the Landmass plugin.

Landmass Plugin (Experimental)

The Landmass Plugin provides examples of using Landscape Blueprint Brushes as well as a Blueprint called BP_CameraOverlap that can be used to overlay photo reference on the screen, match up the camera perspective, and then draw shapes into the world based on the reference:


New: Physically-Based Sky Atmosphere Component

We've added support for a new physically-based Sky Atmosphere component that you can use to create an Earth-like atmosphere with dynamic time of day. It also can be used to create exotic worlds and provides ground view with sky and aerial perspectives, including ground to space view transitions.



This new component supports:

  • Physically based atmospheric attributes for Rayleigh and Mie scattering, Ozone absorption, and light multi-scattering

  • Artistic direction through Atmosphere properties and custom material setups

  • Dynamic time of day setup and integration with the Sun Positioner plugin to provide self-contained functionality

  • Different aerial perspectives for ground to sky, outer space transitions, and planetary space views

  • Detailed debug visualizations

  • And much more

For additional details, see the Sky Atmosphere documentation.

Simplified Sun and Sky Workflow

The new Sun Sky Actor enables you to set up a physically modeled sky, drive the placement of the sun based on the geographical position and time of your scene, and watch the sky respond accurately to the sun based on the real-world laws that govern atmospheric scattering and absorption.

The SunSky Actor ties together several components related to the look of the sky and the lighting of the sun:

  • The new Sky Atmosphere Component

  • Geographically accurate sun positioning

  • A standard outdoor lighting setup composed of a Directional Light and Sky Light

The SunSky Actor is the default sky setup in most of the Template Projects that you'll find in the new categories for Film, Television, and Live Events, Architecture, Engineering, and Construction, and Automotive, Product Design, and Manufacturing.

For more information, see Sun and Sky Actor page.

New: Screen Space Global Illumination (Beta)

We've added support for dynamic global illumination with Screen Space Global Illumination (SSGI). It's a screen space effect which comes with all the normal limitations of such an effect but it's scalable across Console and Desktop platforms and offers a dynamic GI solution where needed at a moderate cost to performance.


1 - SSGI Enabled; 2 - SSGI Disabled

Enable it using r.SSGI.Enable and and control it using the command r.SSGI.Quality by choosing a value between 1 and 4 for different quality levels.

Use the Post Process Volume settings under the Global Illumination category to control its indirect color and intensity.

For additional information, see Screen Space Global Illumination documentation.

New: Live Universal Scene Description Stage (Beta)

You can now work with a Universal Scene Description (USD) Stage live in your Unreal Level, making it more intuitive and efficient to work with USD data in Unreal Engine.

  • Full two-way synchronization so you can update the content in-engine when the USD data changes, and you can edit the scene in Unreal and write the results back out to disk.

  • No time-consuming import process, and no duplicate Asset data.

  • Supports Static Meshes, Cameras, Skeletal Meshes, Variants, Animations, and Materials (PreviewSurface and DisplayColor).

  • Supports third-party USD plugins.

New: Datasmith and Unreal Studio for Everyone!

To celebrate the end of the successful Unreal Studio beta program, which consisted of more than 250,000 subscribers from a range of industries, we have added Datasmith and all other Unreal Studio features to Unreal Engine for all users to enjoy—for free!


Datasmith is the easiest way to get entire preassembled scenes into your Unreal Project from a wide variety of third-party design applications, such as 3ds Max, Cinema 4D, and SketchUp Pro to name a few. It preserves object hierarchies, surface materials and textures, light and camera properties, offers an iterative re-import workflow, and more.

Get started reading about it here.

Other Unreal Studio Features

You'll also get access to a variety of other previously Unreal Studio-only features:

  • The Variant Manager, which helps you set up different versions of your scene and switch between them dynamically.

  • Static Mesh editing and defeaturing (mesh simplification) in the Static Mesh Editor.

  • Jacketing: tools for culling fully occluded Actors and mesh geometry from the Level.

  • The ability to create new UV projections in the Static Mesh Editor.

  • The Collaborative Viewer Template: the easiest way to set up a multi-user design review experience across desktop, VR, and mobile platforms.

Mac OS X and Linux Support

Datasmith is now available on Mac and Linux platforms, depending on the type of file you are importing.

For details on Datasmith platform support, see here.

New: Visual Dataprep (Beta)

You can now take full control over what happens inside the Datasmith import process, and reduce the manual work it takes to prepare your 3D scenes for real-time visualization in Unreal Engine.


With the Visual Dataprep system, you can:

  • Build up a complex sequence out of simple steps, using a Blueprint-like graph editor tailored to data preparation tasks.

  • Merge geometry together, remove or substitute unnecessary Actors, replace Materials, control tessellation, generate data like lightmap UVs, levels of detail, collision meshes, and more.

  • Create standardized "recipes" that you can apply when you import any scene, and reuse them in any project.

  • Combine multiple input scenes together, blending the results into a single Datasmith Scene hierarchy.

  • Use the preview windows to validate your graph's results as you work.

For details, see the Visual Dataprep documentation.

New: Project Creation Workflow Improvements

The dialog for creating new projects has been completely redesigned incorporating a new wizard-style workflow, which simplifies the process for creating projects by breaking it up into smaller steps that are easier to understand!


Templates are now organized into discipline-specific template categories making it easier to find relevant templates. The new workflow also reduces unnecessary confusion by only displaying the settings and questions that apply to the chosen template.

New: Hair and Fur Rendering and Simulation (Experimental)

Unreal Engine now includes realistic hair and fur rendering and simulation using a strand-based workflow to render each individual strand of hair with physically accurate motion!



With this release, the feature supports:

  • Importing an Alembic (.abc) groom from an external DCC application, like Maya or 3ds Max

  • Creation and setting up of Groom Components

  • Authoring and editing of Hair Materials

  • Using Niagara to set up hair physics with some tweakable settings for customization

For additional information, see Hair Rendering and Simulation documentation.

New: nDisplay Setup Improvements

With the changes that we've made to the foundations of the nDisplay distributed rendering system, it's now easier to create immersive experiences that synchronize displaying your Unreal Engine content on multiple devices or projectors.

  • This release eliminates the special Pawn and GameMode classes that nDisplay used to require. Instead, the nDisplay system automatically creates a new type of component at startup, the DisplayClusterRootComponent, and it attaches an instance to the active camera.

  • Every frame, nDisplay uses the position and rotation of this root component as the starting point for the hierarchy of scene nodes that you set up in your nDisplay configuration file. The effect is that all devices and projectors in the whole nDisplay cluster automatically render the scene from the point of view of the active camera.

  • If you don't want nDisplay to create and assign the DisplayClusterRootComponent automatically, you can instead add one yourself to any Blueprint class as the child of any CameraComponent. nDisplay will use the one you set up instead of creating one on the fly.

These changes simplify the nDisplay system to work with almost any project right out of the box. You can now render your project through nDisplay without changing any of the usual Pawn, Character, Controller, or GameMode classes that you use when rendering to a single viewport.

For more information on getting started with nDisplay, see Rendering to Multiple Displays with nDisplay.

New: Ray Tracing Improvements (Beta)

In Unreal Engine 4.24, Ray Tracing adds many new features, optimizations, and stability improvements.


These improvements include:

  • First-class support for instancing that makes rendering Instance Static Meshes and Hierarchical Instance Static Meshes much more efficient, and support for large worlds more feasible.

  • Added support for additional geometry types that include World Position Offset for Static Meshes and Ribbon emitters for Niagara VFX.

  • Added support for reflection multi-samples per pixel denoising.

  • Multi-view support for virtual reality and split-screen.

For additional details, see the Real-Time Ray Tracing documentation.

Improved Ray Traced Global Illumination Method (Experimental)**

We've added an alternative, and currently experimental, ray tracing based global illumination method in 4.24get that aims to win back runtime performance with some trade offs in other areas.

This new final gather-based technique is a two-pass algorithm that distributes shading points at a fixed rate with a screen space history and then attempts to reconnect them to amortize the cost of the method.

To enable the final gather RTGI method use r.RayTracingGlobalIllumination 2

For additional details about this new method, see the Real-Time Ray Tracing documentation.

New: Runtime Virtual Texture Updates (Beta)

We continued to make Runtime Virtual Texturing more efficient and stable with improvements to the workflow when creating these complex procedural or layered materials.


New Material Types

There are now four Runtime Virtual Texture Material options to choose from:

  • Base Color

  • Base Color, Normal, Roughness, and Specular (see note below)

  • YCoCg Base Color, Normal, Roughness, and Specular

  • World Height (new in 4.24)

For any Runtime Virtual Textures that were using "Base Color and Normal" Material option in 4.23, they have been converted to "Base Color, Normal, Roughness, and Specular" for 4.24.

New Streaming Virtual Texture Build for Runtime Virtual Texture

When a Runtime Virtual Texture covers a large world with many Actors, rendering to the low resolution mips of the Runtime Virtual Texture can be a slow operation. This also means that world Actors need to be permanently resident to be available to render to low mips that represent parts of the world, which can be expensive for memory.

We now support baking these low resolution mips to stream to the runtime virtual texture. The higher resolution mips are still rendered at runtime, and in this way a single virtual texture can make the best use of both streaming and runtime approaches.

Improved Runtime Virtual Texture Asset Settings

Several configurable settings have been added to the Runtime Virtual Texture Asset. These enable you to better optimize and tune the generated runtime virtual texture to your own projects and platforms.

New Runtime Virtual Texture Base Color Storage

The new Material Type for "YCoCg Base Color, Normal, Roughness, Specular" has been added to allow for different encoding of Base Color in the runtime virtual texture. This material type reduces artifacts that can happen due to RGB compressed BC1 textures that have a smooth gradient. It comes at some additional costs to performance and memory but improves quality with these types of artifacts.

New Runtime Virtual Texture Normal Storage

Normals are now stored with X and Y values in a BC5 texture (or in the Alpha channels of two BC3 textures). Also, the normal Z direction is stored, allowing for the storage of world space normals.

New Runtime Virtual Texture Asset Actions

There are two new actions available from the Runtime Virtual Texture Asset right-click context menu:

  • Find Materials Using This finds and highlights in the Content Browser all Materials that reference this Runtime Virtual Texture Assets.

  • Fix Material Usage provides an automated way to fix all materials after changing an Runtime Virtual Texture Asset Material Type. It finds all Materials and Material Functions that contain a "Runtime Virtual Texture Sample" node which references an Runtime Virtual Texture Asset. If the Virtual Texture Material Type doesn't match the Material Type in the Runtime Virtual Texture Asset, the node will be fixed to match it.

Added Scalability Options and Console Variables

We've added a number of new console variables and modified some existing ones to allow for additional performance optimization and scalability options for your projects. This means that they can be adjusted per-project and per-platform as needed.

Runtime Virtual Texture Pool Improvements

We've changed the syntax for Virtual Textures pools to now contain multiple textures all being referenced by the same virtual texture page table entry.

It now works so that the pools are set up per-texture format group and tile size. The tile size is now defined as a range of sizes, and when defining Allow Size Scale, the r.VT.PoolSizeScale scalability setting will apply these to a memory pool.

Runtime Virtual Texture Parameter Support

We've added a new Runtime Time Virtual Texture Parameter node which is created directly or by selecting "Convert to Parameter" in the context menu of an existing "Runtime Virtual Texture Sample" node.

This node behaves in the same way as a Runtime Virtual Texture Sample node but exposes the Runtime Virtual Texture Asset being sampled as a parameter for Material Instances to override. Note that this override only applies to Runtime Virtual Texture assets that are of the same Material type set in the Runtime Virtual Texture Sample Parameter node.

New: Inertial Blending (Beta)

Inertial Blending is a high performance alternative to traditional animation crossfading that produces natural transitions as a post-process. Once an inertial blend is activated, the source pose is no longer evaluated at all. By contrast, traditional blending evaluates both the source and target poses for the duration of the transition to combine them into a blended pose. To use inertial blending, your animation graph must contain an Inertialization node.

This feature was contributed by our good friends at The Coalition where it was developed to boost performance for 'Gears of War 4'.

Please see Blend Nodes for more information. The Animation level in Content Examples has also been updated with an example demonstrating Inertial Blending.

New: Animation Blueprint Linking (Beta)

An extension to the Sub Anim Instances system, Animation Blueprint Linking enables dynamic switching of sub-sections of an Animation Graph and can result in significant memory savings as the main Animation Blueprint will no longer load animation assets that aren't in use. In addition, Animation Blueprint Linking allows for easier multi-user collaboration.

Please see Using Animation Blueprint Linking for more information. The Animation level in Content Examples has also been updated with an example demonstrating Animation Blueprint Linking.

New: Control Rig Track in Sequencer (Experimental)

Control Rig tracks are now embedded with all other tracks in the Sequence so you can animate control rigs in the context of a cinematic.

New: Audio Mixer Enabled

The new audio mixer is enabled by default bringing an enhanced audio feature set to all platforms supported by Unreal Engine!

In addition to supporting the majority of existing features in UE4 (Sound Cues, Sound Classes, Sound Mixes, Attenuation), the audio mixer provides a significant extension of audio features such as a new submix graph for applying post-mix DSP effects to groups of sounds, the ability to apply DSP effects to individual sound sources, and many other features. The audio mixer also provides a common audio API for third parties to create their own audio DSP effect plugins.

New: Audio Stream Caching (Beta)

Stream Caching enables Unreal Engine to load audio at any point and release it when it has not been used recently. When enabled, almost all compressed audio data is separated from the USoundWave asset and divided into separate chunks at cook time, so designers can reference as many audio assets as they want, without overrunning memory boundaries. Engineers can load and reference chunks of compressed audio, without relying on state managed by the audio engine. This method of memory management is popular for open world games, where it is difficult to determine the audio required ahead of time.

New: Audio Mixed Modulation (Beta)

Mixed Modulation is a new audio mix system that enables designers to have better control over common audio parameters from the Blueprint and Component systems. Features include:

  • Creating a generic, flexible, and decoupled mix system for the Unreal Audio Engine.

  • Establishing a robust set of tools for auditioning and debugging a game's mix.

  • Providing an API that can be easily extended and used for further modulation of plugins.

New: Audio Synesthesia (Beta)

With the addition of the Audio Analyzer module and Audio Synesthesia plugin, designers can now drive animations, effects, and other elements that are tightly coupled to the sounds being played in-game by exposing extracted audio analysis data that can be used for gameplay scripting.


New: Sound Cue Templates (Beta)

Sound Cue Templates enable programmers to quickly build a Sound Cue node graph in code, enabling consistent and reliable iteration. General class properties are inherited, and it's possible to expose only specified parameters in the nodes to designers.

New: Variant Manager Improvements

Set up different variations of your scene in the Variant Manager more easily than ever, and toggle the visibility of whole Actor hierarchies by changing a single property.

  • Activate the new Auto-expose button on any Variant to make it automatically record all changes you make to Actors and properties in the current Level as you work.

  • Use the new Switch Actor in your Level to control the visibility of whole trees of child Actors. Only one child of the Switch Actor may be visible at any time, so setting one child to visible in a Variant automatically hides all other children and their descendants.

  • In addition, we've expanded the types of Actors you can use with the Variant Manager to include Post-Process Volumes, and made the Variant Manager UI work with string properties.

For more information on the Variant Manager, see Working with Scene Variants and Using the Switch Actor.

New: In-Editor UV Improvements

You can now have more advanced control of the way textures wrap around your Static Mesh Assets by creating new UV layouts right in the Unreal Editor.


  • Use the Unwrap UV command in the context menu for any Static Mesh Asset, or launch it from the Toolbar of the Static Mesh Editor.

  • Tweak the angle threshold and area weight to control the resulting layout.

  • Save the new UV layout in an existing channel, or create a new channel for it.

Alternatively, if you prefer using the UV projection tools in the Static Mesh Editor to create your UV set, the new in-viewport manipulator offers better control over the final layout.

For details, see Working with UV Channels.

New: Datasmith Interop Improvements

With every release, we continue to improve the way Datasmith works with third-party applications and file formats.

Alias Studio

We've completely reworked our Alias .wire importer to make automotive visualizations based on Alias models faster and easier to create. We've brought the process of importing an Alias model, and the results you get in Unreal, into line with the way Datasmith behaves for other types of source files. For example:

  • We've improved surface tessellation, exposing parameters for you to control the balance between the accuracy and complexity of the resulting mesh and the way mesh surfaces should be stitched together.

  • The importer creates new Master Materials based on the shader models used in Alias, and a Material Instance for each variation on those shader models that you've used in your scene.

  • Each Material Instance exposes a set of properties similar to the ones you're already familiar with from Alias, so you can easily tweak the look of your model after import.

  • Datasmith imports all layers that you've set up in your Alias scene into your Unreal Engine Level. You can use these layers to control the visibility of your Actors in the editor.

  • You'll benefit from the same re-import and re-tessellation workflows available for other Datasmith file types.

  • With these changes, we're moving .wire file support out of Beta.

3ds Max

  • Datasmith now supports V-Ray Blend Materials (VRayBlendMtl) from 3ds Max, converting them automatically into new Master Materials and Material Instances in Unreal Engine.

  • It's now significantly faster to export most scenes, especially when you have certain kinds of objects selected (such as Forest Pack Pro objects).


  • The importer now inverts UVs correctly on import. As a result, you can now assign textured Materials from other sources to your SketchUp models, and assign textured Materials imported from SketchUp to other Unreal Engine Assets, without the textures appearing upside down.

  • The Datasmith importer now orients models exported from SketchUp the same way as models exported from other applications such as 3ds Max, Revit, and so on. This ensures that Datasmith coordinates are consistent across all supported applications, to support workflows that involve bringing scenes into Unreal Engine from multiple sources.

  • When the importer needs to scale a model to convert it between different unit lengths, it now scales the vertex positions in the Static Mesh geometry instead of changing the scale of the Actor.

  • You can now rename Components in Unreal Editor without the importer creating unnecessary duplicates the next time you re-import your scene.

  • The importer now supports metadata that you attach to components in SketchUp.


  • The Datasmith importer now makes it easier to visualize entourage by importing placeholder meshes for the RPC objects you've added to your scene in Revit.

  • The importer now creates Actors for the project base point and survey point, and sets up the Actors with Datasmith Metadata that contains the coordinate data you set in Revit.

  • The name of your Revit View is now integrated into the exported filename generated by Datasmith. This makes it easier to combine data from multiple Views into the same Unreal Engine Project.

  • The Datasmith importer now orients models exported from Revit the same way as models exported from other applications such as 3ds Max, SketchUp, and so on. This ensures that Datasmith coordinates are consistent across all supported applications, to support workflows that involve bringing scenes into Unreal Engine from multiple sources.

  • To avoid visual clutter, 2D level symbols from Revit are no longer exported as scene elements.

  • To simplify the scene hierarchy, walls embedded in curtain panels are now imported as children of the curtain wall Actor.

  • We've improved the way the Datasmith exporter deals with missing image textures. First, it tries to resolve paths using any additional render appearance paths you've set up in Revit. If it still can't resolve all the paths, it now warns you in Revit of the missing file names.


We've made improvements to the Datasmith CAD importer to improve the way it handles object hierarchies, object naming, and importing technical metadata.


We've updated our AxF importer to improve visual fidelity and to remove dependencies on third-party technology.


As of this release, AxF import is no longer provided by Datasmith. To import an AxF file, you'll now have to enable the Importers > AxFImporter plugin.

New: Editor Performance Improvements for High Actor Counts

We have improved performance when dealing with large scenes and data sets resulting in major performance and memory improvements when your scene contains many thousands of Actors. These improvements are especially evident when importing, selecting and deselecting, toggling visibility, deleting Actors, and generating UV layouts.

New: RoboMerge (Beta)

RoboMerge synchronizes large-scale development across Perforce streams by monitoring commits and descriptions for commands that tell it to merge between branches. Bulk merges are problematic because chasing conflicts is time-consuming and error-prone. Also, without a tool automating merge changes, default resolutions can introduce bugs until the work is revised, which typically has to be completed by the original author, and this is where RoboMerge can help.

Being a low-level tool, we recommend advanced users review RoboMerge's source code and documentation, which are under Engine/Extras/RoboMerge. Additionally, help is available when the product is running.

The RoboMerge tool and source code are provided as-is. Support may be limited.

New: BuildAgent (Beta)

BuildAgent is a utility for managing agents on a build farm that supports the fast cleaning of Perforce workspaces using locally stored information about file timestamps, as well as the fast-switching of workspaces using a local cache of files addressable by MD5 digest. It also includes functionality for parsing errors and warnings from build steps and propagating them to UnrealGameSync for user-display.

While paying a modest price for a base footprint and unique content in each branch, BuildAgent will have fast workspace cleaning and fast stream switching with the local cache.

Being a low-level tool, we recommend advanced users review BuildAgent's source code, which is under Engine/Source/Programs/BuildAgent. Additionally, run "BuildAgent -Help" from the command-line to see a list of available commands.

New: AutoSDK (Beta)

The AutoSDK system enables users to distribute target platform SDKs while configuring them for the engine on demand. UnrealBuildTool, AutomationTool, and the Tools and Editors are all designed to work seamlessly with AutoSDK, and the switching between SDKs is handled by UnrealBuildTool, which is invoked by the other tools.

While removing the need to manually manage installed packages, the AutoSDK feature was designed for build machines that need to serve multiple branches with different SDK requirements. Also, it may be used by developers that do not require a full SDK install.

Information about adding SDKs for each platform is provided by the "README.md" files in the Engine/Extra/AutoSDK/HostPlatform/TargetPlatform subfolders.

For additional details, see the AutoSDK Reference.

New: Extended Editor UI Layouts

Unreal Editor now supports creating workflow-specific UI layouts designed to improve usability and efficiency! These layouts can be saved and loaded as well as shared with other users.

This update will not remove your current layout. Previously, the Editor was already able to restore the last UI layout in place before the Editor was closed. This new feature is backward-compatible, so the layout you were using in your previous version of the Editor will still be present when you upgrade to the latest release. Therefore, you will be able to save your current layout before playing with this tool.

The new layout functionality is available in the Window menu under Layout.

New: Sparse Class Data (Beta)

The Sparse Class Data feature reduces the footprint of actor instances by converting unchanging variables into shared, class-wide constants. This can lead to significant savings if a commonly-occurring actor class has properties that native and Blueprint code don't change after construction, and that doesn't vary between instances. In addition, this process has minimal impact on code; after replacing the appropriate properties with shared values, developers working in native code will only need to replace direct references to the old properties with calls to their new getter functions, while developers working in Blueprint will be entirely unaffected. Even the current values of the properties will be preserved by the conversion process. This feature has its greatest impact when developers use it on actors that appear in large numbers, and contain several properties that can be converted to shared constants.

New: Auto-Instancing on Mobile

Automatic Instancing, which reduces draw calls to improve graphics performance, is now supported for mobile devices. To enable mobile auto-instancing, set the following in the Engine.ini file for your mobile platform of choice:


Because of limitations on Mali devices, there is also an option to use a texture instead of a buffer by adding this line to the Engine.ini file for your mobile platforms:


It is recommended that you profile your project's performance to evaluate whether or not it provides significant gains before you ship with mobile auto-instancing. Auto-instancing has been found to be most effective on heavily CPU-bound games rather than GPU-bound games.

New: Steam Sockets

The new SteamSockets plugin enables you to take advantage of Valve's recent improvements to the Steam SDK resulting in smoother and safer online experiences for players when using Steam. New features enabled by this plugin include:

  • Ping calculation support for Steam lobbies

  • Built-in DDoS Protections

  • End-to-end encryption

  • Improved NAT traversal over the old SteamNetworking protocol

Games that support matchmaking over Steam can take advantage of the newly exposed connection data to find the best games for clients to join, and dedicated servers will be able to function over IP addresses as well as the Steam internal relay network.

SteamSockets gets stripped from builds for platforms other than PCs.

For more information about SteamSockets, see the steamcommunity.com/groups/steamworks/announcements/detail/1791775741704351698 on the new Networking API.

New: Network Engine Test Suite

We have added support for automated testing of networking features through Net Test Actors. Net Tests can be used to evaluate all types of RPCs as well as replication of variables, structs, and arrays in both Actors and Actor Components.

You can create a network test by extending AFunctionalNetTest, then create steps for that test by extending UFunctionalTestStep for each one. Each test step must be designated as a Server or Client step, then added to the Test. You can then run a test by placing it in a level.

New: DTLS Support

Unreal Engine now supports a DTLS-based encryption scheme for network traffic as a more secure alternative for the existing AES packet handler. To use it, you must enable the DTLS Packet Handler plugin and add the following in your DefaultEngine.ini file:


New: Niagara Editor System Overview (Beta)


The System Overview panel gives a high-level overview of the system or emitter being edited, combining the pan-and-zoom Graph node view with compact versions of the Emitter Stack. This provides an experience that is similar to the Cascade editor, but matching the form, elements, and style of Niagara.

This panel is designed for easier navigating between different parts of the data, and it gives you an at-a-glance view when you open an emitter or system for the first time. This panel can also ease the transition from Cascade to Niagara. You can drag-and-drop elements to and from the stack, and can even drag-copy by pressing the ALT key!

The primary interaction with this UI is to select which data is displayed in the Selection panel (on the right by default). Selecting a row in the Timeline will give the traditional "full stack" view, where the system information is on top, followed by the emitter information below. However, you can also select a certain group or module in the System Overview, and the Selection panel will show only that group or module. If you have large systems with many emitters, or if your emitters have many modules, you no longer have to scroll up and down through the full stack.

New: Collab Viewer Template Improvements


Make your collaborative design review sessions more effective with the new, ready-to-use interaction tools we've added to the Collaborative Viewer Template. You'll find more ways for you to communicate with others, and ways to save out a record of the team's decisions and comments.

  • Draw freely in the scene using your mouse or motion controller.

  • Measure distances between objects and surfaces.

  • Save the state of your session at any time—including drawings you've made and changes to object positions and materials—and return to that point later on.

  • Easily capture the scene to images on disk for later review.

For more, see the Collab Viewer Templates documentation.

New: Pixel Streaming Improvements

Our first-to-market Pixel Streaming system is now easier to set up and more flexible than ever, and produces better results in a wider range of scenarios.

  • Pixel Streaming is now supported for applications based on DirectX12

  • There's no need to run a WebRTC Proxy Server anymore. The Pixel Streaming plugin running in your Unreal Engine application now handles negotiating WebRTC client connections and streaming media directly to the browser.

  • The Pixel Streaming plugin now uses WebRTC release 70.

  • We've detected and fixed some stream encoding artifacts, and we've improved the results of streaming over network connections with limited bandwidth (like mobile connections).

  • You can use the Blueprint or C++ API to freeze the media stream on a single frame or still image. This helps you avoid wasting network traffic when the stream content remains static, or when you suspect a user may no longer be active.

  • Added a client-side AFK system that allows to detect inactive connections and disconnect them

  • Added OnAllConnectionsClosed delegate which is broadcast when all Pixel Streaming clients have disconnected from the Unreal Engine application

  • You can now use the Media Framework to render a media stream being provided by the Pixel Streaming plugin running in a different Unreal Engine application.

  • We've introduced limited support for hardware encoding using AMD GPUs supported by the Advanced Media Framework (AMF) SDK.

  • Fixed video connection issue on Firefox 68+

For details, see Pixel Streaming.

New: Event Track Workflow Improvements

There are two major improvements to Event Tracks. First, you can now Create a Quick Binding to add Endpoints to the key without needing to go into the Sequencer Director Blueprint. This makes it easy to add multiple Event Tracks and bindings through Sequencer.

Second, you can open the Sequencer Director Blueprint to see all your Even bindings and add multiple Payload Parameters to a single Event.

For more information see Calling Events through Sequencer.

New: Local or Master Time Shot Export

When exporting an object in a Shot or Subsequence, you can determine if you want to export the Shot by Master Sequence time or Local Sequence time.

Master Sequence time is useful when you are looking at the animation holistically and in comparison to other shots. Local Sequence time is useful when you are working shot by shot. Exporting to either time maps to the shot keys in Maya, and in Sequencer you can move from Local to Master time easily.

For more information see


New: Tagged Object Bindings in Sequencer

You can now tag object bindings in Sequencer by name and use them at runtime to override or reference similar bindings for similar types of objects, such as Cameras, Players or NPCs, across different Sequences. Bindings can apply to objects within Sub Sequences and are managed by selecting Tags in the context menu for objects in Sequencer or through the toolbar by selecting General Options > Open Binding Tag Manager.

New: Sequencer Curve Editor Enhancements

You can now manipulate curves in various ways through Curve Editor.

First, you can drag and drop keys on the grid and they will snap into place automatically. You can also adjust the grid size to help with auto-snap placement.

Second, when using the Transform Tool with multiple keys selected, the Tools Options enables you to adjust the Bounds, Scale Center, and Falloff values by changing the numerical values.


Similar to the Transform Tool, when you are using the Multi Select tool and have multiple keys selected, the Tools Options enables you to change the X/Y scales and the Pivot Type numerical values.


Lastly, you can Store Curves, which takes a snapshot of the curve data. This snapshot enables you to adjust the curve while keeping the original curve data as a reference/backup (snapshot). You can also Apply Stored Curve data to another curve, which is similar to copy/pasting data from one curve to another.


For more information, see the Sequencer Editor Reference guide.

New: Sequencer Quality of Life Improvements

There are various quality of life improvements that provide a smoother workflow when using Sequencer.

First, you can now access Cinematics from the Windows main menu, and you can open a Sequence on a specific Map in the Content Browser.

Second, you can now pin and group tracks. A pinned track does not scroll with the rest of the tracks, which is helpful for keeping a specific track in context with the rest of the tracks.


Grouping tracks enables you to bundle tracks together, so if you edit or move the group, the whole group adjusts.


For more information on these updates, see Sequencer Overview.

Lastly, the new folder icon next to the Sequencer Breadcrumbs enables you to navigate to any Level Sequencer in the hierarchy.


For more information on this update, see Sequencer Editor Reference.

New: Sequencer Track Enhancements

There are several improvements and enhancements when using Sequencer Tracks.

Evaluating Individual Tracks in a Sequence

You can now mark a track as Solo and evaluate that track separately from other tracks. You can also Mute tracks so they do not evaluate. These states are saved with the asset and persists at runtime.

Attaching Objects to a Track

Attaching objects to track creates a sub-track that adds a key for the object based on the parent track's keys. The object's space and movement is maintained locally to the parent. This enables an object to move based on the parent Track. You can also Attach multiple objects to a track, and use Trim and Preserve to adjust the endpoints of the object attachments.

The default option for attaching objects is Preserve Current, which sets a key at the time before the attach section so that the object maintains its global transform.

Spatialized Audio Tracks

You can now add a spatialized audio track to an object.

Skeletal Animation Looping

You can now loop a specific animation by setting the First Loop Start Frame Offset. This enables you to determine when the animation loop begins, rather than starting the loop at the beginning of the animation.

New: Template Sequences (Experimental)

Template sequences are sequences bound to a single asset archetype or class that can be rebound to an object in a level sequence or played "standalone" on a spawned object or on an object provided as a binding override. This can be used for camera shakes and other similar effects.

New: Chaos Fracture Toolbars

The Fracture and Cluster tools are now located in two toolbar palettes designed to naturally progress through the phases of creating a destructible mesh.

With the new toolbars, the panel has more space for the Geometry Collection Outliner and Tool Settings. Additionally, a new Statistics section has been added below the Geometry Collection Outliner, which was previously only available by using a console command. When a Fracture Tool is active, the Modes Panel switches to display the settings for that tool, followed by Fracture and Cancel buttons.

New: AVID DNxHR Support

Get pre-rendered video content on air or into your editorial pipeline faster by exporting from Sequencer into .mxf files encoded with the professional quality DNxHR codec from AVID.

For details, see Exporting Pro Media Files.

New: Virtual Scouting Improvements (Beta)

We've expanded our Virtual Scouting tools to give directors and cinematographers even more possibilities for exploring the virtual world and setting up shots in VR.

To get started, see Virtual Scouting.

New: Virtual Studio Sample Updates

Thanks to feedback from partners and customers who have used our Virtual Studio sample to get started using Unreal Engine in live on-air broadcasts, we've added a set of modular building blocks that you can use to customize your virtual set, or rebuild it from scratch to your own design.


Pick up the sample from the Learn tab of the Epic Games Launcher, and see the Virtual Studio page for accompanying documentation on its built-in media setup.

New: 3D Text (Experimental)

You can now make high-quality 3D text an integrated part of your real-time visualizations by creating it directly in the Unreal Editor!

  • Use any TrueType or OpenType font that you can import into your Project.

  • Control the extrusion depth of the letters, the beveling of the edges, and typographical settings like kerning and word spacing.

  • Apply your own custom Materials to the front, back, sides, and bevels.

  • Use Sequencer to animate the text properties over time to create your own motion graphics right in your Level.

For details, see [TODO:doc link].

New: ARKit 3.0 Support

Unreal Engine now supports some of the advanced functionality available in the latest ARKit release, including People Occlusion as well as 2D, 3D, and LiveLink Motion Capture.

New: OpenXR Support (Beta)

The OpenXR plugin provides support for the OpenXR 1.0 standard. OpenXR seeks to simplify AR/VR software development, providing unified support for a wide range of VR/AR devices, and true cross-platform XR experiences.

New: Magic Leap Update

Unreal Engine now supports some of the advanced functionality available in the latest Magic Leap release, such as:

  • Improved hand meshing support.

  • Improved touchpad gesture support.

  • Improved audio support via the Unreal SoundField plugin.

New: Mission AR HoloLens 2 Sample

Mission AR offers a bird's-eye view of many aspects of the historic mission, including the launch itself, an accurate model of the Saturn V, a detailed reenactment of the lunar landing, and a look at our first steps on the moon, reconstructed based on data and footage from the mission—generously provided by ILM Chief Creative Officer John Knoll. Highlights that would be difficult to convey with this combined level of detail and immersion in any other medium include the three stages of Saturn V, the form-follows-function design of the Eagle lander, as well as the lunar module's suspenseful descent to the moon's surface.

The sample features platform-leading visuals, including 7 million polygons in a physically-based rendering environment with fully dynamic lighting and shadows, multi-layered materials, and volumetric effects. Unreal Engine enables HoloLens 2 to display holograms of high detail, far exceeding what is possible with edge compute and rendering alone, using Holographic Remoting to bring high-end PC graphics to mixed reality.

Exploring and modifying this sample will help you learn how to:

  • Create immersive narrative sequences and triggered events

  • Implement touch-based input and interactivity

  • Utilize Holographic Remoting to display content streamed from PC over Wi-Fi

New: Burley Subsurface Scattering

We've added a new screen space subsurface scattering using the Burley algorithm. It is more physically accurate and aims to improve the quality of skin shading while simplifying setup using physically-based material properties. This subsurface scattering model targets high-end skin rendering at a much higher quality than separable SSS algorithm. The new algorithm has a cleaner, more accurate falloff.


1 Burley SSS; 2 Separable SSS

To use this feature, enable Burley in the Subsurface Profile and set the Editor Preview Level to Cinematic. If you're already using Separable SSS profile, minimal changes are required to switch to this method. Note that Burley SSS requires Temporal Anti-Aliasing to work properly.

New: Material Layers (Beta)

Material Layering enables you to combine your Materials into stacks using Material Layer and Material Layer Blend Assets so you can build complex Material graphs without building sections of nodes by hand. Material Layering also supports child instancing with drag and drop stack functionality.

New: Platform SDK Upgrades

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


  • 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.16299.0)

      • Minimum Supported versions

        • Visual Studio 2017 v15.6

      • Requires NET 4.6.2 Targeting Pack

    • Xcode - Xcode 11.1

  • Android

    • Android NDK r14b (Windows and Mac use CodeWorks for Android 1r7u1 installer; Linux will use 1r6u1 plus modifications)

  • ARCore

    • 1.7

  • ARKit

    • 3.0

  • Linux "SDK" (cross-toolchain)

  • Oculus

    • 1.40

    • API Level 23

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.39

  • Lumin

    • 0.22

  • Steam

    • 1.46

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 9.3.1 + optional NEX 4.6.3 (Firmware Version: 9.0.1-1.0)

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • PS4

    • Orbis SDK 7.008.001

    • System Software 7.008.021

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • XboxOne

    • XDK: July 2018 QFE-9

    • Firmware Version: Recovery May 2019 10.0.18362.3055

    • Supported IDE: Visual Studio 2017

  • macOS

    • SDK 10.15

  • iOS

    • SDK 13

  • tvOS

    • SDK 13

Major Upgrade Notes



  • You can no longer access Matinee Editor from the Cinematics Menu and Details Panel. This is part of the transition to remove Matinee from UE4 completely in 4.25.

    You can still convert Matinee actors to Sequencer assets using the Matinee to Sequencer Conversion Tool.


  • Action bindings that use MotionController keys need to be updated to use bindings for each platform the project is targeting. Blueprints that read MotionController keys directly need to be updated to use the action system instead. See the Motion Controller Key Deprecation page for more information.

Release Notes


  • Bug Fix: Fixed BlackboardComponent key instances being used as synchronized keys.

  • New: Improved Blackboard key renaming performance by loading only the BehaviorTree assets that reference the modified BlackboardData asset.

  • New: EQS now has a new score operator called Multiply, which makes the score of an item a multiple of its test scores.

  • New: Added the option "DisplayBlackboardKeysInAlphabeticalOrder" in the UEditorPerProjectUserSettings to display blackboard keys in alphabetical order.

  • New: Added a piece of information to GameplayDebugger that allows syncing it to a specific VisLogger recording file if recording-to-file is in progress. The information can be found in the top-right corner of GameplayDebugger's HUD.

Debugging Tools

  • New: When using GameplayDebugger_NavMesh, you can switch between a debug actor and a player Actor as the position reference for the navmesh display [Shift + Subtract (-) key]. It's possible to cycle through all available navigation data [Shift + Add (+) key].

  • New: Behavior Tree's cooldown tags now get printed out in AI's snapshot in the Visual Logger.

  • Improvement: Visual Logger histogram now renders so that each line has a different color.

  • Crash Fix: Fixed a crash in the AI CrowdManager resulting from the navigation data that the manager relies on being removed, being streamed out, or being unregistered from the NavSystem.

  • Crash Fix: Fixed a crash in the navigation system when renaming a NavigationData instance while there's already another one of that name. This would result mainly from using Undo/Redo actions, which circumvented safeguards that prevented users giving multiple objects the same name.

  • Bug Fix: Fixed a UNavLinkCustomComponent issue with unique NavLinkUserId when the UNavLinkCustomComponent's owner is loaded multiple times in different places, like when streaming sub-levels. This issue prevented custom links from working reliably when loading serialized navmesh.

  • Bug Fix: Fixed navmesh generation around Instanced Static Mesh and Hierarchical Instanced Static Mesh components marked as Dynamic Obstacle.

  • Bug Fix: FPathFindingQuery constructors now use the Navigation Data's config as NavAgentConfig instead of using a default config. This fixes an issue when a path is being recalculated (RepathRequests) where it was not using the same NavAgent config that originally requested it.

  • Bug Fix: Fixed the initialization of the NavigationLink AreaClass cache in NavLinkComponent to account for when the component gets reregistered after running construction scripts for Blueprint classes.

  • Bug Fix: NavLinkProxy now appends the link from SmartLinkComponent when it is NavigationRelevant. This enables it to be rendered with simple links.

  • Bug Fix: Fixed an issue where dtQueryFilter::passInlineFilter would not filter out null-area nav links.

  • Bug Fix: The NavLinkUserId from NavLinkCustomComponent is now restored during the Blueprint class's reconstruction process to maintain consistency with the id saved in the NavigationData.

  • New: Added support in NavLinkRenderingProxy for components implementing INavLinkHostInterface so that it can render links from NavLinkComponent.

  • New: Added bAutoDestroyWhenNoNavigation property to NavigationData. This property toggles whether NavigationData instances should be auto-removed when there's no navigation system present, and should be controlled by setting it in child classes.

  • New: Reorganized how SupportedAgents are configured. Every NavigationSystem instance now has data on the full set of SupportedAgents, as configured via ProjectSettings. Each NavigationSystem instance also has a SupportedAgentsMask that marks agents supported by that specific instance. This enables filtered per-agent NavMeshBoundVolumes to work as-expected regardless of which supported agents a NavigationSystem instance wants to support.

  • New: NavSystemConfigOverride can now specify if it should fully override a pre-existing NavigationSystem instance, or if it should simply append new information (like supported agents) to an existing NavigationSystem instance. There is also an option to do nothing if there's already a Navigation System present.

  • New: Added the function GetNavDataForAgentName to UNavigationSystemV1 in order to query for NavigationData corresponding to a given agent name.

  • New: Added a function to UNavigationSystemV1 that unregisters all NavigationData instances no longer supported by current a NavigationSystem instance's SupportedAgentsMask.

  • New: Added NavigationData.SetRebuildingSuspended as a way to suspend nav generation for a single NavigationData instance without locking the whole NavigationSystem.

  • New: Added bSortTilesWithSeedLocations to FRecastNavMeshGenerator to enable or disable the sorting of tiles to be generated. This defaults to True in order to maintain previous behavior, and it should be controlled in subclasses of the generator class.

Behavior Tree

  • Bug Fix: Fixed an issue that prevented BTMoveTo task ObservedBlackboardValueTolerance from being visible in the Editor.

  • Improvement: The AddClassFilter function of FBlackboardKeySelector now accepts Class objects. Previously, it expected UClass subclasses.

  • Deprecated: Previous implementation of FBlackboardKeySelector::AddClassFilter was deprecated.


  • Crash Fix: Fixed a problem that occurred when setting layer overlays when animation layers are ungrouped. Also fixed an alignment issue in layer interface details.

  • Crash Fix: Fixed a crash when setting a layer overlay for graphs that contain layered bone blend nodes.

  • Crash Fix: Fixed a crash that occurred when editing a notify property.

  • Crash Fix: Added handling for the case when color in an Alembic asset is stored per primitive.

  • Crash Fix: Geometry Cache no longer crashes when the asynchronous loading thread is enabled.

  • Crash Fix: A crash was occurring when a user added a new input to an AnimGraph. Fixed the layout in AnimGraphDetails, as the header widget for Details panel had changed slightly.

  • Bug Fix: CurrentMontageStop no longer ignores the OverrideBlendOutTime argument.

  • Bug Fix: Fixed an issue that sometimes caused poses to break and IKs to be disabled when using layers.

  • Bug Fix: Additive Animation states now play back correctly when using the Animation Sharing System.

  • Bug Fix: Correct selection state color is now used when drawing a GeometryCache Actor in the Wireframe View Mode.

  • Bug Fix: Fixed a problem that caused notifications to not be fired from root motion montages in cases when a sub-instance was present but not currently relevant in the animation graph.

  • Bug Fix: Fixed a problem with pose-blending when chaining Blend Multi nodes together.

  • Bug Fix: VB prefix is now stripped from virtual bones when renaming.

  • Bug Fix: Fixed missing curve names when baking transform curves.

  • New: Added the ClearLayerOverlay function of UAnimInstance as a counterpart to the SetLayerOverlay function of UAnimInstance to allow for partial graph resets when using animation layers.

  • New: Control Rigs now exist as a track under skeletal meshes instead of their own level sequence, and you can animate and key control rig controls.

  • New: Added the ability to filter Animation Sequences within the Animation Editors according to whether they contain Animation Curves or Animation Notifies.

  • New: Made Animation Modifiers retain the previously-applied version. This way, when behavior or property values change, the reverting stage is actually correct.

  • Improvement: Improved the title of the dialog box that appears when you are attempting to re-import Skin Weight data from a file that doesn't exist.

  • Improvement: Optimized animation spawning in the following ways:

    • Added deferred root node initialization. When an anim instance is set to initialize to a reference pose, this defers the first call to initialize the blend tree until just before the first Update() call on a worker thread.

    • The system skips ConditionallyCacheBonesForState in state machines in the case where we would call CacheBones_AnyThread during first Initialize_AnyThread. This avoids duplicate work being done because traversal counters will let through synchronization calls if they have yet to be updated (for example, when their count is INDEX_NONE).

    • Cache access to nodes that need pre-update, dynamic reset, or one-time initialization, as well as state machines in the generated class, to avoid iterating all anim nodes on initialization.

    • Cache access to node properties when re-linking nodes to avoid duplicate memory round trips.

    • Cache access to LUT size in FBaseBlendedCurve::GetValidElementCount, avoiding duplicate memory round trips.

    • The system now prevents FName rehashing from string (intended to strip whitespace) when initializing FBoneReferences.

    • Cache access to AnimCurveMapping smart name container on USkeleton, preventing a TMap lookup every time the smart name container is accessed.

    • USkeleton::GetCurveMetaData now uses a "fast path" when accessing by using smart name UID. In this case, we can avoid the TMap lookup as the UID is always a direct index to metadata at runtime (slow path still applies in editor builds).

    • Avoids calling FAnimNode_LayeredBoneBlend::ReinitializeBoneBlendWeights in Initialize_AnyThread, as CacheBones_AnyThread will be called straight after.

    • Cache access to curve UID count and LinkedBones array in FAnimNode_LayeredBoneBlend::ReinitializeBoneBlendWeights, avoiding duplicate memory round trips.

Animation Assets

  • Crash Fix: Fixed a crash occurring when deleting a skeleton.

  • Crash Fix: Previously, a crash occurred when using non-default curve compression assets.

  • Bug Fix: Fixed skeleton animation notifies not showing up until an animation asset is opened.

  • Bug Fix: Virtual bones are no longer missing from imported meshes.

  • Bug Fix: Fixed an issue that caused the curve codec to be reset in compression assets.

  • New: Added direction display for an axis label.

  • New: Added a compression error scale to anim sequence. This change allows compression error tests to account for the playback scale of the animation (such as scaled-up characters).

Animation Blueprints

  • Crash Fix: Deleting a layer that contained an open state machine no longer causes a crash.

  • Crash Fix: Adding a linked layer input no longer causes a crash.

  • Crash Fix: Applying a class as an overlay layer that contains layer nodes itself no longer causes a crash.

  • Crash Fix: Fixed a crash that occurred when deleting an animation layer that contained a state machine.

  • Crash Fix: Previously a crash occurred when scrubbing an animation in the sequencer when the animation Blueprint contained slot nodes and layers.

  • Crash Fix: Deleting a state machine inside an animation layer while the layer node is still visible no longer causes a crash.

  • Crash Fix: Fixed a crash occurring when nodes with cached bone references existed beyond a sub-instance in the anim graph traversal.

  • Crash Fix: An evaluation crash no longer occurs when dynamically linking an animation Blueprint layer.

  • Crash Fix: Fixed a crash that occurred when attempting to initialize linked layer/graph nodes when the anim instance was reused.

  • Crash Fix: A crash that occurred when PostProcessGraph was disabled, but was still trying to update a curve from it. This was visible in the PhAT Editor.

  • Crash Fix: Crash no longer occurs when reusing an anim instance using linked anim instances.

  • Bug Fix: Fixed a problem that caused impure nodes to show up in anim graphs.

  • Bug Fix: Fixed an issue that caused shared rules to dirty anim BPs on load.

  • Bug Fix: Added filters to the animation asset browser to find assets that use specific skeleton notifies and curves.

  • Bug Fix: Fixed an issue with the "Always Update Source Pose" option on montage assets that were sending the wrong weight to the next node.

  • Bug Fix: Transition crossfade durations are now clamped to zero or higher.

  • Bug Fix: Removed checking code that assumed graphs were always contained within a Blueprint.

  • Bug Fix: Added missing compilation error checking for animation state machine states.

  • Bug Fix: Animation interface graphs now display sub-graphs in the My Blueprint tab.

  • Bug Fix: Fixed a problem that caused anim Blueprints to now show a debug execution state when a derived instance was watched in the editor via its base Blueprint.

  • Bug Fix: Fixed an issue that occasionally caused custom-blend graphs to create non-normalized poses.

  • Bug Fix: Fixed excessive anim initialization cost when using animation Blueprint layers (50ms+ hitch).

  • Bug Fix: Animation layer input's type can no longer be reset to default.

  • Bug Fix: Renaming an animation interface graph now also fixes up layer nodes that use that graph.

  • Bug Fix: The "Add new" button in animation interfaces now allows the creation of animation layers.

  • Bug Fix: Fixed a problem with graph fragments getting correctly initialized/cached when unlinking an anim layer.

  • Bug Fix: Fixed weight propagation over sub-instance boundaries.

  • Bug Fix: Fixed a problem that caused GetInstanceTransitionTimeElapsed to always return 0 in non-editor builds.

  • Bug Fix: Fixed the details panel expansion state to persist when adding an animation layer.

  • New: Added ControlRig AnimNode support Alpha value for blending additively.

  • New: Physics assets dropped on animation graphs now create rigid body nodes.

  • New: Added Inertialization node and inertial blending support for State Machine Transitions, Blend Poses by Int/Bool/Enum nodes, Linked Anim Graphs, and Linked Anim Layers.

  • New: There are now blending options for Linked Animation Graphs and Layers. Select a graph or layer in the Animation Blueprint Editor to find the new Graph Blending options in the Details panel. To blend a graph or layer, you must place an Inertialization node after the Linked Anim Graph node or Linked Anim Layer node that uses the graph.

  • New: Added mouse scrolling to SGraphTitleBar—This helps with long-path navigation.

  • New: Layer nodes now display their (potentially dynamically-assigned) linked classes when the animation Blueprint debugger is inspecting a running instance.

  • New: Added the ability to preview layer overlays and sub-instances in the animation Blueprint Editor using "preview animation Blueprint" as a container.

  • Improvement: Improved the UX for anim graph node pin toggles.

Animation Tools

  • Crash Fix: Crash no longer occurs when force-deleting an in-use notify state Blueprint.

  • Bug Fix: The virtual bone text field now focuses correctly when adding a virtual bone.

  • Bug Fix: Fixed multi-selection of skeletons to be allowed in skeleton selection dialogs.

  • Bug Fix: Fixed a display issue when hovering over the boundaries of a blend-space within the Blend Space Editor.

  • Bug Fix: Animation Blueprint preview meshes now correctly persist between sessions.


  • Crash Fix: Fixed a crash with reimporting an Alembic file as a Skeletal Mesh while having an Animation Editor window open.

  • Crash Fix: Exporting an animation after deleting curve no longer causes a crash in the editor.

  • Bug Fix: Fixed a bug that could prevent MorphTargets from being reimported properly.

Skeletal Mesh

  • Crash Fix: Fixed an issue with morph targets flickering and crashing when there were active morph target changes.

  • Crash Fix: Fixed a crash caused by RetargetBasePose and Virtual Bones.

  • Bug Fix: Removed an extra bound that got added automatically to SkeletalMesh and caused it to have a bound that was too big.


  • Crash Fix: Fixed a crash on shutdown of Google Resonance module.

  • Crash Fix: Fixed a race condition crash between the audio engine suspend state and audio engine toggle on iOS.

  • Crash Fix: Fixed a race condition when loading DialogueSoundWaves that would sometimes lead to a crash or invalid data on the DialogueSoundWave.

  • Bug Fix: Fixed the null audio device pace. It was previously generating audio slower than it should have, since it was relying on a Sleep function to set the pace.

  • Bug Fix: Fixed edge cases that were not reporting back to AudioComponents that playback had finished (and failed).

  • Bug Fix: Fixed the MaxDuration sound calculation when cooking surround.

  • Bug Fix: Fixed an issue with SoundWaves being played via SoundCues set to PlayWhenSilent (flag wasn't being observed).

  • Bug Fix: Fixed a bug with OSC bundles not being parsed correctly due to reads not accounting for the header element offset.

  • Bug Fix: Fixed potential audio distortion when recording gameplay with GameplayMediaEncoder, caused by wraparound when playing loud sounds.

  • Bug Fix: Fixed a thread safety conflict with SeekToTime being called on the audio thread and StreamCompressedData on the decompression worker thread. The change forces all seek requests to be processed on the worker thread.

  • Bug Fix: Fixed audio stats not being available in test builds.

  • Bug Fix: Fixed a MaxDistance calculation being wrong for box attenuation, causing sounds to cut out when the listener moves toward diagonals of a box.

  • Bug Fix: Fixed an ADPCM bug where non-interleaved encoding was not reporting the correct number of samples per channel in the asset viewer.

  • Bug Fix: Fixed a bug with focus not interpolating correctly when enabled.

  • Bug Fix: Fixed an iOS audio bug where crackling could be heard during certain OS events.

  • Bug Fix: Fixed an incorrect sample rate for media playback.

  • Bug Fix: Fixed an issue with the "audiomemreport" command where some sounds were incorrectly reported as being fully decompressed.

  • Bug Fix: Fixed a bug where the submix envelope follower would appear inactive due to the temp result being optimized away on some platforms.

  • Bug Fix: Fixed a bug for audio crackling when suspending an iOS app.

  • Bug Fix: Fixed a bug where per-source, one-pole filters were interpolating during their first callback with a new source.

  • Bug Fix: Fixed an issue with Time Synth PIE crash caused by playing more clips than the synth was initially allocated for.

  • Bug Fix: Fixed issues on some platforms where seekable audio streams were not acknowledging seek requests.

  • Bug Fix: Fixed an issue with Dynamics Processor where increasing the Input Gain would decrease the Output Gain.

  • Bug Fix: Fixed a bug in Phaser source effect becoming potentially unstable at project sample rates less than 48kHz.

  • Bug Fix: Fixed an issue on Android where when audio mixer is enabled, audio would render at the incorrect sample rate on some devices, thus causing stutters and pitching.

  • Bug Fix: Fixed a bug with reverb parameter interpolation overshooting its target, creating a possible edge case that would cause audio artifacts.

  • Bug Fix: Fix for multichannel file reimport in the case where a file is reimported to be mono or stereo when it was previously multichannel.

  • Bug Fix: Fixed a bug with AudioMixerDevice incorrectly reporting buffer size to be used in logs.

  • Bug Fix: Fixed a bug with non-seamless LPCM looping.

  • Bug Fix: Fixed iOS audio engine run time settings that were not observing project settings.

  • Bug Fix: Added audio engine option for device callback to wait configurable number of milliseconds for next audio buffer to be rendered before underrunning, which fixes an issue an Android where audio became choppy after connecting bluetooth headphones. You can configure this by setting au.UnderrunTimeoutMSec from the console or a configuration file. The default is 5 ms.

  • Bugfix: Fixed attenuation box shape incorrectly reporting 0 when distance is 0

  • Bugfix: Fixed an issue where the first import of sounds was missing playback or playing back a stale version of a sound. if stopping a sound during import, sounds will now log to the display. Also, removed a prompt for a template update when reimporting a sound.

  • New: Added the ability to force synchronous audio decodes. This is useful with platforms with a low core count, particularly mobile devices. Enable this feature by setting the new cvar au.ForceSyncAudioDecodes to 1.

  • New: The Audio mixer is on by default for all platforms other than Switch. You can turn the new audio engine off for a specific platform, by setting UseAudioMixer (in the [Audio] section) to false in that platform's Engine.ini file.

  • New: Added debug draw cvar au.3dVisualize.Listeners 1 to help debug listener location visually (off by default when au.3dVisualize.Enabled 1).

  • New: Set the default log level to Display for LogAudio to avoid log spam.

  • New: Sound asset creation context menu is now broken into multiple sub-menus to allow a user to find types more quickly and easily.

  • New: Updated the Audio Submix Graph to be more intuitive visually, and fixed usability issues regarding having numerous editors open and editing parent/child relationships.

  • New: Added the ability to disable binaural audio if sound starts playing below a specified radius.

  • New: Steam Audio Beta 17 improves performance with support for multi-threaded environmental effect simulation, Intel® Embree, and AMD Radeon Rays. Each of these features provide developers with significant performance boosts compared to simulating environmental effects with the built-in Steam® Audio ray tracer on a single thread. This update also adds support for scene reinit on level transitions, improves geometry tagging, and improves overall stability. Visit the release blog post for more information and be sure to check out the transition notes for upgrading projects from earlier versions of Unreal.

  • New: New Signal Processing class FSilenceDetection—A processor class that only outputs audio above a certain threshold.

  • New: New Signal Processing class FSlowAdaptiveGainControl—Can be used as an automatic gain control system in conjunction with the FSilenceDetection class.

  • New: New Signal Processing class FFFTConvolver—An FFT convolver class. FFFTConvolver does not currently support partitioned convolution, so window sizes should be less than or equal to the buffer size used in the ProcessAudio callback.

  • New: New Signal Processing function CrossCorrelate—Performs an acyclic correlation of two signals.

  • New: The Audio Capture plugin now also supports Xbox One, PS4, and Mac.

  • New: Added a per-source LPF frequency parameter control to sound classes and sound mixes.

  • New: Added the ability to query the audio component play state from Blueprints.

  • New: Added cvar au.resonance.quality to reduce Google Resonance quality dynamically.

  • New: Added classes to support multithreaded audio rendering. See MultithreadedPatching.h for details.

  • Improvement: Added optimized Push/Pop Containers to Blueprint for manipulating OSC Addresses. Also added a Blueprint call to clear an OSC Address' Containers (instead of having to pop each off individually).

  • Improvement: Added support for additional device routing to our native VOIP engine. This can be done either by using IOnlineVoice::PatchRemoteTalkerOutputToEndpoint(DeviceName), or by using the console command "voice.sendRemoteTalkersToEndpoint ".

  • Improvement: Decoupled AudioMixer callback size and iOS device callback sizes to enable latency to be configurable.

  • Improvement: Improved GameplayMediaEncoder audio handling (timestamps and duration). It now also adjusts the audio clock if it falls behind, such as when we break into the debugger.

  • Improvement: The AudioCapture module has been split into several modules:

    • AudioCaptureCore—Includes our core audio capture interfaces that don't rely on the Engine.

    • AudioCapture—Includes engine dependent classes such as UAudioCaptureComponent.

    • Platform-specific implementations of IAudioCaptureStream in independent modules (AudioCaptureRtAudio, AudioCaptureAudioUnit, and so on).

  • Improvement: The AudioMixer module has been split into several modules:

    • AudioMixer—Includes any engine-dependent code used in Unreal Audio.

    • AudioMixerCore—Includes IAudioMixerPlatformInterface and other audio classes that don't rely on the engine module.

    • SignalProcessing—Does not rely on the engine, and is used as our general purpose audio DSP library.


  • New: You can now block any test from running by adding a BlacklistTest entry to your project settings.

  • New: Automation now automatically discovers Python tests in the editor.

  • New: You can run your Magic Leap (Lumin SDK) via Gauntlet. This option is now available (disabled by default) in the EngineTest.xml file.

  • New: Added handling for HighResScreenshot when you call FEditorViewportClient::ProcessScreenShots from an automated test.

  • New: Added the AddExpectedLogError function for Blueprint and Python tests.


  • Crash Fix: Fixed a crash that occurred when deleting a component in the parent Blueprint then renaming a component in the child to the name of the now deleted component.

  • Crash Fix: Blueprints—Fixed a crash that occurred when attempting to reinstance an actor that did not belong to a UWorld. This was always true of sequencer spawnables that did not have a UWorld ptr.

  • Crash Fix: Fixed an editor crash that happened when copying a gameplay tag variable set node between eventgraphs.

  • Crash Fix: Fixed a crash when generating an incorrect node type connected to "GetProperty" of material options.

  • Crash Fix: ImportBufferAsTexture2D crashes when image bit depth is not 8 or 16. Fixed a badly formatted log string and returning nullptr on failure, which was the cause of the crash.

  • Crash Fix: Fixed a timing-specific crash caused by a stale Blueprint graph pin.

  • Crash Fix: Fixed a crash in DissociateImportsAndForcedExports when asynchronously loading Blueprints in the editor.

  • Crash Fix: Fixed crash in RenameGeneratedClasses when saving a map with a new name.

  • Crash Fix: Fixed an issue causing a crash after undoing the creation of a function.

  • Crash Fix: Fixed a crash that occurred when running commandlets that loaded level packages. The Blueprint search manager was creating missing level Blueprints, compiling them, then prompting the user to check out and save.

  • Bug Fix: Child Blueprints no longer need to check if their parents are abstract when being placed, but only if they are placeable and not deprecated.

  • Bug Fix: Fixed Blueprint property arrays of components not being reset when rerunning construction scripts.

  • Bug Fix: Fixed an issue that prevented the "Paste Here" action in Blueprints from doing anything.

  • Bug Fix: The Copy and Select All options now work in global Find in Blueprints windows.

  • Bug Fix: Fixed an issue that prevented a construction script's local variables from being visible in the details panel.

  • Bug Fix: Fixed a memory leak in the Blueprint action database registry after a map load in the editor.

  • Bug Fix: Fixed an issue where a tab could remain open for a function after the function is deleted if there were several copies of the same graph open at once.

  • Bug Fix: Fixed a default scene root being added when swapping scene roots via drag and drop.

  • Bug Fix: Fixed a bug where input pins of type FGameplayAttribute were having their values reset when compiling the Blueprint.

  • Bug Fix: Added the ability to hook into UK2Node::RenameUserDefinedPin.

  • Bug Fix: The editor now updates nodes when a pin connection has been removed from them, if that pin came from a Make Array or Make Map node.

  • API Change: UK2Nodes that previously implemented the function ERenamePinResult RenameUserDefinedPinImpl(const FName OldName, const FName NewName, bool bTest) should now override a function of the same signature but called RenameUserDefinedPinImpl instead.

  • Bug Fix: Nativized TMaps no longer incorrectly set their default values.

  • Bug Fix: Fixed ensure related to the InheritableComponentHandler's Outer when compiling a Blueprint after performing undo/redo actions.

  • Bug Fix: Blueprint debugger now properly steps over reroute nodes.

  • Bug Fix: Fixed a Blueprint nativization issue in which latent node exec pins occasionally did not fire in the packaged build.

  • Bug Fix: Blueprint interface conflicts are now reported to the user as toasts rather than as silent log messages.

  • Bug Fix: Dependent Blueprint compilation has been reworked to avoid false positives. This can speed up compilation for Blueprints with a large set of dependents.

  • Bug Fix: Fixed duplication of a child Actor occurring when making changes to a macro or Blueprint function library, where both the child Actor class and the parent class containing the child Actor component are included.

  • Bug Fix: Now the Engine will automatically recompile all affected Blueprints when a Blueprint variable is renamed.

  • New: Nested structs inside containers will now display correctly in the Blueprint details panel.

  • New: There is a new experimental feature that you can select that enables modifying Blueprints during Play in Editor by adding a parent class in the BaseClassesToAllowRecompilingDuringPlayInEditor list (empty by default). Whether or not this will work in your particular use case depends on the circumstances:

    • Things that are spawned on demand with no active instances, such as gameplay cues, are the most likely to work, and leaf things that usually aren't referenced by other gameplay code directly, such as props, should generally be fine as well.

    • Core gameplay code is sketchier. For example, iterating on a player controller Blueprint may not work.

    • UMG widgets with existing instances do not work. (If there is a way to recreate your UI during PIE, then it should work after the widgets are recreated.)

    This feature is experimental and may increase the chance of crashes during Play In Editor when recompiling Blueprints, so save first and use with caution.

  • New: Added support for native-generated functions within Blueprint Graphs.

  • New: Private and protected BP function restrictions are now enforced by the Blueprint compiler.

  • New: The number of Blueprints compiled is now included in detailed compile results.

  • New: Exposed FMatrix functionality to Blueprints and provided an Autocast node to support easy printing of matrices.

  • New: Added Blueprint functions to obtain the Minimum LOD property on a StaticMesh for a given platform, or for all supported platforms.

  • New: Asset tabs will now use the icon for the generated class instead of the generic Blueprint icon.

  • Improvement: Improved comments on Blueprint-exposed Floor/Trunc/Ceil/Round functions, and fixed a precision loss issue in the int64 versions.


  • Crash Fix: Fixed a FAssetManagerEditorModule::RefreshRegistryData null pointer crash.

  • Crash Fix: LogTrace with nullptr string arguments no longer crashes.

  • Crash Fix: Fixed a hot reload crash caused by the module manager finding obsolete modules that aren't compatible with the current build.

  • Crash Fix: Fixed a crash in FGenericWidePlatformString::GetVarArgs() For %l64d, Percent to be skipped by four characters(%I64) instead of three.

  • Bug Fix: MallocAnsi no longer crashes when it fails to allocate memory, instead triggering an out-of-memory flow. This brings its behavior in line with the other allocators.

  • Bug Fix: Skeletal simplifier—Made a more robust solution to accommodate problems in tangent space in the unsimplified source mesh.

  • Bug Fix: Fixed the TJsonWriter.WriteStringValue to escape low-ASCII control characters without an alternative two-character code with \u00XX.

  • Bug Fix: FTransaction::Records is now a TIndirectArray to avoid resizing issues when adding Actors that have component instance data caches with components that have editinline subobjects.

  • Bug Fix: GetToolTipText no longer cuts off after two empty or punctuation separator lines in a comment, allowing large comments for the API docs, but only showing the first section in the editor.

  • Bug Fix: Fixed high crash count for when the drive runs out of space while compiling shaders.

  • Bug Fix: Fixed a log manager crash that occurred when HandleOutputFileCorrupted was triggered in some out-of-drive-space situations.

  • Bug Fix: Removed instance templates from UObject::PostLoadSubobjects in cooked builds as all instancing will be brought up to date during the cooking process.

  • Bug Fix: Changed FArchiveFromStructuredArchive and FArchiveUObjectFromStructuredArchive to prevent implicit conversion to FArchive.

  • Bug Fix: Stopped explicit shutdown of async loading, and added ShutdownAsyncThread in UObjectBaseShutdown.

  • Bug Fix: Fixed deprecated properties being written out to config files.

  • Bug Fix: Fixed a divide by zero case in UTimelineComponent::TickComponent.

  • Bug Fix: Fixed two profiler frames created per engine tick. ()

  • Bug Fix: Fixed the formatting of %S, which is ANSICHAR when TCHARs are wide on non-Windows platforms.

  • Bug Fix: Fixed TStringConversion's move constructor.

  • Bug Fix: Removed a broken but unused char overload from FStructuredArchive.

  • Bug Fix: Camera Shake—Fixed oscillation blend-out time. Blend out was previously incorrectly calculated without the OscillationDuration.

  • Bug Fix: Fixed TPropertyValueIterator, skipping all but the first element in arrays of structs.

  • Crash Fix: Fixed a crash that occurred when executing a delegate that was bound with a UFunction with reference parameters.

  • Bug Fix: Static asserts added to TStaticArray::GetData to prevent it from being called when the array elements were non-contiguous. Also fixed the TIsContiguousContainer trait to report the case.

  • Bug Fix: No longer clears the AsyncLoading flag before objects have been post loaded.

  • Bug Fix: GitHub #6052 : Fixed comments for EBuildModuleType.

  • Bug Fix: Fixed an error code being returned from FPlatformString::GetVarArgs() on non-Windows platforms when the formatted string matched the buffer length exactly.

  • Bug Fix: Separated abbreviations in the Display Name.

  • Bug Fix: Removed unused lambda capture.

  • Bug Fix: Fixed an issue that caused the engine to trigger Application Verifier errors relating to potential misuse of ::VirtualFree when run with the -llm command line.

  • Bug Fix: Fixed an issue where calling FPlatformProcess::Sleep with 0 time on the windows platform caused a yield and a sleep, rather than just a single yield.

  • Bug Fix: Fixed truncation of bulkdata size to a 32-bit integer even though 64-bit sizes are handled elsewhere.

  • Bug Fix: Fixed coding style syntax to Use nullptr instead of NULL.

  • Bug Fix: Cook commandlet will now properly report the number of available UObject indices before and after Garbage Collector runs.

  • Bug Fix: Fixed a memory stomp in Trace writer.

  • Bug Fix: FGuardValue_Bitfield macro expansion no longer hides previous usage within the same or a nested scope.

  • Bug Fix: Changed the default sort predicate for TSortedMap to use its ConstPointerType rather than KeyType directly to ensure compatibility for non-const-pointer keys.

  • Bug Fix: Reset the LastRealTime for when the engine goes from fixed-time step to unfixed.

  • Bug Fix: Added logging for a PreExit to catch entering the PreExit state during a game.

  • Bug Fix: During text asset serialization, both the class package and the name in object path strings are included so that they can be resolved properly when loading.

  • Bug Fix: Moved the test for low free UObjectArray slot count when cooking, before testing available memory, and exiting early, thus skipping the check completely.

  • Bug Fix: Fixed Algo::Find* to correctly forward the range type so that rvalue references compile correctly.

  • Bug Fix: SandboxDirectory is now absolute and has no relative paths in it.

  • Crash Fix: Now reports the value of GIsRequestingExit during a crash.

  • Bug Fix: Moved the RootElementId constant out of StructuredArchive.h and into an anonymous namespace in the cpp file. This results in a linker error fix on Linux.

  • Bug Fix: Fixed the cooker to filter out plugin content for unsupported target platforms.

  • Bug Fix: Fixed an uninitialized string return from FWindowsPlatformProcess::GetApplicationName.

  • Crash Fix: Removed a potential crash when destroying GC clusters.

  • Crash Fix: Removed a potential crash when adding tickable game objects in static init.

  • Bug Fix: Fixed a bug where editor-only soft object references loaded from config files wouldn't be correctly marked as being soft object references, and still cooked.

  • Bug Fix: Fixed a bug in the preloading screen manager implementation when early startup movies are used.

  • Bug Fix: Fixed a bug with creating GC clusters when Async Loading times were out and the remaining clusters didn't get created.

  • Crash Fix: Fixed a few issues with running the final Garbage Collector pass when exiting:

  • Fixed a crash when exiting early during init caused by disregard for GC set not being closed.

    • Fixed a crash when exiting early during init caused by classes not being fully initialized.

    • Added guards to prevent other threads from manipulating UObjects when the final GC runs.

  • Bug Fix: Fixed a possible hang in Garbage Collector when the number of objects to be destroyed was divisible by TimeLimitEnforcementGranularityForDeletion.

  • Bug Fix: Changed the task graph behavior in single threaded mode. Now, if there is nothing to wait for, it returns; otherwise it is a fatal error.

  • Bug Fix: Fixed possible buffer overruns in WritePipe functions.

  • Bug Fix: Removed int and replaced it with UE-preferred int32 type.

  • Bug Fix: Added support to the JSON parser for keeping numbers stored as text in the DOM in a way that they can be correctly converted to the requested type when the value is queried, rather than LastRealTime cast to double at read time, potentially losing data.

  • Bug Fix: The DDC cleanup thread will now stop as soon as the engine begins shutting down. This prevents stalls on exit.

  • Crash Fix: Fixed an AtmosphericFogComponent crash when it's InitResource was executed off the main thread.

  • New: It is no longer fatal to provide invalid subobject overrides to FSubObjectInitializer. Instead, proper errors will output, and valid defaults will be used.

  • New: Added version of SetDefaultSubobjectClass that takes UClass explicitly rather than relying on templated type.

  • New: Added ToString method to FrandomStream.

  • New: Added virtual UObject::Modify WITH_EDITOR. UObject::Modify remains defined as a forceinlined noop without editor to avoid having to fixup all existing code that exists in non-editor that calls Modify.

  • New: A clarified comment of VectorToVector2D conversion is now used.

  • New: Improved comments for function metadata specifiers in ObjectMacros.h.

  • New: TOptional::Emplace now returns a reference to the newly-created object.

  • New: Added fixed allocators for sets and sparse arrays that never allocate from the heap.

  • New: ParentTables variables inside of composite tables are now protected.

  • New: FGuid now supports the Short GUID format. The Short GUID format encodes data in unpadded Base64 instead of hex, saving 10 characters per GUID in string form, compared to FGuid strings in digits format.

  • New: FThread is a simpler API for system threads compared to FRunnable/FRunnableThread. The API is modeled after std::thread, except it doesn't support thread detaching. The implementation is based on FRunnableThread.

  • New: Improved error detection and handling for invalid model component index buffers.

  • New: Added a StableSort for SparseArray, Set, and Map on Keys and Values.

  • New: Added PLATFORM_COMPILER_HAS_IF_CONSTEXPR macro for testing that language feature, and changed over some existing TEnableIf overloads to use it.

  • New: Simplified type traits to reduce redundant compile-time churn, and removed some copy constructors, defaulting them to match their overridden POD.

  • New: Made the structured archive's macros more consistent in terms of names and string types.

    • NAMED_ITEM(AnsiName, Value) and NAMED_FIELD(Value) are now merged into a single SA_VALUE(TCharName, Value). FIELD_NAME(TCharName) and FIELD_NAME_TEXT(AnsiName) are now merged into a single SA_FIELD_NAME(TCharName).

  • New: The DDC Summary Stats output, displayed in the log after cook, will now display 0% for counters with zero hits rather than INF. In addition, the indentation for all output columns will now be consistent, and should line up correctly.

  • New: Moved the FArchive adapters into StructuredArchive.h so that they are globally visible.

  • New: Added attribute support to structured archives, and to tests.

  • New: Removed all allocations from FString::MatchesWildcard().

  • New: Added TSet and TMap XxxByHash() functions.

  • New: Hash table loading optimizations—Makes tagged property loading of maps and sets much faster.

  • New: Added a new UncookedOnly module type, which only loads a module in uncooked builds. Previously, the Developer module type was generally used for this purpose because it allowed modules to load from an editor executable that was running with -game, but this was not documented or intended behavior.

  • New: Added a const qualifier to FMatrix::ApplyScale.

  • New: Made TArrayView be constructible from any contiguous range, to save hardcoding every possible type as a constructor.

  • New: Added support for zero-copy consumes.

  • New: StreamableManager RequestAsync and Sync Load functions now take parameters by value, allowing the use of MoveTemp, and avoiding array and string copies when possible.

  • New: Added an overloaded TQueue::Peek to allow peeking at elements that do not allow copying (such as TUniquePtr).

  • New: Added an Async execution mode to dispatch to the task graph on the main/game thread.

  • New: Moved the structured archive slot types from being members of FStructuredArchive to the global namespace so that they can be forward-declared.

  • New: Now allows calling code to ImportText to avoid doing work to create the struct name used for error messages until it is actually needed.

  • New: FTickFunction has been refactored in a way that it has a pointer to internal data that only gets allocated when the tick function has been registered. This saves 40 bytes per unregistered tick function at the cost of 8 additional bytes, and a dereference to interact with the internal data for registered tick functions. Given the number of Actors and components that have tick functions that are never registered, this is a substantial memory saving.

  • New: Added ability for a project to choose oodle version (only 280 and 255 are supported so far, with 280 as the default), using this section in DefaultEngine.ini: [OodleSdk] OverrideSdkVersion=255.

  • New: An additional mode has been added to the crash report client to allow it to run as a monitoring child process. Additionally, the crash report client is now also capable of doing stack walking and symbol resolution. This new monitor mode is enabled by default on the Windows platform, all other platforms remain unchanged.

  • New: Added Visual Studio debugger visualizer support for arrays of chars as strings.

  • New: Removed file header inline documentation, pointing developers to the recently updated Stats System Overview.

  • New: Convert UDataTable serialization to use structured archives.

  • New: Expose "view as text" and "roundtrip" functions to the content browser context menu in the editor.

  • New: Converts UAssetImportData serialization to use structured archives.

  • New: Exposed FDeferredMessageLog for public use.

  • New: Tweaked FQueuedThread::Run so it doesn't wake up every 10ms even though there's nothing for it to do—unless stats collection is on. Eliminates lots of unnecessary context switches, especially on wide CPUs.

  • New: Better serialization of engine versions to structured archives.

  • New: Added a function FPackageName::SplitFullObjectPath() that will split the supplied full path into its constituent pieces.

  • New: Only calls CloseHandle on valid handles.

  • New: Changed all packages save Conform arguments to accept a non-existent type, and to trigger an error in case any code actually passes in a non-null argument.

  • New: Optimized UPackage::Save by removing lots of temporary allocations. Changed visibility of internal UObjectBaseUtility::GetPathName(const UObject StopOuter, FString& ResultString) overload to public. Add public overload of UObjectBaseUtility::GetFullName(const UObject StopOuter, FString& ResultString).

  • New: Changed CsvProfiler singleton creation to avoid "magic statics" initialization.

  • New: Made the FAsyncLoadingThread more self-contained, with reduced use of globals. Limited the use of FAsyncLoadingThread::Get() inside of FasyncPackage.

  • New: Consolidated writing of cooked package data into a single function instead of scattering the same logic in multiple places. This simplifies package store refactoring (and maintenance).

  • New: Updated LexTryParseString() to not use FCString::IsNumeric(), which fails for a number of number formats that can be converted by LexToString perfectly well. The function now runs LexToString(), and compares the output with 0. When the result is 0, we perform a rudimentary check that the input string was 0 and return true if so.

  • New: Extended OctreeSemantics so that SetElementId can now accept a TOctree& parameter as well.

  • New: Added some unit tests for LexTryParseFromString.

  • New: Updated type test messages.

  • New: Added begin() / end() methods to TStaticArray so that it can be treated as an iterable type, used in Algo:: operations and as part of a range-for.

  • New: Added constructors to TArrayView allowing it to view a TStaticArray.

  • New: Enabled fuzz-safe Oodle decompression to prevent crashes on I/O failures.

  • New: Constructed FVector2D from single float.

  • New: Optimized the cooker ConditionallyExcludeForTarget with a new mark OBJECTMARK_KeepForTargetPlatform.

  • New: CancelAsyncLoading() is now supported with the Event Driven Loader enabled. When exiting the application, async loading will be cancelled instead of flushed.

  • New: When a new asset registry is merged into an existing one, all the new assets will fire through the AssetAdded delegate so that any registered systems can pick them up and use them.

  • New: Early-exit AActor::NeedsLoadForTargetPlatform if there's either no root component or the detail mode is low, which should be the typical default case. This will avoid much of the overhead from finding device profiles in most instances.

  • New: Changed -tracehost to use the common convention for arguments with the parameters -tracehost=.

  • New: FMaxPackageSummarySize is now a standalone class not encapsulated inside of FAsyncLoadingThread.

  • New: Exposed hardcoded DDCCleanup settings (TimeToWaitAfterInit, TimeBetweenDeleteingDirectories, TimeBetweenDeletingFiles) to ini.

  • New: Added the ability to toggle between flushing and cancelling async loading on exit in project settings.

  • New: Changed formatting of a pointer in a decompression failure log to use %p.

  • New: Changed a verify on the required encryption key from being available to being a fatal when reading from pak files, as it will never be a recoverable event and should not continue if verify is compiled out.

  • New: Added a range check to the cluster array index operator that logs the bad index, unlike the TArray range check.

  • New: Flagged Windows ANSI malloc as thread-safe.

  • Deprecated: Deprecated FCustomVersionContainer::GetRegistered and replaced it with a new, thread-safe API.

  • Deprecated: Deprecated GetExtrema due to unsafe indexing operations, to be replaced with either the [] operator or direct access to Min and Max.

  • Deprecated: Deprecated the Developer module type. The UncookedOnly type has the same functionality but is more descriptive, and the DeveloperTool module type correctly represents the state of the bBuildDeveloperTools flag.

  • Deprecated: Deprecated ARRAY_COUNT and changed it to UE_ARRAY_COUNT.

  • Removed: TAutoPtr and TScopedPointer smart pointers have been removed (deprecated in 4.15).

  • Removed: Removed tagged binary formatters from structured archive code.

  • Removed: Removed deprecated comments from TBaseMulticastDelegate::Add and TBaseMulticastDelegate::FDelegate. No intention to ever hide these, and they can be useful for binding the same handler to multiple delegates.

  • Removed: Removed global alloc/free/realloc counters, since these were inaccurate as they are global and could be modified multiple times per operation. Additionally, they added one atomic per call, which is bad news, especially since these tracking counters were enabled for TBB. Also removed inert ad hoc timing profiling code from TBB allocation path.


  • Removed: Removed some unnecessary static functions from public Package.h header.

  • Removed: Removed some unused package flags PKG_Need and PKG_DisallowLazyLoading.

  • Removed: Removed code related to now-defunct cook stats.

  • Removed: Removed redundant USkeletalMesh::AddReferencedObjects.

  • Removed: Removed obsolete cooker save setting bConsiderCompressedPackageFileLengthRequirements.

  • Improvement: Optimizations to tagged property serialization and numeric property conversions Tagged property serialization became ~20% faster during initial loading into game of an internal project.

  • Improvement: FAsyncPackage::EmptyReferencedObjects should be a lot faster now—moved most of its cost to the Async Loading Thread.

  • Improvement: Optimizes AllowDebugViewmodes (TLightMapDensityDS::ShouldCompilePermutation) by replacing lots of temporary string allocations and individual string lookups with a global precalculated u32 GRequiresCookedDataPlatformMask.

  • Improvement: Optimizes RemapPaintedVertexColors (UStaticMeshComponent::PrivateFixupOverrideColors) by reusing temporary array.

  • Improvement: Optimizes UAssetManager::OnObjectPreSave by reducing temporary string allocations.

  • Improvement: Optimizes TProperty_WithEqualityAndSerializer (UMapProperty::SerializeItem) by removing temporary string allocs by avoiding copy while comparing properties.

  • Improvement: Optimizes UProperty::FindRedirectedPropertyName by removing temporary string allocation and FName initialization when there is only one outer.

  • Improvement:Improvements to pak index memory optimizations.

  • Improvement: Now optimizes any PAK files that are added after encryption keys are registered.

  • Improvement: Extended trace's analyzer framework to issue callbacks when a new event type is registered from the trace stream, to subscribe to all events, and to expose type information that encourages ad hoc analysis.

  • Improvement: Enabled event tracing (such as Unreal Insights) on Android, iOS, Mac, Linux, and Switch.


  • Bug Fix: The cook now properly fails if the AssetManagerSettings has non-unique Primary Asset Type entries.

  • Bug Fix: The lesser version check in FXGEControllerModule::IsSupported() is now a warning instead of an error.

  • Bug Fix: Fixed an issue that would disable the VertexColor visualization after reimporting a StaticMesh.

  • Bug Fix: Fixed a StaticMesh issue where computing Normals and Tangents in the editor could give different results on Mac and Windows.

  • Bug Fix: Fixed an issue that prevented proper visualization of StaticMeshes' Vertex Color in the editor.

  • Bug Fix: Importing a StaticMesh no longer produces a warning when the imported data is not triangulated.

  • Bug Fix: Fixed an issue that would cause the asset reimport options to stop working after canceling the "reimport with new file" dialog window.

  • Bug Fix: Fixed an issue that would wrongly identify reimported StaticMesh as conflicting when the imported data used a namespace.

  • Bug Fix: Fixed a bug that could cause merged materials to display as black when merging StaticMeshes.

  • Bug Fix: Fixed a bug that could make the editor crash when exporting a DestructibleMesh.

  • Bug Fix: Fixed an issue that would cause some materials to not be assigned in the right sections when merging multiple StaticMeshes.

  • Bug Fix: Fixed a bug that caused MorphTargets to be exported into multiple morph modifiers instead of one.

  • Bug Fix: When running cook on the fly, asset registry was not generated (since no chunk manifests are generated). This caused certain runtime lookups (like UObjectLibrary::LoadAssetDataFromPaths) to return no results in cook-on-the-fly scenarios. With this fix, if there are no chunk manifests present, then the entire asset registry is saved instead.

Memory Profiler

  • New: Added LLM tags for VirtualTextureSystem.

Network Profiler

  • Bug Fix: Actors now use their class name instead of their actual name when reporting data to the networking profiler. This fixes some issues where different actor names would cause data would be grouped incorrectly.

  • New:

    • Created FInternetAddrDemo (which is essentially a dummy internet addr) to be returned when GetInternetAddr is called on UDemoNetConnection. This fixes an issue with network profiling where demo traffic would be recorded on a client connection instead.

    • If FNetworkProfiler::SetCurrentConnection is passed a connection that has an invalid FInternetAddr shared pointer, it will write the data out to the "Invalid Connection" index instead of whatever the previous connection was.

Unreal Insights

  • MAJOR: Added initial layout for the new Networking Insights profiler.

  • Bug Fix: Fixed issue with deleted .utrace files still appearing in the session list.

  • Bug Fix: Fixed the handling of ANSICHAR strings in log trace.

  • Bug Fix: Fixed the session list to correctly update when a trace file is renamed.

  • Bug Fix: Fixed SetColor log messages that were showing up in the log view.

  • Bug Fix: Fixed instrumentation points that were incorrectly using TRACE_CPUPROFILER_EVENT_SCOPE_TEXT for static scope names.

  • New: Added the first version of UnrealInsightsCLI with basic report generation support.

  • New: Added a scope butterfly model to ITimingProfilerProvider.

  • New: TRACE_CPUPROFILER_EVENT_SCOPE_TEXT now supports dynamic strings.

  • New: Added file size and timestamp info to trace sessions.

  • New: Timing Insights: Added Callers and Callees tree views.

  • New: Support added for tracing to a file for later collection and loading in Unreal Insights.

  • New: Added support for Linux and Mac.

Start Page
  • Bug Fix: Fixed session list to correctly update when a trace file is renamed.

  • Bug Fix: Fixed file size for live sessions (now updates as file size changes).

  • Bug Fix: Fixed sorting in sessions list (by timestamp).

  • New: Added extra info (if available) for available sessions (App Name, Platform, Build Config and Build Target). In tooltip was also added the Command Line.

  • New: Added "File Size" info to sessions list.

  • New: Added more info in tooltip of a session.

  • Improvement: Changed units for session file sizes to be consistently KiB (the actual value in bytes and in KiB/MiB/GiB can be seen in tooltip).

Networking Insights
  • New: Added support for multiple Networking Insights tabs (two tabs opened by default).

  • New: Added "Packets" view:

    • Added combo-boxes to choose Game Instance, Connection and Connection Mode.

    • Vertical axis represents the size of packets.

    • The packets are colored based on delivery status.

    • The tooltip of a hovered packet shows: "Packet Index", "Sequence Number", "Content Size (bits)", "Total Size (bytes)", "unused bits", "Timestamp" and "Status".

    • Added support for selecting multiple packets.

      • Mouse Left Click on a packet selects only the respective packet.

      • Shift + Mouse Left Click on a different packet selects a range of packets.

      • Added Ctrl+A shortcut to select all packets.

  • New: Added "Packet Content" view:

    • The view shows the net events from the packet selected in Packets view.

    • Horizontal axis represents the size of events (in bits).

    • Event name and the Net Id (where available) is displayed on event.

    • The events are layout on multiple levels.

    • Left Mouse Click on an event selects the event and also selects its type in the Net Stats view.

  • New: Added "Net Stats" tree view:

    • Columns: Name, Level and stats (Count, Total/Max/Average Inclusive Size, Total/Max Exclusive Size).

    • Grouping: Flat, By Name or By Level.

    • Sorting by any column.

    • Filtering by event name.

    • Aggregated stats are computed for selected packet(s).

    • Added "!0" toggle button to filter out the net event types having zero total instance count (aggregated stats).

Asset Loading Insights
  • New: Added "Package Details" and "Export Details" tabs (generic tree table views).

  • New: Added two tree table views: Event Aggregation and Object Type Aggregation. The "top 10" mini-tables for aggregations are still visible.

  • New: Added toolbar with on/off toggles for Timing view, Event Aggregation view and Object Type Aggregation view.

  • Removed: Aggregation mini-tables (as aggregation is available in the docked tabs as generic tree table views).

  • Improvement: Changed layout to use docking windows.

Generic Tree Table View
  • New: Added grouping by "Unique Values" for all columns in the source table.

  • New: Added support for Aggregation (Sum) for all numeric columns.

  • New: Added support for multiple grouping rules. Also, the "Group by" combobox was replaced with a breadcrumb control to choose the ordered list of grouping rules.

  • Improvement: Changed the way a Generic Tree Table view handles "name" column (now transformed into a "hierarchy" column). It does not use the first string column anymore. Instead, the name of items in list (table rows) are generated as "row N" (where N is the table row index).

  • Improvement: Improved sorting for large tables (for example, Asset Loading's Export Details).

Timing Insights
  • Crash Fix: Fixed crash occurring when clicking on a tree view (Timers, Stats, Callers, Callees, etc.) after selecting a time range to compute aggregated stats (when computation of aggregated states takes longer than usual).

  • Bug Fix: Fixed analysis being slow when opening a new session if in the previous session a time range was left selected.

  • Bug Fix: Fixed toolbar when resizing, to not hide buttons on the left side too early (the right side of toolbar was taking half of space).

  • New: Added Callers and Callees tree views.

  • New: Re-enabled the "Graph" toolbar option that opens a test graph track (now with more test series).

  • New: Added toggles for available trace modules (only for live sessions), in toolbar.

  • Improvement: Renamed "Stats" to "Counters".

  • Improvement: Improved performance when holding the mouse over a widget (Frame track, Graph track, Timing view). Due to synthetic mouse move events, the detection of events under mouse was executed even if mouse was not moved.

  • Removed: "Graph" toggle button from the toolbar (debug functionality).

  • Improvement: Disabled the functionality for controlling the enabled trace modules and loggers (for live sessions) from Timing Insights toolbar.

Timing View
  • Bug Fix: Fixed aggregated stats not being updated when a track is shown/hidden (if a time range selection is already made).

  • Bug Fix: Fixed I/O tracks to not update when session is reset (but only when the track is made visible).

  • Bug Fix: Fixed position of current time info in Time Ruler when selecting (when the selected time interval being just 1-2 pixels).

  • New: Added Ctrl+C shortcut to copy name of selected timing event to clipboard.

  • New: Added "% of Parent" and "% of Root" in tooltip of a hovered cpu/gpu timing event.

  • New: Added percentage for Exclusive time (relative to Inclusive time)) in the tooltip of a hovered cpu/gpu timing event.

  • New: Added possibility to manually zoom vertically the Graph tracks for series that does not have "vertical auto zoom" enabled (i.e. for frame series): Shift + Mouse Wheel.

  • New: Added context menu to tracks (for now, only the Graph track shows a valid context menu; the context menu for CPU/GPU tracks only shows the name of thread track and the group name).

  • New: Added "Graph Track - G" visibility toggle option in Tracks drop down menu.

  • New: Added tooltip for the event hovered by the mouse, in I/O Overview and I/O Activity tracks.

  • New: Added possibility to make a time range selection using Ctrl + Shift + mouse drag (anywhere in the view area).

  • New: Added vertical marker (gray line) for session start time (0) and end time (in Time Ruler, Graph and Timing Events tracks).

  • Improvement: Improved performance when moving the mouse over timing events.

  • Improvement: Made "canceling selection by clicking on time ruler" to behave the same as "canceling selection by clicking on an empty space" (to not reset the stats in Timers view).

  • Improvement: Improved algorithm to layout I/O file activity events so to not overlap. "Close" events are now ignored when computing layout, but are still displayed on same depth as Open/Read/Write corresponding events.

  • Improvement: Changed "O" key shortcut to show/hide background events for file activities, in the I/O Activity track.

Timers View
  • Bug Fix: Fixed selection not being restored when list is updated or when aggregated stats are updated.

  • New: Added "!0" toggle button to filter out the timers having zero total instance count (aggregated stats).

  • New: Changed tooltip to show total inclusive and total exclusive time values with increased precision.

Callers/Callees Views
  • New: Tree views showing the hierarchy of callers or callees for a selected timer.

  • New: The tree view is updated based on selected time range (in Timing view) and selected timer (in Timers view).

  • New: Timers on the hot path are highlighted with a "fire" icon.

Stats Counters View
  • Bug Fix: Fixed selection not being restored when list is updated or when aggregated stats are updated.

  • New: Added "!0" toggle button to filter out the stats counters having zero total instance count (aggregated stats).

  • New: Added support for double clicking a counter to show/hide a series in the Timing view's main graph track.

  • New: Added colored rectangle in front of name for counters having a series added in Timing view's main graph track. Color is generated pseudo-randomly (based on counter id).

Log View
  • Bug Fix: Fixed clicking on a message to focus the Timing view on time of respective message even if the message was already selected.

  • Bug Fix: Changed the drop down for Verbosity Threshold to contain radio buttons (instead of checkboxes).

  • Bug Fix: Fixed log view showing invalid messages when a new session is loaded.

  • Bug Fix: Fixed case where there are no logs in analyzed trace session resulting in UI showing continuously "Filtering... please wait...".

  • Bug Fix: Fixed issue where having a filter set during a live session (or during a long analysis) results in selected item to trigger multiple scroll requests in timing view (each time new log messages are added to log view).

Frames Track
  • Bug Fix: Fixed tooltip flickering when zooming in/out.

  • Bug Fix: Fixed misaligned viewport issue after zooming in/out (affecting detection of frame under mouse).

  • Bug Fix: Fixed auto zooming to not zoom anymore if view is not in initial position (for example, if user has scrolled or zoomed the view).

  • Bug Fix: Fixed auto zoom not zooming enough if session is too short.

  • New: Added horizontal and vertical grid (frame index for the horizontal axis major grid lines and frame duration + fps for the vertical axis major grid lines).

  • New: Added fade in animation for tooltip.

  • New: Added context menu with toggle options for Game Frames, Rendering Frames and Auto Zoom.

  • Improvement: Increased the highlighted interval (white brackets) to include a frame even if it is only partially visible in Timing view.

Graph Track
  • Bug Fix: Fixed drawing of points (bottom points being hidden).

  • Bug Fix: Fixed draw lines for cases where a value is infinite.

  • Bug Fix: Fixed position of lines (1px offset).

  • New: Added support for Stats Counter series.

  • New: Added auto vertical zoom (animated) for the Stats Counter series.

  • New: Added polygon rendering to fill area between series (connected line) and baseline (value == 0).

  • New: Added context menu with the following toggle buttons:

    • "Show Points"

    • "Show Points with Border"

    • "Show Connected Lines"

    • "Show Polygon"

    • "Use Event Duration"

    • "Show Bars"

  • New: Added list of series to context menu (to show/hide each series).

  • New: Added event detection and highlight (point / horizontal line / box) for event hovered by the mouse.

  • New: Added tooltip for event hovered by the mouse.

  • New: Added custom formatting for value displayed in tooltips. For Stats Counters, value can be "memory" (bytes), an integer number or a floating point number. For "Frame" series the value is displayed as time and as "fps".

  • Improvement: Improved drawing of boxes (implemented simple reduction algorithm).

  • Improvement: Reduced size of points from 7px to 5px.

Graph Track Widget
  • New: Added support for horizontal panning and zooming with the mouse.

  • New: Added Time Ruler track.

  • New: Added time range selection (Ctrl + Shift + mouse drag or mouse drag on time ruler area).

  • New: Added context menu (right-click).


  • New: Added TestMemoryOptimization mode, which attempts to unload filenames and shrink pak entries across every pak in a directory, making sure there are no collisions and that everything works correctly

  • New: Only prints out "adding entries" message when we're actually creating a pak file.


  • Crash Fix: Fixed a crash that was occurring when canceling the drag-and-drop of a Datasmith scene into a Level viewport.

  • Crash Fix: Variant Manager Blueprint functions with invalid inputs no longer cause crashes.

  • Crash Fix: IFC Importer—Fixed an issue where a Material was not created when the Material had no name in the IFC Importer. Also fixed crashes that occurred when importing files with schema other than IFC2x3.

  • Crash Fix: IFC Importer—Fixed a crash that occurred when IFC GlobalID was not a unique IFC Importer. Also fixed an issue on updating meshes on reimport.

  • Crash Fix: glTF Importer—Fixed a crash that occurred when a joint node was used in different skins.

  • Bug Fix: Fixed an issue where some geometry imported from Alias files wasn't imported due to too small of a scale.

  • Bug Fix: Fixed mesh tessellation problems for some types of NURB geometry imported from Autodesk Alias files.

  • Bug Fix: Handled parsing of DeltaGen TML animations for nodes that have rotation and scaling pivots.

  • Bug Fix: Fixed a bug where Materials imported from Alias scenes were not assigned to the imported static meshes when reimporting.

  • Bug Fix: Fixed an issue that caused Materials to be incorrectly set on some static meshes when importing .IFC files in Datasmith.

  • Bug Fix: Fixed an issue where Actors were sometimes imported through Datasmith as static when they should have been dynamic.

  • Bug Fix: Multiple ImportedSequencesHelper Blueprint Actors were created when reimporting VRED and DeltaGen scenes. This has been fixed.

  • Bug Fix: Actor labels no longer change when reimporting Datasmith scenes.

  • Bug Fix: Fixed the re-import options dialog where it was not automatically filled in with the corresponding VRED and DeltaGen chosen import options.

  • Bug Fix: Fixed a bug with Actors imported from GLTF files sometimes not being bound to the imported Level sequences.

  • Bug Fix: Fixed a few problems that occurred when parsing transparency layers from imported Cinema 4D Materials.

  • Bug Fix: Imported VRED visibility animations now correctly affect the entire attached Actor hierarchy, as in VRED.

  • Bug Fix: Fixed an issue where the normal map green channel was wrongly flipped when importing multiple textures.

  • Bug Fix: HDRIBackdrop plugin assets are no longer dependent on DatasmithContent plugin.

  • Bug Fix: In Visual Dataprep, disabled parameters inside a node will now display properly.

  • Bug Fix: glTF Materials are now imported by assigning them to Static Mesh assets instead of scene Actors.

  • Bug Fix: IFC importer—Geometry normals are now imported correctly. This fixed problems with visualization of some tessellated meshes.

  • Bug Fix: glTF animations are now resampled to 30 fps on import, and all glTF interpolation types(including Cubic), are supported. This fixes various issues with animation import.

  • Bug Fix: Fixed retessellation to use input meshing parameters.

  • Bug Fix: IFC Importer—Fixed reimport when importing a new file.

  • Bug Fix: IFC Importer—An imported object now has correct orientation. Imported Static Meshes no longer look mirrored in the Content Browser.

  • Bug Fix: Fixed the import of the UV map with Rhino files.

  • Bug Fix: Fixed import of Materials with the Inventor file.

  • New: Added a scene statistics panel to the Visual Dataprep Editor, similar to the engine statistics. This panel can display primitive stats, texture stats, and static mesh lighting info.

  • New: Added support for importing animations on Cinema4D's Crane Camera parameters.

  • New: Added support for importing DeltaGen baked lightmaps and ambient occlusion maps.

  • New: Cinema 4D, IFC, GLTF, VRED and DeltaGen scenes can now be imported through Visual Dataprep.

  • New: Added the SwitchActor C++ class that makes it easy to toggle the visibility of child-attached Actors. When bound to a variant with the Variant Manager, it's Option property can be used to toggle the active child Actor.

  • New: Now imports camera roll value and animations when importing Actor-tracking cameras from Cinema 4D.

  • New: Post-Process Volume properties can now be captured by the Variant Manager.

  • New: The MDL/AxF Importer plugin is now split into two plugins—AxF Importer and MDL Importer.

  • New: Updated the Visual Dataprep Editor to display a Save confirmation dialog if data was imported but not committed to prevent accidental loss of data.

  • New: The StaticMeshEditorExtension plugin now adds a Generate Unwrapped UV utility feature to the Static Mesh Editor, in the Content Browser (for bulk generation), in Editor Blueprints, and for Visual Dataprep.

  • New: Improved support for blended Materials in the Datasmith importer.

  • New: Added an option in the menu for Datasmith assets to be able to execute the Visual Dataprep pipeline as a convenience.

  • New: Added an auto-expose mode to the Variant Manager that can be enabled with the red button in its UI. When active, the Variant Manager will capture any modified property of any Actor to the selected variant.

  • New: Added a button to the right of a captured property in the Variant Manager that indicates whether the recorded value differs from the current value of the property. Clicking that button updates the recorded value with the current value.

  • New: Added an indication when an activated Variant Manager variant has unresolved actor bindings.

  • New: When importing with Datasmith, the option to enable lightmap UVs generation is now exposed, allowing users who do not need static lighting to disable it and speed up the import.

  • New: In Visual Dataprep, the operations Enable Lightmaps UVs and Compute Lightmap Resolution have been combined into the more clear Setup Static Lighting operation.

  • New: Improved import of Cinema 4D Materials:

    • Now parses base colors from reflectance and color layers

    • Added proper handling of linear and sRGB documents

    • Added support for the Normal texture mixing mode

    • Fixed color brightness for incorrectly modulating texture color

  • New: Updated the Visual Dataprep scene and asset preview panels to include icons for handling object visibility and displaying different icons depending on input asset types respectively.

  • New: Variant Manager variants now have a small indicator that displays whether or not they are active.

  • New: VRED and DeltaGen variant Datasmith elements are now accessible to editor scripting.

  • New: MDL Importer is no longer dependent on Datasmith.

  • New: CAD import—Improved meta-data (custom properties) import.

  • New: IFC Importer now applies length unit-conversion settings from an IFC file.

  • Improvement: Improved both speed and memory usage when importing big scenes using Datasmith.

  • Removed: All Datasmith importers are now unified, The dropdown menu from the Level Editor was no longer necessary, and has been removed.



  • Bug Fix: Fixed Gauntlet for recopying OBBs to a target device.

  • Bug Fix: Fixed Ionic compatibility issues relating to Zip64 archives and the 7-zip/Mac unzip command.

  • Bug Fix: Armv7 and arm64 architectures are now built when packaging Android plugins.

  • Bug Fix: Fixed editor-only plugins that triggered the recompilation of code projects.

  • Bug Fix: Improved logic that determines whether a content-only project needs to be compiled.

  • New: AutomationTool now uses MSBuild over the legacy xbuild tool on Mac, if available.

  • New: Added SyncProject script that syncs and optionally builds/opens a project.

    Example usage:

    SyncProject -project=EngineTest -build -open

    See SyncProject help for all options

  • New: Added BuildTarget script that builds specified targets for a project (See BuildTarget help for all options).

    Example usage:

    BuildTarget -project=EngineTest -target=Editor
    BuildTarget -project=ShooterGame -target=Game -configuration=Development -platform=Win64+PS4+XboxOne
    BuildEditor -project=Foo is equivalent to BuildTarget -project=Foo -target=Editor


  • New: Macros can now contain agent and node definitions.


  • Bug Fix: When loading BuildConfiguration.xml, whitespace characters are now stripped around xml node values (except for string values) for convenience.

  • Bug Fix: BuildConfiguration.xml files now explicitly check for valid boolean values rather than defaulting to false on error.

  • Bug Fix: Added -fdiagnostics-absolute-paths to Clang builds on Linux and Switch to get fully qualified paths to all files involved when an error happens in a header.

  • New: To improve local iteration times, you can add a list of modules to the DisableUnityBuild setting in BuildConfiguration.xml to exclude them from unity builds.

  • Bug Fix: Fixed an issue with loading .suo settings, and updated the version to 1.56.

  • Bug Fix: Changed the PVS Studio toolchain to use an instance of the VCToolChain to preprocess all the input files.

  • Bug Fix: Changed the order in which modules are mapped to Visual Studio projects. It is now Game to Mod to Program to Engine to Enterprise. This resolves issues where a Program in the game source root would take all the source code away from the Game project. In this case now, though the Program source is put into the Game project, it is best to have the program target in a Programs folder under the game source rather than at the same level as the game targets.

  • Bug Fix: Added a custom driver to invoke the linker on Windows, to filter out intermittent "Unexpected PDB error; OK" messages and restart the link.

  • Bug Fix: Added a warning when referencing a module without a fully qualified path, doing so will break the incremental building of it.

  • Bug Fix: Fixed single-file compile option modifying response files for files other than the one being built, causing unnecessarily large rebuilds.

  • Bug Fix: Fixed an issue where using -Platforms to generate a solution with a subset of platforms would break the editor finding the solution.

  • Bug Fix: Excluding target.cs files from the module source, this fixed an issue where target source got assigned to a project multiple times (which in some cases resulted in it being assigned to an otherwise empty project). Resolves an issue with games having a program with the same overlapping name.

  • Bug Fix: Reworked module assignment to visual project files to simplify the rule. Now the first matching target starting at the module file and searching upward in the directory structure will be used as a base for which project to use. If multiple targets are on the same level, the old rules of Game to Mod to Program to Engine to Platform to Enterprise still applies.

  • Bug Fix: Now allows of a list of preferred Windows toolchains. This makes it possible to reference both the latest toolchains as we version them in AutoSDK, while also still allowing for the version number used when installed locally.

  • Bug Fix: Fix LIB files not being generated to the same directory as the DLL when bShouldCompileAsDLL = true in the target.

  • Bug Fix: Fixed an error when trying to delete a file when hot reloading with the debugger is attached.

  • Bug Fix: Fix for broken IntelliSense data.

  • Bug Fix: Added detection of all .NET Framework versions, and if none are found, throws BuildException.

  • New: Added an error when trying to build the editor in an unsupported configuration.

  • New: Added a "GenerateClangDatabase" mode to UBT, which will generate a compile_commands.json file in the workspace root directory for Clang tooling. Specify which files to include using the new -Filter=... argument (for example, -Filter=QAGame/Source/…).

  • New: Added an option to VSCode project file generator to include all files (disabled by default).

  • New: Added support for generating Rider project files.

  • New: Developer modules are now enabled for game/client/server targets that aren't built in Test or Shipping.

  • New: Engine modules now specify the full path to the third party static libraries where possible, and UBT outputs a warning when a qualified path is not specified. This allows dependency checking for libraries and improves performance.

    • The PublicSystemLibraries list has been added for situations which require the legacy library search behavior.

  • New: Updated conventions on importing Android libraries use the newly introduced Android Architecture instead, which is always set to a valid architecture (unlike Target.Architecture for the general case).

  • New: Added a -preprocess argument, which will just preprocess the source code rather than compile it. Can be used in conjunction with -SingleFile=... to preprocess a single source file.

  • New: Added build support and customization options for DirectX Math on Windows.

  • New: Added native support for parsing command line arguments inside Target.cs files, via the [CommandLine] attribute on fields.

  • New: Added the ability to override unity and optimization settings per module via the BuildConfiguration.xml file. This should eliminate most needs to disable unity builds in Build.cs (as disabling it for local iteration times was the primary motivation for it). bFasterWithoutUnity has been renamed to bUseUnity (note the inversion of the statement), and should be used if a module does not support building in unity mode.

  • New: Shadow variable warnings are treated as errors by default for projects that are using the latest UBT build settings. The warning/error level can be modified on a per-module and per-target basis. The engine will always be built with it as an error.

  • New: Added flag in TargetRules to optionally disable generation of runtime symbol files for some platforms.

  • New: UBT now outputs an error when compiling Unreal Engine with known codegen issues, and excludes toolchain versions when sorting compilers for use. Note that the Visual Studio 2019 16.3 toolchain (14.23.xxxxx) is currently blacklisted.

  • Improvement: Updated the Android toolchain to filter paths to a library in the same way an additional library search path is filtered, enabling us to just specify the full path to multiple libraries for different architectures.


  • Bug Fix: Fixed an issue that prevented building (and consequently, generating project files) when syncing precompiled binaries, which can happen if the build checkbox is selected before the "Sync Precompiled Binaries" option is enabled.


  • Bug Fix: Fixed null dereference when starting batch builds without selecting a job first.

  • Bug Fix: UnrealVS v1.55 now loads asynchronously and no longer displays warning on start.

  • Bug Fix: Fixed that the Quick Build menu Visual Studio 2019 would occasionally be empty.

  • Improvement: Added more logging when running build batch jobs to catch a crash.


  • Bug Fix: To address Intellisense warnings about incorrect macro definitions, modified the OpenColor header to check if GNUC is defined before use (as it already does a few lines below). Removed global invalid GNUC define, and fixed up spaces in the define, which were causing problems with VSCode.


  • Crash Fix: Fixed a crash that occurred when a user attempted to spawn an Actor Blueprint that has been force-deleted.

  • Crash Fix: Fixed a duplicate-object crash that happens when a user performs a paste after undoing an earlier paste. This fix moves all objects with the same name out of the way, instead of just the first one.

  • Crash Fix: A crash was occurring when adding a component in the Blueprint Editor after undoing an Add Component action; the fix explicitly moves objects out of the way in order to adhere to the component naming convention.

  • Crash Fix: Fixed a crash that sometimes occurred in composite tables when performing an undo action on adding a table to itself.

  • Crash Fix: Fixed a potential crash that was triggered by early GC when creating assets.

  • Crash Fix: Fixed a crash that occurred when the user force-deleted levels containing certain types of assets such as particle systems.

  • Crash Fix: Deleting multiple entries of a map in a Blueprint will no longer crash the editor.

  • Crash Fix: Fixed a crash occurring for -game client in Multi-User when hot-reloading and purging packages.

  • Crash Fix: Fixed a crash that could occur when deleting an Actor from a level.

  • Crash Fix: HLOD: Fixed a crash occurring in cluster computation when a cluster's spheres barely overlapped.

  • Crash Fix: Fixed an issue with the World Outliner's customizable column, where it was allowing multiselect, which could cause a crash when no options were selected.

  • Crash Fix: Fixed a crash that occurred when user scrolled the sequence node list while the the track context menu is open.

  • Crash Fix: Fixed a crash caused by a missing call to initialize the concert style set from the Disaster Recovery plugin. This was initialized in a Multi-User plugin, so if both Multi-User and Disaster Recovery were enabled, it did not crash. Now, Disaster Recovery properly makes the call to initialize, preventing the crash.

  • Crash Fix: HLOD—Fixed a crash occurring when a user deleted the last Actor from an HLOD cluster.

  • Crash Fix: Fixed a crash that occurred when saving a package named "None."

  • Crash Fix: Fixed a Disaster Recovery crash occurring at exit if two editors were launched on the same project concurrently.

  • Crash Fix: Fixed a rare PIE crash that occurred when an Actor preview viewport is open.

  • Crash Fix: Fixed a crash that was occurring when refreshing a property editor "Guard against null properties" when calling IsOnlyVisibleWhenEditConditionMet.

  • Crash Fix: A crash was occuring after clicking Launch if Failed when the message log was open to Packaging Results. This has been fixed.

  • Crash Fix: Fixed a crash that occurred when adding a new spline point to the last segment of a closed-loop spline component.

  • Bug Fix: Fixed a bug in the GetNumberOfSelectedNodes function of SGraphEditor so it correctly returns the number of selected nodes. Added a new method, FindGraphEditorForGraph, in the SGraphEditor class.

  • Bug Fix: Duplicating an interface function no longer duplicates the pins on the graph nodes. When the schema duplicates a graph, the fix will have it path up all function terminators, not just the entry. When an interface graph is duplicated, it checks to make sure a user-defined pin exists before adding it.

  • Bug Fix: Fixed a problem where users were able to drag and drop events into the Event Graph that were non-callable by Blueprints.

  • Bug Fix: Fixed a typo in the OnNavigateToDataTableRowCode function of FDataTableEditor that was causing it to navigate to the struct twice.

  • Bug Fix: In Blueprints, SwitchOnEnum node output pins for native enums are now searchable by their corresponding C++ enum name. Previously, they would only turn up in a search if the keyword(s) matched the user-facing display name that's used for the pin's label.

  • Bug Fix: Creating an event from the details panel is now focused in the window without pressing Ctrl.

  • Bug Fix: Fixed a Blueprint compiler error that occurred when a Blueprint interface was removed from a class.

  • Bug Fix: Fixed a bug that could prevent Unreal Editor from closing.

  • Bug Fix: Fixed an issue where the Multi-User Browser search bar was not clearing the filter when the user pressed the Esc key to clear the search text.

  • Bug Fix: The editor now gives the user feedback when a combobox is useable.

  • Bug Fix: Fixed an issue with undo/redo that could cause UObject name collisions and possible crashes in UObject::Rename calls.

  • Bug Fix: The Stylus Input plugin now correctly triggers stylus events in popup windows.

  • Bug Fix: Asset property editors will no longer display thumbnails when an Array/Set/Map of SoftObjectPaths is tagged with "DisplayThumbnail=false" metadata.

  • Bug Fix: Fixed the Multi-User active session widget to display a "N/A (-game)" when a session client is in-game. Added a tooltip saying that client in-game does not emit their presence/level.

  • Bug Fix: Force-deleting an asset no longer closes all open asset editors, but instead only closes all editors that reference that asset.

  • Bug Fix: Prevented Disaster Recovery log console to pop up behind the editor on Mac OS.

  • Bug Fix: Fixed an error where tessellated materials displayed as a checkerboard and PS complexity 0 in Shader Complexity ViewMode in the editor.

  • Bug Fix: Added a parameter to constrain menu height. Some menus that were previously too long to access all the entries now have a fixed length.

  • Bug Fix: There is now a warning message about data loss when the Merge Actor tool overwrites existing files.

  • Bug Fix: Fixed an error in an Actor name when using the Merge Mesh tool to replace the selected Source Actors.

  • Bug Fix: Fixed an issue with the Multi-User Session History; the transaction Details panel was not displaying transactions that were superseded by others, and therefore not applied.

  • Bug Fix: Fixed an issue where the Multi-User Session History Details panel was expanding and collapsing when the user was browsing session activities. Now the Details panel stays open, but displays a "No Details" message when the selected activity does not have details.

  • Bug Fix: Fixed an issue where LOD Paint warning dialog was occurring when LOD Paint was not enabled.

  • Bug Fix: Fixed some property "reset-to-default" buttons in the Property Details panel that were not generating a transaction.

  • Bug Fix: Fixed the Depth Picker in the Details panel depth picker so it actually picks a sensible depth, rather than just picking the hit proxy Actor location. This allows you to use the eyedropper to set the focus distance for a cinematic camera.

  • Bug Fix: Fixed the asset picker to keep the "Show Other Developers" toggle button in sync with the filter list checkbox state when the filter UI is enabled.

  • Bug Fix: Disabled the unintended usage of console commands spawning Multi-User UI widgets when running the editor in "-game."

  • Bug Fix: Editor now validates that there are no locally dirty packages when joining a Multi-User session.

  • Bug Fix: Prevented Disaster Recovery from recovering changes made during a Multi-User session.

  • Bug Fix: Fixed persistence of live transaction session changes when the asset is not loaded.

  • Bug Fix: Reduced the time for gathering session changes when persisting.

  • Bug Fix: Fixed the filtering of classes when "AllowedClasses" or "DisallowedClasses" is specified for a UClass* property. Previously, unloaded Blueprint classes were always displayed.

  • Bug Fix: Fixed an issue where the data table row property was writing a potentially localized value for "None".

  • Bug Fix: Maps with struct values now correctly display their key in a separate property.

  • Bug Fix: EditConditions applied to containers holding structs now correctly apply to the structs' members as well.

  • Bug Fix: Scale spin boxes no longer cause the other components of the scale to get stuck at 0 when scaling through zero (eg. 1 -> -1).

  • Bug Fix: Fixed the BehaviorTreeEditor auto arrange crash and bug.

  • Bug Fix: Curve Editor—Speculative fix for when the curve owner is null and testing cubic tangents.

  • Bug Fix: Editor now shows the selected IDE instead of the suggested IDE in the tooltip for code hyperlinks.

  • Bug Fix: Fixed a regression where archetype spline editing inside the BP Editor window was no longer working.

  • Bug Fix: MaterialBaking—Removed cached Materials instances from the material proxy pool when changes are made to one of its parent materials.

  • Bug Fix: Fixed a crash that occurred when user hot reloaded "compiled in" or "in memory" packages. This happened if the user enabled or disabled disaster recovery during a Multi-User session.

  • Bug Fix: HLOD—You can now merge HISM to the resulting proxy mesh.

  • Bug Fix: Fixed the Multi-User icon that is displayed in the context menu when you right-click an asset in the Content Browser during a Multi-User session. The Multi-User icon is displayed now instead of the Source Control icon (which was used as a placeholder).

  • Bug Fix: Fixed an issue with Disaster Recovery where it was not rotating/trimming the old recovery sessions, because it tried to delete from the wrong directory.

  • Bug Fix: Fixed the reallocation of auto-reimport monitors, which were causing corrupt delegate bindings.

  • Bug Fix: HLOD—Previously, rebuilding HLOD proxies sometimes resulted in bad textures; this fixed stale Materials in MaterialProxyPool.

  • Bug Fix: Consolidated add external property parameters, and added the ability to forcibly show external properties.

  • Bug Fix: Reference Viewer used to show a +1 offset in the "Search Breadth Limit" option. For example, if the user selected a Breadth of n, n+1 elements were shown rather than only n. This is now fixed.

  • Bug Fix: Fixed an incorrect component reference check.

  • Bug Fix: Fixed an issue where Replace Actors was not properly finding Actor references in sublevels. Instead of performing the reference fixup on the editor world, the editor now steps through each Actor being replaced, and gathers up its level so that the user knows where to search.

  • Bug Fix: Fixed an issue with the EditorSettings import button not working in some cases.

  • Bug Fix: Monitors to the left of monitor 0 (with negative pixel indexes) were not showing the tooltips in the right place. This problem has been solved. In addition, and to avoid future related bugs, "FSlateRect GetToolTipForceFieldRect(...)" was deprecated and replaced by "bool GetToolTipForceFieldRect(..., FSlateRect&)", which additionally indicates whether the function found a solution. This updated function minimizes the risk of re-adding this bug in the future.

  • Bug Fix: Fixed an issue where PIE/SIE dummy package events were not marked as "ignored on restore" by Disaster Recovery when PIE/SIE was launched from a Multi-User session.

  • Bug Fix: Fixed an off-by-one error when rotating the disaster recovery sessions that would delete the most recent session.

  • Bug Fix: Fixed a problem with disaster recovery finite state machine reporting as "not completed" when it actually was completed.

  • Bug Fix: Previously, the user was not notified when a recovered level was not saved to disk because the file was read only. Now, the editor is prevented from resetting the package dirty flag when the package did not save successfully, so the user does not think the asset was saved while it was not.

  • Bug Fix: Fixed an issue with DPI scaling for the ReporterGraph.

  • Bug Fix: Changed the warning badge in the Details panel for experimental/beta classes, so that the warning properly reports the last ancestor class that declared experimental/beta, instead of the last ancestor class that introduced a property.

  • Bug Fix: Fixed a memory stomp in Editor Settings that caused the editor to crash when undocking an asset editor window or Blueprint.

  • Bug Fix: Fixed a random crash that occurred while connecting to a Multi-User session, when the server could not respond in the same frame that the connection request occurred.

  • Bug Fix: Fixed a serialization/versioning issue with MeshDescription. Also eliminated unnecessary memory bloat by not retaining MeshDescriptionBulkData, which is generated to be written to the DDC when a legacy static mesh is first loaded.

  • Bug Fix: Fixed an issue where child tabs would grow when destroyed or recreated in the OnTabRelocated function of FGlobalTabmanager due to the DPI scale being applied redundantly.

  • Bug Fix: The Viewport Add Camera list no longer can contain Abstract classes.

  • Bug Fix: Fixed an issue where you could not rename a folder with case-sensitive strings.

  • Bug Fix: Fixed DPI scaling issues for the Console.

  • Bug Fix: Previously, when an Input Post was added to an animation layer, it would expand all input options in that layer. To fix this, now FAddPropertyParams is exposed to the AddExternalObjects function of IDetailCategoryBuilder. This is done to allow unique IDs to be specified, so the expansion state is persisted when displaying multiple external objects of the same type. It forces AllowChildren(True) to mimic previous behavior.

  • Bug Fix: Previously, when creating two Actors in a tool mode with the same name but different classes, the editor would crash. This is because the editor was testing on the World and not on the Level. Now, the editor tests for a unique name on the correct outer before spawning the second Actor.

  • Bug Fix: Added a warning to ComponentIsDamageableFrom that shows up if ECC_MAX is passed in.

  • Bug Fix: Fixed an issue where drag and drop was spawning Actors in the wrong location of the level viewport.

  • Bug Fix: Fixed an issue where newly added or saved assets in Multi-User were locking.

  • Bug Fix: Fixed a missing source control error status icon on the Level Editor toolbar.

  • Bug Fix: Fixed an issue where the editor would hang on shutdown due to a long file system scan by DDC.

  • Bug Fix: Fixed a memory leak in SOutputLog.

  • Bug Fix: File paths are now converted to use backslashes when opening source files in Visual Studio. This fixes issues with plugins in Visual Studio that were prompting users to re-open the file.

  • New: Added support to the editor to allow rendering onto HDR monitors when running on Windows10.

  • New: Added a "Convert function to event" option for function nodes and a "convert event to function" option for events.

  • New: Selecting a node and pressing Shift + Del will reroute any input points that were connected to outputs on the deleted node.

  • New: Added drag-and-drop reordering for local variables in the My Blueprint palette in the Blueprint Editor.

  • New: Detail item node filtering now supports custom builder nodes with a valid filter string. Category filtering no longer overrides non-text filters.

  • New: Added a warning to UHT to check Blueprint type enums and make sure that they have an entry that is equal to 0. This will fix Blueprint compiler warnings with those enums, and conform to the "memset to 0" contract of the reflection system.

  • New: Improved the searching heuristics in the Blueprint context menu. Added context menu CVars for tweaking the behavior when finding matches in the context menu. Added some comparisons to the type of pin that was dragged off so that there is a preference toward that type. Improved preference toward shorter matches from the user over long ones, and updated how percentage matches are calculated.

  • New: You can now retrieve interface implementation function parameters from the node search context menu.

  • New: Updated the override functions menu so that the base class is displayed to the right. Interface functions are not included in the override menu.

  • New: UBlueprint OnChangedEvent and OnCompiledEvent are now editor-only events.

  • New: Exposed the SkipAssigningGamepadToPlayer1 function of UGameMapSettings to Blueprints.

  • New: Added the ability to rename a function from its entry node.

  • New: Double-clicking on an interface node call now goes to its implementation.

  • New: MakeHitResult and BreakDateTime nodes now act more like normal make/break nodes, with some pins hidden behind a "more info" dropdown, resulting in the pins taking up less vertical space in graphs when not all inputs are used.

  • New: SkeletalMeshComponent and StaticMeshComponent are now marked as Blueprintable.

  • New: Added a best-guess modifier to overriding functions. If the original function was created as a Blueprint function, that will be preferred over an event implementation.

  • New: Make calls to the IsDataValid function on Blueprints also now check the validity of the simple construction script and SCS nodes. This ensures that any components added to the Blueprint are also checked. Added a helper function to combine the intermediate results of two IsDataValid checks.

  • New: Users can now type in additional keywords to the details panel of a custom event and search for them in the BP context menu.

  • New: SWizard now supports displaying the page title (enabled with ShowPageTitle) on every page of the wizard.

  • New: When searching for plugins in the plugin browser, the search engine now scans description text.

  • New: UFUNCTION's marked CallInEditor now supports the DisplayPriority meta tag, which is used to control ordering and sorting of the clickable buttons generated when the parent UObject is used in a Details View.

  • New: The correct executable is now automatically re-launched if you are using a project with a unique build environment. The ".target" file is read at startup, and is used to determine the correct path for the executable to launch.

  • New: A user can now select the target to package through the project packaging menu, rather than showing client/server in the configuration menu. This allows support for multiple game/client/server targets.

  • New: Fixed a spelling error in the CookOnTheFly server.

  • New: Added the option of exporting static meshes as USD. It supports vertices, normals and UVs.

  • New: Added a filter for showing plugins filtered by enabled state in the plugin browser.

  • New: Now you can press ENTER while your cursor is in the Reference Viewer's Search field to re-run the search.

  • New: Added Sun and Sky Blueprint to the Lighting modes pane.

  • New: Added an option to perform a partial save of assets that can be saved when a subset of assets cannot be checked out (such as when the asset is exclusively locked or not at head revision).

  • New: Changed the UI flow to restore an archived Multi-User session, to display the session history, and to display the live stream of activities in the active session window. Added a contextual introduction at the top of the recovery window, giving some context to the user. Renamed the Recover button to Recover All.

  • New: Added contextual text to the top of the disaster recovery widget that explains the purpose and the context of the widget.

  • New: It is now possible to export textures that were created from grey scale images.

  • New: There is a new Interior ArchVis Level Template.

  • New: Compiled-In packages are no longer saved in the transaction buffer when they are marked dirty.

  • New: Added a search bar to the Multi-User History widget to lookup activities quickly when in a session.

  • New: Added a search bar to the Multi-User/Disaster Recovery "session recovery" widget.

  • New: Added the number of displayed (not filtered out) vs. total of activities displayed by the Multi-User History widget and Recovery widget.

  • New: The "Zip up project" packaging option now includes a project's Plugins folder when zipping the project from the editor.

  • New: When long-running UAT tasks (such as cooking or packaging) are completed, the editor will now either flash or highlight its entry in the taskbar. This can be disabled using the Editor Preferences under the option Get Attention On UAT Completion.

  • New: The Audit Asset dialog will now correctly refresh its display of chunks for the Editor platform, and display the correct information from the moment it is first opened.

  • New: Added EditConditionHides meta property that determines visibility based on the edit condition.

  • New: Added support for InlineCategoryProperty metadata, which makes the bool or enum property it is applied to display inline next to the category. This can be used for toggling the visibility of an entire category of properties.

  • New: You can now populate arrays in the details view by dragging onto them.

  • New: Asset property editors now handle multiple Actor types correctly when set with the "AllowedClasses" meta as well as supporting "ExactClass" meta.

  • New: Added word wrapping in the Output log window.

  • New: Integrated NPR level in the ArchVis level template.

  • New: It is now possible to disable recursive filtering in the asset view, so that when an asset type filter is enabled you don't see all assets of that type at once. You can toggle this behavior with View Options > Filter Recursively.

  • New: Multi-User—Exposed additional presence functionality to the API to more easily customize presence behavior in code.

  • New: Multi-User—When a Multi-User server is started from the editor, it now uses the same UDP Messaging settings as the editor uses for unicast, multicast and static endpoints.

  • New: MessageBus—Added a network messaging modular feature that the UDPMessaging module implements.

  • New: MessageBus—Added an auto repair option to reinitialize the UDPMessaging service in case of error, with an increasing backoff in case of failure.

  • New: The mesh painting settings Enable Brush Flow, Ignore Back-Facing, and Color View Mode are now persisted between editor sessions.

  • New: When displaying sessions or creating a new session in the Multi-User Browser, there is now an icon/tooltip beside the server to indicate when that server does not validate the session requirements (server launched with -CONCERTIGNORE).

  • New: Makes the autosave interaction delay a config variable.

  • New: Added an SRecentProjectBrowser widget that only displays the NumProjects for most recently opened projects.

  • New: Moving a folder with a numeric name (such as "1" or "1234") to another level in the hierarchy no longer causes the editor to get stuck in an infinite loop.

  • New: Updated the Disaster Recovery activity widget to display non-restorable activities (such as those generated during a Multi-User session) as grayed out.

  • New: When recovering a Multi-User session, the archived session name is set in the window title.

  • New: Component visualizers now work with components of ChildActorComponent Actors.

  • New: Made level cleanup output more verbose, describing all the reference chains that the user code leaked during PIE.

  • New: Added a Plastic SCM Source Control provider plugin.

  • New: Added an expandable Details area to the Recovery panel; this displays package/transaction details when restoring a disaster recovery session or an archived Multi-User session.

  • New: Changed the look and feel of the "lock" icons, which are displayed on top of an asset in the Content Browser during a Multi-User session when a user has locked the asset.

  • New: Date/time-based naming for the high resolution screenshots.

  • New: Added the GetNavigationActionFromKey function that properly handles multiple users and modifiers.

  • New: Added support to run concurrent disaster recovery clients on the same project. This enables the user to open the editor twice, and get its session transaction recorded.

  • New: Updated the CSV reader to be able to reimport write-locked files, such as spreadsheets open in other applications.

  • New: Fixed an issue where a substance tutorial was not showing up.

  • New: Added a MessageToken that uses an FText Attribute instead of an FText. This makes it dynamic. There is logic in the STextBlock that prevented TextToken from working with a bound attribute.

  • New: Performed refactors for deprecating FAssetEditorManager in favor of AssetEditorSubsystem.

  • New: Added an option for displaying the first line of help text in a console auto-complete window. This new option is disabled by default.

  • New: Moved GizmoMaterial from Editor Materials to Engine Materials.

  • New: Added the Custom Scene Outliner. This widget is useful if you need to reuse the presentation of the scene outliner for your own tools. Added the capacity to add or remove filters and columns to normal scene outliners.

  • New: Exposed ARFilter UPropertys for editing in defaults.

  • New: Expanded ISlateInputManager to include support for remapping the mouse user index.

  • New: Added a new Multi-User setting which will retry auto-connection on an error (this setting is false by default); this prevents spamming the log continuously in case of an error (such as when the workspace requirement is not fulfilled). The setting can be overwritten from the command line by using ConcertRetryAutoConnectOnError=true.

  • New: The dropdown marked "Select Function..." has an additional option that creates a function/event that matches the specified signature.

  • New: Pass the editor UDP messaging settings to the Multi-User server when launching it from the editor.

  • New: Added additional details in the output log about which files contain local modifications, during source control workspace validation when joining a Multi-User session.

  • New: Default Multi-User VR avatar can now display two interaction lasers if the user's VR interactor supports it.

  • New: Added a Multi-User sequencer option to sync the timeline of unrelated sequencer in a Multi-User session.

  • New: Added debugging support for multiple message bus instances.

  • New: Spline component—Added "Snap All Selected X/Y/Z" menu option to snap all spline points to the x, y or z value of the currently selected spline point.

  • New: Spline component—Changed tangent visualization to use solid lines rather than dashed.

  • New: Spline component—Alt-drag for creating new spline points now works in both directions.

  • New: Spline component—Added box-select / frustum-select capabilities for spline points.

  • New: Spline component—Added "Select All Spline Points" menu option.

  • New: Spline component—Added "Snap/Align to Floor" (the default hotkey is End) menu option to drop selected spline points to the Actor directly below, optionally aligning the spline point up vector to the target position's normal.

  • New: Spline component—Added "Snap/Align/Align Perpendicular to Nearest Spline Point" menu option which moves the selected spline point to nearest spline point on another spline component. Spline point tangent is adjusted to be parallel or perpendicular to target point's tangent when aligning.

  • Improvement: You can now delete the user construction script if a Blueprint is no longer derived from AActor.

  • Improvement: Updated the Multi-User Active Session widget and Multi-User Package History widget to display the activity history in a table with several columns rather than a single line of rich text.

  • Improvement: Improved performance for Actors multi-selection.

  • Improvement: Deprecated the global variable GEditor->Layers and the classes ILayers and FLayers. The deprecated variables all have been replaced by GEditor-> GetEditorSubsystem () and the class ULayersSubsystem. This also required deprecating all functions in the ULayersSubsystem that used/returned a TWeakObjectPtr; these have been replaced by raw pointer analogs (for BluePrint compatibility). This directly exposes most ULayersSubsystem functions to BluePrint.

  • Improvement: Improved performance of UV island packing:

    • Tested rows from longest to shortest to get rid of one inner loop in the hot path.

    • Added a lookup table to skip another free segment inner loop in the hot path.

    • Added island hashing to skip directly to the last known best position.

    • Split loops, simplified code, and added comments for clarity.

    • Reduced data copying and clearing to the working area only.

    • Multithreaded initial scale search when the complexity is high enough.

    • Added a segment grid along the Y axis for more efficient search of taller islands.

    • Added the ability to log packing stats per island in Insights to understand algorithmic behavior.

  • Deprecated: The IDesktopPlatformBase::GetSolutionPath() method has been deprecated in favor of functionality in the SourceCodeAccess module.

  • Removed: Removed the validation that forced the replaced object to be the same class as the previous object in the ReplaceObjects function of SDetailView. This restriction was not needed.


  • Crash Fix: Prevented crashes in the Editor by fixing divide by zero in beam update.

Content Browser

  • Crash Fix: Fixed an issue where saving assets while renaming was causing a crash.

  • Crash Fix: Fixed a crash occurring when creating a new asset with CollectGarbageEveryFrame enabled.

  • Crash Fix: A crash was occurring when a user saved over an existing level and pressed ESC. This is now fixed.

  • Crash Fix: Fixed an editor crash that occurred when user accepted local revision during a merge.

  • Bug Fix: The "Discovering Assets" overlay no longer eats mouse events.

  • Bug Fix: Multi-editing font face assets are now avoided by default, because it does not work with the font face editor and can be done using the property matrix instead if needed.

  • Bug Fix: The breadcrumb arrow is now hidden when no child path is available.

  • Bug Fix: Fixed an issue where the Show in Content Browser was not working for engine plugin content.

  • New: There is now a confirmation dialog before executing folder validation.

  • New: All filters in content browser + shortcuts have been enabled..

  • New: You can now select the parent of a child folder when collapsing the parent.

  • New: Added context menu option to level sequence assets to open the level containing the sequence.

  • New: Added TIFF texture import.

  • New: The In Use by Any Level filter in the content browser now checks more than one layer deep.

  • New: Added a new right-click context option that lets you copy the file path of the selected assets.

  • New: Extended the Migrate tool so you can selectively exclude individual files or entire folders.

  • New: Optimized content browser filters/search during startup (while assets are being discovered).

  • New: Added a display/hyperlink in the top right of data asset editors to their native class (or the most-common-ancestor if editing multiple different ones at once)

  • New: Collection UX improvements:

    • Revamped the collection UI:

      • Updated collection item design.

      • Added the asset count to the collection view.

      • Added the collections more prominently in asset tooltips.

    • Revamped the sources panel UI:

      • Added a unified search for all aspects of the sources panel (paths, favorites, and collections).

      • Added a switcher for the paths and collections views, which auto-switches as you browse to paths or collections.

      • Collections are now visible by default, rather than hidden behind a View Option.

    • Improved Content Browser auto-complete:

      • Lists collection and meta-data tag names, as well as the old class names.

      • Tokenizes the search terms to allow auto-complete on partial statements.

    • Added scripting API support:

      • Collections can now be created, destroyed, and manipulated via Python or Editor Utilities (editor only, see the AssetTagsSubsystem API).

      • Collections can be queried both in-editor and at runtime (if cooked).

    • Added support for optionally "cooking" collections for use at runtime:

      • This only works for static collections, and adds their information to the asset registry meta-data.

      • See the AssetRegistry settings in BaseEngine.ini (bTagAllCollections, CollectionsToIncludeAsTags, and CollectionsToExcludeAsTags).


  • Bug Fix: Removed an invalid check in the ApplyLevelTransform function of FLevelUtils, and adapted code to support reentrancy.

  • Bug Fix: Cooking fix in StaticMeshComponent::OwningComponent can be NULL for a component created via SpawnActor off of a Blueprint default (LODData will be created without a call to SetLODDataCount).

  • Bug Fix: Fixed "move selected instanced foliage Actors to level". Now this moves only the selection, not all instanced foliage Actors.

  • Bug Fix: Fixed a bug where Snap Foliage to Landscape was not working when using the Landscape Layer system.

  • Bug Fix: Fixed a problem where Foliage instances were not properly handling Level transforms.

  • Bug Fix: Fixed Foliage instances to properly handle Level Editor transform. When ActorFoliage respawned at load (caused by a FoliageType change), Actors were spawned in world coordinates and then a Level Editor transform was applied on all level Actors. This resulted in bad positioning.

  • Bug Fix: ActorFoliage respawning at load was also done too early, which would lead to the respawned Actor being invisible. This no longer occurs.

  • Bug Fix: StaticMeshFoliage in a level with a Level Editor transform was moving some editor instances when saving the level, only for the instances made from Actors that were moved by the level transform. Visually, it did not cause problems because IFA was also moved, but it would generate a mismatch between editor instances and HISM instances. At this point, erasing foliage and other manipulations using editor data would not work for all cases (loading the level with or without the transform). This is now fixed.

  • Bug Fix: Editor data instances are now always saved locally to the Level.

  • Bug Fix: Foliage Actors in PIE are not respawned when detecting a mismatch of FoliageType's Actor class.

  • Bug Fix: Fixed an issue where the Foliage Engine Show Flag was ignored by Actors that were painted by the Foliage Tool.

  • New: Added an option to Include Actors into Foliage, and an option to Exclude Actors from Foliage.

  • New: Added Exclusion Landscape Layers and minimum threshold value in FoliageType to exclude foliage instances in a specific area.

  • New:

    • Added an option to override the radius used to detect collision with other instances when you are painting in single instance mode.

    • The sphere brush in single instance mode painting now displays the maximum radius of selected Foliage Types to paint. It also takes into consideration override radius if enabled.

    • Single instance mode painting sphere brush color is green to differentiate from the normal foliage painting.


  • Crash Fix: Fixed a crash occurring when the virtual texture file cache has more line reservation requests than it can handle.

  • Crash Fix: Previously, a crash occurred when selecting Landscape mode and then selecting Foliage mode. Landscape mode automatically creates an Actor and selects it when you select that mode. Switching to Foliage mode destroys the Actor previously created, but an invalid, weak reference is still in the Selected Actors list. Just checking Num() is not enough, as GetSelectedObject has additional clauses that return nullptr. The fix uses GetBottom, which is a bit more robust, and also uses Cast instead of CastChecked so nullptr is accepted and skipped.

  • Bug Fix: Fixed a landscape splines issue where socket connections were not reset when a spline point mesh was removed.

  • Bug Fix: Fixed an issue where landscape simple collision was returning incorrect physical material.

  • Bug Fix: Fixed an issue where usage of non UAV-compatible formats caused Runtime Virtual Textures to crash on Windows7 PCs.

  • Bug Fix: Landscape component now recreates its material instances when a material is destroyed by the Delete Asset dialog.

  • Bug Fix: Editor now waits for the streaming virtual texture transcode to complete before deleting file handles.

  • Bug Fix: Fixed an issue where the landscape did not render after opening a level in the editor with a mobile Preview Rendering Level enabled.

  • Bug Fix: Previously, when viewing Wireframe from the Top view, the LOD for the landscape would not change when zooming in and out with the mouse wheel. Now the landscape LOD calculation is correct for these views.

  • New: Handle orthographic camera case for landscape LOD calculation. This prevents an issue where LOD was not properly calculated and displayed in wireframe Top view.

  • New: Added LeftSideFalloffFactor & RightSideFalloffFactor on Landscape spline control points, to allow different side falloffs.

  • New: Modified Landscape Layer Contribution for heightmap, so it now shows a gradient value instead of a constant.

  • New: We have created multiple optimizations to the CPU rendering cost of landscape components, such as using a much more SIMD-friendly and cache-coherent way to calculate continuous LOD values for landscape, and implementing support for cached mesh draw commands. With these changes, the LOD selection algorithm has also changed, and it is not possible to reach the exact same LOD distribution as you could in previous versions. You will need to readjust your landscape LOD distribution settings, taking both visuals and performance into account. For the new system, we have a set of recommended parameters:

    • LOD 0 Screen Size: 0.5

    • LOD 0: 1.25

    • Other LODs: 3.0

  • New: Added an option to bind hotkeys for the increment or decrement of landscape alpha brush rotation.

  • New: Added support to control the spline max draw distance in the main pass for Runtime Virtual Texture landscape splines. This allows us to cull Runtime Virtual Texture splines earlier, knowing that just the landscape with Runtime Virtual Texture is good enough to show the road shading.

  • New: Enabled mesh draw commands for rendering landscape to runtime virtual texture. This can improve performance in Runtime Virtual Texture page rendering.

  • New: Added support for rendering of landscape spline control points to Runtime Virtual Textures.

  • New: Landscape now supports up to 18 grass layers.

  • New: Added Focus Selected menu option for spline points. Interpolate spline component metadata when adding a point to a spline segment with right-click.

  • New: The tangents of surrounding spline points are now automatically adjusted when adding new spline points. This prevents awkward loops and kinks.

  • New: Added ability to orbit one or more selected spline points.

Material Editor

  • Bug Fix: Fixed a problem where the color picker would stop updating during an edit.

  • Bug Fix: Changed the texture preview from Fill to either Align Left or Right (depending on what side of the node it's added to). This preserves the aspect ratio of the texture preview.

  • Bug Fix: Now makes sure we have Material Editor commands before trying to use them to create a node.

  • Bug Fix: The Material Parameters list now updates when parameters are hooked up.

  • Bugfix: When you copy material function calls, they will now update their input pin appearance correctly.

  • Bug Fix: Changing undo behavior now also handles material function changes and more strictly updates the parent material.

  • Bug Fix: Previously, when editing an empty material instance with no parent, an unhandled exception occurred because the code tried to access a parent that did not exist. Now the editor checks to see if the parent exists first.

  • Bug Fix: Added a refresh to parameter toggling in material layers so you can update nested children. This fixed an issue where the user was unable to manually change values in material layers after the initial toggle to allow editing.

  • Bug Fix: Previously, when changing a parameter to a constant, the parameter would not be removed from the Parameter Defaults panel. Fixed this by ensuring that parameter overview panel updates properly when a parameter is converted back to a constant.

  • New: The Material Instance Editor Hierarchy toolbar button was refactored so that submenus for each item are no longer needed.

  • New: There is now an option in the Material Editor user preferences where you can set the default size for the Preview viewport when you are viewing a material/material instance with "User Interface" domain.

  • New: If an RVT output node is used in a material with the RVT domain, it now triggers a material compilation error. Simply overriding the material output might be confusing for users, so this makes it more explicit.

  • New: The "teardrop" material function generates velocity-aligned quads that appear to be spheres when viewed head-on, but stretch out into stable teardrop shapes when viewed on a vector that is perpendicular to the velocity.

  • New: This new material function manipulates quad/sprites to generate stable, velocity aligned ellipsoids.

  • New: The Material Editor now correctly propagates any material instance curve atlas value changes to the scalar parameter value array.

  • New: You can now use the advanced property Channel Names to label the R, G, B and A outputs of texture and vector parameters. These names will be visible in the Material Instance Editor for instances of this material, as well as being visible next to the pins for this expression.

  • New: The Override Original Material dialog is now reworded to be more clear and easy to understand.

  • New: Moved the atlas generation to PostLoad so it is now called in cook commandlets.

  • New: Added logging to get more information about a material crash occurring when saving.

  • Improvement: When right-clicking a set of Material Function(s) in the Content Browser, a new "Find Materials Using This" option displays that opens the Reference Viewer with the Materials using the selected material function(s).

Media Framework

  • New: In the Pixel Streaming Matchmaker, if a browser cannot connect, then it will retry periodically by refreshing the page. A countdown to the next refresh also displays.

  • New: For the Pixel Streaming Matchmaker, improved the message displayed when there is no capacity left so the user is informed what the capacity is.

  • New: Allow Pixel Streaming to stop streaming and to send a freeze frame JPEG to the browser for display. This is for situations where the camera is not moving and nothing is animating in the scene, so the user will not perceive any difference, other than the JPEG being higher quality perhaps. This is controlled by two new Blueprint functions: FreezeFrame and UnfreezeFrame. FreezeFrame may be supplied with an explicit RGBA texture which will be used for the freeze frame. If this is not supplied, then the back buffer will be captured and used as the freeze frame, acting as an impostor for the suspended video stream. The PixelStreaming.FreezeFrameQuality console variable will allow you to control the quality of the JPEG. This is a value from 1 to 100, and the default value is 100.

  • New: FileMediaCapture now pads filenames with "0" instead of spaces.

  • New: MediaFramework—Updated EXR library to 2.3.0.

  • Bug Fix: For Pixel Streaming, when we change level, ensure the PixelStreamingInputComponent is recreated. Otherwise a crash could occur when Pixel Streaming after a level change.


  • Bug Fix: The node context menu no longer displays the option to expand a node that has just been expanded and has no contained nodes.

  • Bug Fix: Add CLASS_HasInstancedReference flag if any property is instanced. This affects Blueprints that use a struct with properties marked as instanced and which were based on a type with no native instanced references.

  • Bug Fix: CompileAllBlueprints commandlet now re-instances, ensuring that it does not later crash during GC.

  • Bug Fix: Improved invalid parameter error when passing the incorrect struct type to Python.

  • Bug Fix: Updated Editor Utility Widgets to reinstance on compiling, and then move the old instance to the transient package, so that garbage collection can pick it up. This fixes an issue where OnConstruct would be called on the same instance each time the widget is recompiled.

  • New: Added support for Content Browser extension Editor Utilities to target/filter against Blueprint classes instead of regular asset types. It does this by returning true for IsActionForBlueprints; use the GetSelectedBlueprintClasses function of UEditorUtilityLibrary to get the selected BP classes.

  • New: New UI menu item added to clear recent Python files menu.

  • New: Editor now allows "Run" on Editor Utility Objects to be called by Blueprints.

  • New: Added QuitEditor function that can also be called in Python.


  • Crash Fix: Now removes parent binding if a component is not updated. This fixes a crash that occurred when assigning a binding to a different Actor class type, which could make some component bindings invalid.

  • Crash Fix: Fixed a crash occurring when ticking ALevelSequenceActors that might remove themselves from the world's array during a tick.

  • Crash Fix: Fixed a crash occurring when adding a spawnable from a Blueprint-generated class.

  • Crash Fix: Fixed a crash occurring when drawing trajectories of animated objects in the level viewport.

  • Crash Fix: Fixed a crash occurring when you convert an unbound possessable to spawnable.

  • Crash Fix: Fixed a case where some Sequencer assets were not transactional, causing crashes when the user performed an undo.

  • Bug Fix: Actor Sequence—Find curve tab spawner before registering so that the curve editor appears for Actor sequences.

  • Bug Fix: CameraRig—Removed invalid preview rail mesh segments.

  • Bug Fix: CameraRig—Preview meshes should be transient and not saved. This fixes a bug where they are being serialized out as null.

  • Bug Fix: Curve Editor—Fixed dragging exit tangent.

  • Bug Fix: Curve Editor—Prevented throttling on drag so that editing keys in the Curve Editor updates the viewports interactively.

  • Bug Fix: Curve Editor—Show a dummy editable text box before the property rows are generated. This fixes an issue so that the input boxes are now always visible.

  • Bug Fix: Take Recorder—Currently recording takes are now stopped automatically if PIE ends.Close the recorded sequence on end PIE if it wasn't closed otherwise.

  • Bug Fix: Take Recorder—Added guards to prevent starting and stopping recordings while they are in progress.

  • Bug Fix: Ensured that restore state does not happen during evaluation.

  • Bug Fix: Jump to the start of playback range when stepping to the next previous shot.

  • Bug Fix: Fixed an issue where some sections were not visible when dragging a section creates additional subtracks.

  • Bug Fix: Fixed a clamping occurring when keying transform rotation values > 180. Changed the interrogation type internally to FTransformData to get the raw Rotator, instead of one corrupted by FTransform > FRotator conversion.

  • Bug Fix: Live Link recorded curves now have correct Auto Tangents.

  • Bug Fix: Sequencer now is only setting/scrubbing time if the mouse-click was within the time scrubber region. This fixes a bug where if you double-click on a shot, hold the mouse button down on the second click and drag, it will set the time, causing the time to change unexpectedly. This no longer occurs.

  • Bug Fix: Editor now allows a folder name to be the same as a non-folder sibling.

  • Bug Fix: Override FBX import settings are now possible from Python. The override settings are now stored temporarily from python calls, then reset. This fixes a bug that prevented override FBX import settings from Python.

  • Bug Fix: The import camera cut/switcher from fbx was getting removed in a bad merge. This is now fixed.

  • Bug Fix: Fixed an issue with subsequences sometimes not working with a timescale < 1. This was caused by a rounding issue caused by transforming compile and clamp ranges by a scale of < 1.

  • Bug Fix: Moved material track object binding track menu to MaterialTrackEditor so that it will appear for the Actor Sequence Editor and other sequencer editors.

  • Bug Fix: The active anim instance on a skeletal animation component now correctly clears when stopping a sequence. This will stop any active anim-notifies when reverting to pre-animated state.

  • Bug Fix: Added more robust protections against assigning a sequence that would produce circular dependencies. For example, if the current level sequence is NewLevelSequence, this prevents the user from setting a subsection in it to NewLevelSequence as well.

  • Bug Fix: Fixed an issue where sequencer animation was not being reliably applied to materials.

  • Bug Fix: ALevelSequenceActor now implements RewindForReplay which will stop the sequence when seeking starts in a replay. This solves issues that occur when seeking before the sequence started would not restore the state, as no new network packets are sent to update the state.

  • Bug Fix: Fixed adjusting animation start time during resizing so that the start time is clamped to the beginning of a clip.

  • Bug Fix: UMovieScene::AddGivenTrack now allows multiple tracks with the same name.

  • Bug Fix: Cinematic Viewports now correctly enable Game View mode when activated.

  • Bug Fix: Fixed a significant performance impact that occurred when opening a Cascade Particle system before opening Sequencer. Sequencer was causing Cascade viewports to endlessly do an expensive re-render.

  • Bug Fix: Renamed Play Rate track to Time Dilation track.

  • Bug Fix: Invalidate bound objects after rerunning construction scripts, so that they are re-evaluated when FindBoundObject is called. This fixes an issue where the binding in the tree view is red and the menu is empty.

  • Bug Fix: Fixed an issue where default spawnable state was sometimes not always getting saved when the spawned object is destroyed. OnObjectModified saves the default state of the object if it is in the list of ModifiedObjects. However, the spawnable is removed from ModifiedObjects in OnPreObjectSaved.

  • Bug Fix: Forced an evaluation in the stopped state when scrubbing.

  • Bug Fix: Fixed an issue where pasting a spawnable does not correctly evaluate. The sequence signature was not getting invalidated after swapping the tracks from the copyable binding to the spawnable.

  • Bug Fix: Error notifications are now shown to provide feedback when an edit fails due to a sequence being read only.

  • Bug Fix: Paste on to selected object binding track is now supported.

  • Bug Fix: Improved the usability of track listing when using a text search.

  • Bug Fix: Reworked GatherTakes and GetTakeNumber so that the asset path can be shown in the tooltip. This removes ambiguity when there are multiple assets with the same take number (such as when an asset was duplicated and therefore the metadata was duplicated). Also, creating a new take now increments the metadata take number.

  • Bug Fix: Movie Rendering audio pass now ignores per-shot warmup and overall warm up times. This resolves an issue where audio would only be partially captured when using these settings; now the renders should be faster overall.

  • Bug Fix: Dragging an audio asset onto an object's audio sub-track now adds the section to a new row instead of a new audio track.

  • Bug Fix: Animation section's Properties now filter out animations that do not apply to the bound object's skeleton.

  • Bug Fix: Anim-notifies on the first frame of an animation will now trigger when played in Sequencer. Anim-notifies in the middle of the animation will no longer trigger when the Sequence loops back to the beginning.

  • Bug Fix: The Details panel now updates when selecting a Camera Component in Sequencer.

  • Bug Fix: Fixed an issue where sections would be pasted onto an existing row instead of creating a new one.

  • Bug Fix: Fixed object binding label so that it reports correctly when there are invalid bindings.

  • Bug Fix: Editor now allows spatialized audio on scene components, not just Actors.

  • Bug Fix: Fixed an issue where Cinematic Mode occasionally fails to get disabled when seamlessly traveling between maps.

  • Bug Fix: Newly pasted tracks are now expanded automatically.

  • Bug Fix: Improved synchronization of renaming spawnable Actors between Sequencer and World Outliner.

  • Bug Fix: Nodes are no longer automatically expanded when dragging.

  • Bug Fix: Improved the layout and usability of breadcrumbs and toolbar items when using a narrow Sequencer layout.

  • Bug Fix: Piloting cameras now correctly rotate from 180 to -180.

  • Bug Fix: Refocuses on the previously focused item when setting the current time with the play time widget. This enables the user to: press Spacebar for play, Ctrl + G to set a time, then Spacebar to play, without needing to click an item to focus on it after setting the time.

  • Bug Fix: Newly created sections for imported root motion are now additive with scale disabled, so that the imported motion moves the object from its current position.

  • Bug Fix: Flickering of the Sequencer track view in certain scenarios has been greatly reduced.

  • Bug Fix: Fixed several issues with pasting keys caused by which objects are selected.

  • Bug Fix: Fixed an issue with transform values being doubled when keyed.

  • Bug Fix: Fixed split regression. The newly created split section is now on the right side.

  • Bug Fix: Fixed an issue with transform baking for rig rails not outputting the correct values. The rail actor is now ticked on each baked frame, to make sure the correct values are baked.

  • Bug Fix: Fixed multiple export to FBX issues.

    • Fixed skeletal animation export off by 1 frame—changed the anim adapter to advance by integer frames, rather than converting to float time and incrementing by the sampling rate.

    • Fixed exporting an object in a shot—evaluation needs to happen in global time through RootToLocalTransform.Inverse(). As a result, also added an option to export in global time or in the sequence's local time. For example, if an object is animated in a shot that starts at global frame 150, the exported keys can either start at global frame 150 or local frame 0. 3. Step and export frames at the display rate of the sequence, rather than the hardcoded DEFAULT_SAMPLERATE.

  • Bug Fix: Fixed an issue where exporting transform tracks to Camera Anims would cause the tangents to be incorrect.

  • Bug Fix: Loop points for animation sections are now drawn correctly.

  • Bug Fix: Max Tick rate in the Sequencer UI now behaves the same as in-game (t.maxfps is only overridden during playback, and if Frame Locked is enabled).

  • Bug Fix: Transform origins are now implemented as shared global data, to remove the need to Initialize transform tracks. Transform tracks are heavily used, but transform origins are not. We now compute the sequence transform origin once at the start of the frame, and use that for the rest of the evaluation. This can result in significant wins for content where lots of transform tracks are used.

  • Bug Fix: Previously, manipulating a spawn track caused the object to be destroyed and respawned when the spawn track executed Restore State. Fixed this by removing the call to DestroyObjectDirectly, allowing the spawn register to do the work.

  • Bug Fix: Take Recorder—Fixed a crash caused by undoing a transaction that included the creation of the recorded take. Transactions are now disabled on the movie scene during the creation of a take; this means that the creation of the asset, and operations on the movie scene that occur before you stop recording, are not undoable.

  • Bug Fix: Sequencer—Previously, Blueprint components were not restoring properly when autotracked with "Allow Level Sequencer Edits Only" enabled. This was fixed by swapping out object pointers in Sequencer's cached states in response to OnObjectsReplaced.

  • New: Cinematics Camera—Changes default film back to 16:9 Digital Film.

  • New: In the main Editor menu bar, Sequencer windows have been consolidated into a Cinematics submenu for easier navigation.

  • New: Take Recorder—Several UI Tweaks:

    • Timecode Provider is now used as the running timecode.

    • The duration in timecode shows in the popup recording toast.

    • The timecode provider frame rate is now used instead of the INI value, so that Take Recorder is always recording using the Timecode Provider frame rate.

    • You can now open the timecode settings by clicking on the frame rate button.

    • Added Timecode In and Timecode Out to the take metadata.

  • New: Take Recorder—Added PreInitialize which is called before Take Recorder does any initialization for recording (such as when the button is pressed).

  • New: Added extensibility points for drag-and-dropping things on the Sequencer Editor.

  • New: Added support for pinning a root track so it is always visible while scrolling. Useful for referencing a shot track while editing other tracks.

  • New: Exposed Set and Get Object PropertyClass.

  • New: Curve Editor—Added support to the Curve Editor for using the S key to key transform channels individually like in the main Sequencer. This makes the Sequencer Curve Editor commands available externally, so that you can add additional commands to the Sequencer-specific Curve Editor without knowing about the actual Curve Editor.

  • New: Added tick marks for audio loop frames.

  • New: Added option to enable all track filters at once.

  • New: Sections are now pasted onto nodes with selected keys or sections if there are no nodes selected.

  • New: Added an initial first loop start offset to animation and geometry cache sections. When the user trims the start of a section by dragging its left edge, it only trims the first loop of that animation using this new property, so that extending the section by its right edge will make it loop seamlessly. The old start/end offsets are still available for people who want to loop a subset of the animation, but they have to set them in the properties menu.

  • New: Movie scene player now has a list of binding overrides.

  • New: Fixed spawnable export so that they are temporarily spawned on export.

  • New: Slate and Take numbers are now embedded into animation assets recorded from Take Recorder.

  • New: Sequencer Scripting—Added MakeBindingID to generate an FMovieSceneObjectBindingID from a given master sequence and a FSequencerBindingProxy. This can be used to make a binding to an object in a subsequence.

  • New: Added an option to delete an object's binding/tracks and keep the animated state.

  • New: Added support for showing only selected nodes while editing UMG animations.

  • New: Experimental: New Template Sequence asset type. Template sequences are sequences that are bound to a single object archetype or class. They can then be dropped onto any object binding of the same type as a subsequence, allowing common sequences to be reused across many assets. The can also be played on their own using ATemplateSequenceActor. This is an experimental plugin that needs to be enabled in a project.

  • New: The track icon is now dim if it is muted. Track display text is now also dimmed if all the sections are inactive.

  • New: Sequencer Scripting—Exposed blend type and completion mode.

  • New: Added a level sequence setting for handling the aspect ratio constraint during play. The new setting defaults to overriding the constraint to XFOV to preserve previous behaviour. It lets the user choose what kind of constraint to use during the sequence, or whether to not touch the constraint at all.

  • New: Take Recorder—Expanded the playback range when you start recording rather than when the asset is first created. Changing this to Infinite at the start of recording allows the current time to progress.

  • New: Added a menu item to attach audio to an existing binding.

  • New: ALevelSequenceActors now listen for the network demo replay's ending to pause themselves. This solves issues where a sequence would continue to play audio and other stateful tracks after reaching the end of the replay.

  • New: Users can now mark Sequencer tracks as solo or mute. This enables the user to restrict playback to tracks being edited, or to temporarily disable tracks.

  • New: Added support for grouping track sections together. Grouped sections are moved together while dragging, maintaining a relative start offset.

  • New: Sequencer now allows subsequence tracks to generate an evaluation template.

  • New: Made additional changes to allow for exporting spawnables. Spawnables need to be set to have master sequence ownership when exporting from a subsequence. Spawnable Actors can be respawned during the export, so keep a map from the GUID to the FBX node.

  • New: Removed Discard Changes and Save As from the Toolbar, as they were unused or infrequently used.

  • New: Set material and particle range to the playback range when creating a new section.

  • New: Changed Trim left/right and Split to remove keys outside of the trim and split ranges.

  • New: Locked sequences now display all their tracks as locked (red border), and nodes show their text as dimmed.

  • New: Pressing CTRL + F in the Sequencer or Sequencer Curve Editor will now jump keyboard focus to the search widget, enabling you to quickly search the tree.

  • New: Sequencer Movie Renders now flush the shader compiler and mesh distance field builder on each tick, to ensure shaders are ready before rendering a movie.

  • New: Event usability overhaul:

    • It is now possible to define payload parameters for events again.

    • Creating a new event endpoint will leverage custom event nodes rather than separate functions by default. This is possible due to the added flexibility of generated function graphs.

    • Users can now also specify which pin to pass the bound object through (if any)— previous rules apply (only object and interface pins supported).

    • The quick-binding menu has been reworked to use the Blueprint graph action menu.

  • New: Curve Editor tree filtering and synchronization improvements:

    • When changing selection in sequencer, the Curve Editor now selects the same nodes on its tree as well as isolating (auto-filtering) the tree to those nodes. This makes it much easier to drill down into curves from the sequence. Both these settings are configurable through the Editor Preferences ("Synchronize Curve Editor Selection" and "Isolate Curve Editor To Selection").

    • Changed pin widgets to only be visible when their table row is hovered, or if the pin is active.

    • Changed filter logic to exclude implicit children when a sibling was explicitly matched. This prevents seemingly unmatched nodes showing up in hierarchies where nested matches occur.

    • Expanded text filter logic to include Parent.Child.Grandchild syntax for matching specific hierarchies of nodes.

  • New: Added the ability to tag object bindings by name. Since Object Bindings are referenced internally by GUID, consistent referencing of similar object bindings (such as possessable cameras or characters) was previously impossible. Object bindings can now be tagged by name, so that they can be consistently overridden or referenced by core systems regardless of the asset the objects reside within.

  • New: Added an option to disable superfluous playback data in cooked builds for sequences that are not directly playable. The option is exposed on the right-click context menu for subsequences, and when enabled, the option will cause the sequence's playback data to be pruned at cook time (potentially saving memory).

  • Improvement: Matinee: Added a Cvar Matinee.AllowMatineeActors to enable accessing the Matinee Actors from the Cinematics list. Defaults to Off.

  • Improvement: Improved the performance of CameraRig_Rail when using bLockOrientationToRail, by combining location and rotation transforms.

  • Improvement: Improved the performance of CameraRig_Crane by combining location and rotation transforms.

  • Removed: Matinee—Removed from UI. Removed access to Matinee from the following:

    • Cinematics > Add Matinee [Legacy]

    • List of Matinee Actors in the cinematics menu

    • Open Matinee button in the Details panel

Static Mesh Editor

  • Bug Fix: StaticMeshEditor now respects the selected LOD even if it is below MinLOD. If the selected LOD is below MinLOD a warning will be displayed.

  • Bug Fix: Fixed canvas DPI scaling issues for static mesh socket names and skeletal mesh socket/bone names.

  • Bug Fix: Fixed Navigation properties in the Static Mesh Editor so they handle undo correctly.


  • Bug Fix: When an asset is force-deleted in VR mode, the asset editor UI will now close.

Gameplay Framework

  • Crash Fix: Fixed a number of issues, including crashes, with composite data tables and composite curve tables that contain a cycle in the parent table hierarchy.

  • Bug Fix: Changed INVALID_CONTROLLERID to -1 to avoid potential issues where game code might confuse INDEX_NONE (-1) with the old value of INVALID_CONTROLLERID (255).

  • Bug Fix: Actor overlap events no longer trigger on an actor from its own subcomponents overlapping with each other at startup.

  • Bug Fix: Overlap events no longer trigger while the level is being loaded, except where allowed explicitly by the Actor overlap flags.

  • Bug Fix: Added AddForce and related functions to UProjectileMovementComponent. This supports external applications of forces that accumulate until the next tick, at which time they are applied to acceleration and zeroed. This enables application of a force during the correct stage of integration, and when substepping is involved.

  • Bug Fix: Character moves can no longer combine when the movement mode changes over the course of that move. This reduces the latency of sending that move (by using bForceNoCombine), and prevents some issues when combining incompatible movement modes.

  • Bug Fix: Fixed a glitch when walking on a component attached to a simulated component.

  • Bug Fix: Character moves no longer attempt to combine on the frame where jump input begins or ends, fixing some common movement corrections.

  • Bug Fix: UCharacterMovementComponent::ServerCheckClientError now uses ServerExceedsAllowablePositionError for the actual position and movement mode checks, so you can override the behavior but still retain the ignore setting, logging, and random chance from fake packet loss CVars.

  • Bug Fix: Avoids using bAutoManageAttachment within UAudioComponent and UParticleSystemComponnent, unless the world is a game world, to prevent erroneous bounds in editor worlds. Avoids including auto-detached components in CalcBounds().

  • Bug Fix: Fixed input rebindings not working correctly when modified from a Blueprint that inherited directly from Pawn.

  • Bug Fix: Exposed all suitable SplineComponent::Get*AtSplineInputKey() functions to Blueprints. Using a spline input key is more efficient than continually querying by location, and we already exposed the FindInputKeyClosestToWorldLocation() function.

  • Bug Fix: Fixed dynamic actors in streaming levels failing to replicate in cases where an in-memory version of the PIE level still exists, rather than duplicating from the editor world version of the sublevel.

  • Bug Fix: Fixed cases of CharacterMovementComponent additive root motion source overshoot for SimulatedProxies.

  • Bug Fix: Properties of components that are not editable when inherited can no longer be edited through the data-only Blueprints window or the actor's instance properties panel.

  • Bug Fix: Added SetUseAutoAttachment function to FXSystemComponent, and implemented it for ParticleSystemComponent and NiagaraComponent.

  • Bug Fix: Fixed the WorldAsset name in LevelStreaming for duplicated levels not having the PIE prefix stripped off.

  • Bug Fix: The UCharacterMovementComponent VisualizeMovement function now returns a float that is used for the height offset of the last rendered debug player movement info, which enables derived classes to add text starting at that offset as well.

  • Bug Fix: Refactored CanJumpInternal_Implementation in ACharacter, which determined what CharacterMovement states supported jumping. This logic is now handled in a new overridable function in the UCharacterMovementComponent called CanAttemptJump.

  • Bug Fix: Added debug information about Character Jump state to "p.visualizemovement".

  • Bug Fix: The UNiagaraComponent CalcBounds function now uses the auto attach parent's bounds when not attached.

  • Bug Fix: Added GetFloatPropertyAtSplineInputKey and GetVectorPropertyAtSplineInputKey functions to work with SplineComponent input keys for compatibility with query functions that return a key instead of point.

  • Bug Fix: The minimum difference between a Character's perch radius and its capsule radius has been slightly increased. This prevents Characters from falling in-place or on valid geometry.

  • Bug Fix: Added proper safe-zone support for the debug console.

  • Bug Fix: bOverrideWalkableSlopeOnInstance now appropriately sets it's flag on Instanced Static Mesh Components when creating all body instances.

  • Bug Fix: Owner No See is now properly respected for objects placed in a level.

  • Bug Fix: Fixed inconsistent ordering of UpdateOverlaps relative to BeginPlay in the cases of server/standalone SpawnActor, networked replicated actors, and actors streamed as part of a level. BeginPlay now always precedes UpdateOverlaps.

  • Bug Fix: LevelScriptActor can no longer create unlimited InputComponents.

  • Bug Fix: Debugged arrows from "p.showinitialoverlaps 1" lasting forever.

  • Bug Fix: Console history no longer shows multiple entries for a single command that was entered multiple times.

  • Bug Fix: The DuplicateTransient specifier on UInputComponent now properly ignores duplicate Actors that have an Input Component but no actual input bindings.

  • Bug Fix: Fixed a bug that caused LightComponents to display duplicate versions of some properties.

  • Bug Fix: Updated the RestrictedToClasses metadata specifier to use a "," delimiter instead of spaces.

  • Bug Fix: Initial controller ID set for the ULocalPlayer PlayerAdded function now uses the overridable SetControllerID function to avoid swapping controller IDs with themselves in the UEngine SwapControllerId function.

  • Bug Fix: Fixed edge cases so that the Root Component of an actor can no longer be destroyed from the actor's user construction script.

  • Bug Fix: The UGameplayAbility MontageStop function now properly uses the OverrideBlendOutTime parameter.

  • Bug Fix: SpawnForceFeedbackAtLocation is now properly tagged as an unsafe function call during Actor construction.

  • Bug Fix: ChildActor no longer attaches (or reattaches) to ChildActorComponent as part of OnRegister. Instead, this happens in CreateChild.

  • Bug Fix: Fixed Actor overlap events triggering on the same Actor from subcomponents changing overlap state with each other.

  • Bug Fix: Random Streams now reset to InitialSeed instead of regenerating in PIE.

  • Bug Fix: Calling the AssetManager function UnloadPrimaryAssetsWithType from the debug console was incorrectly loading the assets. It will now unload them as expected and report the number of assets unloaded.

  • Bug Fix: Fixed Gameplay Tag Query variables on components not being modified when edited.

  • New: MassageVectorAxisInput and MassageAxisInput can now be overridden in UPlayerInput subclasses.

  • New: Added support for gameplay tag filtering to gameplay tag container Blueprint pins. New: Added support for gameplay tag filtering for UFUNCTION parameters through the UPARAM(meta=(Categories=""))) mark-up; Filtering will prefer UPARAM values first, but can fall back to the UFUNCTION-level tag filter.

  • New: Updated UCameraComponent to have an editable Camera mesh that can be marked as visible at runtime.

  • New: Added BlueprintEditorUtillity functions for determining if functions are a part of an interface or not, and for getting the override of a function based on its name.

  • New: Created virtual accessor functions for bCanRenameNode on EdGraphNode.

  • New: Added the ability for gameplay effect execution calculations to support scoped modifiers against "temporary variables" that aren't required to be backed by an attribute capture.

    • Implementation basically enables gameplay tag-identified aggregators to be created as a means for an execution to expose a temporary value to be manipulated with scoped modifiers; you can now build formulas that want manipulatable values that don't need to be captured from a source or target.

    • To use, an execution has to add a tag to the new member variable ValidTransientAggregatorIdentifiers; those tags will show up in the calculation modifier array of scoped mods at the bottom, marked as temporary variables—with updated details customizations accordingly to support feature.

  • New: Added multiple dynamic output parameter support. Users can now specify multiple dynamic outputs by adding "," between the property names.

  • New: DateTime structs now support an addition operation.

  • New: Added RawInput plugin fixes to support generic gamepads on Windows.

  • New: PossessedBy now sets the owner of the Pawn.

  • New: Added Blueprint Functions to get and set "Splitscreen Enabled".

  • New: A fatal error will now display when trying to spawn an Actor with the same name as an existing Actor in the level.

  • New: OnWorldTickStart (in FWorldDelegates) now has the UWorld it is being called for as a parameter.

  • New: Actors now have a GetComponentsByInterface function.

  • New: Added an Input Device Context to enable differentiating the source of controller input.

  • New: Added restricted tag quality-of-life improvements. Removed the default option for restricted gameplay tag source. We no longer reset the source when adding restricted tags to make it easier to add several in a row.

  • New: Improved implementation of the GetNextViewablePlayer function in APlayerController. Removed FTViewTarget as a friend of APlayerController.

  • New: PossessedBy now sets the owner of the pawn to the New Controller.

  • New: Added the ability to share data that is constant for all instances of a given same class. This data will be stored on a per-class basis instead of per-instance, which can result in substantial memory savings for classes that have many instances and constant data, while still maintaining editability through the normal Blueprint workflow in the editor. Good candidates for this feature are member variables that are marked as EditDefaultsOnly and BlueprintReadOnly.

  • New: IsLevelLoaded (in FLevelUtils) will now return false when the level isn't found, rather than failing a check.

  • New: Added IsNodeRefValid function to INavigationDataInterface, and implemented it in RecastNavMesh. This new function is called by PhysNavWalking (in CharacterMovementComponent) to detect when the floor drops out.

  • New: Added templated versions of APlayerController::GetHUD and AController::GetPawn.

  • New: The new UpdateOverlapsMethodDuringLevelStreaming function (in AActor) can disable the entire UpdateOverlaps query run after BeginPlay(), or make it conditional based on mobility (skipping for static objects). There is also an option to defer to the default specified in INI, which allows each class to have a separate default. This includes setting the behavior of engine classes without modifying engine source. The new default option is OnlyUpdateMovable, which means to run overlaps only if the root component of the actor has its mobility set to Movable (non-static, non-stationary). Previous behavior was equivalent to AlwaysUpdate; however, this can lead to suboptimal streaming performance for many actor types.

  • Improvement: The Blueprint sub-level selection dropdown menu now sorts alphabetically.

  • Improvement: You can now specify multiple classes to restrict to using the "," delimiter, as specified in the documentation.

  • Deprecated: Deprecated the APawn function IsControlled.

  • Deprecated: In UGameViewportClient, GetDisableSplitscreenOverride has been deprecated and replaced with IsSplitscreenForceDisabled.

  • Deprecated: SetDisableSplitscreenOverride has been deprecated and replaced with SetForceDisableSplitscreen.

  • Deprecated: Removed obsolete enum EConsoleType and the IsConsoleBuild function and bUseConsoleInput variable from UEngine.

  • Deprecated: Made the definitions of a number of UStaticMeshComponent functions whose implementations were entirely compiled out if not WITH_EDITORONLY_DATA, not exist unless WITH_EDITORONLY_DATA.

  • Deprecated: The UWorld function GetPawnIterator has been deprecated. Use a TActorIterator of the desired pawn class instead.

  • Deprecated: UWorld::GetPawnIterator() has been deprecated. Use a TActorIterator of the desired pawn class instead.

  • Deprecated: AActor::GetComponentsByClass has been deprecated. Use type templated AActor::GetComponents or the version of GetComponents that takes a TSubClass parameter.


  • Bug Fix: Previously, various break iterators were using the wrong FString constructor in their overloaded version of IBreakIterator's SetString function.

  • Bug Fix: Fixed an issue where categories in the Details panel were unlocalized.

  • Bug Fix: Fixed IdenticalTo's FText function, comparing two instances, with null localized strings as identical. Invariant and generated FText instances will have null localized strings unless they are persisted, and should never be considered identical to anything else.

  • Bug Fix:Fixed an issue with LEET failing to load native LocRes data if set during a boot. This makes the behavior of -leet and -culture=leet on the command line consistent with what would happen when switching to LEET at runtime.

  • Bug Fix: Performed fixes on localization commandlet executor.

  • Bug Fix: Fixed an issue with Niagara graph nodes being gathered for game localization.

  • Bug Fix: Fixed a crash occurring when using locales with numeric symbols that are outside the Unicode basic multilingual plane.

  • New: Added the SetStringRef function to IBreakIterator, as an optimization for platforms using UTF-16 strings where it can avoid a string copy.

  • New: Converted LEET to a code-based culture, and added support for general custom code-based cultures. This avoids the LEET culture being tied to the ICU-specific implementation and version, and allows games to inject custom cultures of their own without needing to use ICU data.

  • New: Upgraded ICU to 64.1.

  • New: Made UAssetManager run the localization cache update after a late delivery asset registry is merged in. This stops log spam from async loading, accessing the cache while it is dirty.

  • New: FEnginePackageLocalizationCache will no longer be marked as dirty after handling an add/remove/rename event, if that event didn't actually modify the cache contents.


  • Bug Fix: Added ensures to track any CDO or Archetypes that are incorrectly added to the Net Driver.

  • Bug Fix: The Net Driver's OutPacketsLost variable will now increment when detecting an outgoing packet loss.

  • Bug Fix: Fixed an issue where invalid interface scopes would cause multicast group joins to fail on iOS.

  • Bug Fix: Actors are now blocked from being added to the Network List if they are being destroyed.

  • Bug Fix: Fixed an issue that prevented replicated object references within arrays that are nested inside structs from resolving correctly.

  • Bug Fix: The Steam version of GetAddressInfo now parses and handles all of the address types the platform supports, even when using the passthrough functionality.

  • Bug Fix: TcpMessaging now closes connections that send invalid or corrupt messages.

  • Bug Fix: Fixed an issue preventing UEnum::NetSerializeProperty from serializing the correct number of bits for the Max Value of an enum if it was a power of 2.

  • Bug Fix: Fixed an issue that would set error codes incorrectly when making GetAddressInfo requests.

  • Bug Fix: Fixed an issue that would cause server s to drop clients without microphones when voice is enabled.

  • Bug Fix: Moved the encryption key response delegates from UWorld to UNetConnection in order to correctly handle seamless travel during the key lookup.

  • Bug Fix: All Components that are owned by Actors now get unmapped when the ActorChannel is deleted. This prevents issues where Component references may point to the PendingKill version of the Actor or Component.

  • Bug Fix: Net tick rate is now only limited if it is lower than the Engine tick rate.

  • Bug Fix: Fixed address mapping issues on IPv6 only platforms when user input was not pushed through any sanitizers, which led to a protocol mismatch conflict. Addresses on IPv6 are now synthesized when a protocol mismatch is detected.

  • Bug Fix: Added additional address synthesis paths when attempting to connect to a named destination. Now synthesis will be attempted on any input address if necessary, or whenever the address would need resolution. This functionality will be improved with more precision in a future version.

  • Bug Fix: Duplicates of static network GUIDs will now time out correctly during travel.

  • Bug Fix: Party beacons now handle parties and their members joining and leaving the same beacon in different parties more gracefully. This resolves several scenarios where new reservations that overlap with existing ones would be rejected, and fixes a possible leaked reservation when changing party leader.

  • Bug Fix: Fixed an issue where replicated properties that were sent reliably due to net.PartialBunchReliableThreshold were still generating history items. This would cause the History buffer in FSendingRepState to fill up with reliable changelists that weren't initialized.

  • New: Quantization of Scale, Velocity, and Location on initial Actor spawn are now configurable.

  • New: Changed DOREPLIFETIME implementations to use a struct for its parameters, and exposed a new macro called DOREPLIFETIME_WITH_PARAMS to encompass older functionality.

  • New: Added a function to Net Driver for changing the Next Update Time for all Actors (ForceAllActorsNetUpdateTime).

  • New: Added several console commands for testing GetAddressInfo and address serialization on a platform. These commands are only enabled in development builds of the engine. The new commands include:

    • SocketSub GAI

    • SocketSub Serialize

    • SocketSub AsyncGAI

  • New: Added support for asynchronous GetAddressInfo queries, enabling a platform to query host information without causing any stalls until the request returns.

  • New: Added the ability to track replication data in csv profiles brought in from references in the playlist.

  • New: Added a BandwidthTestActor class that generates constant or spiky bandwidth using property replication. The console commands to use it are:

    • Net.GenerateBandwidth KilobytesPerSecond—Generates a constant throughput every tick.

    • Net.GeneratePeriodicBandwidthSpike SpikeInKb PeriodInMS—Generates a bandwidth spike (1 frame) every period.

  • New: Added TCP NoDelay functionality.

  • Improvement: Refactored some functionality from APlayerController::ServerShortTimeout into the Net Driver for improved organization.

  • Improvement: Optimized APlayerController::ServerShortTimeout.

  • Improvement: Increased the verbosity of logs printed when a nak packet is received to Very Verbose. This prevents excessive log output.

  • Improvement: Per-request logs in HttpConnection are now log level Verbose.

  • Improvement: The following functions are no longer virtual:

    • USceneComponent::SetRelativeScale3D

    • UActorComponent::IsActive

  • Deprecated: Replicated properties in UActorComponent, USceneComponent, and AActor are deprecated and will be made private in future versions. Uses of them should go through the new Getters and Setters. Deprecated properties include:

    • AActor: bHidden, bReplicatedMovement, bCanBeDamaged, Role, ReplicatedMovement, Instigator

    • UActorComponent: bReplicates, bIsActive

    • USceneComponent: ReativeLocation, RelativeRotation, RelativeScale3D, bAbsoluteLocation, bAbsoluteRotation, bAbsoluteScale, bVisible

Replication Graph

  • Crash Fix: Fixed an issue where the Lifetime Custom Delta State tracked by Rep Layout used improperly-sized lookup tables, causing crashes under some circumstances.

  • Bug Fix: Fixed an incorrect return value when removing an Actor from the Replication Graph.

  • Bug Fix: The Replication Graph will now reflush DORM_Initial and non-netstartup Actors when a client unloads and reloads a streaming level.

  • Bug Fix: Dependant Actors are now prevented from getting added twice to the same parent in Replication Graphs.

  • Bug Fix: Destroyed nodes in the AllChildNodes array are now cleaned up after a spatial rebuild event.

  • Bug Fix: Child nodes are now cleaned up in the TearDown function.

  • Bug Fix: Fixed a bug where changing an Actor's Dormancy could add it back to the GridSpatialization2D node in the Replication Graph, even if it was explicitly removed.

  • Bug Fix: Fixed a bug that would add classes to the Replication Graph's class tracking more than once.

  • Bug Fix: Limited the bounds for connection view locations in the Replication Graph to HALF_WORLD.

  • Bug Fix: Implemented special case Weak Object Ptrs and Special Object Ptrs in RepLayouts. This fixes issues with RepNotifies and property comparisons.

  • New: Added Net.RepGraph.PrintCullDistancesForConnection, which outputs also the connection-specific cull distance (uses the RepGraphDebugActor).

  • New: Added DO_ENABLE_REPGRAPH_DEBUG_ACTOR instead of hard-coded build defines to easily add the RepGraphDebugActor.

  • New: Added an option to the Replication Graph to keep the node order intact when removing destroyed nodes.

  • Improvement: Net.RepGraph.PrintCullDistances will now work without a RepGraphDebugActor.

  • Improvement: The Replication Graph now uses RemoveSingleSwap in RemoveConnectionGraphNode to speed up TArray item removal operations.

Network Emulation

  • Bug Fix: Network Emulation PIE settings will now be disabled instead of hidden when Play settings are configured for a single instance.

  • Bug Fix: Network Emulation PIE settings will set a custom profile when no current profile have been assigned.

  • Improvement: The warning when a NetEmulation profile is not found in configs has been downgraded to a log.


  • Bug Fix: Fixed an ensure that could occur during replay playback in the editor.

  • Bug Fix: Added a check to prevent save game-based replay commands from running on a dedicated server.

  • Bug Fix: Fixed an issue with level sequence Actors where the sequence would not be reset properly when a replay is scrubbed.

  • New: Added support for stream encrypting and decrypting data in AES-256 ECB, AES-256 CBC, and AES-256 GCM formats to the PlatformCrypto plugin.

  • New: Added Create Random Bytes and Create Pseudo-Random Bytes support to the PlatformCrypto plugin.

  • New: Added broadcast retries to LAN beacon queries.

  • New: Modified the encryption packet handler interface to pass data in addition to the key value.

  • New: Added an experimental DTLS packet handler component.


  • Crash Fix: Moved XMPP socket/thread destruction into destructor to prevent a crash when using websocket-backed libstrophe XMPP connections.

  • Bug Fix: Fixed FindFriendSession and SendSessionInviteToFriends inappropriately returning false in some cases when using the Steam subsystem.

  • Bug Fix: Fixed issues with projects linking to SteamAuth (using the reporting delegates). Due to required usage of FUniqueNetIdSteam, the code would not build properly outside of the SteamOSS.

  • Bug Fix: Fixed a memory leak during libcurl shutdown.

  • Bug Fix: Fixed a potential memory leak in libcurl in cases when headers fail to append to a request. All previously appended headers would be leaked and not added to the request in this case.

  • Bug Fix: Cancelled HTTP requests no longer log errors as if curl had failed.

  • Bug Fix: Fixed a bug that prevented clients without microphones from muting others.

  • Bug Fix: Fixed a small memory leak when using the Debugging SSL certificates bundle.

  • Bug Fix: Rebuilt OpenSSL on Win32 and Win64 to fix an issue where a register would sometimes be corrupted

  • Bug Fix: Fixed an incorrect uint assignment causing problems on Clang builds.

  • Bug Fix: Fixed an issue where GetOnlineSubsystem could return the wrong subsystem if called in the OnOnlineSubsystemCreated callback.

  • Bug Fix: In the VivoxVoiceChat plugin, FOnVoiceChatBeforeRecvAudioRenderedDelegate now will have the correct number of samples.

  • New: Introduced the SteamShared module! This enables projects to use the Steamworks SDK directly without having to worry about API initialization and dependency linking. Plugins and existing modules can link directly with the new shared module, providing a smoother flow for developers writing expansions to the engine using Steamworks.

  • New: In the VivoxVoiceChat plugin, FOnVoiceChatBeforeRecvAudioRenderedDelegate can now inject audio into the output stream.

  • New: Introduced the FOnlineAuthUtilsSteam class, which grants access to the Steam Auth Interface outside of SteamOSS code. All delegates have been moved there, and new reporting delegates have been added with more information so that projects can take better action with SteamAuth results.

  • New: Added ISocialUserList::GetListName() accessor to SocialUserList to aid in logging/debugging.

  • New: Removed SetAutoUpdatePeriod from SocialUserList to help clarify the process of enabling/disabling auto update.

  • New: Move IVoiceChat header out of VivoxVoiceChat.

  • New: FJoinPartyResult now supports subcodes for reasons other than NotApproved.

  • New: Added GetPlatformIconMarkupTag with an accompanying ruleset to allow crossplay logic to be applied, including rules on when to display an icon depending on the local player's crossplay situation.

  • New: Added SetFriendAlias to IOnlineFriends as a method to associate a user-provided string with a friend. The alias is retrieved using GetUserAttribute with attribute USER_ATTR_ALIAS. This requires a backing implementation to store the alias. Online subsystems that do not have a backing implementation yield a NotImplemented error.

  • Improvement: Improved WebSockets handling of empty protocol strings

  • Improvement: Modified the way we determine a SocialUser's Platform for GetCurrentPlatform calls by using the best available information (by also searching the local player's persistent party). This function is now virtual to enable games to dig deeper if desired.

  • Improvement: Increased MAX_LOCAL_PLAYERS from 1 to 4 on Windows.


  • Crash Fix: Fixed a hang when cell width or height was set to 0 in the Extract Sprites dialogue.

  • Bug Fix: Paper2DSprites now correctly use Source UV and Dimension values for textures not in an atlas.


  • Bug Fix: Fixed a compatibility issue with Visual Studio 16.3.

  • Bug Fix: Fixed a Chaos MacOS build failure caused by missing exposed symbols.

  • Bug Fix: Chaos commands were abandoned when switching between threading models. We now correctly flush the dispatcher and solvers before switching to the new dispatcher.

  • Bug Fix: Fixed a Physics replication rotation issue.

  • Bug Fix: Integrated a workaround for a Clang 7 bug.

  • Bug Fix: Fixed SQ to run initial overlap on zero-length sweep.

  • New: If you want to execute a batch of commands before the next physics tick, you can use the Chaos::FCommandList class. You might want to do this, for example, to get more predictable results when you have complex interactions with the physics engine.

  • New: Added support for offline generation of Chaos geometry.

  • New: You can now edit a subsection of the Chaos heightfield to enable using Landscape tools with Chaos objects for painting and sculpting. (Materials and holes don't work yet.)

  • New: Avoid unnecessary string copies while dealing with collision profiles in cooked builds.

  • Improvement: Initialize bIsSceneSimulating member variable to false.

Collision Detection

  • Improvement: Improved performance of SetActorEnableCollision. For actors that generate overlap events, we no longer update overlaps in some cases.


  • New (Experimental): Chaos Cloth now supports backstop and maximum distance constraints (PBDSphericalConstraint class).


  • Bug Fix: Added an early check before creating a TargetPlatform object if the PlatformInfo will be found (check a static function to see if it's usable before making it). Changed each platform's GetTargetPlatform[s] function.

  • Bug Fix: Fixed the cubemap array UAV support in DX11 and DX12. Previously, only first cubemap of the array was exposed.

  • Bug Fix: Fixed platform configs being saved in extension paths for non-extension platforms.

  • Bug Fix: Fixed an issue where Linux/Mac were returning 0 as a validly running PID. This is a special PID used by the kernel that isn't needed to check as a proper running user space application.

  • Bug Fix: When a chunk is installed, mount optional pak files and other pak files are now mapped to this chunk.

  • Bug Fix: Fixed stack use after free on temp TSet, which FPointerEvent stored as a member variable reference.

  • Bug Fix: The engine no longer assumes a data-driven target platform's module will always exist. This prevents some "module not found" warnings from appearing for platforms that have data-driven platform configs but don't actually build.

  • New: Removed the wildcard searching for *TargetPlatform modules. Instead, only attempts to load TargetPlatforms where the PlatformInfo exists (such as when you have synced support for the platform and have the DataDivenPlatformIni.ini file).

  • New: Supports duplicating non-optional mips in the uptnl file, which will reduce IO seek time when loading textures with optional mips. Since non-optional mips will be duplicated, this would increase build size. Now, non-optional mips to be duplicated in uptnl files will be serialized twice when cooking, once in ubulk and once in uptnl. Duplication can be controlled per LODGROUP in TextureLODGroups with attribute DuplicateNonOptionalMips. When loading a texture with optional mips, if uptnl is available, all non-inline mips will be loaded from uptnl instead of from ubulk to reduce IO seek time and will improve performance.

  • New: Fixed the compiling editor with RTTI enabled for Linux and Mac.

  • New: Finalized location of PlatformExtensions (Engine/Platforms/... and {Project}/Platforms/...).

  • New: IOS and Android Facebook SDK update to 5.8.

All Mobile

  • Bug Fix: Enabled boot profiling for embedded library building.

  • Bug Fix: Fixed an issue that prevented the progress bar from appearing when switching preview rendering levels in PIE.

  • New: Added additional ES2 Deprecation warnings to the UI.

  • New: Platform scalability settings are now applied when changing to a Preview Rendering Level in the editor, and are restored when the Preview Rendering Level is disabled.

  • New: GPU Scene can now be enabled on all mobile devices. Previously certain Mali GPU devices had a limitation for the maximum number of supported primitives.


  • Bug Fix: Refactored Android event handling to prevent the Android hardware window from being created or lost before the engine could use it.

  • Bug Fix: TheAndroid toolchain now prevents paths for .so files from becoming absolute.

  • Bug Fix: Corrected the .so files library filtering by architecture so that library prefixes are not assumed.

  • Bug Fix: FLiteralOrName now uses a uint64 instead of UPTRINT on 32-bit platforms to account for cases where the high bit of a 32-bit pointer may be in use.

  • Bug Fix: Fixed an issue that prevented non-unity Android builds from successfully compiling.

  • Bug Fix: Fixed the UPL plugin paths for GoogleARCoreBase, GoogleARCoreServices, and LeapMotion.

  • Bug Fix: Fixed errors that occurred when configrules.txt was less than 80 bytes.

  • Bug Fix: Corrected an issue with greater than or equal to operators (>=) in configrules.txt.

  • Bug Fix: Fixed the button mapping for controller v2 firmware when connected to certain phones.

  • Bug Fix: Fixed an issue that prevented copying over older OBBs during packaging.

  • Bug Fix: Fixed a shader compiler issue with samplerExternalOES on certain mobile devices in GLES 3.1 mode.

  • Bug Fix: Added R8G8 to GLES 3.1 RHI's list of supported textures, as it was previously missing.

  • New: Added an option for an alternative login id determination (gameActivityGetLoginIdAdditions).

  • New: Added controller lighting and force feedback support to the Android input interface.

  • New: Exposed isEmbedded to UPL for Android devices.

  • New: Added an option for public logs on Android in Project Settings ("Make log files always publicly accessible?").

  • New: Enabled fullscreen for Nokia 8.1.

  • Improvement: Mobile rendering will use GL_QCOM_shader_framebuffer_fetch_noncoherent extension when possible. This improves the rendering performance of translucent materials.

  • Improvement: Android devices will use big cores when possible for Garbage Collection tasks. This speeds up Garbage Collection by 2x on some mobile devices.

  • Deprecated: Support for OpenGLES2 has been further deprecated in 4.24, and it will be removed fully in 4.25. OpenGL ES3.1 is now the minimum rendering path for mobile devices.

  • Removed: Removed Android support for Ant build system.

  • Removed: Disabled testOnly injection for Android Studio builds.


  • Bug Fix: Mac Python—Updated copy script to support homebrew Python installs.

  • Bug Fix: Save game system checks are now skipped under multi-threaded builds.

  • Bug Fix: The AutomationTool for HTML5 now handles alternative project names.

  • Bug Fix: Launching onto the current editor map now works correctly.

  • Bug Fix: Emscripten audio stability has been improved.

  • Bug Fix: Added error handling for Python forking while trying to terminate already terminated processes.

  • Bug Fix: HTML5 is blacklisted on ApexDestruction, as APEX does not build for HTML5.

  • Bug Fix: HTML5 as a platform extension uses LoadLocalIniFile instead of GConfig.

  • Bug Fix: Fixed a runtime error for a HTML5 platform extension on non-HTML5 platforms.

  • Bug Fix: Added a missing GetRuntimeSettingsClassName member to FHTML5PlatformProperties.

  • New: All HTML5 code has been removed from engine code, and is now a platform extension.

  • New: WebSocketNetworking is now a standalone plugin, making it available for multiple platforms. It is now located in Engine/Platforms/Plugins/WebSocketNetworking.


  • Crash Fix: Fixed a crash that occurs when a background/foreground event comes in too early while MoviePlayer is trying to look at the command line.

  • Crash Fix: Fixed a race condition that would cause DeploymentServer.exe to occasionally crash on shutdown.

  • Bug Fix: Fixed issues with deployment of large .ipa files.

  • Bug Fix: Fixed an issue preventing MetalTexture.SetPurgeableState from working on iOS11.

  • Bug Fix: BundleID is now only set to the provisioning profile's identifier if it does not contain a wildcard.

  • Bug Fix: Fixed an issue that would cause iOS builds to fail when running some non-English versions of Windows.

  • New: Updated OpenSSL to version 1.1.1 on iOS.

  • New: Rebuilt libwebsockets binaries for OpenSSL 1.1.1 on iOS.

  • New: Added audio options that provide greater control over how audio behaves on iOS using AVAudioSession, which can be enabled using -SetFeature:Active on IOSAppDelegate or through a config setting. These include:

    • Microphone/speaker usage during VOIP.

    • Enabling/disabling background audio.

    • Enabling/disabling audio mixing with other applications.

  • New: Added the ability to pause shader batching via embedded communication.

  • Removed: Removed deprecated source code that previously supported OpenGL ES on IOS.


  • Bug Fix: Linux SDL2: Remove EGL/OpenGL code from of Wayland CreateWindow when using Vulkan.

  • Bug Fix: SDL2—Rebuilt sdl2 with a alsa-lib-devel package installed (enable ALSA).

  • Bug Fix: LinuxAArch64 platform—Removed targetplatform from the LinuxToolchain.

  • Bug Fix: Fixed GetMemoryTypeFromProperties VERIFY not retrying without a VK_MEMORY_PROPERTY_HOST_CACHED_BIT bit. The VERIFYVULKANRESULT() was failing, and we weren't getting into the code where we removed VK_MEMORY_PROPERTY_HOST_CACHED_BIT and tried GetMemoryTypeFromProperties again. The result of GetMemoryTypeFromProperties is now checked, and if it fails, those memory flags are removed, and the GetMemoryTypeFromProperties call is tried again, reporting the failure at that point with UE_LOG.

  • Bug Fix: If a dir already exists, the engine now returns true from the CreateDirectoriesFromPath.

  • Bug Fix: Fixed a race condition when building with -nodebuginfo was set. Previously attempted to strip the debug info twice.

  • Bug Fix: No longer adds a local launch device for the Linux AArch64 platform Local device; right now, this will never be an Arm64 device.

  • Bug Fix: Fixed an issue on Linux that prevented killing the multi-user server from the editor (from the Multi-User Browser).

  • Bug Fix: The default LinuxAArch64 platform in binary now builds to the same default as the Linux platform.

  • Bug Fix: Fixed a file handle leak and file handle registry corruption on Linux when a file opened in "read/write" mode was looked up/added to the file handle registry reserved to file opened in "read only" mode.

  • Bug Fix: Fixed an issue in the Linux file abstraction layer preventing a seek() followed by a read() to read at the correct position when a file is opened in "read/write" mode, preventing a multi-user session from reloading on Linux.

  • Bug Fix: Fixed real-time signals set to be ignored on Linux, which made it hard to use VTune and some other programs.

  • Bug Fix: Fixed a deadlock on startup between a TLS and dlopen threads.

  • Bug Fix: Added LinuxAArch64 platform to the LinuxDeviceProfileSelector whitelist.

  • Bug Fix: The Linux address sanitizer now builds when linking shared libs (DSOs) under Linux, using the -shared-libsan option. This loads libclang_rt.asan-x86_64.so instead of a static link. Also added linux sanitizer information to build details if set. This is a fast way to relink circularly dependent libraries.

  • New: Added a LinuxAArch64 platform and Linux platform group.

  • New: New Linux toolchain build scripts have also been added.

  • New: Built an nvTriStrip and ForsythTriOptimizer with the UE Clang toolchain (linked with libstdc++). Removed stdc++ dependency for MeshBuilder Add bash scripts for future building.

  • New: Added Linux AArch64 FreeType2 libraries.

  • New: Added LinuxAArch64Server and LinuxAArch64Client build targets.

  • New: Moved Linux architectures to the Linux Package Project submenu. Added a PlatformSubMenu ini entry to DataDrivenPlatformInfo sections, and coalesced these in FPackageProjectMenu::MakeMenu().

  • New: Set PrecompileForTargets to None for AArch64 builds of SoundVisualizations and Kiss_FFT.

  • New: Updated Linux Strophe libs with new SSL headers.

  • New: Built nvTriStrip and ForsythTriOptimizer with UE Clang toolchain (link with libstdc++). Removed stdc++ dependency for MeshBuilderCommon.

  • New: Rebuilt Linux libwebsockets libraries with SERVER and STATIC_PIC flags -DLWS_WITHOUT_SERVER=OFF -DLWS_STATIC_PIC=ON.

  • New: Updated Linux OpenSSL to v1.1.1c, libcurl to v7.65.3, libwebsockets to v3.0.1, webrtc rev.24472 Add aarch64 docker build scripts Fix aarch64 issues in BUILD.EPIC.sh. Added conditional WebRTC build var to BUILD.EPIC.sh. Added missing bzip2 and file packages to the centos build tools dockerfile Update libcurl and openssl locations in build.cs files. Updated CRYPTO_get_mem_functions and function signatures. Removed 32-bit arm and i686 files.

  • New Removed falling back to system compiler by default on Linux, Now, will only check for and use the system compiler if "-ForceUseSystemCompiler" command line is passed. Also, now defaults to epic compiler if -ForceUseSystemCompiler specified and the system compiler can't be found.

  • New: Disabled editor fullscreen mode for Linux.

  • New: Updated Linux WebRTC with third party WebRTC source changes.

  • Deprecated: Removed the 32-bit Linux i686 and armhf libraries.


  • Bug Fix: Fixed an invalid string index in the UE4DataFormatters lldb script.

  • Bug Fix: Fixed the multi-user server application on the Mac OS to get the Unreal icon when running, and to enable the users to scroll/copy text from the displayed log console.

  • Bug Fix: Now initializes the SSL module when loading AppleHTTP to ensure the correct unload sequence on shutdown.

  • Bug Fix: OpenGL (still used by the Launcher or CrashReportClient) doesn't allow zero-sized windows on newer versions of macOS, so for such windows, the size is set to (1,1) instead, and alpha is set to zero to hide the window.

  • New: Mac Python—Upgraded to 2.7.14.


  • Bug Fix: Added DXBC disassembly check for loads using additional typed formats, which are not supported on all versions of Windows (despite requesting a vanilla DX 11.0 feature level). Additionally, this change no longer makes dumping out debug info and checking for double ops mutually exclusive (checks would be skipped if debug dump was enabled).

  • Bug Fix: Fixed the execute process where strings on Windows platform were getting corrupted.

  • Bug Fix: Removed unused warning numbers from WindowsPlatformCompilerSetup.h. These typically introduced problems when new compiler versions were released, because they resulted in new errors being output from published code.

  • Bug Fix: Implemented fix for vsync always enabled when running in Independent Flip mode with Direct3D 11.

Programming Notes

  • Bug Fix: The sun position plugin no longer creates a dependency on the editor during runtime compilation.

  • Bug Fix: Fixed an invalid check in BulkDataWriter when attempting to serialize a zero byte buffer.

  • Bug Fix: The Windows 10 SDK is now included when installing new versions of Visual Studio from the editor.

  • New: Generated function Blueprint graphs can be created as part of the Blueprint compilation process, and are ephemeral (only lasting the duration of the compile), but will still be used to generate bytecode and UFunctions on the final class layout. External clients can hook into this process by binding to UBlueprint::GenerateFunctionGraphsEvent and spawning the necessary intermediate graphs on the compiler context using FKismetCompiler::SpawnIntermediateFunctionGraph. GenerateFunctionGraphsEvent is a dynamic delegate, meaning that all bindings will be serialized into the package, enabling composition workflows within a single package.

    Generated function graphs are also visible as an intermediate build product with this Blueprint developer setting enabled.

  • New: Introduced a new debugging aid, GPlayInEditorContextString, which can be added to the watch window to indicate the kind of world that is being processed when stopped at a breakpoint in the editor (for example, "Client 1" or "Dedicated Server"). To use, add "UE4Editor-Engine!GPlayInEditorContextString" to your Watch Window.

  • New: Any enums that are marked as "BlueprintType" must have a zero initializer. Here is an example:

    enum class EVariantManagerTestEnum : uint8
    //~ Required "= 0" to avoid a UHT warning
    None = 0 UMETA(Hidden),
    FirstOption = 1,
    SecondOption = 3,
    ThirdOption = 45,
  • New: Graceful deprecation has been added for all converted functions. Please change any calls to detail property builders to use the AddPropertyParams overloads.

  • New: Added a verify command to the launcher module which enables the game to inform the launcher that the installation might be corrupt and to trigger a verify operation.

  • New: Made a variety of changes to the MeshDescription API:

    • Improved the API, providing more operations, and making it possible for arrays with different allocators to be provided as results containers.

    • MeshDescription now uses triangles as its primary face representation. They can and should be used in preference to polygons when a mesh is known to be entirely triangulated, as they are quicker, and can be used in exactly the same way.

    • Creating a triangle will also create a 'shadow' polygon for backward compatibility, although this is omitted when serializing.

    • As with polygons, any missing edges are created when creating a new triangle, and operations such as adjacency are available to triangles, just as for polygons.

    • The native serialization format for MeshDescription is now based around triangles.

    • Polygons of arbitrary number of edges may still be represented, and when created, will automatically generate the appropriate number of triangles. Polygons of more than three sides automatically generate 'internal edges', which are owned by the polygon, and which will be regenerated if the polygon is retriangulated. Internal edges are otherwise not distinct from other edges, and can be used to determine connected triangles or vertices.

    • Direct access to public members of mesh element classes (such as FMeshVertex) is now deprecated. In particular, vertex instances and edges now hold a list of connected triangles, and the ConnectedPolygons member is deprecated and will be removed (as this data can be derived from the ConnectedTriangles list).

  • With the addition of the StaticMeshDescription module, FMeshDescription methods which referred explicitly to static mesh specific attributes have been deprecated, and StaticMesh attribute registration has been moved to FStaticMeshAttributes.

  • Public direct access to UStaticMesh::SourceModels, SectionInfoMap and OriginalSectionInfoMap has now been deprecated in favor of public accessors. There are a number of methods in the StaticMesh API for handling SourceModels, along with GetSectionInfoMap() and GetOriginalSectionInfoMap().

  • Existing bindings to OnWorldTickStart will need a UWorld* parameter added to their signatures.

  • FBodyInstance::bOverrideWalkableSlopeOnInstance now has an accessor function that should be used instead of direct access.

  • The PanelWidget function, SetDesignerFlags, is now properly marked as virtual override.


  • Crash Fix: Fixed a crash in Pixel Streaming with NVIDIA GPU occurring if RHI thread is enabled.

  • Crash Fix: Fixed a crash in FSceneViewport::OnFocusReceived(...) when ViewportClient is nullptr.

  • Crash Fix: Fixed a crash that occurred when changing to or from fullscreen mode.

  • Crash Fix: Fixed an issue where non-UAV textures caused a crash when using GenerateMips functionality. Now render targets for mip generation have UAV access.

  • Bug Fix: Fixed fullscreen mode for DX12.

  • Bug Fix: Fixed a bug where Vulkan extensions were not properly initialized.

  • Bug Fix: Made a fix for non-power-2 UDIM Virtual Textures.

  • Bug Fix: Fixed an issue where RDG was assuming that raster pass has render targets.

  • Bug Fix: Refactored FSlateUpdatableInstanceBuffer so that the render thread flush is removed in its destructor, and correctly handles object lifetimes.

  • Bug Fix: Fixed a potential binding error occurring in the uniform buffer used by procedural mesh sections.

  • Bug Fix: Fixed an error "was not found or is set to read-only" occurring for Cvar when marked up in RendererSettings.

  • Bug Fix: The stat screen message for multi-viewport now displays correctly #6019.

  • Bug Fix: VT prefetch pages are now marked as recently used, otherwise they might be evicted later in the frame. This can break code that assumes they're resident.

  • Bug Fix: Current gamma and sRGB behavior for render targets when used with USceneCaptureComponents. Allows matching scene capture to screen rendering much more closely.

  • Bug Fix: This fix handles disabling linear gamma when using sRGB format.

  • Bug Fix: LODs screen coverage for orthographic views is now calculated correctly.

  • Bug Fix: Fixed an issue with PixelStreaming on Firefox 68+ where ice candidates now have an empty candidate to denote the last entry (this was being sent to the WebRTC proxy before, which didn't know how to deal with it, and so force-disconnected the user).

  • Bug Fix: Fixed an issue occurring when authentication is turned on; moved login url setup code to the above folder setup to stop an infinite loop of redirection.

  • Bug Fix: Fixed MIP sky light pdf texture and solid angle texture defines set in the incorrect location for sky light direction sampling.

  • Bug Fix: Fixed incorrect throughput for calculation, path tracing, specular reflection, material sampling.

  • Bug Fix: Fixed Subsurface Profile shading model showing up as default shading model in cooked builds when using FromMaterialExpression.

  • Bug Fix: Fixed an issue where the volumetric lightmap was not being removed from a scene before ReloadPackages().

  • Bug Fix: Fixed a threading issue on landscape multi-view LOD calculation.

  • Bug Fix: When translucency is not rendered, separate translucency and scene color are no longer blended because separate translucency is blank.

  • Bug Fix: On some occasions, PixelStreaming could encode a frame with older content. This was caused by encoding the frame before the backbuffer got copied into it. This is issue is now fixed.

  • Bug Fix: Fixed an issue with r.rendertargetpool.events visualization.

  • Bug Fix: Fixed an issue where translucent hit proxies were always selectable even when translucency selection was off.

  • Bug Fix: Fixed a memory leak in Instanced Static Mesh reported from UDN.

  • Bug Fix: Made robustness changes to FD3D11DynamicRHI::GetQueryData.

  • Bug Fix: Fixed a bug with Dithered LOD occurring when user would set EarlyZPassOnlyMaterialMasking.

  • Bug Fix: Fixed the VT editor image when using UDIMs with non-power-2 sizes.

  • Bug Fix: Fixed several issues related to texture readback in DX12.

  • Bug Fix: Fixed a problem for NaNs in pass/view uniform buffers in canvas tile rendering, occurring due to scene buffers not being initialized yet.

  • Bug Fix: VT prefetch pages are now marked as recently used so they are not evicted later in frame, which would break code that assumes that the VT prefetch pages are resident.

  • Bug Fix: The editor usually prevents users from assigning non-virtual textures to materials that are expecting virtual textures, but if that state happens, it causes a crash. This fix avoids a crash when that happens, with the problematic texture rendering as black.

  • Bug Fix: Fixed an issue with incorrect computation of the specular transmission BRDF.

  • Bug Fix: Fixed FrameFence so that RT and RHIT agree on what frame we're on. This fixes a DX12 mesh corruption bug.

  • Bug Fix: Frame rate smoothing is now disabled by default.

  • Bug Fix: Fixed a problem where wrong sizes were computed for mips of non-power-2 UDIM texture when computing VT address wrapping.

  • Bug Fix: Moved DX12 PipelineState hashing to 64-bit to avoid hash collision, and to take vertex declaration into account in the hash.

  • Bug Fix: Fixed a case where the landscape sometimes would be rendered with a default material in a packaged game.

  • Bug Fix: Fixed a -nan issue with view uniform buffer due to render target context not being allocated for the main view.

  • Bug Fix: HLOD—Fixed MaxDrawDistance not working for HLODs.

  • Bug Fix: Fixed an issue where the render target pool was releasing all targets instead of the requested target.

  • Bug Fix: HLOD—bCastDynamicShadow was forced off in ALODActor::PostLoad() since 4.19 as a workaround for another issue.

  • Bug Fix: Previously, a GPU error occurred when using a scene capture 2D component in the level. The GPU would restart when you performed reflection captures using SceneCapture components. CaptureSceneToScratchCubemap performs a copy that requires depth as it has a distance fade factor, so you must use a real depth buffer for that pass.

  • Bug Fix: Lots of Vulkan validation work:

    • Debugged names for images for helping track down validation errors.

    • When the reflection environment rounds up to 2 cubemaps, it is now explicitly cleared to avoid a validation error.

    • The Shadowmask texture is now properly transitioned to read.

    • A missing transition was added for LightScatteringHistoryTexture.

    • Added an ensure that occurs when updating descriptorset, to catch validation errors when a texture is set.

    • Fixed an issue in transition resources, where it would use the incorrect number of subresources.

    • Added VK_QUERY_RESULT_WAIT_BIT to ensure query results are actually ready when copied back to the result buffer.

  • Bug Fix: File cache async requests are now destroyed before handle, and this fixes rare crashes when using a virtual texture.

  • New: You can now use the command list manager fence to release resources instead of the frame fence.

  • New: Fixed DXC shader diagnostic message reporting. DXC diagnostic messages include a few lines of context, which are now filtered out so it is consistent with how we report FXC messages.

  • New: Added RDG support for uploading to buffers with a lifetime managed by RDG, and that can be bound as SRVs in later passes.

  • New: The QueueBufferExtraction function of FRDGBuilder now lets you choose which access and pipeline the buffer is transitioned to, since only RDG knows the previous state.

  • New: Updated DXC to a0c95cd and DXIL to version 10.0.18362.0 This version of DXC contains the fix for the [unroll] bug, where even trivial loops failed to unroll unless the explicit loop count was specified with [unroll(N)].

  • New: Added an explicit member function to retrieve native mask.

  • New: Implemented a new RHI buffer lock/unlock API. These changes remove the need for the RHI to call functions such as IsInRenderingThread() and IsInRHIThread() in their buffer lock/unlock implementations, to determine whether buffer renames should be deferred or not. RHIs can now make use of the RHICmdList.IsTopOfPipe() and RHICmdList.IsBottomOfPipe() functions to determine if lock/unlock operations should be deferred or not:

    • If IsTopOfPipe() returns true, the code is executing on the rendering thread (RT), while the RT is recording commands into the immediate RHI command list. Buffer renames may need to be deferred down the pipe using RHICmdList.EnqueueLambda().

    • If IsBottomOfPipe() returns true, the code is replaying previously recorded commands (or we are Bypass()ing the command list recording). As such, we should behave like we are running on the RHI thread (RHIT) and access GPU resources directly. It is possible for IsBottomOfPipe() to return true while we are on the RT, if running in "-norhithread" mode, since the RT both records and plays back the immediate command list. This is why it is important to use the IsTopOfPipe/IsBottomOfPipe functions to provide the execution context in the RHI, rather than using threading functions like IsInRenderingThread(). It is also more optimal to use these new functions, as the IsIn*Thread() functions require accessing TLS data which can be slow on some platforms.

  • New: Mesh attachment groups on the scene are now only filled by primitives in an attachment group that has a root with "bLightAttachmentsAsGroup" enabled. Now you can select any primitive component in the attachment hierarchy to be used as a root for grouping inset shadows and indirect lighting.

  • New: Added BP setters to manipulate the inset shadow state of an entire group of attachments. This saves a little bit of memory by not creating Attachment Groups on FScene when not needed.

  • New: Implemented mGPU virtualization on a single GPU in D3D12, enabled using the -vmgpu command line argument. Virtualization works by creating multiple FD3D12Device-s, as if real SLI/LDA mode was used. All resources are created multiple times on the same physical device to simulate multiple LDA nodes. Multiple 3D, copy and compute queues are created (one per device). Explicit transfers and synchronization must be performed to share resources between virtual devices, exactly like on a real mGPU machine. This mode allows development and debugging of mGPU AFR and SFR features on any machine, using standard tools such as PIX, Nsight and RenderDoc, that don't support real multi-node configurations. Up to four GPUs can be virtualized this way (same number as maximum supported real LDA GPUs). Example usage command line: MyProject -game -d3d12 -MaxGPUCount=2 -VMGPU -AFR.

  • New: Added memory stat counters for bottom and top level acceleration structures.

  • New: Allows the address (as well as the port) of UE4 to be given to the Proxy. This provides a way to use the Proxy when UE4 is not on the local machine.

  • New: Added ability to choose if a Texture Render Target 2D should auto-generate mip maps when created with the Create Render Target 2D Blueprint utility function.

  • New: Added support for translucent objects in reflections.

  • New: Added mipmap generation support for scene capture 2D render targets.

  • New: Added GRHISupportsDepthUAV flag specifying if the RHI supports depth target unordered access views. Based on this flag, SceneDepthZ now sets TexCreate_UAV if supported.

  • New: PixelStreaming now works when using the D3D12 renderer.

  • New: Added a more explicit description to the memory leak check in FD3D12SegListAllocator::VerifyEmpty().

  • New: Implemented support in render graph for aliasing metadata surfaces (like HTILE) for SRVs and UAVs.

  • New: Added RHI support for dual source blending.

  • New: Added COMPILER_SUPPORTS_BITFIELD_INTRINSICS and COMPILER_SUPPORTS_PACK_INTRINSICS and implemented them on certain platforms.

  • New: Added CVar r.MinRoughnessOverride which clamps the roughness value for direct lighting. This allows to reduce specular shimmering when TAA is off.

  • New: Added an OnAllConnectionsClosed delegate for Pixel Streaming. This will be the broadcast target when everybody has disconnected from the app using Pixel Streaming. This is an opportunity to reset the app, and make it ready for a new user. In Blueprints, the GetPixelStreamerDelegates function can be used to get access to the OnAllConnectionsClosed delegate so you can bind to it.

  • New: The DepthOfField engine show flag is no longer shipping-only.

  • New: Now only some EOF updates are sent when rendering materials to textures. Ensured that parameter collection updates, materials and render target updates are flushed.

  • New: Optimized BuildVertexBuffers—Vertex color conversion.

  • New: Added a client-side AFK system to Pixel Streaming which will disconnect inactive users. It will first warn the user after a period of inactivity that they are going to be disconnected, and a countdown is displayed. If the user does not click, that user will be disconnected. This is configured in app.js as follows:

    • afk.enabled: Set this to true to activate the AFK system; default false.

    • afk.warnTimeout: Set this to the number of seconds of inactivity before the warning overlay is displayed; default 120 seconds.

    • afk.closeTimeout: Set this to the number of seconds the warning overlay will be displayed before the user is disconnected (unless they click); default 10 seconds.

  • New: Added RHICreateUnorderedAccessViewHTile, RHICreateShaderResourceViewHTile and RHIResummarizeHTile methods to the RHI, and implemented them on platforms with GRHISupportsDepthResummarize and GRHISupportsExplicitHTile. This functionality allows access to the HTILE metadata buffer, and also allows for rebuilding HTILE in some circumstances where HTILE was bypassed or otherwise incorrect.

  • New: Exposed custom primitive data on the primitive component to be edited in the Details panel under Advanced settings.

  • New: Add a new method to reduce temporal aliasing in interactive Path Tracing views as well as a CVar to toggle it.

  • New: Improved the assignation of UV slots for custom interpolators in materials; now unused slots are reused instead of simply being added after the last used slot.

  • New: Added an optional fence parameter to MapStagingSurface(). If a fence is passed in, you can Poll() to find out if you have passed the fence. If so, the RHI flush is skipped. For the benefit of non-parallel APIs, the RHI thread is still stalled while processing the Map().

  • New: HLOD: Added the GetHLODDistanceOverride() to ALODActor, which takes into account the active distance override (r.HLOD.DistanceOverride).

  • New: Added PF_G16 render target output support.

  • New: Added RDG{TEXTURE, BUFFER}COPY_DEST usage to pass parameters.

  • New: Added validation to assert when multiple uniform buffer definitions are registered with the same shader variable name.

  • New: Removed the UtilityShaders module and moved sources into RenderCore.

  • New: Added texture source image support for 16-bit UNorm (G16) data.

  • New: Blueprint ClearRenderTarget2D now uses hardware fast clear if possible.

  • New: VK_KHR_dedicated_allocation is now disabled by default, due to video memory leaking.

  • New: Added RHI support for creating a UAV with an aliased format. GRHISupportsUAVFormatAliasing specifies supported platforms.

  • New: Added helpers to GSystemTextures to get RDG textures.

  • New: Replaced RHIGetStencilTexture with RHICreateUnorderedAccessViewStencil to match the other subresource view RHI functions.

  • New: Implemented basic tiled multi GPU support for the path tracer.

  • Improvement: Improved DX12 FastConstantAllocator. It is now faster and uses less memory, while also eliminating some GPU crashes.

  • Improvement: Improved reflection denoiser for 1 sample per pixel. There is also an experimental multi-sample per pixel code path.

  • Deprecated: RHISetStreamOutTargets is now deprecated and will not function. Switch to a compute shader-based approach if needed.

  • Deprecated: Removed references to OpenGLDrv.h in build scripts for iOS platform.

  • Deprecated: Deprecated boolean version of SetShaderValue and SetPixelShaderBool for 4.24.

  • Removed: Removed the FRHIGPUMask uint32 cast operator and made uint32 constructor private.

  • Removed: Removed the RHI thread stall from DrawTileMesh.

  • Removed: Removed vestigial SM4 workaround with depth render target.

Ray Tracing

  • Crash Fix: Moved GatherRayTracingWorldInstances after InitViews to avoid crashes caused by InitViews removing mesh draw commands (through RemoveCachedMeshDrawCommands() that were cached in VisibleRayTracingMeshCommands).

  • Crash Fix: Fixed a driver crash occurring when scrubbing in the Sequencer with Ray Tracing enabled and Geometry Cache.

  • Bug Fix: RaytracingSkyLight now allows alpha to propagate for usage in Composure.

  • Bug Fix: Ray Tracing HISM/ISM now uses the correct LOD.

  • Bug Fix: Fixed an issue with the Ray Tracing pipeline state cache that could cause pipelines created on the current frame to be immediately evicted, resulting in a use-after-free error.

  • Bug Fix: Fixed Ray Tracing debug modes where they were using pre-exposure incorrectly.

  • Bug Fix: Ray tracing scenes now explicitly hold references to all FD3D12Resources that are bound to the SBT, so they are not released while some RT commands are still in flight. Added a command to explicitly clear all SBTs for a scene, which releases resource references and allows resources to be immediately reused.

  • Bug Fix: Double-sided geometry ray-traced shadow CVar also affects reflection now.

  • Bug Fix: An uninitialized out parameter was causing undefined behavior in the spotlight estimator; this is now fixed. Fixed other similar instances through path and Ray Tracing shaders to prevent similar bugs in the future.

  • Bug Fix: Fixed the light "Affect Global Illumination" flag being ignored by Ray Traced global illumination. Slightly improved the flag description.

  • Bug Fix: Fixed performance drops with scene capture components when Ray Tracing is enabled.

  • Bug Fix: Fixed Landscape race conditions for Ray Tracing.

  • Bug Fix: Fixed an issue where the Cast Shadows flag was ignored for procedural meshes with Ray Tracing shadows enabled.

  • Bug Fix: Fixed validation errors occurring due to missing resource barriers in the skin cache and Ray Tracing dynamic geometry systems.

  • Bug Fix: Fixed the Ray Tracing shadows denoiser in multiview mode. Now each view renders in a separate tile, and they are later composed into the final texture. Fixed batch shadows mode that always applied the denoiser even if it was disabled.

  • Bug Fix: Fixed an issue where the cast shadows flag was ignored for geometry cache meshes with Ray Tracing shadows enabled.

  • Bug Fix: Fixed an issue where SkyLight was not respecting "Affect Ray Tracing Reflections" and "Affect Ray Tracing Global Illumination" flags.

  • New: Added a single ray per pixel specialization for shadow ray generation shader as a performance optimization.

  • New: Ray Tracing now has support for Niagara Ribbons.

  • New: Texture LOD for Ray Tracing shaders is now a per-project setting, disabled by default.

  • New: Allows unique custom user data to be provided per instance when native Ray Tracing instancing is used. Previously only transforms could be unique.

  • New: Added CVar to toggle Ray Tracing debug visualization modes. Default value is now BaseColor instead of showing a black viewport.

  • New: Added flags to improve Ray Tracing performance on visibility rays not requiring hit depth.

  • New: Added tiling support to Ray Tracing reflections pass. r.RayTracing.Reflections.RenderTileSize Old Tile parameter to control reflections material sorting renamed to "SortTile" for clarity.

  • New: Dynamic Raytracing Geometries now supports an async build option through the CVar r.raytracing.asyncBuild.

  • New: Implemented support for multiple instance transforms within one FRayTracingInstance. This is now used in the GetDynamicRayTracingInstances function of FInstancedStaticMeshSceneProxy, which can generate thousands of instances. This gives a significant CPU performance improvement in scenes with many instanced static meshes.

  • New: Ray Tracing now has support for Niagara Ribbons.

  • New: Hybrid ray-traced/screen-space reflections (experimental). If a reflected ray hit point is visible on screen, then SceneColor texture is sampled instead of tracing the material evaluation ray and running lighting. This mode can be enabled via r.RayTracing.Reflections.Hybrid=1 (off by default). Only single-bounce reflections are supported. Material sorting is required, and is enabled automatically when hybrid reflections are used. This is a significant performance improvement, but has several current known issues:

    • SSAO is applied to SceneColor before reflections, causing a slight mismatch.

    • Direct specular lighting in SceneColor uses the main view eye vector, not a reflection vector, causing a direct lighting mismatch.

    • Main depth buffer is used to determine visibility of the reflection hit point, which has issues with surfaces that are steep in clip space (large surface areas map to small number of depth buffer pixels).

  • New: Added an early out path to Ray Tracing material hit shaders. This is useful when tracing visibility rays against masked geometry, where closest hit shaders only need to fill the hit distance. Added 8 bit flags field to the packed Ray Tracing payload.

  • New: Added automatic state object cache eviction for the Ray Tracing pipeline state. By default, the cache keeps only up to 50 full pipeline states. This reduces the likelihood of editor crash when many Ray Tracing shaders are being continuously loaded (such as when recompiling shaders). Cache size can be controlled using r.RayTracing.PSOCacheSize CVar. Oldest pipelines are removed from the cache after 10 frames of not being needed, until the total cache size reaches the specified value. Individually compiled Ray Tracing shaders are not affected by this, only full linked pipelines. Large levels with many shaders, such as Infiltrator, are still not stable unless PSOCacheSize is set to a very small number (<5) using NVIDIA driver 430.86.

  • New: Added Cast Ray Tracing Shadows per material flag.

  • New: Default settings for Ray Tracing Global Illumination was changed to 4 SPP and 50% screen percentage.

  • New: Added tiling support to the Ray Tracing global illumination pass. r.RayTracing.GlobalIllumination.TileSize (default = 0, disabled)

  • New: Built-in Ray Tracing API now uses two-sided intersection. This only affects RHIRayTraceIntersection and RHIRayTraceOcclusion.

  • New: Added an option to enable RTAO in post process volume settings.

  • New: Introduced a new Ray Tracing debug view called Primary Rays.

  • New: Added the option to exclude decals in Ray Tracing (r.RayTracing.ExcludeDecals).

  • New: Renamed the stat GenerateVisibleRayTracingMeshCommands to GatherRayTracingWorldInstances, as that is the function it actually measures.

  • New: Culling enabled by default for ISM/HISM in Ray Tracing.

  • New: Packed Ray Tracing payload is now used during the main Ray Traced reflection rendering. Same payload instance is used for main material Ray Trace and for shadow rays during direct lighting. This significantly improves performance for regular code path when not using miss shaders to evaluate lighting.

  • New: Implemented native instancing for Ray Tracing geometry. Same shader bindings can now be used with many copies of the geometry that have unique transforms. This results in a significant CPU time savings for GatherRayTracingWorldInstances(), BindRayTracingMaterialPipeline() and SetRayTracingHitGroup().

  • New: Implemented support for binding different vertex buffers per Ray Tracing geometry segment.

  • New: Material sorting is now enabled by default in Ray Tracing reflections.

  • New: TLAS, SBT and other expensive Ray Tracing routines are now skipped when all Ray tracing passes are disabled.

  • New: Added support for creating Ray Tracing shaders through FShaderCodeLibrary.

  • New: The Ray Tracing reflections denoiser now works with any number of samples per pixel, not just one.

  • New: Multi-SPP is now handled through a high level loop. The reflections shader adds an extra stage that reads the current accumulated color/hit distance on anything beyond pass 0, and only applies the final weighting on the final pass.

  • Improvement: Implemented an optimization for Ray Tracing resource binding. SBT records are now cached using uniform buffer pointers as key. Records with matching keys are simply copied, avoiding the entire cost of resource binding. CPU performance in large scenes with many identical mesh instances is significantly improved by this (up to ~4–5x speedup in ArchVizRayTracing, ~1.5x speedup in Infiltrator). This optimization assumes that the contents of uniform buffers will not change during a frame. CVar r.RayTracing.CacheShaderRecords (default = 1) can be used to turn off caching.

  • Improvement: Changed the display name of some attributes in LightComponentBase to specify that they affect Ray Tracing only.

  • Improvement: Improved generic TraceRay helper functions and replaced existing common TraceRay calls which fit established material and visibility ray patterns.

  • Improvement: Unified bottom level acceleration structure build and update APIs.

  • Deprecated: RHICopyBufferRegion/s, as it was exclusively required and used for skin cache VB merges.

  • Removed: Skin cache vertex buffer merging step has been removed, improving GPU performance.


  • Crash Fix: Fixed a crash in the Niagara System Editor that occurred when alt-dragging time ranges in the timeline.

  • Crash Fix: Fixed a crash in the Niagara System Editor that occurred if a module was missing a dependency, and there were multiple modules with the same name which could provide that dependency by using the full name in those cases. Added code to prevent this crash where two fixes have the same unique ID.

  • Crash Fix: Fixed a crash that occurred when using aligned memory writes for types like FQuat / FVector4 when adding new parameter data, as they may not be aligned in the parameter store.

  • Crash Fix: Fixed several crashes in the Niagara System Editor which would happen with undo and redo, especially when adding and removing emitters.

  • Crash Fix: Fixed a crash in the Niagara System Editor that occurred when performing Undo after copy/pasting emitters in the timeline.

  • Crash Fix: Fixed a crash caused by Niagara DI instance data not being recreated after a reset.

  • Crash Fix: Fixed a crash that occurred when adding new emitter to a system that has not been compiled after its last change.

  • Bug Fix: Fixed an issue where the particle system dynamic parameter was invalid in instanced stereo.

  • Bug Fix: Garbage is now collected after closing the Niagara Editor. This allows all the buffers to be deleted, reducing RHI memory pressure in the editor.

  • Bug Fix: In the Niagara Script Editor, execution state enum values are now hidden if they are invalid to set directly.

  • Bug Fix: Fixed an issue where particle vector random instance parameters were incorrectly using VRand, causing unit vector sizing instead of a box for certain assets. A new unit vector sizing option was added to allow data created under the incorrect implementation to have the same behavior. If you have assets that appear to be malfunctioning, that were created using version 4.23, select the new option to fix that.

  • Bug Fix: In the Niagara System Editor, made the drop-down arrow for stack function inputs focusable again, so that it can be opened with the keyboard. This also fixes the issue where the menu's search box is not focused when it is opened.

  • Bug Fix: Fixed an issue with Niagara systems which would cause a system to recompile on every load if certain types of emitter changes were merged in.

  • Bug Fix: Fixed a bug in the Niagara Script Editor where pressing the refresh button would crash the Editor if the graph contained reroute nodes.

  • Bug Fix: Removed bUse*Sampling variables because they are unreliable. They are bound after the DI is initialized in the editor and the discovery of them during VM binding might not write to the correct UObject (such as the one that will be serialized), and are therefore not reliable in cooked builds. They are also incorrect for GPU emitters. Replaced with bAllowCPUMeshDataAccess that the DI determines on instance initialize. This means the VM cannot bind to functions that would fail.

  • Bug Fix: Fixed an issue where the Niagara Component was activating automatically when changing sg.EffectsQuality.

  • Bug Fix: Handled reimport of StaticMeshes with Niagara Mesh Renderer.

  • Bug Fix: In the Niagara Script Editor, fixed the following issues with input and output renaming:

    • Fixed an issue where renaming an input or output from the parameters panel would not update a script's change ID and would not enable the Apply button.

    • Fixed an issue where you could create duplicate output names when renaming from the node context menu.

    • Fixed an issue where you could not have a function input with the same name as a function output.

  • Bug Fix: Fixed Engine.Time being set to 0 in the emitter namespace. Removed SystemInstance bindings to Simulation parameter stores.

  • Bug Fix: Fixed a possible crash caused by invalid render properties.

  • Bug Fix: Niagara detail level is now set correctly for cooked platforms.

  • Bug Fix: Fixed a bug where multiple Niagara particles could have the same value for Particles.UniqueID, and this generated identical deterministic random numbers. This no longer occurs for particles spawned through Events, or if using multiple Spawn Modules in the same Emitter.

  • Bug Fix: Fixed a bug where static switches with compiled constants were not correctly compiled across complex graphs.

  • Bug Fix: Fixed a check in Niagara GPU particles when switching the preview feature level.

  • Bug Fix: Fixed issues relating to RTT happening in the middle of a tick when there is other async work happening. Niagara now waits on async work when it hits a RTT mid-frame.

  • Bug Fix: Added fx.NiagaraGlobalSpawnCountScale to Engine/Config/BaseScalability.ini and EngineTest/Config/DefaultScalability.ini files.

  • Bug Fix: Modified Niagara component's Activate() call for correct reset behavior.

  • Bug Fix: Changed the SpawnRate and SpawnBurst_Instantaneous Niagara modules to account for the new fx.NiagaraGlobalSpawnCountScale variable. There are three parts to this change: 1) Hooking in the global spawn count scale. 2) Clamping the burst spawn count to 1. 3) Moving the scalability application to an earlier point in the SpawnRate module. The module ended up using two values (pre- and post-scaled) of the spawn rate in different locations. This updates the Niagara custom script version.

  • Bug Fix: The Niagara log panel was previously showing out of date messages if the last emitter or system compile failed. Now, Niagara empties EmitterCompiledData when initializing it, even if the latest VM executable data is invalid.

  • Bug Fix: Fixed an issue where Niagara components would never clear their render state dirty flag.

  • Bug Fix: Fixed an issue where loading a Niagara asset by using a hard reference during game startup would hit a check on initializing renderer properties.

  • Bug Fix: Fixed a crash in the Niagara System Editor which occurred when the user performed an undo while hovering over the advanced expander or function input.

  • Bug Fix: Fixed an issue which caused a crash when saving after editing a module parameter description.

  • Bug Fix: Fixed an issue in the Niagara System Editor where curves in the Selection panel would not be zoomed to fit on open.

  • Bug Fix: Fixed a crash caused by an invalid renderer being called on a GPU emitter.

  • Bug Fix: Fixed an issue where multiple stack modules that called the same function with static switches were not evaluated correctly (the first one was overwriting the values of the others).

  • Bug Fix: Fixed a crash that occurred on compiling an If node after adding and deleting input or output pins.

  • Bug Fix: Fixed an issue with broken trails when spawning an interpolated position.

  • Bug Fix: Previously, a data interface function call with unused output parameters would cause an error on compiling. Now Niagara properly supports DI function calls in the VM that have unused output parameters.

  • Bug Fix: Previously, parts of the VM compiler backend did not correctly handle matrix parameters, so data interface calls with matrix inputs did not behave correctly. This has now been fixed.

  • Bug Fix: Non-deterministic RNG calls in Niagara GPU scripts no longer impact subsequent deterministic calls. This might change the actual numbers generated by GPU emitters using the deterministic RNG if non-deterministic random numbers are also generated due to effectively changing the call order.

  • New: Refactored high level ticking structure of Niagara for better thread utilization.

  • New: System Properties have been moved out of the System Properties tab of the Niagara System editor and now exist in the new System Settings category in the Stack. Emitter Properties have also been moved from the Emitter Spawn group to a separate Emitter Settings category for greater clarity.

  • New: Added a debug name generator so that duplicate stack entries are easier to debug.

  • New: Niagara scale modules can now be combined with other scale operations.

  • New: Submitted a new Niagara module called "AlignParticlesWithCollisionPlane". You can use this to simulate coins, leaf interactions with the ground, and so on. This first edition can be improved upon.

  • New: Niagara System Simulations can now tick in multiple tick groups and run concurrently across all tick groups until the last demotable tick group.

  • New: Made Parent and ParentAtLastMerge editor-only data to avoid pulling emitter hierarchy into memory on cooked builds.

  • New: Moved some parameter management work from the game thread to a concurrent thread in the Niagara system runtime.

  • New: Updates bounds during concurrent tick and only calls UpdateComponentToWorld on the GT in finalize if they have changed. This follows what Cascade does, and saves ~30us on the GT finalize when attached; it also saves updating the octree on the RT.

  • New: Executes Niagara system spawns in tick groups as we progress ticking each group. This pushes the spawning to async where possible, but we can still be left with systems that have to be spawned in after an actor tick if the last demotable group spawned additional systems.

  • New: The Niagara rotation modules have been rewritten. This includes:

    • A new naming convention.

    • A new method for combining quats.

    • A new paradigm for setting mesh orientation using rate vs. setting the particle's angular velocity.

    • New spaces to transform rotations into, including mesh/particle space.

    • A new approach to aligning meshes to a vector.

    • Rotational drag was added to the drag module.

  • New: In the Niagara System Editor, we added additional icons in the Timeline panel and item header to show when emitters and systems have issues which were previously only shown on rows in the Selection panel's full stack view.

  • New: Now compile errors for GPU shaders display as warnings, so that they do not stop a cook.

  • New: In the Niagara System Editor, modules can now be drag-copied between emitters and systems using the ALT key.

  • New: Niagara compile errors no longer generate full errors in a cook, potentially stopping a cook. Instead, they show up as warnings in the cook process. Similarly, Niagara compiler warnings will show up as display text in the cooking process.

  • New: Added an onscreen message when a NaN is encountered. NaN dumps are disabled by default, and replaced with console variables to control.

  • New: Updated Niagara to be in its own CSV scope for easier tracking.

  • New: Converted the system instance ID to an atomically increasing number rather than a GUID. Removed system instance ID to FName; this fixes ever increasing memory usage on FNames.

  • New: Added fx.Niagara.Solo.TickEarly which allows Niagara components to tick in the first tick group. Added fx.Niagara.Solo.AllowAsyncWorkToEndOfFrame which allows async work to continue until the last tick group.

  • New: Added a data interface to allow bulk exporting particle data to Blueprint or C++.

  • New: Optimized Niagara particle sorting.

  • New: Added the option to convert all Numeric Niagara graph nodes simultaneously when right-clicking a node in the Script Editor (as opposed to just right clicking a single pin).

  • New: Adds GetSpecificSocketTransform to Niagara skeletal mesh data interfaces. This returns the FTransform components of the current USkeletalMeshComponent or USkeletalMesh. An optional ComponentToWorld transform can be applied. The GPU version is not yet implemented.

  • New:

    • Added a Details customization panel for UNiagaraScriptVariables selected in the Parameters panel in the Graph editor. You can use this to change the default value of module inputs similar to Blueprints.

    • Added per-graph descriptions to non-module parameter metadata.

  • New: Added the option to override the Niagara Emitter Properties' global spawn count scale for each EffectsQuality Scalability level. The spawn count scale overrides are initially seeded by the EmitterQuality sections of the Scalability .ini hierarchy. If the scales are not overridden, the emitter will fall back to using fx.NiagaraGlobalSpawnCountScale instead. This fix also introduces two new engine variables:


    The latter is a constant and can be used in static switches. This deprecates Engine.GlobalSpawnCountScale.

  • New: Enabled per-particle material parameters for Niagara shaders on devices targeting OpenGL ES3.1.

  • New: The Niagara Script Editor now creates comments around the current selection when you press the C key.

  • New: Improved the logic for Niagara ribbon tessellation by normalizing the tessellation factors between frames, based on the current length of the ribbons.

  • New: Added "fx.NiagaraAllowTickBeforeRender" which allows Niagara GPU particles that do not rely on view data to tick before the view is rendered. This allows Niagara to render the particle state of the current frame, instead of the one from the previous frame.

  • New: Moved VM context from TLS to pool.

  • New: A compact form of the databuffer layout is now stored in a single array to reduce cache misses in register setup.

  • New: Removed unused module inputs during compilation.

  • New: Some improvements to Niagara activation and reset times:

    • Datasets no longer keep a local copy of their layout information that has to be copied during each init.

    • Pulled out some bindings between const parameter stores that were happening each activation; they now happen once on init to prime those stores.

    • Reduced the number of stores binding/unbinding on each activation and doing only the minimal set needed.

    • Added new stat scopes to help identify the cost of activation.

    • Added data driven pre-allocation for emitters to help avoid many allocations as emitters spin up.

    • Emitter renderer objects are no longer created for disabled or uninitialized emitters.

  • New: Added a component pool for Niagara components so they can be recycled for better performance.

  • New: Object Parameters—Added this new parameter type in Niagara that allows the passing of raw UObject pointers into Niagara for use with Data Interfaces or Renderers. Initial use case is a way to pass in Skeletal Mesh references to the Skeletal Mesh Data Interface.

  • New: Deterministic Randoms for Data Interfaces—You can now have data interfaces generate deterministic random numbers by passing in the NiagaraRandomInfo struct. Currently this only works with the Skeletal Mesh Data Interface.

  • Improvement: Optimized temp register layout for better cache usage.

  • Improvement: Replaced Niagara's original grid location module. Improvements:

    • Offset and noise inputs can now be normalized to the grid cell size.

    • Users can now pin particles to each cell corner or uniformly distribute them throughout a volume.

    • The transform options now operate as expected.

  • Improvement: Static switches were added to reduce runtime costs.

  • Improvement: Optimized passing of Niagara CPU simulation data to the GPU for rendering. Now data is passed only if needed by the vertex factory.

  • Deprecated: Removed the "Dynamic load balanced sim" enum value for simulation targets.


  • Bug Fix: Fixed an issue with DFAO artifacts in the distance after the DFAO cutoff range.

  • Bug Fix: Fixed the fog toggle in Unlit view mode.

  • Bug Fix: Fixed the capsule shadow principal point test to match the changes to the projection matrix when OffCenterProjectionOffset is nonzero.

  • Bug Fix: Removed unused depth and velocity shaders from translucent material shaders.

  • Bug Fix: Fixed Cloth shading model banding by encoding Cloth's fuzz component with a gamma of 2.

  • New: Added Illuminance to the luminance meter on the HDR Eye Visualization tool.

  • New: Lightmass now supports bUseEmbreeInstancing (default setting is False) to reduce memory consumption in scenes where instancing is heavily used, such as forests. It enables Lightmass to bake scenes that are previously not possible; to enable this, use Modify BaseLightmass.ini (or better, create DefaultLightmass.ini in your project folder).

  • New: Added r.DFDistanceScale to enable scaling the distance field shadow cut-off range.

  • New: Added static lighting support for the Sun and Sky plugin.

  • New: Lightmass—Improved dark corner mitigation by storing backfacing hits fraction inside irradiance cache records and marking texels as unmapped when their interpolated backfacing fraction > 0.5.

  • New: Lightmass—Lightmass now supports bUseFastVoxelization (default to false) to speed up volumetric lightmap voxelization in large scenes. Modify BaseLightmass.ini (or better, create DefaultLightmass.ini in your project folder) to enable.

  • New: Exposed DistanceFieldAtlas classes to other modules. This allows custom mesh proxies outside of the engine module to generate their own distance field data.

  • New: Added support for volumetric lightmap (VLM) sublevel streaming as a memory optimization. It is recommended to enable bUseFastVoxelization=true and bUseEmbreeInstancing=true in BaseLightmass.ini (or better, create DefaultLightmass.ini in your project folder/Config).


  • Crash Fix: Fixed an Engine crash that occurred when importing a texture bigger than 8K.

  • Crash Fix: Fixed a crash that occurred when building a texture that has invalid data.

  • Bug Fix: VertexInterpolator material expressions now work correctly when creating lightmass/proxy materials.

  • Bug Fix: Lightmass/Proxy-replaced switches do not attempt to evaluate a non-active branch. This fixes a problem when the non-active branch has compile errors in the current context, which causes the compile to fail.

  • Bug Fix: Fixed an issue with transmission on shadowed point lights.

  • Bug Fix: Fixed an issue with scene color node in translucent shaders.

  • Bug Fix: Previously, the RuntimeVirtualTextureOutput was overwriting the data passed to the normal material output node, causing display errors, but no error was generated in the Material Editor. Triggered a material compilation error if a Runtime Virtual Texture Output node is used in a material with a virtual texture domain. Now, if an RVT output node is used in a material that is not compatible with that material domain, a material compilation error is generated.

  • Bug Fix: Fixed a bug where some texture mips would not get loaded when using the "force fully load" heuristic.

  • Bug Fix: Added "r.Streaming.UseAsyncRequestsForDDC" to prevent streaming textures from stalling the Editor when saving maps, when using a shared DDC server with potentially long IO latencies.

  • Bug Fix: Sanitized the sampler source being null in a material expression evaluation.

  • Bug Fix: Fixed one memory leak from view when rendering Runtime Virtual Texture pages.

  • New: Translucent materials now output depth and velocity if the 'Output Velocity' box is checked.

  • New: AxF Importer: Improved representation of Car Paint materials, matching roughness and reflectivity closer to the original material.

  • New: Added a SubUV properties material expression, which allows direct access to values used to implement particle subUV animation.

  • New: Added support for an eye adaptation material expression in deferred decal and post process materials.

  • New: Added a material shader stage switch, which allows customizing the graph for vertex vs pixel shader.

  • New: Added thumbnail previews for runtime virtual textures.

  • New: Added support for mip level adjustments, set in the material graph when sampling runtime virtual textures.

  • New: Multiple texture layers can be be put into groups that are accessed through the same Virtual Texture page table layer. Physical spaces can now contain multiple texture layers, one for each member of a physical group. This is on by default for Runtime Virtual Texture, so that RVT uses a single page table channel. This reduces page table memory and lookup cost.

  • New: Added support for the sign of Normal Z in Runtime Virtual Texture format. This enables storage of world space normals if required.

  • New: Changed the internal texture layout for BaseColor + Normal + Specular Runtime Virtual Textures. The new layout improves the quality of the normals for a 33% memory cost.

  • New: Added support to the Build Menu for building streaming data for Runtime Virtual Textures.

  • New: Support added for YCoCg encoding of the base color in Runtime Virtual Textures. This gives a much better quality result, but encoding is slower and there is a 25% memory increase in the physical texture.

  • New: Added a new action, "Fix Material Usage", for Runtime Virtual Texture assets. This fixes all dependent materials to match the selected Runtime Virtual Texture asset's material layout. This is useful when changing a Runtime Virtual Texture material type in a big project.

  • New: Runtime Virtual Textures can contain an optional streaming virtual texture to produce low mips. Added a button on the virtual texture volume which bakes this in.

  • New: Added support for 16-bit page table values for virtual textures, when physical space is small enough to support this. This reduces memory and update costs.

  • New: Serialized the flag for disabling a Runtime Virtual Texture. Initially this was intended for debug use only (and not as a persistent flag). However, it is useful for controlling behavior during development, when you might want to place a virtual texture in the world but not use it yet.

  • New: Added a new "r.VT.RVT.TileCountBias" scalability option for the Tile Count of Runtime Virtual Textures. This lets you to change the virtual texture resolution according to platform or quality level.

  • New: Added support for negative LodBias for Runtime Virtual Texture primitives. This can be used by primitives that render at a visibly low LOD in the Runtime Virtual Texture.

  • New: Added console variable "r.VT.PoolSizeScale". This is a scale factor for virtual texture physical pool sizes. This allows per-platform overrides of memory allocation.

  • New: Added support for material expression conversion from raw Runtime Virtual Texture Sample to the parameter form.

  • New: Added a new "r.VT.MaxAnisotropy" scalability console variable. It is an anisotropy setting for virtual textures only. Its effective value is clamped according to the border size of each virtual texture.

  • New: Added a CSV stat to track the percentage of total virtual texture physical space being used over time.

  • New: Added a WorldHeight material type for Runtime Virtual Textures.

  • New: Added a performance marker for virtual texture transcode tasks.

Mobile Rendering

  • Bug Fix: Fixed a software occlusion bug caused by candidates that cannot be set to be occluded. For example, when you enable custom depth.

  • Bug Fix: Fixed a bug where ILC/VLM does not affect Static Staticmesh at all on Mobile.

  • Bug Fix: Fixed a bug that caused Translucent material to not get valid custom depth RT on mobile platform and pc preview.

  • Bug Fix: Fixed a bug where Stationary Sky Light has double lighting contributions to StaticMeshActor on MobilePlatform.

  • Bug Fix: Previously, a wireframe-like rendering artifact on decals was appearing on some iOS and Android devices. This has now been fixed.

  • Bug Fix: Fixed issues with rendering thread time counting on iOS. Typing in "stat unit" should now show correct numbers.

  • Bug Fix: Android OpenGL should now correctly discard unused attachments on a default framebuffer.

  • Bug Fix: Fixed occasional rendering artifacts appearing on Android devices when UI elements use movies as a textures.

  • Bug Fix: Fixed occasional rendering artifacts occurring with scene capture on mobile when MSAA is enabled.

  • Bug Fix: Fixed an issue where Landscape will allocate buffers for adjacency information that are not used on mobile.

  • Bug Fix: The Apple TV HD is based on the A8, which does not allow writes to r11g11b10. So we'll promote to 16F instead of losing precision.

  • New: Added SpecularScale support for all light types for mobile renderer.

  • New: Previously, Image Based Lighting used a simple calculation based on IndirectIrradience and AverageBrightness. This caused a notable difference between rendering on mobile platforms and rendering on PC. Now, the same formula for calculating IBL is used on both mobile and PC.

  • New: Tries to keep LightMapPolicyType selection coherence between mobile and PC.

  • New: Added more robust validation and more detailed errors in the Material Editor for mobile-specific Landscape materials.

  • Deprecated: Mobile preview will now use Shader Model ES3.1 (instead of ES2, which is deprecated).

  • Deprecated: Shader Model ES 2.0 is now deprecated. Users should instead target Shader Model ES3.1.


  • Crash Fix: Fixed a possible crash that sometimes occurred in the GetWorldTime function of FLevelRenderAssetManager when the world scene is null.

  • Bug Fix: Eliminated most hitches from upload buffer allocations.

  • Bug Fix: ProfileGPU only prints events whose duration is greater than N percent of root, by default .05. Unreported events contribute toward Other Children time so their cost is not lost.

  • Bug Fix: Made sure that file cache async requests are destroyed before handle.

  • New: ProfileGPU tracks compute dispatches and group counts.

  • New: Remove serialization of PSO creation. This substantially reduces the amount of hitching in the empty cache case.

  • New: Implemented support for D3D11 and D3D12 vendor extensions (such as NVAPI). This change also updated NVAPI to the latest version (r430), and made it available to the D3D shader compiler.

  • New: UnrealInsights is now a supported module on macOS.

    • LOGTRACE_ENABLED is now enabled for non-program, non-shipping build targets on *nix and macOS platforms.

    • UE_TRACE_ENABLED is now enabled for non-program, non-shipping build targets on macOS.

    • CPUPROFILERTRACE_ENABLED is now enabled for non-program, non-shipping build targets on macOS.

    • The wide-character representation on macOS has been converted to a 2-byte representation (this is consistent with iOS).

  • New: Significant optimization to BuildVertexBuffers - hoisted ScaleMatrix out of per-vertex loop.

  • New: Added half-res scene color as SSR input. It is controlled by r.SSR.HalfResSceneColor and enabled by default on lower scalability settings. Improves performance in bandwidth bound scenarios while retaining very similar visual quality.

  • New: Added a new shader compile flag (CFLAG_ForceOptimization) that will always apply optimizations, even if CFLAG_Debug is set globally by r.Shader.Optimize=0. This is needed for complex shaders that are incredibly slow or non-functioning when unoptimized (such as heavy spilling to scratch). This flag is also required for shaders that use vendor extensions like NVAPI (the driver injection requires optimized shaders).

  • Improvement: Implemented many updates in the shader cross compiler for Metal.

  • New: Added "r.Streaming.PoolSize.VRAMPercentageClamp" to prevent reserving too much space when using PoolSizeVRAMPercentage on system with high amount of VRAM. Default=1024 MB

  • New: Use uint8 for RuntimeVirtualTextureMaterialType to reduce component memory cost

  • New: Added an option to force scene depth textures as memoryless on iOS. Controlled through a Cvar. This is not the ideal way to implement it, but there is no straightforward way to know if we will ever need to read the depth buffer at creation time (currently, at least).

  • New: Makes runtime virtual texture page clear before rendering an option on the asset.


  • Bug Fix: Fixed PreExposure on post processing before tonemapping.

  • Bug Fix: Fixed a regression in the tonemapper sharpen operator

  • Bug Fix: Fixed TAA not getting enabled for planar reflections.

  • Bug Fix: Fixed post process materials scheduled after tone mapping to no longer render over editor primitives and selection outlines.

  • New: Post processing pipeline has been rewritten, using the rendering dependency graph API.

  • New: Added "r.ShaderComplexity.CacheShaders" to allow caching of the shader complexity viewmode shaders to avoid latency caused by the on-the-fly compilation.


  • Crash Fix: Fixed a crash when canceling import with a bad skeleton.

  • Crash Fix: Fixed ShaderCompileWorker from crashing when setting FORCE_USE_STATS.

  • Bug Fix: Reverted unique naming for a morph target change—it is a needed behavior to merge a morph target that has the same name.

  • Bug Fix: Fixed an issue in batch scripts where the directory to a batch script was not quoted, and would cause a problem when special characters were part of the path.

  • Bug Fix: Inherit handles when launching a game process, this continues to allow stdout and stdin to read as the child processes, will use the same handles for those streams.

  • Bug Fix: Fixed LODGroup change—avoid touching LOD 0 SectionInfoMap, and remove any entry for the other generated LODs.

  • Bug Fix: Made PanoramicCapture a developer module.

  • Bug Fix: Prevented HoloLens and Win32 from building when -set:HostPlatformOnly=true was specified on the command line for InstalledEngineBuild.xml.

  • Bug Fix: Fixed degenerated triangle that introduced NAN value into the normals when they are computed.

  • Bug Fix: Fixed an issue in Framepro's DynamicWString wrapper class where each time the assignment operator was called, it chopped off the string's last character.

  • Bug Fix: When changing the default resolution (Edit > Editor Preferences > Play > Common Solutions), landscape or portrait orientation was reverted to the original value for that default resolution (for example, landscape orientation for televisions, monitors, and laptops, and portrait for phones and tablets). This fix maintains the last orientation used, enabling users to change multiple times from different phones or tablets in landscape mode without having to manually reset the orientation.

  • Bug Fix: Fixed Widget Blueprint to switch landscape and portrait orientation bug by forcing televisions, monitors, and laptops to strictly exhibit landscape orientation; however, because televisions or monitors may require portrait orientation, the code was modified to present the same behavior over Edit > Editor Preferences > Play

  • Bug Fix: Fixed Widget Blueprint to switch landscape and portrait orientation. Bug exhibited when the orientation was clicked after opening the program, where the default values were being used before selecting the screen size, which made the screen disappear and show a new resolution of zero-by-zero.

  • Bug Fix: Added missing const keywords to some arguments in SDesignerView.h, SDesignerView.cpp, and LevelEditorPlaySettingsCustomization.h.

  • Bug Fix: Fixed an issue with the real-time GPU Profiler where event names were incorrectly tracked.


  • Bug Fix: FFrameNumber customization was not displaying the property tooltip in the correct location.

  • Bug Fix: You can now always use Select All shortcut in EditableText.

  • Bug Fix: Fixed an issue where an added input processor would still be in the ProcessorsPendingRemoval array, and would get removed the next time a button was pressed even though it was added back to the InputPreProcessorList. So now any time we add to the InputPreProcessorList we remove that processor from the ProcessorsPendingRemoval array.

  • Bug Fix: Fixed an issue with how the UI safe zone is displayed for split screen. Now uses the Viewport rather than View[0] that was previously used.

  • Bug Fix: Fixed an issue with stale safe zone updates. When updates are made to the title safe zone, the UI is updated immediately to be inside the new safe zone.

  • New: Upgraded FreeType to 2.10.0.

  • New: Upgraded HarfBuzz to 2.4.0.

  • New:

    • Added support for disabling outline and tint for bitmap fonts in Slate and Canvas.

    • Added support for batching both grayscale (8-bit alpha only) and color (8-bit per-channel BGRA) font quads from a font texture atlas in RHI, D3D, and OpenGL.

  • New: Allows separate size settings for grayscale and color font atlases:

    • This allows fonts to be configured consistently, rather than the color atlas always being 1/4 the size of the grayscale one.

    • The old FontAtlasSize setting is deprecated in favor of GrayscaleFontAtlasSize and ColorFontAtlasSize.

  • New: Exposed SetScrollOffset function to the ListViewBase class.

  • Improvement:

    • Added support for rendering TTF/OTF fonts containing bitmaps, including color fonts like Emojis. Bitmap fonts require FreeType 2.10, and support is compiled out if using an older version.

    • ApplySizeAndScale now computes the desired pixel size manually using our desired DPI rather than calling FT_Set_Char_Size.

      • This also includes the font scale, which avoids the call to FT_Set_Transform, and lets us remove some workarounds for inconsistent scaling from FreeType.

      • For scalable fonts, the desired pixel size is passed to FT_Set_Pixel_Sizes.

      • For bitmap fonts, the desired pixel size is used to find the most suitable strike size, set via FT_Select_Size, and the ratio needed to scale that strike to the desired size (see GetBitmapAtlasScale and GetBitmapRenderScale).

    • AppendGlyphFlags has been updated to load color data when available, and to only exclude bitmap data for fonts that also have scalable data.

    • FSlateFontRenderer::GetRenderDataInternal has been updated to handle color bitmap rendering (BGRA, sRGB) in addition to the existing grayscale rendering.

      • It will handle scaling down bitmap font strikes that are larger than the desired size, which saves space in the atlas (see GetBitMapAtlasScale).

      • It won't scale up any bitmaps, as that is handled by the transform applied when batching the glyph quads for rendering (see GetBitMapRenderScale).

  • Deprecated: SetText taking FString on STextBlock.

  • Removed: Removed unused data from FCharacterRenderData.

  • Removed: Removed legacy localized fonts:


  • Crash Fix: Fixed an editor crash that occurred when re-importing a font face over an existing asset for the same font face. Also fixed a related issue where the font face editor did not point to the new font face asset.

  • Bug Fix: Improved display scaling support during window creation and resize.

  • Bug Fix: Fixed an issue where OnUnhovered events were doubled when the mouse left a clicked button.

  • Bug Fix: After WidgetRenderer draws a widget, the widget's original parent is now reassigned.

  • Bug Fix: Fixed an issue where the user was getting stuck in an infinite loop if the next two entries in list view were not selectable or navigable.

  • Bug Fix: Fixed an issue with SScaleboxes not invalidating prepass when their scale was changed directly.

  • Bug Fix: Fixed an issue where invisible but keyboard-focusable widgets in a scroll box could block navigation.

  • Bug Fix: Fixed an issue where web browser UObject binding could cause a memory stomp when invoking UFunctions called by the web page.

  • Bug Fix: Removed the clearing of viewport focus for all users when the primary keyboard user focused something other than the viewport. Updated hard-coded checks to User 0 so so the user can fetch the keyboard user ID instead.

  • Bug Fix: Added a check for NullRHI before drawing canvas elements in Flush_GameThread. This guards against a crash occurring when using NullRHI in conjunction with "Constrain Aspect Ratio."

  • Bug Fix: Fixed a problem where font material was not applied correctly on rich text. This occurred because SlateTextRun reused a cached ShapedGlyphSequence with the wrong FontMaterial because the CachedShapedTextKey was ignoring it.

  • Bug Fix: Fixed an issue where spinbox min/max values on vector structs would not propagate to the nested individual member fields.

  • Bug Fix: Changing a Grid Panel layer at runtime now updates properly.

  • Bug Fix: Fixed an issue where slate combo buttons were not focusing the opened widget. Now allows search and keyboard navigation.

  • Bug Fix: Previously, strings with wildcard symbols were not matching properly (for example, "abcde" and "abc*de" would return False).

  • New: SWizard now has a BreadcrumbTrail that can be displayed by setting ShowBreadcrumbs to True. SWizard now supports more complex branching wizards through the OnGetNextPageIndex delegate.

  • New: TSubclassOf widgets now supports the AllowedClasses metadata to limit what classes are allowed to be set from the details view.

  • New: It is now possible to flip an SDecoratedEnumCombo's orientation to vertical.

  • New: Added support for removing input preprocessors while they are being processed.

  • New: Add FindInputPreprocessor to SlateApplication.

  • Improvement: Significantly reduced the memory footprint of accessibility data in SWidget.

  • Improvement: Added a small triangle icon close to each one of the main sections of the Editor Preferences menu, for collapsing or expanding them.

  • Removed: Removed SWizard's OnNextClicked and OnPrevClicked delegates since they were never called.


  • Crash Fix: Fixed a crash that occurred when placing a native UserWidget in a panel within another UserWidget.

  • Crash Fix: Fixed a crash that occurred when you delete the content in a named slot or drag it out of the named slot in the UMG Editor.

  • Crash Fix: Fixed a crash that occurred in the editor when you dragged a Widget outside of a Panel Widget in the hierarchy panel, then set a property on that dragged widget.

  • Bug Fix: Fixed a bug where checking "Override Accessible Defaults" would cause non-deterministic cook errors. Any widgets with this enabled would need to be resaved in order to cook properly.

  • Bug Fix: Fixed an issue where font materials were not being applied correctly on Rich Text Widgets.

  • Bug Fix: Fixed an issue where the mouse input for widget components was being offset.

  • Bug Fix: Fixed an issue where Widget::IsDesignTime() was returning False when called inside Initialize override.

  • Bug Fix: The Curve Editor tab now closes when there is no active animation. This eliminates the "unrecognized tab" error when opening UMG.

  • Bug Fix: Removed an ensure message in the Editor that can happen when you rename a NamedSlot. Changed UUserWidget::GetSlotNames to support non-Blueprint widgets.

  • Bug Fix: Now the Editor only assigns the widget component as a child of the game Viewport if it is not in some kind of Editor world.

  • Bug Fix: Correction for a bug that was introduced in 4.23, where ColorAndOpacity was applied to both the background and the content of a button instead of being applied to the content only.

  • Bug Fix: Fixed a double Selection Changed event in List View when the selection was changed by clicking on an item in the list.

  • Bug Fix: The Details View widget now properly filters out any unwanted property category (some categories, such as "Transform", were showing up no matter what the CategoriesToShow and PropertiesToShow filters were set to).

  • Bug Fix: The Margin and Padding properties in UMG now remains selected and keyboard focused after a value is committed.

  • Bug Fix: Focus navigation on widgets within a world-space widget component now works in a standalone build.

  • New: Added an option for global capture to allow for a restore state of UMG animation.

  • New: Added UMG_API to SafeZoneSlot.

  • New: Added three new methods (SetNavigationRuleBase, SetNavigationRuleExplicit, SetNavigationRuleCustom, SetNavigationRuleCustomBoundary) to handle all the possible cases.

  • New: Added an IsOpen Blueprint function to the ComboBoxString widget.

  • New: Added a helper function to UWidget: SetFocus. This calls SetUserFocus(GetOwningPlayer()).

  • New: Added support for changing text justification at runtime on all UMG text widgets.

  • New: Added missing WidgetLayoutLibrary helpers for casting to a specific slot type.

  • New: Added a selection dialog for choosing a root widget when creating a new Widget Blueprint. This can be enabled in Project Settings.

  • New: Exposed a SetFocus function on the widget interaction component for manually setting the focus of the underlying virtual user.

  • New: Exposed edit condition property for list view offset.

  • Deprecated: Deprecated SetNavigationRule.

Virtual Production

  • Crash Fix: Fixed an assert/crash that occurred when trying to use the HAP video codec with DX12.

  • Crash Fix: Fixed a crash in Maya that occurred after unloading the LiveLink plugin.

  • Bug Fix: Removed a dependency to DisplayCluster GameMode and Pawns.

  • Bug Fix: Fixed the default interpolator so it is now applied to new LiveLink subjects.

  • Bug Fix: Added a Fix for Recorded Live Link Sections not showing all keys.

  • Bug Fix: Fixed the OCIO shader that was trashing the input alpha component.

  • Bug Fix: Fixed a redefinition of super in AnimNode_LiveLinkPose.

  • Bug Fix: Added an Exit VR button in VRScouting. Fixed a warning that occurred when VRScouting was launched.

  • Bug Fix: Virtual camera will now fetch the frame rate from the recorder cockpit.

  • Bug Fix: Fixed a threading issue with RemoveSession. Added an ImageSender to the ImageChannel to prevent multi-thread access.

  • Bug Fix: Fixed a shutdown LiveLink sources error when the engine closed.

  • Bug Fix: Moved Widget3DCameraPassThrough_Opaque_OneSided reference from the Engine to the Game folder.

  • Bug Fix: Fixed a black screen for simple projection policy and GameViewportClient class-check logic. Fixed an issue with DisplayClusterRootComponent hierarchy construction.

  • Bug Fix: LiveLinkRetargetAsset initialization code was moved out of AnyThread. Now LiveLinkReference is used to get a reference to LiveLinkClient, and creates a copy of that ptr for AnyThread since the ModularFeature is not thread safe.

  • Bug Fix: Fixed the LiveLink switch preprocessor.

  • Bug Fix: Fixed the LiveLink EvaluateFrame node to have cohesive behavior like other nodes.

  • Bug Fix: Fixed an incorrect background color in the LiveLinkClientPanel when docked.

  • Bug Fix: Now clears the LiveLink Subject List when exiting Maya.

  • Bug Fix: A fix was made for Message Bus Sources switching their order in the context menu of LiveLink.

  • Bug Fix: Now checks for an invalid value returned by the ARKit for Virtual Camera.

  • Bug Fix: Fixed a threading issue in RemoteSession. The input was delayed by one frame, which prevented the destruction of the input handler.

  • New: Updated LiveLink recording to support custom structs and c_style arrays.

  • New: Fixed the use of UMediaOutput::RequestCaptureSourceSize by increasing the maximum number of texture buffers on the GPU from 4 to 8. Added the capability to customize how the capture will occur.

  • New: Added a Text3D plugin.

  • New: Released a mutex that can prevent a source from shutting down.

  • New: Added LiveLinkLog.

  • New: The Virtual Production Template helps you get up and running more quickly by enabling the correct plugins, console variables, and project settings for virtual production. Using the template, a virtual production artist run VR scouting shoots and virtual camerawork, setup live composites, and cluster Ndisplay to handle multiple outputs. The list of plugins includes:

    • Livelink

    • Remote Session

    • Take Recorder

    • Virtual Camera

    • Virtual Production Utilities

    • Apple AR Kit

    • Apple AR FaceKit

    • Multi-User

    • Remote Control

    • Composure

    • Variant Manager

    • nDisplay

    • Media Framework Utilities

    • Media IO Framework

    • AJA and Blackmagic Media

    • Timecode Synchronizer

    • Pixel Streaming

    • Avid Media

    • Apple ProRes

    • Media

    • Hap Media

  • New: Added the ability to add delay to the timecode provider and video player.

  • New: The following logs were added to assist buffer tracking:

    • Log a frame at a specific time when you are not in source mode.

    • Log when the frame time is already in the buffer.

    • When the livelink source mode is latest, only keep one frame in the buffer.

    • Add a customizer for live link source settings.

    • When adding a new frame, respect the buffer size settings.

  • New: Added GetTimecodeFrameRate() to the TimeManagementBlueprintLibrary.

  • New: Added DNxSDK to support Sequence exports of MXF video files.

  • New: Added an option to export MXF with DNxUncompressed encoded frames.

  • New: LiveLink debugging HUD that shows your connection state in the viewport. Provides a capability to check the current status of your connections during a shoot. You can track the current status for each subject that you see in the Live Link panel.

  • New: Removes LiveLink MessageBus sources when they have been unresponsive for 30 seconds.

  • New: A new factory system to Remote Session to create channel. This provides a way to add an external channel factory, provide a callback to tell the user when the channel was created. This gives the user the opportunity to set custom param like quality and viewport.

    • Split the RemoteSessionFrameBufferChannel into a channel and an ImageProvider. ImageProvider is responsible for creating the raw buffer that the channel will send over to the client.

    • Added a ChannelRedirector to let an old version of the app open a new channel.

  • New: Remote Session can now route the touch message to a widget directly.

  • New: Add panel that lets any UMG stream to the iPad (via RemoteSession). The streaming when the map changes, or when the UMG is compiled or deleted.

  • Deprecated: FRemoteSessionFrameBufferChannel is deprecated. Use FRemoteSessionImageChannel and select how the image should be captured.

  • API Change: Deprecated ILiveLinkSource::GetCustomSettingsClass. Now uses a GetSettingsClass that returns a TSubClass.


  • Bug Fix: Fixed an issue where the XR tracking system was calling OnBeginPlay twice—once near the beginning of PlayInEditor, then again in CreatePIEGameInstance. The PlayInEditor call was removed, leaving the CreatePIEGameInstance as the single call for OnBeginPlay.

  • Bug Fix: Fixed an issue where the VRPreview window only showed half of the headset view on Hololens 2, SteamVR, and WindowsMixedReality platforms.

  • New: Implemented hidden-area mesh support for the OpenXR plugin.

  • New: Improved the swap chain texture aliasing pattern by providing an API to create an aliased texture directly from a source texture, rather than create an empty texture and then discard it using the current aliasing API. This implementation is provided for D3D11, D3D12, Vulkan, and OpenGL. The default method will assert on an RHI that doesn't support this method (RHI validation added to RHIAliasTextureResources).

  • New: Added depth support to the OpenXR plugin, which includes plumbing depth through to the present and managing the depth swap chain.

  • Improvement: Set up the spectator screen for WMR and Hololens 2 remoting, which makes the various spectator screen modes available.

  • Deprecated: MotionController keys are now deprecated and have been replaced by keys specific to each controller model.


  • Bug Fix: Fixed deferred decals corruption when using the mobile renderer on Magic Leap.

  • New: Hololens 2 added a SetFocusPointForFrame Blueprint function.

  • New: Hololens 2 anchors now update transform and tracking status immediately on load from the anchor store. The update gets the transform or sets the tracking status to NotTracked. Then you can either use the transform or know that it is not yet available.

  • Improvement: We now enable MRMesh to be used as a depth-only mesh, so it can be used more efficiently for occlusion.


  • Crash Fix: Added a possible fix and additional logging for a crash seen in FSteamVRModel.

  • Bug Fix: Fixed excess logging from OculusHMD_Splash.

  • Bug Fix: The Vulkan Shader Compiler no longer strips multiview shader permutations.

  • Bug Fix: Enabled dynamic shadows with multiview on mobile. We split the DirectionalLightScreenToShadow's view dependent part into ViewUniformShaderParameters.MobileMultiviewShadowTransform, enabling multiview to work correctly.

  • Bug Fix: Fixed late update threading sync issues.

  • Bug Fix: Fixed Oculus controllers not appearing in the editor while in VRMode.

  • Bug Fix: Fixed a mirror window sizing logic bug introduced by a platform-specific fix.

  • Bug Fix: Fixed a crash on VR-preview exit for D3D12/Vulkan RHIs in Oculus plugin.

  • Bug Fix: Fixed lighting/volume fog rendering incorrectly with stereo-instancing enabled by ensuring the correct fog volume texture is referenced when sampling fog.

  • Bug Fix: Fixed dynamic decals rendering multiple times in left eye (this shader does not support instanced stereo, so disabled instancing in this case).

  • Bug Fix: Fixed Vulkan queries to allow accurate timers and GPU stats on mobile.

  • Bug Fix: Fixed an MSAA-count discrepancy when running with HMD-allocated depth targets (should allow render-target pool to allocate the MSAA depth in this case). Fix was to only defer texture creation in the render target pool when the HMD supplies depth and there's no MSAA.

  • New: Vulkan FFR (Fixed Foveated Rendering) added for Oculus Quest. FFR leverages hardware support to allow the edges of the eye render targets to be rendered at a lower resolution than the center, which provides considerable performance improvements with minimal visual impact. This works well because optical distortion means we lose visible resolution at the edges of the image.

  • New: Added support for depth passthrough to compositor in SteamVR.

  • New: Added full D3D12 path to the SteamVR plugin (including thread-safety support), which provides support for SteamVR in D3D12.

  • New: Moved OpenXR plugin swap chain usage over to a new XRSwapChain class.

  • Improvement: Simplified handling of loading external asset resources in SteamVR.

  • Improvement: Quest is selected by default when adding a new Oculus target device.

  • Improvement: Integrated the SteamVR Input marketplace plugin into the SteamVR plugin.

  • Deprecated: Support for Google VR is deprecated in UE 4.24.

  • Deprecated: Support for Samsung Gear VR is deprecated in UE 4.24.

Upgrade Notes


  • Control RigUnit has been deprecated. Controls should now be added in the Rig Hierarchy. Use the Detail panel to pick different meshes or options. You can create hierarchies with Controls to provide different spaces.

  • Custom anim nodes that implement OnInitializeAnimInstance now need to return true for the new accessor NeedsOnInitializeAnimInstance that is called at init time.

  • The meaning of HasPreUpdate and NeedsDynamicReset has changed slightly. Previously these were called at init time, so if their results were mutable, it was possible to re-init an anim instance with new settings. Now that these functions are called at CDO load time, it is no longer possible to re-init their results.


  • Unless PPF_UseDeprecatedProperties or PPF_ParsingDefaultProperties has been specified in the port flags, deprecated properties no longer return true from ShouldPort.

  • To reduce multithreaded contention, we have enabled hashing before acquiring a lock that guards a hash table in order. It can also be used for heterogeneous lookup, which avoids the construction of an expensive key type to perform a lookup.

  • FMatrix::ApplyScale is now const.


  • UObject::Modify overrides now must be marked as WITH_EDITOR.


  • UK2Nodes that previously implemented the function ERenamePinResult RenameUserDefinedPinImpl should now override RenameUserDefinedPinImpl (which has the same signature) instead.



  • Targets and modules now contain a property called DefaultBuildSettings, which determines which build settings they should use by default. This allows us to change the default C++ compile settings and provide an upgrade path without breaking backwards compatibility. A notice will appear explaining the updated settings when compiling.

    • Engine targets and modules use BuildSettingsVersion.Latest by default.

    • Project targets and modules use BuildSettingsVersion.V1 by default. New projects use the appropriate version number for the current engine version.

  • API Change: We now use fully qualified paths to libraries (.lib) that have been synced in Perforce.



  • The material type "Base Color + Normal" has been deprecated. Any runtime virtual texture assets that used it will be migrated to use "Base Color + Normal + Specular" material type.


  • Developers must move the [/Script/ConcertSyncCore.ConcertSyncConfig] section in DefaultEngine.ini to DefaultConcertSyncCore.ini in order to preserve any values they've created or changed in their project's Multi-User Transactions settings.

VR Editor

  • Fixed a typo replacing enum EConcertSeverFlags as EConcertServerFlags. Be sure to update your code accordingly.


  • The VoiceChat.h header declaring the IVoiceChat interface has moved from VivoxVoiceChat to Engine/Source/Runtime/Online/Voice/Public/Interfaces/VoiceChat.h.

  • If you have a custom IOnlineFriends implementation, you will need to implement SetFriendAlias. If you do not have a backing storage for the alias, you can trigger the completion delegate on the next tick with FOnlineError(EOnlineErrorResult::NotImplemented) as the result.

Gameplay Framework

  • The AActor::GetComponents API has been cleaned up. GetComponentsByClass has been deprecated, but K2_GetComponentsByClass has been created to preserve Blueprint functionality. C++ programmers should use the new non-templated GetComponents function, which takes a UActorComponent subclass and populates a passed-in array with UActorComponents of that subclass.


  • FCollisionResponseTemplate::HelpMessage is now WITH_EDITOR.


  • Xcode 11 or higher is required to compile projects for macOS, iOS, or tvOS using an installed binary build (from the Epic Games Launcher). Binary builds will fail to compile projects targeting any of those platforms when using Xcode 10.


  • The Maximum Metal Target Version is now 2.0, which is supported by all iOS 11 devices. Existing projects can continue to use Metal version 1.2, but you must manually set this in your Project Settings or your project will automatically default to version 2.0.


  • The highest supported Switch SDK is now 9.3.0, and minimum supported SDK version is 8.3.0. Supported NEX version remains at 4.6.3.


  • RHISupportsDrawIndirect is no longer supported, as it had some false negatives. Replace this call by checking if the feature level is equal or greater to SM5.


  • The hardcoded default mesh reference for FX in cooked builds has been removed. FX that were using this default mesh for spawning will now need to link to an actual skeletal mesh in the scene.


  • Virtual texture size is now determined by TileCount instead of directly by Size. Old Runtime Virtual Texture assets will be updated so that the final virtual resolution is preserved.


  • Due to shader resource loading optimizations, shader resource lifetimes are now managed by thread-safe reference counting. FShaderResource objects have undergone some changes:

    • Create FShaderResource objects with FShaderResource::FindOrCreate instead of FShaderResource::FindOrCreateShaderResource. These objects will also need to be created as TRefCountPtr instead of FShaderResource*.

    • To find a shader by its ID, call FShaderResource::FindById instead of FShaderResource::FindShaderResourceById.


  • Moved LODUtilities API to a new module. This will require updates to the build.cs file for any project using LODUtilities.



  • A new cross platform API for showing VR Loading Screens has been added. This makes it easier to show loading screens on multiple VR platforms. Although the platform-specific interfaces are still available, new projects should use the Loading Screen functions.

  • IStereoLayer::Show/HideSplashScreen() and related methods have been deprecated. Please update your code to use the IXRLoadingScreen interface instead.

  • IStereoLayers created by UStereoLayerComponent will now retain their IDs after being made invisible and visible again. In the unlikely case of C++ code that relies on the layer IDs changing, that code will have to be updated.

  • Projects using the SteamVR Input plugin should disable it to avoid conflicts with the integrated SteamVR plugin.

Known Issues

For a complete listing of known issues affecting Unreal Engine 4.24, 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