Unreal Engine 4.23 Released!


What’s New
Thanks to our next-gen virtual production tools and enhanced real-time ray tracing, film and TV production is transformed. Now you can achieve final shots live on set, with LED walls powered by nDisplay that not only place real-world actors and props within UE4 environments, but also light and cast reflections onto them (Beta). We’ve also added VR scouting tools (Beta), enhanced Live Link real-time data streaming, and the ability to remotely control UE4 from an iPad or other device (Beta). Ray tracing has received numerous enhancements to improve stability and performance, and to support additional material and geometry types—including landscape geometry, instanced static meshes, procedural meshes, and Niagara sprite particles.

Unreal Engine lets you build realistic worlds without bounds. Fracture, shatter, and demolish massive-scale scenes at cinematic quality with unprecedented levels of artistic control using the new Chaos physics and destruction system. Paint stunning vistas for users to experience using runtime Virtual Texturing, non-destructive Landscape editing, and interactive Actor placement using the Foliage tool.

We have optimized systems, provided new tools, and added features to help you do more for less. Virtual Texturing reduces texture memory overhead for light maps and detailed artist-created textures, and improves rendering performance for procedural or layered materials respectively. Animation streaming enables more animations to be used by limiting the runtime memory impact to only those currently in use. Use Unreal Insights to collect, analyze, and visualize data on UE4 behavior for profiling, helping you understand engine performance from either live or pre-recorded sessions.

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

drichardson, KristofMorva, RDIL, projectgheist, jorgenpt, Skylonxe, muit, geordiemhall, umerov1999, slonopotamus, Mouthlessbobcat, SertacOgan, trond, Zaratusa, Mosel3y, grujicbr, Rei-halycon, MichaelHills, mastercoms, ZKShao, eezstreet, vladipus, SuperWig, TurtleSimos, Bormor, yamashi, yatagarasu25, Zeblote, druidsbane, MoRunChang2015, SRombauts, rlabrecque, Wesxdz, KimmoHernborg, Volbard, Nadrin, kallehamalainen, KaosSpectrum, ehartNV, sclark39, tmiv, Clockwork-Muse, CyberKatana, roidanton, aknarts, chozabu, surakin, dyanikoglu, Kalmalyzer, phi16, TBBle, Punlord, kallehamalainen, rproepp, ericwa, PhilBax, user37337

Epic has made recent account changes to provide an age-appropriate experience for players, developers, and creators of all ages. If you don’t see your name credited here for code that you have contributed, please log into your Epic account and ensure that you have updated your account information so that we can include you for future releases. If you need additional assistance, please reach out to Support.

Major Features
New: Chaos - Destruction (Beta)
Revealed in a demo at GDC 2019, Chaos is Unreal Engine’s new high-performance physics and destruction system available to preview in Beta form with the 4.23 release. With Chaos, users can achieve cinematic-quality visuals in real-time in scenes with massive-scale levels of destruction and unprecedented artist control over content creation.

Chaos functionality in Unreal Engine 4.23 must be enabled and compiled using a source build. See this guide for instructions on enabling Chaos.

For more information on Chaos Destruction, refer to the Chaos Destruction documentation pages. We have also added a Chaos Destruction Demo sample to the Learn Tab in the launcher to demonstrate how to set up various types of simulations and effects.

Geometry Collections
These are a new type of asset in Unreal for destructible objects. They can be built from one or more Static Meshes, including those gathered together in Blueprints or even nested Blueprints. Geometry Collections let the artist choose what to simulate and they also offer flexibility in terms of how you organize and author your destruction.


Left - One Wall Section - 31 Geometry Collections; Right - Exploded view of Static Mesh parts

Once you have a Geometry Collection, you can break it into pieces using the Fracturing tools. You can fracture each part individually, or apply one pattern across multiple pieces. In addition to standard Voronoi fractures, you can use Radial fractures, Clustered Voronoi fractures, and Planar Cutting using noise to get more natural results.


Left - Original Geometry Collection; Center - Fracture Across Entire Mesh; Right - Sub-fracturing Only Large Pieces

With optimization in mind, Sub-fracturing allows you to control where to add complexity. Each time you sub-fracture, an extra Level is added to the Geometry Collection. The Chaos system keeps track of each subsequent Level and stores that information into something you can control called a Cluster. Below is an example of a mesh where each fracture Level is combined into its own set of Clusters.


Left - Level 1: 6 Objects; Center - Level 3: 50 Objects; Right - Level 5: 513 Objects

Connection Graph
This is a lightweight connectivity map that is a bit of a different paradigm for destruction simulation. In the image below, we have a few statically anchored pieces, but everything else in the scene is potentially dynamic.


Blue - Potential for Chaos; Yellow - Anchored Nodes

Rather than swapping from kinematic to dynamic, the Chaos system applies strain, which in turn breaks connections and Chaos destruction ensues. This is a great way to maximize interactivity, while retaining control over the amount of active rigid bodies.

Fields are the way that you can directly interact with and control simulations. Fields can be used to control any attribute on any part of your Geometry Collection. If you want to vary the mass for instance, or make something static, make the corner more breakable than the middle, apply some force; all of this can be controlled with Fields.

Cached Simulations
With caching, high fidelity simulations can be pre-cached and played back in real-time resulting in a kinematic Geometry Collection. This means that you can author large scale destruction events and still allow interactivity with the player and environment.

Niagara Integration
The Chaos system is a first class citizen of UE4, and as such, lives alongside all other systems that simulate your world including Niagara. Incorporating visual effects into your simulations can add a lot of depth and realism to the world. For example, when a building breaks apart it generates a large amount of dust and smoke. To create the marriage between destruction and VFX, data from the physics system can be sent to Niagara when an object collides or breaks apart, and that data can be used to generate interesting secondary effects.

New: Real-Time Ray Tracing Improvements (Beta)
Ray Tracing support has received many optimizations and stability improvements in addition to several important new features.


Performance and Stability
A large focus this release has been on improving stability, performance, and quality of Ray Tracing features in Unreal Engine. This means:

  • Expanded DirectX 12 Support for Unreal Engine as a whole

  • Improved Denoiser quality for Ray Traced Features

  • Increased Ray Traced Global Illumination (RTGI) quality

Additional Geometry and Material Support
We now support additional geometry and material types, such as:

  • Landscape Terrain (Measured Performance on a 2080Ti in KiteDemo: ~2ms geometry update time and ~500MB video memory)

  • Hierarchical Instanced Static Meshes (HISM) and Instanced Static Meshes (ISM)

  • Procedural Meshes

  • Transmission with SubSurface Materials

  • World Position Offset (WPO) support for Landscape and Skeletal Mesh geometries

Multi-Bounce Reflection Fallback
We’ve improved support for multi-bounce Ray Traced Reflections (RTR) by falling back to Reflection Captures in the scene. This means that intra-reflections (or reflections inside of reflections) that are displaying black, or where you’ve set a max reflection distance, will fall back to these raster techniques instead of displaying black.

This can subtly improve the quality of reflections without using multiple raytraced bounces, greatly increasing performance.


1 - Single RTR Bounce; 2 - Two RTR Bounces; 3 - Single RTR Bounce with Reflection Capture Fallback for last bounce

New: Virtual Texturing (Beta)
With this release, Virtual Texturing beta support enables you to create and use large textures for a lower and more constant memory footprint at runtime.[br]

Streaming Virtual Texturing
Streaming Virtual Texturing uses Virtual Texture assets to offer an alternative way to stream textures from disk compared to existing Mip-based streaming. Traditional Mip-based texture streaming works by performing offline analysis of Material UV usage, then at runtime decides which Mip levels of textures to load based on object visibility and camera distance. For Virtual Textures, all Mip levels are split into tiles of a small fixed size, which the GPU can then determine which Virtual Texture tiles are accessed by all visible pixels on the screen.

Streaming Virtual Texturing can reduce texture memory overhead and increase performance when using very large textures (including Lightmaps and UDIM textures), however, sampling from a Virtual Texture is more expensive than sampling a regular texture.

For full details, see the Streaming Virtual Texturing documentation.

Runtime Virtual Texturing
Runtime Virtual Texturing uses a Runtime Virtual Texture asset with a volume placed in the level. It works similarly to traditional texture mapping except that it’s rendered on demand using the GPU at runtime. Runtime Virtual Textures can be used to cache shading data over large areas making them a good fit for Landscape shading.[br]
For full details, see the Runtime Virtual Texturing documentation.

New: Unreal Insights (Beta)
Unreal Insights (currently in Beta) enables developers to collect and analyze data about Unreal Engine’s behavior in a uniform fashion. This system has two main components:

  • The Trace System API gathers information from runtime systems in a consistent format and captures it for later processing. Multiple live sessions can contribute data at the same time.

  • The Unreal Insights Tool provides interactive visualization of data processed through the Analysis API, providing developers with a unified interface for stats, logs, and metrics from their application.

You can connect to one or more live sessions, or select live or pre-recorded session data to view, in the Trace Sessions window (under the Unreal Insights tab):

Once you have selected the session data you want to examine, you can use the Timing Insights or Asset Loading Insights tabs to browse through it.

New: HoloLens 2 Native Support (Beta)
Developers are now able to begin creating for the HoloLens 2. You’ll have access to APIs for the platform’s unique features, such as streaming and native deployment, finger tracking, gesture recognition, meshing, voice input, spatial anchor pinning, and more. Build an AR game or an enterprise application. And with robust emulator support, it doesn’t matter if you have a device already or are still eagerly awaiting delivery - you can get started right away with UE4 and HoloLens 2 development.[br]



For more information, see Microsoft HoloLens 2 Development.

New: Virtual Production Pipeline Improvements
Unreal Engine continues to lead the way with advancements in what is possible in a virtual production pipeline! Virtually scout environments and compose shots, use the virtual world to light the real world, connect live broadcast elements with digital representations to build a seamless experience, and control it all remotely using custom-built interfaces.

In-Camera VFX (Beta)
Using improvements for In-Camera VFX, you can achieve final shots live on set that combine real-world actors and props with Unreal Engine environment backgrounds, using an LED wall that can either display an Unreal Engine scene, or a digital greenscreen for real-time compositing in UE4.

Camera frustum-based rendering enables real-world actors and props to receive lighting and reflections from the CG environment, and in some cases eliminates post-production workflows, significantly accelerating overall production. Save time by quickly placing greenscreens digitally on an LED wall with a click of a button instead of physically setting them up on stage. The entire solution can scale to LED walls of virtually any size or configuration thanks to nDisplay multi-display technology.

VR Scouting for Filmmakers (Beta)
The new VR Scouting tools give filmmakers in virtual production environments new ways to navigate and interact with the virtual world in VR, helping them make better creative decisions.


Directors and DOPs can easily find locations, compose shots, set up scene blocking, and get an accurate representation of the filming location, while artists and set designers can experience the location in VR while building it, using measurement and interaction tools to check distances and modify the world. You can capture out images from the virtual world, helping the whole production team track the decisions made during the VR session. Controllers and settings can be customized in Blueprints, without needing to go into C++ and rebuild the Engine.

For details, see Virtual Scouting.

Live Link Datatypes and UX Improvements
The Live Link Plugin now handles more kinds of information and it is easier to apply the synchronized data to scene elements in Unreal! You can now drive character animation, cameras, lights, and basic 3D transforms dynamically from other applications and data sources in your production pipeline.

You can assign a *role *to each scene element, which determines the information that Live Link synchronizes for that element. The Live Link Plugin offers built-in roles for character animation, cameras, lights, and basic 3D transforms. You can also drive an Actor in your Unreal Engine Level more easily from any Live Link source by assigning the Actor a new Live Link controller Component.

Additional improvements:

  • Pre-process the data coming through Live Link before it gets applied to your scene (for example, to apply axis conversions) and control how incoming data is transformed when you map a source from one role to another. You can also create and assign your own custom pre-processors and translators classes.

  • Combine multiple sources into a Virtual Subject, which lets you drive a single scene element in Unreal based on information coming through multiple Live Link sources.

  • Save and load presets for Live Link setups that you need to return to often.

  • Status indicators show you at a glance what Live Link sources are currently sending data to the Unreal Engine.

  • We have added support for ART tracking through Live Link enabling you to leverage ART technology for various tracking purposes in applications such as VR, Augmented Reality and Motion Capture.

For details, see the Live Link Plugin documentation.

Remote Control over HTTP (Beta)
You can now send commands to Unreal Engine and Unreal Editor remotely over HTTP!

This makes it possible to create your own customized web user interfaces that trigger changes in your Project’s content. You can control Unreal Engine from any browser or custom app that supports modern web standards, and you can integrate your controls into other custom panels that you use to control other applications in your environment.

By calling different endpoints provided by the remote control interface, you can set and get properties on Actors and Assets and call any function that is exposed to Blueprints and Python.

For details, see Web Remote Control.

New: nDisplay Warp and Blend for Curved Surfaces
You can now use nDisplay to project your Unreal Engine content on to a wider variety of physical installations, including curved and spherical screens, and scenarios that involve complex blending between overlapping projections.


nDisplay offers built-in integrations for two common ways of expressing how to project and blend 2D images from multiple projects to warped and curved surfaces:

  • The Scalable Mesh File (.smf) format, developed by Scalable Display Technologies.

  • The Multiple Projection Common Data Interchange (MPCDI) standard, developed by VESA.

In addition, third-party developers can now customize for the way nDisplay renders UE4 content by implementing an extended set of rendering interfaces.

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

New: Niagara Improvements (Beta)
Integration into Chaos Physics
Niagara particle systems can now be generated by the physics simulation in Chaos! Whenever an object fractures, you can generate smoke and dust as well as more tiny fractured bits that enhance the physics simulation’s visuals. There is now a Chaos destruction listener, which sends events to associated particle systems and provides information about Chaos interaction events such as break, collision, or trailing. Examples are available in the Chaos Destruction Content Example hallway.

GPU Simulation Improvements
Performance of GPU simulation has been significantly improved to reduce idle time by providing better data management and more explicit synchronization primitives between compute jobs. This enables overlapping significant amounts of GPU work, which greatly increases throughput and allows for more opportunities to run compute shaders in parallel with other computing work.

GPU Support for Static and Skeletal Mesh Sampling
GPU simulations can now sample the surface of a mesh, grab the UV coordinates, and sample from a texture, and then use that capability to drive complex simulation logic, narrowing the gap between what is possible on the CPU and what is possible on the GPU and enabling effects like the fairies in the GDC Troll demo, which spawned 600,000 particles a second.

Ray Tracing Support for Niagara Sprite Emitters
Niagara simulations can now generate geometry that is used by reflections and shadows when raytracing, such as the fairies in the GDC Troll demo which contribute to the reflections in the water as they fly over.

Currently only sprite emitter particles are supported.

Emitter Inheritance
You can now create an emitter that inherits from an existing emitter in your project when you create an emitter in Niagara. Now artists can reuse content more easily, since you can create inheritance trees of functionality for emitters with similar purposes.

As an example, if you create an emitter for a basic muzzle flash used in weapon effects, you might then want to have a heavy and light variant of that muzzle flash. Through inheritance, you can create new emitters for light and heavy variations, but which both inherit the same base functionality and renderers as the original muzzle flash.

Compiling and Cooking Improvements
You can now flush stale data and avoid unnecessary recompilation of Niagara Assets during load and cook operations using two new console commands:

  • fx.PreventSystemRecompile flushes data for a single system and all emitters it depends on.

  • fx.PreventAllSystemRecompiles finds every Niagara System in the project and will flush these Systems and the Emitters they depend on

After flushing and resaving the affected Assets, your load and cook processes will be faster and free from potential failures that stem from stale data.

Improved Error Reporting
A new Niagara Message Log panel in the Script and Emitter/System editor displays messages, warnings and errors from the last compile and allows you to navigate to the nodes or pins in your Script Graphs that cause warnings or errors.

This is particularly useful for technical and VFX Artists who write new functionality and behaviors through Niagara Scripts, or who composite Niagara Scripts into Systems as it improves your ability to rapidly iterate in the Script Editor. Moreover, these messages act as hyperlinks to the source of the error, which enables you to quickly find and resolve issues in Scripts or Systems.

Static Switches
Niagara now supports Static Switch nodes to reduce compile time and improve runtime performance by dropping instructions and parameters that don’t affect the graph’s final output. Static Switch nodes support several unique features, such as value propagation, metadata support, parameter culling, and compiler constant evaluation.


Increased Feature Parity with Cascade
This release increases the feature parity between Cascade and Niagara. Here are some features Cascade has that are now available in Niagara:

  • Sprite cutouts enable artists to reduce overdraw by creating a smaller bounding shape for the particle instead of rendering a full quad.

  • GPU sorting enables transparent objects to be sorted appropriately within the emitter.

  • AnimNotify events enable you to create particles in animation tracks, and manage their lifetime appropriately.

  • Standardized Activate/Deactivate make it easier to drop Niagara effects into existing pipelines.

  • Set Static Mesh and Skeletal Mesh targets in Blueprints make it easier to drop Niagara effects into existing pipelines.

  • Sampled Bone and Socket transforms enable effects that use the Skeletal Mesh to run on lower end target hardware.

New: Platform Extensions
We have added the concept of Platform Extensions which are similar in nature to plugins as they encapsulate all code for an individual platform in a single location decoupling it from the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine. See this guide for more details on Platform Extensions.

New: Skin Weight Profiles
The new Skin Weight Profile system enables you to override the original Skin Weights that are stored with a Skeletal Mesh and improve visual fidelity on certain platforms where dynamic character parts are disabled for performance reasons. You can import a profile from the Skeletal Mesh Editor and will need to provide the FBX file containing the different Skin Weights to use, a name for the profile, and optionally an LOD index. You can also assign a Skin Weight Profile for a Skinned Mesh Component (or any child-class) using the new Blueprint exposed API.

For more information, please see the Skin Weight Profiles documentation.

New: Animation Streaming (Experimental)
Animations can now be streamed for improved memory usage and memory management, which is particularly useful when playing back animation data in long cinematics.

The Animation Compression system can now compress animations into chunks to make them stream friendly, while the new Animation Stream Manager manages the loading and holding of the streamed animation data in memory and a new UAnimStreamable asset represents an animation that can be streamed.

New: Dynamic Animation Graphs (Experimental)
Dynamic Anim Graphs provide dynamic switching of sub-sections of an Animation Graph via Layers, which are separate Graphs that can be plugged into the Anim Graph via Layer Nodes**. This enables multi-user-collaboration and potential memory savings for functionality that is no longer needed.

Layers are defined by an **Animation Layer Interface **asset, which is an Animation Blueprint that has restricted functionality and is analogous to a Blueprint Interface. It defines the number of Layers, their names, which group they belong to, and their inputs.

Additionally, Sub Instance nodes have gained the ability to have their running class dynamically switched using SetSubInstanceClassByTag in UAnimInstance. Sub Instance nodes can also now expose multiple input poses from sub-graphs.

Both the Animation Blueprint and Sub Animation Blueprint(s) have to implement an Animation Layer Interface to be able to create Layer graphs, and instantiate Layer Nodes.

New: Open Sound Control (Beta)
The Open Sound Control (OSC) plugin provides a native implementation of the Open Sound Control standard, which provides a common framework for inter-application and inter-machine communication for real-time parameter control over UDP.[br]


New: Wavetable Synthesis Plugin
We added a new monophonic Wavetable synthesizer that leverages the curve editor in Unreal Engine to author the time-domain wavetables, enabling a wide range of sound design capabilities that can be driven by gameplay parameters. The table index as well as all other parameters are controllable from C++ and Blueprint.

New: CSVToSVG Tool (Beta)
CSVToSVG is a new command-line tool that helps visualize performance data by building vector graphics image files (.SVG) from .CSV files. The tool handles data from any numerical stat, and supports smoothing, budget lines, and stacked graphs. Developers can use this to produce graphs of any data output by the performance tools included with Unreal Engine, or data from their own tools.


New: Sequencer Curve Editor Improvements (Beta)
The Sequencer Curve Editor has been significantly improved with several highly requested features and extensibility support! Artists and developers can now extend the Curve Editor by adding new tool modes, new toolbar buttons, and custom data filters (such as smoothing) without modifying engine code. In addition, the Curve Editor can now be docked separately from Sequencer and includes a transform tool that includes scaling, as well as a key retiming tool.

To use the updated Curve Editor, just open Sequencer or a UMG (Unreal Motion Graphics) Animation and click the Curve Editor button. The new Transform and Retime tools are provided through a plugin that is enabled by default. You can now remove and dock the Curve Editor window anywhere you want, and the position saves when you close Sequencer or the Editor and restores when you reopen Sequencer.

Extending the Curve Editor
The updated Curve Editor can be extended by plugins without modifying the engine code. There are three main ways to extend the curve editor:

  • Tool Modes - Tool modes are exclusive modes that allow you to catch the user input to the Editor first, which allows you to create a wide variety of tools. There are two example tools: FCurveEditorTransformTool, and FCurveEditorRetimeTool. To create a new custom tool, implement ICurveEditorToolExtension and register your extension with the Curve Editor module (see FCurveEditorToolsModule::StartupModule() for an example).

  • Toolbar Buttons - Toolbar Buttons allow you to insert new buttons into the Curve Editor toolbar, and these buttons can manipulate the Curve Editor in any way you want. There is an example which implements additional options for focusing on data (instead of just the default Focus Selected). To create a new toolbar button, implement ICurveEditorExtension and register it with the Curve Editor module (see FCurveEditorToolsModule::StartupModule() for an example).

  • Data Filters - Data Filters are a way to create new ways to manipulate selected curves as a singular action with user-specified settings. We provide three data filters by default which operate on your current selection:

    • Bake (UCurveEditorBakeFilter)

    • Simplify (UCurveEditorReduceFilter)

    • Smoothing (UCurveEditorFFTFilter)

A new filter can be implemented by deriving a class from UCurveEditorFilterBase. No registration with the module is needed. New implementations will automatically appear inside the User Filter dialog. Any UPROPERTY marked as EditAnywhere will automatically appear, enabling you to manipulate them before applying the filter.

View Modes
View your curves in new and exciting ways! Visible curves can be viewed in the tree view on the left side of the Curve Editor, and then you can choose how to view selected curves by clicking the View Mode button as shown below. There are three View Modes:

  • Absolute View shows all of your curves plotted in absolute space - this matches legacy behavior that everyone is used to.

  • Stacked View normalizes each curve and then draws them non-overlapping.

  • Normalized View normalizes each curve (like Stacked View), but draws them all on top of each other.


New Filter Menu
The new Filter menu applies different filters to your selection with a full Details panel and a wide range of settings. It persists after you click the Apply button, so you can easily iterate on your settings. You can add new options in this dialog by implementing a function on a new class which derives from UCurveEditorFilterBase.

Multiple Framing Options
Multiple different framing options are now available.

  • Frame Selection (or Frame All if there is no selection) is built-in and defaults to F.

  • Frame on Playback Cursor and Frame on Playback Range are new options. These are good examples of how you can extend the Toolbar using a plugin.

  • The old Frame Horizontal/Frame Vertical options have been replaced with Focus All followed by ALT + SHIFT + RMB to zoom each axis independently. You can also follow Focus All with ALT + RMB to scale proportionally.


Retiming Tool
The Retiming Tool creates a one-dimensional lattice and lets you adjust the timing of your keys. It supports grid snap, multi-select and more! This tool is provided by the default plugin.


Transform Tool
The Transform tool supports translating selected keys and scaling on both X and Y axes (where appropriate). Press ALT to change the anchor point from the opposite edge to the center.

New: Sequencer Usability Improvements
A number of workflow and usability improvements have been added including:

  • Filter and Search for Tracks - You can now filter and search for tracks and actors.

  • Stretch/Shrink Frames - You can now add or reduce the amount of time between sections and keys as long as there are no overlapping elements.

  • https://docs.unrealengine.com/Images/./../../../Images/Support/Builds/ReleaseNotes/4_23/image_20.gif

  • Adding and Editing Multiple Tracks - You can now group-add and edit multiple tracks by using Shift or Control.

  • https://docs.unrealengine.com/Images/./../../../Images/Support/Builds/ReleaseNotes/4_23/image_21.gif

  • Blend Audio Sections on Multiple Rows - You can now blend Audio sections which enables you to achieve crossfading effects. This functions similarly to blending Transform sections.

  • Restore State or Keep State for Skeletal Animation Poses - This option uses the When Finished property to either restore the Skeletal Mesh to its bind pose after the animation section has been evaluated, or, keep the animation pose of the last animation section.

  • UMG Multibinding - This feature has been around prior to 4.23, however, now you can add multiple widget bindings to an existing binding. This lets you animate one widget which can be used by other widgets.

New: Data Validation Extensibility
The Data Validation plugin has been extended to support C++, Blueprint, and Python-based rules for asset validation. This enables tech artists who are working in Blueprints or Python to create asset validation scripts, instead of requesting C++ implementations. For developers, default engine classes are now able to go through a validation path.

New: DebugCameraController Improvements
In this release, we have added new features to the DebugCameraController:

  • Orbit functionality which allows the user to orbit about a selected position or the center of a selected actor so you can review assets more thoroughly.

  • Buffer visualization overview, with an option to select buffers for fullscreen view makes it possible to examine the contents of the graphic card buffers.

  • View mode cycling gives you the ability to examine the different types of scene data being processed.

The new features augment in-game debugging capabilities when you are using the Debug Camera Controller in Play-In-Editor (PIE). The ability to examine view modes and graphics buffers helps you diagnose unexpected scene results in-game.

To open the debug camera controller in PIE, enter ToggleDebugCamera on the console command line, or use the new semicolon hotkey.

New: Multi-User Editing Improvements (Beta)
Multi-User Editing is significantly improved with the goal of making it a better fit for real-world production use cases.

  • We’ve streamlined the user interface to remove unnecessary dialogs, and to bring all the information and controls you need to manage your sessions into one place.

(The Multi-User Editing icon in the Toolbar is now hidden by default. You can open the new Multi-User Editing Browser from the Window > Developer Tools menu, or re-enable the Toolbar icon in the Project Settings dialog. See the Multi-User Editing Reference.)

  • Reliability of the transaction system across all session participants is greatly improved.

  • We have minimize the possibility of accidentally losing session data through user error by prompting the owner of a session to persist the changes made in the session before they leave. The server now also automatically archives all live sessions it’s currently running when it shuts down, and you can recover the data from that archive later, if needed.

  • We’ve improved the Asset locking system to make it easier for multiple users to work on the same Assets. You’ll now receive a notification when you try to modify an Asset that is already locked by another user in your session. In addition, if that other user releases the lock, you’ll automatically get a lock on that Asset until the next time you save it.

For more information on using the Multi-User Editing system, see the documentation.

New: Disaster Recovery (Experimental)
The new opt-in Disaster Recovery system augments the Editor’s existing Auto-Save system to increase your confidence that you’ll be able to recover changes you make in your project’s content, even in the event of an unexpected shutdown.

As you work, it records the edits you make, using the same transaction system that underlies the Multi-User Editing system. If the Editor shuts down with unsaved changes, then the next time you open your project you’ll be shown a list of all the transactions you made since the last save. You can restore all the listed changes, or all changes up to any recovery point you select.

New: Drag and Drop to Fill Array
You can now select multiple Assets from the Content Browser and drag and drop them onto the array header to fill the array. Select any Assets of the same type that you want as the array, and drag them from the Content Browser into the array header. This works for any array that stores Assets, and simplifies the workflow when working with large arrays.

See the Array Control page for more information.

New: EditConditions Metadata Improvements (Beta)
You can now use simple boolean expressions to enable or disable property editing in the Details panel using the new expression parser for the EditCondition metadata of the UPROPERTY system. Support for enums and numeric types is also included, so programmers can write relatively complicated expressions with minimal overhead.

Programmers writing classes that are intended to be edited by users, such as Actors or Components, where certain properties are only conditionally valid can quickly create more intuitive UIs without needing to write a fully detailed customization class.

The EditCondition meta tag now accepts nearly any valid C++ expression. For example, here is a valid property definition after this change:

UPROPERTY(EditAnywhere, Category=EditCondition, meta=( EditCondition="IntegerEditCondition >= 5" ))

Additional examples of valid expressions:

  • MyInteger > 5 && MyFloat <= 10

  • MyEnum == EnumType::B

  • MyBool == true || MyInteger == MyFloat + 5

New: Editor Utility Blueprints Updates (Beta)
Editor Utility Blueprints have been updated to improve the Editor’s extensibility with Blueprints, bringing Blueprints extensibility more in line with Python and C++ extensibility. Editor Utility Widgets are now available to enable deeper customization of UIs than the previous auto-generated buttons for Editor Utility Blueprints.

Improvements include:

  • Parent classes can be any editor-only class that isn’t a widget.

  • Can create instances of Editor Utilities that need instancing for function calls.

  • The ability to add a Run function to any Editor Utility Blueprint or Editor Utility Widget which will run scripts on Editor start. This will create an instance and allow for binding to stateful editor events.

New: Hide Unrelated Nodes
Users can now select a node and use the Hide Unrelated feature to dim all other nodes not linked to the selected node so Materials and Blueprints can be debugged and understood in a much cleaner and direct way.

New: Landscape Splines Improvements
You can now use ALT + Left Mouse Button (LMB) Drag to create a new spline control point and segment. This is in addition to the existing CTRL + Left-Click action to add new splines. The advantage of ALT + LMB Drag is that as you drag the cursor, you can see what the new spline will look like. You can also split splines with this action.

To add a new control point, select an existing control point and ALT + LMB Drag in the direction you want to place the new point. To split an existing spline, select a spline point on either side of the segment and ALT + LMB Drag the cursor towards an existing segment to split the path.[br]

New: Editor Performance Improvements
If you regularly work with very large scenes, you should notice some significant performance improvements in the Unreal Editor aimed at making your work faster and smoother. It’s much faster to select and de-select hundreds or thousands of separate Actors at a time, to show and hide Layers that contain thousands of Actors, to work with a selected Actor that is a parent of thousands of other Actors, to load Levels that contain thousands of Actors, and more.

New: Material Editor Updates
Material Editor and Material Instance Editor workflows are improved, and we added increased scriptability for Materials and Material Instances.


  • There is now a Hierarchy button to the Material Editor toolbar to display a menu that shows all the immediate children, and enables quick access to edit them.

  • The Hierarchy menu in the Material Instance Editor now shows all immediate children in addition to the parent chain of Materials and Material Instances.

  • The following nodes were added to the material scripting library, for use in Editor Utility Widgets, Editor Utility Blueprints, Python, and C++.

    • For material instances, GetStaticSwitchParameterValue.

    • For materials, GetMaterialDefaultScalarParameterValue, GetMaterialDefaultVectorParameterValue, GetMaterialDefaultTextureParameterValue, GetMaterialDefaultStaticSwitchParameterValue, HasMaterialUsage (for checking whether or not a material has a given usage flag), GetChildInstances, Get___ParameterNames (to get an array of scalar, vector, texture, or static switch parameter names), Get___ParameterSource (to find the source asset, whether it be function or material, where the parameter is defined, and again there’s one for Scalar, Vector, and so on)

  • When you mouse over a parameter name in a Material Instance, you will see the name of the Asset where that parameter was defined. This makes it easier to work with Materials that have many levels of nested functions.

New: UMG Accessibility Screen Reader Support (Experimental)
UE4 now supports third party screen readers for Windows or VoiceOver on iOS, which enables you to make sure your game UI is accessible and helps you comply with CVAA standards. Screen readers, such as NVDA and JAWS, allow a software application’s UI to be narrated to the user. This is a critical feature that enables those who are visually impaired to use and navigate software applications.

As of 4.23, there are now APIs included in UE4 to allow the use of third-party screen readers to read UI text. This supports a number of common UMG widgets, such as Text Block, Editable Text Box, Slider, Button, and Checkbox. This built-in functionality removes the need to implement custom text-to-speech technology, making screen readers easier to support.

To enable screen reader support, you need to go into either your project or Engine Console Variable configuration file. Once in the file, add the variable Accessibility.Enable=1.

For more information, see Supporting Screen Readers.

New: Wacom Tablet Support (Experimental)
Programmers working on features like a painting plugin or modeling tools can now take advantage of stylus inputs, such as pen pressure and tilt, using a new plugin that provides access to the additional inputs that Wacom-style tablet and stylus systems provide.

Not all tablets support all possible values that the API supports - the subsystem has intentionally been written to expose a superset of all supported values. It is up to the user of the subsystem to determine what values they are interested in.

This is an experimental feature, and it is not supported by any Unreal Engine tools as of yet.

New: UMG Widget Diffing
We have expanded and improved Blueprint Diffing to support Widget Blueprints as well as Actor and Animation Blueprints! The new tools also show changes made to the structure of the Blueprint, adding property and function flags, class settings, parent class, and added Components, in addition to default property values (which now include the default properties of Widgets and Widget Slots) and changes to Blueprint Graphs.


If you have written a custom Blueprint subclass that you would like to diff, you can override the FindDiffs function, which enables you to list specific changes you want to show, and to request subobjects for diffing.

New: Non-Destructive Landscape Editing (Experimental)
Landscape Heightmaps and paint layers can now be edited with non-destructive layers. You can add multiple layers to your landscape that can be edited independently from each other. These new layers function as a foundation for sculpting and painting a landscape, which allows you to manipulate and maintain landscapes more efficiently.

As you add layers, you can lock layers you don’t want to change and focus on editing one layer at a time. You can also hide layers to help focus on a specific layer, or see what the landscape looks like without a certain layer. Lastly, by enabling Layer Contribution, the layer highlights in the viewport and you can see all of the sculpting and painting within that layer, even as you add to the layer. There are other new options, such as ordering layers and adjusting the layer alpha blending.

Landscape splines terrain deformation and painting can now be a non-destructive process by reserving a layer for splines. This means that you can now edit, change, and move splines non-destructively and the landscape will long roads or paths through your landscape.

For more information, see Non-Destructive Landscape Layers and Splines.

New: Place Interactive Actors with Foliage Tool
The Foliage Tool now supports populating a scene with interactive Actors in addition to Static Meshes. Actors placed by the Foliage Tool will behave the same way that Static Meshes do, automatically scattering when you sculpt the terrain or move the Static Meshes that you painted them on.

For example, in this video, the scattered trees are Blueprint Actors that contain interaction logic along with their Static Mesh Components. And when the terrain is later modified, these Tree Actors are automatically updated to match the new height of the terrain.

Foliage Actors are not rendered as Instanced Meshes because they are treated by the renderer as if they were individually placed by hand into the Level.

For additional information, read more about Foliage Mode.

New: HDRI Backdrop Actor
The new HDRI Backdrop Actor makes it faster and easier to create a realistic background and lighting environment for your Level from a single HDRI image. Place the Actor into your Level and assign it the HDRI texture you want to get your image projected onto a backdrop, a Sky Light automatically set up to provide ambient light drawn from the image, accurate reflections, and a floor surface that captures shadows cast from your Level content.

For details on the workflow, and on all the settings that you can use to control the projection, see HDRI Backdrop.

New: Dual Height Fog for Exponential Height Fog
We improved control over the fog with additional parameters for Fog Density, Height Falloff, and Height Offset of an additional fog layer when using an Exponential Height Fog Volume.


1 - No Exponential Height Fog; 2 - Exponential Height Fog; 3 - Dual Exponential Height Fog

New: Dynamic Shadow Bias Improvement
We improved shadow biasing for movable lights in this release by adding some new parameters that can be set per-light or globally per-light type using a console variable. In addition to the constant Shadow Bias parameter, we’ve added the Slope Bias parameter to help resolve some (but not all) issues with shadow artifacts and acne. For Directional Lights, we added an extra depth bias parameter with Shadow Cascade Bias Distribution to control the bias strength across cascades.


1 - Before Slope Bias and Shadow Cascade Bias Distrubution; 2 - After Adjustments to Slope Bias and Shadow Cascade Bias Distribution

There are two parts to consider: the Slope Bias is used during shadow map rendering, and the Receiver Bias during the shadow map fetching. The Slope Bias is controllable per-light and is proportional to the Shadow (Constant) Bias. With these two parameters (the Constant and Slope Bias), there is a trade off in shadow quality versus accuracy that will resolve some artifacts.

To control the Receiver Bias, use the console variables under r.Shadow.* to set a value between 0 (better accuracy with more artifacts) and 1 (less accuracy with fewer artifacts) to set the receiver bias globally per-light type. You can set any light-type’s constant and slope bias globally using console variables, also.[br]
New: Pre-Skinned Local Bounds Material Expression
We’ve added a new Material Expression to return the Pre-Skinned Local Bounds of Skeletal Meshes. This expression enables you to be able to calculate a relative position inside the bounds of an Actor through the Material. Since these bounds don’t change - even when animated - it enables you to apply a material in a consistent or fixed manner, such as a pattern like a decorative wrap applied to a weapon or vehicle. In the Animation Editors, you can visualize the Pre-Skinned Bounds of any mesh from the Character drop-down under the Mesh category.

New: Storing Custom Per-Primitive Data
We now support storing data on a per-primitive level instead of per-Material Instance, enabling primitives to be automatically considered for dynamic instance drawing.

Storing data with Use Custom Primitive Data per-primitive has the advantage of lowering the number of draw calls required for similar geometry, even if each primitive were to have to have its own custom data.

New: From Material Expression Shading Model
We’ve added support for multiple shading models to be used in a single Material using the new From Material Expression Shading Model!


Previous workflows using the Material Output and Material Attributes node are supported, and common workflows using If-Statements, BlendMaterialAttributes, Static Switches, and Material Instances are also fully supported.

This can be an opportunity to optimize and reduce the number of draw calls used if a single asset is using two separate Materials, equaling two draw calls used for each instance of that asset in the level. Using a single Material with two shading models can reduce this to a single draw call.

For additional details, see the From Material Expression documentation.

New: IES Profile Improvements

With this release, we’ve made some improvements to working with IES Profiles in the Editor and with different light types:

  • Selected Point and Spot lights with an assigned IES Texture now provide a 3D visualization of photometric data.

  • There is better support for Type C IES files that improve axial symmetry display without artifacts.

  • IES Texture icons in the Content Browser now give a preview of the photometric data.

For additional details, see IES Light Profiles.

New: Render Dependency Graph
The Rendering Dependency Graph (RDG) — or simply, “Render Graph” — is designed to take advantage of modern graphics APIs to improve performance through the use of automatic asynchronous compute scheduling, as well as more efficient memory and barrier management

Unreal Engine’s renderer is being actively ported to RDG and is the primary API for authoring render passes for new features going forward. The implementation is still in early development and lacks many of the performance benefits right now, but the API is stable enough to use in production.

For additional information, see
Render Dependency Graph.

New: Composure Improvements
In this release we have added some additional options for Composure:

  • AlphaHoldOut Blend Mode - This new Material Blend Mode enables objects to hold out the alpha in the Material, punching a hole through objects behind it.

  • Color Grading - Composure now supports color grading and white balance using floating point post processing lookup tables (LUTs).

  • Composure Layer inherits Post Process Parameters from Scene Camera - Composure Layers can now inherit Post Processing parameters from the scene camera, enabling color correction controls to be optionally enabled separately for each CG Layer.

The Composure sample available from the Learn Tab in the launcher has also been updated to reflect the latest workflows for compositing in Unreal Engine!

New: Python Import/Export FBX
Python scripting now supports importing and exporting FBX animations.

New: Pro Video Codecs
The Unreal Engine now supports additional video codecs, making it easier to integrate Unreal into professional video production pipelines and workflows.

You can now export Pro Media files to Apple ProRes Encoder:

  • All formats of the codec are supported: 4444 XQ, 4444, 422 HQ, 422, 422 LT, 422 Proxy

  • Multiple frame rates and resolutions.

  • Embedded timecode track is supported.

  • No embedded audio. Audio is mixed down and exported to a separate .wav file.

  • Supported on Windows platforms only.

For details, see the new how-to guide, Exporting Pro Media Files to Apple ProRes

The Media Framework can now playback files encoded with HAP Codecs.

  • All formats of the codec are supported: HAP, HAP Alpha, HAP Q, HAP Q Alpha

  • Supports playback for a 1x 4K 60 FPS movie or 2x 4K 30 FPS movie, which can be stretched to 2x 4K 60 FPS movies.

  • Full support for alpha channels.

  • Multiple frame rates and resolutions.

  • No embedded audio or timecode support.

  • 8K and 16K are not supported at this time

For details, see the HAP Codec Playback Support section in Media Framework Technical Reference.

New: Stereo Panoramic Capture Tool Improvements (Experimental)
With the updates to the Stereo Panoramic Capture tool, it’s much easier to capture high-quality stereoscopic stills and videos of the virtual world in industry-standard formats, and to view those captures in an Oculus or GearVR headset. You have expanded control over render settings, bit depth, and quality; you can also choose the graphic buffers you want to capture, making it possible to post-process and composite the images in other applications.

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.11 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 10.3

  • Android

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

  • ARCore

    • 1.7

  • HTML5

    • Emscripten 1.38.31

  • Linux “SDK” (cross-toolchain)

  • Oculus Runtime

    • 1.37

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.34

  • Lumin

    • 0.19.0

  • Steam

    • 1.42

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 8.3.0 + optional NEX 4.6.3 (Firmware 7.x.x-x.x)

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • PS4

    • 6.508.001

    • Firmware Version 6.510.011

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • XBoxOne

    • XDK: July 2019 QFE-9

    • Firmware Version: May 2019 10.0.18362.3055

    • Supported IDE: Visual Studio 2017

  • MacOS

    • SDK 10.14

  • iOS

    • SDK 12

  • tvOS

    • SDK 12

Upgrade Notes

  • With the release of Unreal Engine 4.23, Matinee is no longer supported and will be removed from the engine in an upcoming release. Once removed, you will no longer be able to access or open Matinee files.

  • Please use the Matinee to Sequencer Conversion Tool to convert any Matinee sequences to Sequencer Sequences as soon as possible.

VR Editor

  • The VR Mesh Editor presented at GDC 2017 is no longer supported. The Mesh Editor plugin will be removed from the engine in an upcoming release.


  • HTML5 platform support will be migrated to GitHub as a community-supported Platform Extension and no longer officially supported by Epic in upcoming releases.


  • Support for iOS 10 has been removed. iOS 11 is now the minimum supported version.

  • OpenGL on iOS will be removed in an upcoming release, potentially as early as 4.24. Once removed, Metal will be the only rendering path for iOS devices going forward.

Release Notes

  • Bug Fix: AISense Sight now preserves its result history when its config gets updated at runtime.

  • Bug Fix: Fixed an edge case in EQS result sorting where it would sort the results multiple times if doing a time-sliced expensive filter test at the end.

  • Bug Fix: Fixed a bug in EQS test sorting that was resulting in test order not matching the feature’s design. The fix also improves runtime EQS performance when running queries in a ‘single item’ mode.

  • Bug Fix: Fixed using wrong EQS test scoring sign during inverse linear scoring.

  • Bug Fix: GetKnownPerceivedActors used with a given Sense class no longer returns actors once stimuli are forgotten.

  • New: EQS Volume Test - A Simple EQS Test to check if a point is in one AVolume (volumes list generated either by a context or a AVolume class). The test can do either simple bounding box checks or a full physic test for more complex volume shapes.

  • New: TeamAttitude enum is now a BlueprintType.

  • New: Added an option in EnvQueryTest_Overlap to filter out the actor performing the query.

  • New: Added a comment keyboard shortcut for Behavior Tree editor.

  • New: The AI Support plugin now forcibly loads AI modules early in the Editor startup sequence. They are no longer loaded by Blueprint UI.

Behavior Tree

  • Bug Fix: Made Behavior Tree Editor comment creation consistent with Blueprint Editor so that comments get created when a single node is selected.

Debugging Tools

  • Bug Fix: Added logging to the two cases that can make RecastNavMeshGenerator recreate the dtNavMesh instance.

  • Bug Fix: Fixed a bug where you would not see any instances of the BehaviorTree when opening the debugger after PIE was started.

  • Bug Fix: Fixed BehaviorTree not pausing dedicated server world upon breakpoint in BehaviorTree editor in PIE.

  • Bug Fix: Behavior Tree Debugger now resumes a session paused by a Blueprint breakpoint.

  • New: Added a way to configure navmesh drawing GameplayDebugger category to mark up “forbidden” nav polys (the ones that have extended navmesh drawing to be able to optionally mark polys excluded by navmesh’s default query filter (via dtQueryFilter.data.m_excludeFlags). See FRecastDebugGeometry.bMarkForbiddenPolys property and ai.debug.nav.DrawExcludedFlags console variable.

  • New: When picking pawn in the GameplayDebugger, it also selects it in the UE Editor. That way the BehaviorTreeEditor automatically changes to the right one.


  • Crashfix: Fixed editor crash when trying to use NavigationSystemBase class with NavigationSystemModuleConfig.

  • Bugfix: Fixed a tiny editor-time memory leak occurring when FRecastNavMeshGenerator fails to create or initialize dtNavMesh. This can happen when navigation bounds get removed.

  • Bugfix: Fixed Detour’s CollectRegionsMonotone, CollectRegionsChunky, CollectLayerRegionsMonotone and CollectLayerRegionsChunky to not fail as ‘out of memory’ when no regions were found. Instead, if the region count is 0 we simply return as ‘success’ since no issues occurred. Updated the rest of nav generation process to handle these results properly.

  • Bugfix: Made sure we mark all the navigable space dirty after recreating dtNavMesh instance due to mismatching navmesh properties.

  • Bugfix: Fixed a bug in ARecastNavMesh::GetRandomReachablePointInRadius that resulted in erroneous behavior for large Radius values.

  • Bugfix: Fixed NavModifierVolume not updating navmesh upon undoing changes in the Editor

  • Bugfix: Fixed gathering of lazy navigation collision of landscape.

  • Bugfix: Deprecated K2_GetRandomPointInNavigableRadius, and replaced it with BlueprintCallable K2_GetRandomLocationInNavigableRadius. Initialized RandomLocation to Origin, and will only set it upon success.

  • Bugfix: NavLinkProxy using SmartLinks are now loaded with the proper transform.

  • Bugfix: Made NavModifierComponent work properly even if its owner’s root component was marked as nav-irrelevant.

  • Bugfix: Forcing re-registering NavAreas modified in the Editor to support better debugging via NavigationTestingActors (for example) and changing area costs in between PIE sessions.

  • New: Added functions for quick replacing of nav area information in NavOctree and RecastNavMesh:

    • ARecastNavMesh::ReplaceAreaInTileBounds replaces occurrences of given area directly on navmesh polys (checking and setting areaID) in tiles overlapped by given bounding box.

    • UNavigationSystemV1::ReplaceAreaInOctreeData replaces occurrences of given area in object’s nav representation in the NavOctree.

  • New: Added the concept of supported navigation agents to Smart Links.

  • New: Added ProjectGoalOnNavigation parameter to the AIMoveTo function to allow the user to disable navigation usage entirely.

  • New: Added a way to query the NavMesh generator to determine if generation is taking place at a given moment inside a specified bounding box.

  • New: Adding some perf starts to RegisterNavOctreeElement / UnregisterNavOctreeElement. These functions have proven to be quite expensive when there is a lot of geometry in the NavOctree.

  • New: Added a new ConditionalPopulateNavOctreeActor Delegate to the Navigation System.


  • **Crash Fix: **Fixed crashes and inconsistent values when accessing BoneSpaceTransform due to a memory swap that happens during evaluation.

  • Crash Fix: Fixed a crash in TriggerMontageEndedEvent when a montage end notification triggers actor destruction.

  • Crash Fix: Fixed a crash when a redirector is displayed for a skeletal mesh upon renaming an asset.

  • Bugfix: Fixed memory corruption in FSkeletalMeshMerge::GenerateLODModel().

  • Bugfix: Fixed a problem related to adding curves when using an Animation Modifier.

  • Bugfix: Addressed a couple of issues with Animation Notify functions in the AnimationBlueprintLibrary.

  • Bugfix: Fixed use of uninitialized member in Anim Instance proxy.

  • Bugfix: Fixed condition where having an Additive animation state in an Animation Sharing setup asset would cause the system not to initialise.

  • Bugfix: Ensured that Alembic files as Static Meshes import correctly when skipping empty frames.

  • Bugfix: Fixed an issue with thread access of the Default Curve UID List.

  • Bugfix: Removed unnecessary Animation Property Changed events in undo log.

  • New: Removed cloth simulation logic from FAnimationBudgetAllocator::TickEnableHelper(). Some use cases require the mesh component to tick but have cloth disabled.

  • New: Improved quality of motion vectors when playing back Geometry Cache files.

  • New: Improved Additive animation support in Animation Sharing system by making them consistent.

  • Optimization: We now normalize bone rotation only once when getting the animation pose out of the pose asset.

Animation Blueprints

  • Crash Fix: Fixed a crash related to right-clicking a Sequence Player node in an Animation Blueprint, after previously deleting Animation Sequence asset.

  • Crash Fix: Fixed crash in FAnimNode_RigidBody caused by referencing bones that don’t exist at lower LODs.

  • Bugfix: Reinitialized the Copy Pose From Mesh node when the target mesh changes. Fixing the Animation Pose breaking when dynamically changing between Skeletal Meshes that use the same Animation Blueprint but have a different number of bones.

  • Bugfix: Added checks to ensure that Animation Montages cannot be played back using an Animation Sequencer Player node.

  • Bugfix: Fixed issue where Animation Notify events would not show up as implementable in the Animation Blueprint event graph.

  • New: “Layered blend per bone” node now has an option “Mesh Space Scale Blend” which performs scale blending in mesh space instead of local space.

  • New: Improved tooltips for the AnimDynamics Animation Blueprint node.

  • New: Users can now enable / disable cone drawing for the input poses with PoseDriver.

  • New: Added a warning message to the Constraint Animation Blueprint node to flag nodes which don’t have normalized weights.

Animation Tools

  • Bugfix: The Animation Editor now unregisters certain detail layout delegates on shutdown.

  • Bugfix: Fixed an issue where the Editor would freeze if an Anim Composite length was set to 0, while having an animation with a notify.

  • Bugfix: Made sure Skeleton Tree is refreshed when re-importing a Skeletal Mesh.

  • New: When using custom AnimNotify classes, it is now possible to have the UI automatically generate a bone name search field for a property if the AnimNotifyBoneName is used. For example:

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AnimNotify", meta = (AnimNotifyBoneName = "true"))
    FName SocketName;


  • Bugfix: Fixed an issue with disabling import bone tracks.

  • New: Added MorphTarget support when exporting Skeletal Mesh.

Skeletal Mesh

  • Crash Fix: Attempting to rename multiple sockets in a Skeletal Mesh at the same time no longer causes a crash.

  • Crash Fix: Fixed crash in FSkeletalMeshComponentDetails::UpdateAnimationCategory when a custom Skeletal Mesh Component hides the Animation category via the HideCategories UCLASS specifier.

  • Bugfix: Fixed issue where Create Render State was destroying morphtarget values which was causing flickering.

  • Bugfix: Fixed crash when a virtual bone exists but the retargeted Skeleton does not include the virtual bone.

  • New: Support for AnimClass Property Track by exposing SetAnimClass,GetAnimClass. Added redirects for k2_SetAnimInstanceClass (and previous SetAnimInstanceClass).


  • Crash Fix: Fixed crashes when requesting an eviction of the same sound in the same frame from multiple concurrency groups.

  • Crash Fix: Fixed a crash when releasing reverb with Steam Audio.

  • Crash Fix: Fixed a crash when passing a null TimeSynth volume group to SetVolumeGroup.

  • Crash Fix: Fixed crashes when using the new Spectrum Analyzer data getter method.

  • Crash Fix: Fixed a crash in Flexiverb due to updates being called in SetSettings.

  • Crash Fix: Fixed a crash when attempting to play TimeSynth before activation.

  • Crash Fix: Fixed a hang when hot reloading in UAudioCaptureComponent.

  • Crash Fix: Fixed a crash when VirtualLoop was attempting to realize.

  • Crash Fix: Fixed a hang during cook.

  • Crash Fix: Fixed a hang in the audio mixer during flush.

  • Crash Fix: Fixed a rare crash in the editor when PIE is exited on Mac.

  • Crash Fix: Fixed a hang in audio streaming.

  • Crash Fix: Fixed crashes when handling failed sound initialization.

  • Crash Fix: Fixed a crash when updating listener transform.

  • Bug Fix: Fixed a bug in Phaser DSP effects where audio would go silent at certain project sample rates.

  • Bug Fix: Fixed a bug where Synth Sample Player would not play older sounds that still reported 0 samples.

  • Bug Fix: Fixed a bug where Concatenator Sound Nodes wouldn’t report a Delay if it was not the first child node in an execution tree.

  • Bug Fix: Fixed a bug where Distance Crossfade SoundCue node returned incorrect volume.

  • Bug Fix: Fixed a bug with hashing collisions in SoundNodes.

  • Bug Fix: Fixed a bug where stereo sources upmixing to surround used an incorrect listener distance for spread calculation.

  • Bug Fix: Fixed a bug with MIDI Pitch Bend parsing errors.

  • Bug Fix: Invalid prompts are now suppressed when importing/reimporting sound.

  • Bug Fix: Effect presets will now update in real-time while auditioning in the editor.

  • Bug Fix: Dynamic Volume feature now allows sound volumes to be selectively modified by hotfixing to work with the new audio mixer.

  • Bug Fix: Fixed concurrency not being observed properly when “Limit To Owner” was set.

  • Bug Fix: Fixed USynthComponent object reference to prevent GC.

  • Bug Fix: Fixed distortion and zippering during panning.

  • Bug Fix: Fixed leaked async task in the audio mixer.

  • Bug Fix: Fixed accidentally culling sounds before they async load in.

  • Bug Fix: Fixed potential memory leak on consoles when au.IsUsingAudioMixer was changed.

  • Bug Fix: Fixed ambisonics decoding with Google Resonance Audio.

  • Bug Fix: Fix for cvar swapping to legacy backend after launching with the audio mixer on PC when there are no audio devices available.

  • Bug Fix: Fixed issue where audio output on Android would stutter on devices that requested specific buffer sizes.

  • Bug Fix: Fixed native reverb for use with Google Resonance Audio and added the ability to disable HRTF spatialization via cvar.

  • Bug Fix: Fixed various potential crashes when loading and unloading USoundWave assets while playing streaming data.

  • Bug Fix: Fixed various issues associated with changing or disconnecting Playback Devices while the engine is running.

  • Bug Fix: Fixed pops on audio mixer due to timing problems with mixes.

  • Bug Fix: Fixed XMA2 streaming for audio mixer.

  • Bug Fix: Fixed audio streaming crashes.

  • Bug Fix: Fixed occlusion interpolation.

  • Bug Fix: Fixed a crash that would occur if a Sound Wave asset failed to cook properly.

  • Bug Fix: Fixed sound being removed from the streaming manager before it has stopped playing in the audio renderer.

  • Bug Fix: Enabled reverb to be muted while app is in the background.

  • Bug Fix: Enabled real-time decoding in audio mixer to be in the background priority thread pool.

  • Bug Fix: Added missing delete in audio streaming manager.

  • Bug Fix: Fixed failing initialization of audio device when no audio devices are available.

  • Bug Fix: Fixed virtualize when silent and loop virtualization.

  • Bug Fix: Fixed looping discontinuity with the audio mixer and ADPCM.

  • Bug Fix: Further fix for reverb, reducing the volume of quad verb by 0.5 to maintain power.

  • New: MaxChannels can now be overridden by any platform setting on initialization, not just the minimal value of the two.

  • New: Added spread to Stereo Panner effects to allow more interesting stereo channel operations.

  • New: Audio is now seekable on all platforms for streaming sounds using LPCM/ADPCM.

  • New: Included the ability to selectively target per platform audio settings and initialize accordingly. This is provided in .ini files for new projects.

  • New: Created a mid/side Spread control Source Effect.

  • New: Added mid/side decoding/encoding to the DSP library.

  • New: Standardized visualization calls with new au.3dVisualize family of commands.

  • New: Sounds limited by concurrency groups can now recover from volume ducking using a prescribed fade in/out time.

  • New: Included asset actions to create time synth clips from sound waves.

  • New: Added the ability to control Submix and Source Bus send levels based on listener distance.

  • New: Virtualizing looping audio sources is now possible; they can be visualized using the new au.VirtualLoops family of debug commands.

  • New: When importing, added the ability to templatize for non-imported properties of USoundWaves from pre-existing USoundWaves.

  • New: Concurrency now supports a user-specified fade out time due to a concurrency group stealing the playing sound’s voice.

  • New: Added feature to enable audio mixer toggling to only happen once per load.

  • New: The HTML5 platform now uses the new Unreal Audio Engine by default.

  • New: Enabled Google Resonance Audio to make a global spatialization source setting, if one is not specified in the global plugin preset.

  • New: Added setting to disable creating new audio devices for PIE.

  • New: New getter functions on audio component retrieve data directly with no frequency interpolation.

  • New: Added the ability to log baked fft/envelope data to csv files.

  • New: Added the ability to override the sound wave to use for analysis of FFT attack/release envelope following.

  • Improvement: Optimized per-source low and high pass filters to run over 3 times faster.

  • Improvement: Optimized the built-in Audio Mixer Reverb Submix Effect to run 5 times faster.

  • Improvement: Command line auto-complete now supports all audio commands.

  • Improvement: The default mapping of surround speaker angles now align with Dolby specifications for 7.1 and 5.1 configurations.

  • Removed: Removed OneShotPriorityCullThreshold in AudioDevice.

  • Removed: Removed UAudioSettings::MaxWaveInstances.


  • Crash Fix: Fixed crash when editing user structs that are being used in a Blueprint instance that is open for editing.

  • Crash Fix: Fixed crash when changing classes on a blueprint while a different window is open for that blueprint.

  • Crash Fix: Fixed crash on load when using a Make Struct node in a blueprint, due to using a property that isn’t visible to as an override pin.

  • Crash Fix: Saving a Blueprint that contains a Map variable whose default value includes an empty (unset) key will no longer crash the editor.

  • Crash Fix: Opening a partially-deleted Blueprint asset for editing after a failed attempt to force delete it will no longer crash the editor.

  • Bug Fix: Fixed rare crash when renaming a blueprint component via its variable.

  • Bug Fix: Deprecated API usage warning messages are now more consistent after compiling a Blueprint class/graph. Also fixed an issue where the deprecated API usage warning could appear more than once in the tooltip text.

  • Bug Fix: Fixed accessed none errors caused by accessing a Timeline component that is not connected to anything in its defining blueprint from another blueprint.

  • Bug Fix: Fixed crash that occurred when trying to change the type of a variable while in the blueprint diff window.

  • Bug Fix: Fixed a crash that sometimes occurred when mousing over output parameter pins during blueprint debugging.

  • Bug Fix: Fixed an ensure() that fired on an attempt to paste one or more Blueprint nodes with missing links into another graph that doesn’t allow the node type(s).

  • Bug Fix: Fixed an ensure that fired when reloading a Blueprint asset with the current debug object in the Blueprint editor set to an instance of the Blueprint’s class.

  • Bug Fix: PostDuplicate function for blueprints now also calls the PostDuplicate function on the CDO of their generated class.

  • Bug Fix: Enum literal values are now included in Blueprint search indexing along with functions that are referenced by Create Event nodes.

  • Bug Fix: The implicit World Context pin will no longer be visible and connected when dragging off an object pin and creating blueprint nodes that have a hidden world context pin as their first parameter.

  • Bug Fix: Fixed the DataAsset and Property Matrix editor to refresh properly when recompiling a parent blueprint

  • Bug Fix: PointLight, RectLight, and SpotLight now properly allow the contained light component to have their properties edited when subclassed in blueprints.

  • Bug Fix: Scroll wheels that can scroll in increments of less than 1 (eg. some Microsoft mice) can now zoom-in the blueprint editor.

  • Bug Fix: The ‘Override Function’ dropdown in blueprints is now sorted by name and searchable.

  • Bug Fix: The ConstructObject node can now correctly have a class variable of type Object connected to the Class pin.

  • Bug Fix: Changing a parameter’s container type or pass by ref flag is now correctly transacted.

  • Bug Fix: Reordering categories now correctly creates an undo record and marks the Blueprint as modified.

  • Bug Fix: The Blueprint graph overlay now properly includes a client/server context label when a streaming level actor instance is selected as the active debugging context during a multiplayer PIE session.

  • Bug Fix: When applying instance changes to a blueprint, instance-only properties will no longer get copied to the blueprint.

  • Bug Fix: Blueprint compile errors are now more easily locatable after failing to start a PIE session. (contributed by KristofMorva).

  • Bug Fix: Make ‘Redraw Time’ have a Blueprint-friendly name

  • Bug Fix: Fixed issue which could cause blueprints using FText to cook non-deterministically

  • Bug Fix: The active debug object drop-down now includes a server/client context label during a multiplayer PIE session to differentiate between Actor instances with the same name when “All worlds” is selected. The overall selection behavior in the drop-down UX has also been improved.

  • Bug Fix: Fixed crash when adding a component in the blueprint editor after undoing an add component action

  • Bug Fix: Compact impure nodes (e.g., Array Add) now correctly show enabled/development-only/disabled states like other impure nodes

  • Bug Fix: You can now change the Multiline option for arrays, sets, and maps that contain strings or text as the inner/value property

  • Bug Fix: Removed duplicate tooltip and category settings in the details panel when editing Event Dispatchers

  • Bug Fix: Delegate nodes now correctly use DisplayName if specified on the property.

  • Bug Fix: The Blueprint editor will now open on a click to view properties from Find-in-Blueprints results.

  • Bug Fix: Fixed incorrect error message popping up when renaming a blueprint component and the text had been changed and then returned to the original value.

  • Bug Fix: Compiled Blueprint output terms now adhere to a format that utilizes the name table more efficiently (runtime memory optimization).

  • Bug Fix: Redirected delegate nodes now correctly have a target pin type of the containing blueprint.

  • Bug Fix: A compiler warning will now appear on nodes that reference a deprecated event dispatcher (MC delegate) variable in a Blueprint class.

  • Bug Fix: Soft references to actors can now be set in Data Tables, hard references are still outlawed for safety reasons

  • Bug Fix: Fixed crash reparenting a scene component blueprint to actor component.

  • Bug Fix: The active debug world instance drop-down now excludes streaming subworlds that previously appeared as ‘Standalone’ during a PIE session.

  • Bug Fix: Fixed ensure that would occur when multi-selecting make, break, or get class default nodes of the same node type, but for different structs with the same number of pins. Now the details panel will only display the show/hide pins if all selected nodes are of the same node type as well as the same struct/class type.

  • Bug Fix: Fixed bug where Arrays, Maps, and Sets of components/widgets were not correctly instanced at runtime when the variable was added by a blueprint class

  • Bug Fix: Stoped temporary blueprints loaded for diff or other tools from showing up in class pickers and causing data loss.

  • Bug Fix: Passing the result of GetMousePosition directly into SetMousePosition in a blueprint no longer causes the cursor to drift to the top-left corner.

  • Bug Fix: Fixed blueprint functions being able to be renamed the same as an existing property or base class function.

  • Bug Fix: ConstructObjectFromClass nodes are now included in Find-in-Blueprint search results (contributed by KristofMorva).

  • Bug Fix: The blueprint compiler and bytecode interpreter no longer call ‘GetFunctionCallspace’ for functions that are not flagged as net functions

  • Bug Fix: Fixed crash when dragging a non-placeable actor class on to the blueprints components panel.

  • Bug Fix: Blueprints construction script function can now be safely duplicated into a new, normal function.

  • Bug Fix: Toggle comment bubble on a blueprint node properly returns to constant visibility and comment bubbles on reroute nodes no longer disappear when compiling.

  • Bug Fix: Blueprint function parameters are now case sensitive to renaming.

  • Bug Fix: User-defined structs/enums can no longer be reloaded from the editor, to avoid crashes.

  • Bug Fix: Fixed bug that could cause the Blueprint Editor UI to make it appear as if a parent blueprint was being altered by edits to its children.

  • Bug Fix: Fixed crash when reparenting a blueprint component from scene to actor while an actor blueprint containing that component is opened.

  • Bug Fix: Changes to the scene component hierarchy in actors containing a blueprint defined component when switching the blueprint defined component from actor to scene are now more consistent with changes from adding a component from via UI.

  • Bug Fix: Multi-gate node is now correctly limited to having 32 outputs.

  • Bug Fix: Fixed bug that could cause transaction buffer reference to old instances of Blueprint archetypes, causing issues when mixing blueprint compilation, undo/redo, and changes to default values.

  • Bug Fix: Legacy Blueprint assets that own one or more child redirector objects can now be fully deleted in the Content Browser.

  • Bug Fix: The type selector for map values now correctly clips the text to the selector box.

  • Bug Fix: Fixed several issues where types like Tags, Soft Object References, and Text were not properly tracked or had redirectors fixed up if used as function inputs or local variables. As a result, localized text strings used in blueprint functions may change package namespace.

  • Bug Fix: Fixed log spam on attempt to change focus to an empty Blueprint search result.

  • New: Added support to the ke (kismetevent) command for broadcasting to all instances of a class by passing in the class name as the target

    • Improved the success/failure logging for all variants of ke.

    • ke classname command [args] will now find all instances of that class in the current world and call it on them (printing out the number of instances & successes, as well as the fully qualified class name found).

    • ke instance_name_or_path command [args] will now print out the fully qualified name of the object found and whether or not the call was successful (not just whether or not the object was found). Note that the name displayed in the world outliner for an actor is not always the same as the underlying actor name.

    • ke * command [args] will now print out the number of successes.

  • New: When getting debug info for a blueprint function’s output parameter, display the value of the connected pin if the output parameter is connected to another node.

  • New: Added the ability to deprecate user-defined variables, functions and custom events in the Blueprint editor. The behavior is the same as deprecated properties, functions, and events inherited from a native C++ parent class.

  • New: Changed the function icon for pure functions to be green in the My Blueprint list.

  • New: Added development commands to audit bytecode contents:

    • ScriptAudit LongestFunctions - List functions that contain the most bytecode - optionally include the number of entries to list.

    • ScriptAudit FrequentFunctionsCalled - List functions that are most frequently called from bytecode - optionally include the number of entries to list.

    • ScriptAudit FrequentInstructions - List most frequently used instructions - optionally include the number of entries to list.

    • ScriptAudit TotalBytecodeSize - Output total size of currently loaded bytecode in bytes.

  • New: Added GetActorOfClass node.

  • New: Mouse Capture Mode can now be set from Blueprints.

  • New: The number of actions primed into the blueprint action database per frame is now controllable via the CVar bp.DatabasePrimingMaxPerFrame.

  • New: Added blueprint compiler extensions (UBlueprintCompilerExtension), providing developer modules/monolithic editor extensions a chance to do further game-specific blueprint validation.

  • New: Added Getting Player Controller via the Controller ID as a blueprint widget.

  • New: Added support for reordering and recategorizing Blueprint functions by drag-dropping in the My Blueprint list.

  • New: Impure compact nodes (e.g., array add) will now ensure that the first pin on each side is aligned with other impure nodes, making it easier to have a straight execution path.

  • New: Added support for BlueprintAutoCast functions that take in or return container types like TArray.

  • New: “Call in Editor” functions only include unique function names to avoid duplicates when functions are overridden by children.

  • New: Added support for setting the display name of the AsyncTaskProxy pin on async BP nodes by setting ExposedAsyncProxy=“DisplayName”. Changed the display name of the pin for GameplayTasks to AsyncTask instead of AsyncTaskProxy.

  • New: Added LoadAssetClass_Blocking and ToSoftClassReference functions to KismetSystemLibrary and improved comments and load behavior for existing Soft Object Reference versions.

  • New: Added ReturnDisplayName metadata to UFUNCTION, allowing overriding the pin name for the return value.

  • New: Added GetInputChordDisplayName node.

  • New: Deprecated function can now be exposed for use in the Blueprint editor.

  • Deprecated: The FEdGraphNode::GetDeprecationMessage() and FEdGraphNode::ShouldWarnOnDeprecation() APIs have now been deprecated in favor of FEdGraphNode::GetDeprecationResponse().


  • Crash Fix: Fixed a crash when using MallocAnsi with the MSVC compiler.

  • Crash Fix: Fixed a null pointer crash in AActor::Tick.

  • Crash Fix: Fixed DoLazyStaticMeshUpdateCVarSinkFunction crash during engine start-up when running commandlets.

  • Crash Fix: Fixed LLM shutdown crash caused by FLLMCsvWriter attempting to track its own destruction.

  • Crash Fix: Fixed issues with objects not being serialized before being ConditionallyPostLoaded by other objects and LoadContext related crashes.

  • Crash Fix: Fixed a crash when detaching linkers from serialize context.

  • Crash Fix: DuplicatedDataReader and DuplicatedDataWriter will now store UObject serialize context internally so that they do not crash in case of an error.

  • Crash Fix: Fixed a crash when calling the IsValid function on a moved-from TStrongObjectPtr.

  • Bug Fix: Fixed TUnion missing the assignment operator.

  • Bug Fix: Removed obsolete comment about multicast delegates deferring removal until they get compacted.

  • Bug Fix: Made sure all UObject delete and create listeners are removed from the global UObject before static exit to avoid crashes caused by removing listeners after the global UObject array has already been destroyed.

  • Bug Fix: Fixed rounding big numbers when reading int64 from JSON.

  • Bug Fix: Fixed GetMinAlignment function returning 1 for native UStructs and UClasses.

  • Bug Fix: Changed several implicit operator bools to explicit.

  • Bug Fix: Fixed potential infinite recursion when processing malformed XML.

  • Bug Fix: Fixed cook -iterate bug with incorrect disk sizes and TagsAndValues in cooked asset registries.

  • Bug Fix: Fixed TUniquePtr::Reset destroying the object being set if it was already set to that object.

  • Bug Fix: Fixed possible null pointer crash when attempting to get the game state by unique net id.

  • Bug Fix: Fixed a race condition in cook -diffonly where the same ubulk file was being written by multiple threads.

  • Bug Fix: Fixed incorrect disk sizes in asset registry by taking CookAdditionalFiles into account.

  • Bug Fix: Made it so that asset scan paths can handle having a trailing slash.

  • Bug Fix: Fixed a crash when reporting long reference chains with the ‘obj refs’ command.

  • Bug Fix: Improved LLM tagging to move items out of various miscellaneous categories and into something more explicit. Also added parent tags for Audio and Meshes.

  • Bug Fix: Fixed non-determinism in custom version serialization by sorting the custom version container by key.

  • Bug Fix: Fixed migration of Cvar values across a hot reload.

  • Bug Fix: Fixed a rare crash caused by UObjectDelete listeners not being locked when freeing UObjects on the Async destruction thread.

  • Bug Fix: Fixed UMaterialExpression::PostInitProperties to not mark its package as dirty on load.

  • Bug Fix: Enabled TStrongObjectPtr to be constructed with nullptr.

  • Bug Fix: Fixed TStrongObjectPtr being unable to be constructed with TStrongObjectPtr rvalues of other types.

  • Bug Fix: Enabled functions to be overloaded on unrelated TStrongObjectPtrs.

  • Bug Fix: Fixed incorrect const correctness and parameter types in some container allocators.

  • Bug Fix: Fixed hot reload crash caused by reinstancing unreachable Blueprint objects, whose class was changed, but still had the old layout.

  • Bug Fix: Fixed deserialization into bitfield property in StructDeserializer.

  • Bug Fix: Fixed FText to truncate rounding errors.

  • Bug Fix: Fixed a small memory leak in CookOnTheFlyServer by making sure to always clear hierarchy timers.

  • Bug Fix: Fixed undefined behavior caused by signed int overflow when adding two signed ints.

  • Bug Fix: Instead of crashing, added ensure and log errors for newly spawned Tick functions that are unable to be released.

  • Bug Fix: Removed an obsolete UnrealHeaderTool error that could cause false ‘class contains dependencies to itself’ errors.

  • Bug Fix: Removed global locks when logging through FOutputDeviceRedirector to avoid hangs when logging crashes.

  • Bug Fix: Fixed a race condition in cook -diffonly when writing the same ubulk multiple times.

  • Bug Fix: Fixed a dangling reference to a timer handle, and added some extra game thread checks to FTimerManager.

  • Bug Fix: Added extra checks to trap bad FTimerManager internal state errors.

  • Bug Fix: Fixed ensure when using some Russian characters for Text variables.

  • Bug Fix: Fixed Algo::RemoveIf to use the correct predicate return value (false) to signal preservation.

  • Bug Fix: Fixed LLM to retain the original pointer’s tag during a realloc.

  • Bug Fix: Fixed a race condition in FCrashReportingThread initialization.

  • Bug Fix: Increased buffer size for floats and doubles formatting in FGenericWidePlatformString::GetVarArgs to properly deal with MAX_DBL Buffer (which was 48 characters), and increased it to 340 characters to be sufficient for any double.

  • Bug Fix: StandardPlatformString::GetVarArgs now handles size_t and ptrdiff_t properly on 64-bit platforms — width and precision for strings now works correctly.

  • Bug Fix: Fixed an issue where UnrealPak failed to read from old pak files with no content.

  • Bug Fix: Removed some VS2015-specific TTuple workarounds.

  • Bug Fix: The cooker will no longer perform Event Driven Loader checks when doing iterative cooks because this would always lead to warnings about missing dependencies.

  • Bug Fix: Fixed documentation comments in FWeakObjectPtr.

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

  • Bug Fix: Supported absolute log file paths that contain ‘(’ characters.

  • Bug Fix: Fixed an UnrealHeaderTool crash when UINTERFACE declaration is not parsed properly — for example, due to a missing semicolon.

  • Bug Fix: Fixed a rare hang by pumping platform messages when a task graph drains other threads that were blocked on message dependencies.

  • Bug Fix: Fixed double to int conversion in FDumpFPSChartToEndpoint::DumpChart.

  • Bug Fix: Fixed log warning when trying to load cooked content in the editor to reflect the new setting that needed to allow it.

  • Bug Fix: Removed ‘stat hicthes’ from auto-completion list because it no longer exists in the engine.

  • Bug Fix: Fixed uninitialized member access in FExportReferenceSorter.

  • Bug Fix: Fixed soft object pointers to work properly if a referenced object is reimported or recreated, fixing the Data Table editor UI when reimporting a Data Table.

  • Bug Fix: Cooked Animation Blueprints will now properly work when loaded in the Editor.

  • Bug Fix: Optimized deserialization from compressed pak files when read from synchronous pak file handles.

  • Bug Fix: Disallowed memory mapping of encrypted files in a .pak, especially since the CPU needs to operate on the data.

  • Bug Fix: Pak file handles no longer store a pointer to a shared reader archive. Those readers are thread specific, and it means that handles cannot be read from different threads without causing problems. By storing a function that looks up the pak reader dynamically on each file operation, the requests will work properly from any thread.

  • Bug Fix: Fixed a licensee reported crash of LLM during shutdown.

  • Bug Fix: Fixed parsing error when FJsonReader reads a unicode character from a stream with a narrower char type.

  • Bug Fix: Initialized signature checking hash cache array when using CRCs — static analysis warning fix.

  • Bug Fix: Minor off-by-one correction to chunk hash failure warning message.

  • Bug Fix: Corrected platform implementations of VectorSign and VectorStep so that they are all consistent with the SSE implementation.

  • Bug Fix: Fixed call to IsValidLongPackageName function in FPackageName::DoesPackageExist to pass in the proper path. Previously, it would pass in an empty string.

  • Bug Fix: Fixed an issue with the changelist number being ignored when checking asset compatibility against engine hotfix releases.

  • Bug Fix: Fixed debug logging of chunk hashes for pak file signature check failures.

  • New: Cleaned up LLM behaviour with Realloc:

    • Made FMemory::Realloc not call into LLM to track a free if the original pointer was null

    • Made FMemory::Realloc not call into LLM to track alloc if the new size was zero (indicating a free)

  • New: Added concept-checking TModels trait used to check C++ concepts defined as special C++ structs.

  • New: Moved GAllowCookedDataInEditorBuilds declaration to a global header to allow it to be set programmatically by commandlets.

  • New: PkgInfo commandlet will now be automatically able to open cooked packages without the need to modify ini files.

  • New: Added -AllPackagesIn=Path command line param to recursively find all files under the specified folder, which is useful for dumping info for all cooked packages.

  • New: Added DDCCleanup commandlet that iterates over shared DDC directories and removes old (unused) cache files.

  • New: Moved code to reset linker on an object that is being destroyed before the object gets renamed to get better log output when debugging.

  • New: Added Invoke function support to Algo::Sort algorithms and TReversePredicate.

  • New: Added UnrealInsights performance inspection tool with associated event tracing and analysis framework.

  • New: Added Algo::Rotate, Algo::StableSort, and Algo::StableSortBy algorithms.

  • New: Fixed FSetElement to use default copy/move constructors and assignment operators for updates, such that TSet uses faster assignment where possible.

  • New: Replaced use of FindObject<UEnum> with StaticEnum<>().

  • New: Improved Visual Studio debugger visualization of FNames.

  • New: Where the iteration order does not matter, changed some TSortedMaps with FName keys to use faster ordinal-based comparisons instead of string-based comparisons.

  • New: To keep the API consistent, changed some SecureHash related buffer sizes from 32 to 64 bits.

  • New: Made string conversion significantly faster by using a constexpr ASCII bit set.

  • New: Added FAutoConsoleCommandWithWorldArgsAndOutputDevice for consistency with other auto-registering console commands.

  • New: Added support for the latest version of FramePro runtime integration code (v1.5.15.0).

  • New: FDebug::DumpStackTraceToLog can now be provided a heading to display instead of the default heading.

  • New: Added weighted moving average smoothing functions.

  • New: Added defines for string format specifiers for Unreal specific types, including int64, uint64, SIZE_T, SSIZE_T, PTRINT, and UPTRINT. Defines now exist for decimal and hexadecimal outputs — they are named with all capital letters starting with the type name and ending with _FMT. For SIZE_T, the defines are SIZE_T_FMT, SIZE_T_x_FMT and SIZE_T_X_FMT for decimal output, lowercase hexadecimal output, and uppercase hexadecimal output, respectively. The other types follow the same pattern. In addition there are several improvements and bug fixes to the generic wide character implementation of GetVarArgs, which is used in FString::Printf on some platforms.

  • New: Made FTickableGameObject registration and unregistration thread safe (registration is lock free).

  • New: Enabled TStrongObjectPtr’s FInternalReferenceCollector to be destroyed on the Garbage Collector’s Async destruction thread — as the underlying FGCObject generally works with it and multi-threading with garbage collection.

  • New: Removed unnecessary validation logic from FAsyncLoadingThread::ProcessLoadedPackages, reducing server load time by 10 percent on a local machine.

  • New: Removed inserting packages by priority when EDL is enabled.

  • New: Added TIsConst metafunction.

  • New: Modified Garbage Collector to perform UObject destruction on a worker thread so that it does not need to wait for it on the game thread.

  • New: Added gc.MultithreadedDestructionEnabled setting to be able to disable Async destruction.

  • New: Added boot trace instrumentation, which enables Unreal Insights to visualize all early activity that was previously only available in a separate log file using a special command-line option — these scopes now show up in the CPU profiling view of Unreal Insights.

  • New: Added general process lifetime tracing for Unreal Insights visualization.

  • New: Added bookmarks for Tick loop end, WinMain.Enter and WinMain.Exit, UnloadModulesAtShutdown, and EditorExit.

  • New: Added CookOnTheFlyServer trace and Selective DerivedDataCache instrumentation for Unreal Insights.

  • New: Removed sleep before setting Windows thread names, which were showing up in profiles.

  • New: Added FName page protection to guard against memory stomps.

  • New: Adding missing overload to Visual Logger for logging an arrow with a log category (instead of a log category name).

  • New: Switched to faster implementation of GetTypeHash(FSHAHash) to improve asset loading speed.

  • New: Added adapter operators for types that provide an operator<<, which take an FArchive& but not an FStructuredArchive::FSlot.

  • New: Enabled Visual C++ warning about incorrectly ordered member initializers in constructors.

  • New: UPackages will no longer be hashed with their outer as their outer is null and the resulting hash is the same as their name hash, nor will they be added to the object to outer map — this saves up to 3 MB of memory in our internal projects.

  • New: Enabled TSharedPtr to be comparable to nullptr.

  • New: Added proper support for TSet in StructSerializer and StructDeserializer.

  • New: Added proper support for object reference and its derivative (soft, weak, lazy, and class reference) in StructSerializer and StructDeserializer.

  • New: Returned a bool from multicast delegates’ Remove function to indicate if the binding was successfully removed, and an int32 from the RemoveAll function to indicate how many bindings were removed. Changed compaction on multicast delegates to only be performed if the Remove function succeeded.

  • New: Reduced Linker annotation memory usage by introducing new annotation array type that can reclaim memory from object ranges that no longer require the annotation.

  • New: Added IncrementExchange, DecrementExchange, AddExchange, and SubExchange to TAtomic.

  • New: Added InterlockedAnd, InterlockedOr and InterlockedXor to FPlatformAtomics.

  • New: Reduced cached archetype annotation array memory usage by 50 percent on 64 bit platforms by storing the archetype index instead of a pointer.

  • New: Added AndExchange, OrExchange, XorExchange as well as operators &=, |=, and ^= to TAtomic for integral types.

  • New: Added support for uint64 bitfield properties.

  • New: Added support for using FString with RegisterConsoleVariableRef.

  • New: Changed code that used TryEnterCriticalSection, followed by EnterCriticalSection into a straight EnterCriticalSection call — TryEnter* is redundant if you already decided that you want to enter the critical section.

  • New: Made it possible to do oriented captures with the SceneCaptureCubeComponent.

  • New: Enabled fast path for unique name generation for all cooked builds by default.

  • New: Removed .complete file functionality for CSV profiles, and added the OnCSVProfileFinished delegate that can be used to register for when a CSV profile is done writing.

  • New: Added support for the latest version of MemPro when using LLM.

  • New: Added a small Zip file Utility API.

  • New: Made FMath’s Perlin noise thread-safe and deterministic — this includes 2D and 3D versions.

  • New: Added new IncludeAssetBundles meta tag to support including referenced object properties in asset bundles for an owning object.

  • New: Collapsed asset redirectors when loading the redirector map — this should prevent issues where A->B B->C C->D. Previously A would not redirect to D, and now, A redirects to D.

  • New: Moved STAT_FAsyncPackage_CreateAsyncPackagesFromQueue to an inner scope to reduce the number of stat events it generates.

  • New: Dynamic Multicast delegates that are expected to be bound rarely can now specify that their storage be stored in a sparse allocation using the DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_ family of delegate definitions.

  • New: Changed ‘Allow Cooked Data in The Editor’ setting to prompt for editor restart.

  • New: Exposed a version of IConsoleManager::UnregisterConsoleObject, which takes a name so that unregistering can be done faster than O(N).

  • New: Added RSA support to the PlatformCrypto Plugin — only implemented for platforms that support OpenSSL. Note that other platforms have empty implementations.

  • New: Added const variants of some of the more common AddReferencedObject(s) functions to allow for FGCObjects to store const pointers to UObjects (or collections), and easily report those references; otherwise, people make the mistake of creating local pointers that cannot be nulled out correctly if they need to be collected.

  • New: Added support to pak platform file for a custom decryption function that a game can override the way decryption is performed at runtime.

  • New: Added better FGCObject reporting in object references — some FGCObject names are now reported in the “obj refs” console command.

  • New: Made FArchive::IsTextFormat return a compile time constant value when text archive support is disabled so that we can have redundant text-only code paths stripped.

  • New: Any user code that overrides SerializeBin/SerializeTaggedProperties/SerializeDefaultObject on UClass must be rewritten in terms of the FStructuredArchive base version.

  • New: Removed virtual from several internal serialization functions that take FArchive parameters to stop external code from overriding them. Some serialization paths were changed to only call the structured archive version, and as such, they would not reach these overloads. Note that this will be a compile error for licensees that have overloaded these functions.

  • New: Added new FPaths::GetPathLeaf function.

  • New: Added FContentEncryptionConfig::DissolveGroups function to the content encryption config, which moves all assets out of a given group and puts them into an unnamed “loose group”.

  • New: Added a GUID to the generic crash report, which is specific to that particular execution of the project — this allows multiple records from the same run to be correlated.

  • New: Adjusted VSCode code-workspace generation for foreign projects and plugin suggestions.

  • New: Centralized the loading of pak signature data so that the same object can be reused between the SignedArchiveReader and FPakPrecacher implementations — this stops the same data being loaded and verified twice.

  • New: Added log pak key registration when something was actually mounted.

  • New: Added hardening of pak index loading. If a corrupt index is detected, do a retry but collect and log more information along the way to help diagnose the issue.

  • New: Added “debug spikemark” and “debug spikemarkcheck” to track objects that get destroyed after a mark, which can be used to track objects that go away right after being loaded — this can help reduce memory spikes of objects being loaded and garbage collected right away.

  • New: Added an option to content encryption groups to say that their members should be encrypted even if they are soft referenced by some other asset.

  • New: Added PlatformCrypto based RSA support for the engine — the RSA lib now redirects through a modular feature interface to find a crypto provider.

  • New: Added virtual memory display to “stat unitmax” — along with peak physical and virtual memory.

  • New: Made is so that when a shader pak reader is first created for a thread, return the FThreadCheckingArchiveProxy wrapped version rather than the raw archive pointer.

  • New: Removed ensure from signedarchivereader pak signature failure handler to make it consistent with the pakprecacher version. Projects can override the signature check failure delegate to choose what to do when a signature fails.

  • New: Added Unreal Insights to Win64 Installed Builds.

  • Improvement: Made it so that we no longer mount pak files that fail the initial signature check.

  • Improvement: Minor optimization in FLinkerLoad::SerializeNameMap when using binary format.

  • Improvement: Implemented minor optimization in StreamableHandle.

  • Improvement: Optimized performance while Async Loading.

  • Improvement: Optimized the destruction phase so that the Garbage Collector no longer iterates over the entire UObject array but reuses the unreachable objects array instead.

  • Improvement: Implemented serialization optimizations for tagged properties, name maps, and soft object paths.

  • Improvement: Optimized game start-up times that yielded approximately 15 percent speed-up when loading an internal project.

  • Improvement: Optimized asset gathering by changing ResolveChunkDependencyGraph to use a set of FNames.

  • Improvement: Optimized ULevel::PreSave in the cooker by moving the validation of light GUIDS to LightComponent::PreSave.

  • Improvement: Optimized UPackage::IsFullyLoaded for the cooker.

  • Improvement: Optimized cook -iterate by fast forwarding through already cooked packages instead of ticking them.

  • Improvement: Optimized cook -iterate by reducing OS file system calls during engine and cook commandlet start-up.

  • Improvement: Optimized asset gathering by calling RemoveSingleSwap on DependsNode.

  • Improvement: Made several optimizations to AssetRegistry in cook scenarios.

  • Improvement: Made several optimizations to ShaderCodeLibrary cooking.

  • Improvement: Optimized cook -iterate by reducing OS file system calls in FAssetRegistryGenerator::GenerateStreamingInstallManifest.

  • Improvement: Added FName improvements and optimizations:

  • Encoding improvements

    • Implemented new hash table without fixed upper limit and 16-byte hash limitation

    • Changed NAME_INDEX from contiguous int to monotonically increasing int

  • General improvements

    • Improved API and documentation

    • Allowed getting FName as TCHAR without dynamic allocations

    • Added New constructor that enables supplying string length

    • Document IsValid and clarify IsNone semantics

    • Hid global state such as GetNames

    • Reduced amount of implementation details visible in header

    • Decreased NameTypes.h size down by approximately one-third while adding documentation covering stronger type safety, and the new API’s performance and memory results for internal project:

      • Editor start-up wall time: 12 percent speed-up (from 22.0 seconds to 19.5 seconds)

      • Win64 Test Client memory usage with approximately 400,000 names: 30.3 MB to 22.2 MB

  • Optimizations

    • Implemented memory optimizations that reduce per entry overhead

    • Avoided dynamic allocations in string conversions greater than or equal to 128 characters

    • Avoided extra copying when splitting numbers

    • Implemented more efficient IsPureAnsi check and wide-narrow conversions

    • Implemented a single global lazy initialization call instead of multiple calls

    • Switched from single lock to sharded hash map with separate locks to reduce contention

  • Improvement: Optimized cook -iterate GenerateLongPackageNames by using a temporary set.

  • Improvement: Optimized cook -iterate by replacing individual localization AssetRegistry queries with a single query.

  • Improvement: Optimized cook -iterate overhead by reducing allocations for ConvertCookedPathToUncookedPath, which is used in GetAllCookedFiles.

  • Improvement: Optimized processing of soft object paths in the cooker.

  • Improvement: Made it so that we no longer log encryption key registration for empty key GUIDs.

  • Improvement: Improved logging of pak signature failures — now treat a missing .sig file like a signature failure, log it, and ignore the pak file.

  • Improvement: Made improvements to pak file check command:

    • Added timing information to the log.

    • If pak is signed, used a faster method where we read one byte from each signing block.

    • This is still invoked with the -checkpak command line parameter.

  • Improvement: Minor UnrealPak refactor:

    • Added a “-sign” parameter to enable signing for the given pak — the cached settings in the crypto.json file are not used to enable signing any more.

    • Encapsulated all signing and encryption keys in a single keychain object that is passed around, rather than individual keys.

    • Added some validation to UBT/UAT encryption config parsing so that if you enable any signing or encryption stuff but haven’t generated a key, it’ll warn and disable everything.

  • Improvement: Various improvements and bug fixes for the experimental structured archive system, which will soon provide access to human readable asset formats.

  • Improvement: Made ChunkHashToString an inline function in IPlatformFilePak.h so that it can be used by other modules without requiring a link dependency.

  • Deprecated: Deprecated default FName operator < and > — you must now choose lexical or fast sort order.

  • Deprecated: Deprecated THasInserterOperator and THasOperatorEquals in favor of new concepts, CEqualityComparable and CInsertable.

  • Deprecated: Deprecated THasGetTypeHash in favor of the CGetTypeHashable concept, which handles inheritance properly.

  • Deprecated: Deprecated CreateAbstractDefaultSubobject because it did not work as intended. CreateDefaultSubobject should now be used, and it has been improved to provide a warning when a non-abstract class tries to create an abstract default subobject.

  • Deprecated: Moved FTextRange to Core module — includes should be updated to UnrealString.h.

  • Deprecated: Made some member variables in FArchive private — this was deprecated with Unreal Engine 4.20.


  • Crash Fix: Fixed BuildPatchTool shutdown crash, as some engine code crashes if GIsRequestingExit is not true when exiting.

  • New: Added support for allowing definition and execution of test “groups” using the legacy automation framework. Groups are defined in DefaultEngine.ini by specifying a group name and then a set of filters that are used to determine group membership. Groups of tests may then be executed via “RunTests Group:GroupName”.

    • See DefaultEngine.ini in the EngineTest project as an example. Filters can now also be specified via “RunTests Filter:System+Filter:Editor”. This will correctly match filters instead of the old behavior of doing a substring search. For example, SomeNonEditorTest is executed by “RunTests Editor”.


  • New: Moved EngineTest Gauntlet script out of Gauntlet project and into EngineTest project — this is a good example of how to include Gauntlet scripts in your projects.

  • New: When the number of desktop clients in a test is greater than 1, tile the windows into a 2N configuration.

  • New: Native plugin now marked as runtime so it is available in more builds. Android device now uses a path under the Gauntlet temp directory for pulling artifacts. Also, the directory is marked for clean-up.

  • New: Moved SubmitToDashboard into its own function to ensure derived classes do not accidentally skip it.

  • New: Added Win32 support.

  • New: ITestNode now defines GetWarnings and GetErrors calls for tests to return instances that occurred during a test.

  • New: Split creation of Summary report in UnrealTestNode into header and body functions to allow tests to easily customize these.

  • New: Added GetLogChannels function to UnrealLogParser that returns all lines from multiple channels.

  • New: Added AutomatonLogParser that specifically parses the output of automation (non-Gauntlet) tests.

  • New: Rewrote RunAutomatedTests Gauntlet node in the EngineTest project to be more comprehensive in terms of error reporting and to support both Editor and Cooked formats.

  • New: Addressed various issues that prevented Gauntlet from being used on projects that were not located next to the Engine. Should also allow Gauntlet to work with Installed engine builds.

  • New: Added example of running Gauntlet with C# tests in FirstPersonTest project, and the project is located away from the Engine directory: RunUAT.sh -scriptdir=/Volumes/Data/Dev/FirstPersonTest RunUnreal -project=/Volumes/Data/Dev/FirstPersonTest/FirstPersonTest.uproject -test=FirstPersonTest.BootTest -build=editor

Media Framework

  • Bug Fix: Fixed wrong sample sometimes being used in MediaTextureResource.

  • Bug Fix: Fixed videos not respecting last loop status when changing track.


  • Bug Fix: Improved validation of platform and configuration arguments passed into BuildCookRun.

  • Bug Fix: Empty arguments on the command line (for example, arguments passed in as “”) are now ignored rather than being treated as command names.

  • Bug Fix: Fixed it so that when creating the base release directory for a chunkinstall build, to copy pak sig files if they exist.

  • Bug Fix: Updated UATHelper to cache packaging notification, ensuring it is destroyed when a new packaging operation starts

  • New: Added support for overriding the launch command line per platform.

  • New: Code signing on Windows now uses SHA1 and SHA256 certificates.

  • New: Added RunUAT stub scripts to workspace root.

  • New: The P4Sync command now has an option for retries.

  • New: On Mac, AutomationTool now uses MSBuild if Mono 5.0 or later is installed, significantly improving start-up time when running UAT scripts.

  • New: UAT now performs high-level dependency checking on the input (.csproj, .cs) and output (.dll, .pdb) of all automation scripts to reduce redundant compiles.

  • New: Added BuildEditor and OpenEditor scripts. Both take a -project=<name> argument.

  • Removed: Removed the CommandUtils.Log function to avoid shadowing the global Log class.


  • New: <Compile> Task now has a Project=“” attribute that specifies the path to a foreign project.

Live Coding

  • Bug Fix: Fixed issues with symbols not being stripped if they can throw an exception during construction.

  • Bug Fix: Fixed crashes when patching adaptive non-unity files in those game modules that contain static global variables.

  • Bug Fix: Prevented Ctrl+Alt+F11 from triggering a full-screen toggle in packaged builds.

  • Bug Fix: Several fixes to resolve issues with global symbols being reconstructed when loading patch DLLs — this was causing asserts when log channels were being re-registered.

  • Bug Fix: Fixed an issue when Live++ recompilation would execute old HotReload code that triggered an exception in monolithic builds.

  • Bug Fix: Prevented object files being overwritten during a live coding compile, ensuring we can gather COFF data from the correct executables on relaunch — this fixes several crashes, and enables restarting and reapplying Live Coding state by triggering a compile without having to compile from the IDE first.

  • Bug Fix: Fixed support for lazy loading modules, which now passes UBT a list of modules that can be updated. UBT fails the build and writes out a list of other modules that would be modified, and Live Coding console then loads those modules and retries.

  • New: Added a “Quick Restart” button to the Live Coding console, which restarts the current process and reapplies patches.

  • New: Live Coding now supports packaged builds in more scenarios. To use it, type “LiveCoding” into the console.

    • The path to the original .uproject file is now compiled into monolithic executables when Live Coding is enabled. This allows the invoking of UnrealBuildTool with the original project file when the executable is staged to a different directory. Note that this parameter can be overridden with the LiveCoding.SourceProject CVar.

    • The original engine directory is also compiled into the executable. This enables finding the console executable path without having to enter it manually via the LiveCoding.ConsolePath CVar.

  • New: Added a LiveCoding.Compile command to trigger a compile from the console.

  • New: Added a warning for trying to add a content pack if Live Coding is enabled.

  • New: Added a <VCProjectFileGenerator><bBuildLiveCodingConsole> build setting that allows building LiveCodingConsole automatically for any target that requires it.

  • New: Triggering a compile from the IDE now results in an error if a Live Coding session is active.


  • Bug Fix: Fixed case of engine directory being derived from the launch path, resulting in the engine directly potentially not matching the case of files on disk and causing build artifacts to be invalidated.

  • Bug Fix: Fixed a problem with Mono being slow on Mac when launched from AutomationTool.

  • Bug Fix: Errors caused by circular dependencies in the action graph now only show actions relevant to the cycle.

  • Bug Fix: Fixed support for multiple modules in program targets when generating project files.

  • Bug Fix: Fixed support for PCHs when compiling with Clang on Windows.

  • Bug Fix: Fixed issues creating a new plugin in a project with a unique build environment.

  • Bug Fix: Fixed the ModuleRules.bShadowVariableWarningsAsErrors = true setting being ignored.

  • Bug Fix: Fixed issues with inconsistent path casing when cross-compiling for Linux.

  • Bug Fix: Fixed issues with UBT not detecting new files with reflection markup. Previously, it was not correctly detecting sub-directories or checking for new UHT types being added to a module that was not previously being scanned.

  • Bug Fix: Modified Xcode project generator to empty header search paths and preprocessor definitions build settings for the build target to solve an issue in latest Xcode with Clang that failed with “posix_spawn failed: Argument list too long” error for some files

  • Bug Fix: Fixed makefile not being invalidated if a directory containing source files was added.

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

  • Bug Fix: Fixed SN-DBS interaction with cl-filter.

  • Bug Fix: Fixed incorrect filename when launching DebugGame targets from VSCode (or any target that overrides the undecorated configuration).

  • Bug Fix: Fixed UHT being run every time a target was compiled in an installed build due to precompiled modules not being filtered out of the list of outdated headers for dependency checking.

  • Bug Fix: Fixed exception when enumerating older versions of Visual Studio that do not implement ISetupInstanceCatalog, causing some installed Visual Studio versions to be ignored.

  • Bug Fix: Fixed incorrect executable path in VSCode projects that use unique build environments.

  • Bug Fix: Fixed UBT not cleaning up some Linux build artifacts (.debug and .sym files).

  • Bug Fix: It is now possible to generate a console application for engine (non-editor) builds by setting TargetRules.bBuildAdditionalConsoleApp to true in XXX.target.cs .

  • Bug Fix: Reads from config files are now tracked to more accurately detect makefile dependencies. Some config files are modified whenever the editor is started, causing the makefile to be invalidated unnecessarily.

  • New: Using UE_NAME_PROJECT_AFTER_FOLDER leads to “go to source” not working from the editor. Now handle SLN naming in one place, resulting in the named SLN being written out consistently.

  • New: Excluded projects with temporary targets from generated project files by default. This functionality can be re-enabled by passing the -IncludeTempTargets argument when generating project files.

  • New: Added an explicit error for trying to use a unique build environment with an installed build.

  • New: Added a warning when a plugin reference overrides the plugin’s list of supported target platforms. Silently failing at build time would cause errors at runtime.

  • New: Added reference to the System.Core assembly from compiled rules assembly, so that Linq can be used in from .build.cs and .target.cs files.

  • New: Added a TargetRules.bOverrideBuildEnvironment flag that allows bypassing errors relating to overriding the shared compile environment with custom build settings.

  • New: Added -writeactions= and -writeoutdatedactions= arguments to export the action graph to a JSON file, and an “Execute” tool mode to read in an action graph and execute it.

  • New: Removed the “Default” value for TargetRules.BuildEnvironment. The property now returns the appropriate default value depending on the target being built.

  • New: To reduce IDE load times and memory usage, source files in a ThirdParty folder are now excluded from the generated Visual Studio solution.

  • New: Added support for AoT compilation for Mono UnrealBuildTool (approximately ten percent savings on a noop build due to no JIT) - this must be opted into using “defaults write com.epicgames.ue4 MonoAOT 1”


  • Bug Fix: If a branch does not have the requested number of changes, the fade effect is suppressed on the last entries in the main window.

  • Bug Fix: Fixed support for localized time. Previously, UGS did not format time according to local culture, meaning it always used 12-hour formats.

  • Bug Fix: Fixed issue where clients with multiple proxies will fail to get server info and refuse to connect.

  • Bug Fix: LatestData class of UGS MetadataServer now has “Comment” spelled correctly, fixing the client not finding the right field to deserialize when calling /api/cis.

  • Bug Fix: Fixed DPI scaling in “Clean Workspace” window.

  • Bug Fix: Fixed “Clean Workspace” tool not working correctly for workspaces with forward slashes in the root directory.

  • Bug Fix: Fixed incorrect handling of return code when fetching the project file for a new client.

  • Bug Fix: Fixed incorrect display of the total number of known changes when a branch has fewer changes that the default batch size.

  • Bug Fix: Fixed close button in tab control not scaling correctly on high DPI monitors.

  • Bug Fix: Fixed changes being greyed out when using bisect mode.

  • Bug Fix: Added a check which ensures that the window bounds are on one of the displays before restoring them.

  • New: Added a new build health notification feature, including the following:

    • Build health issues can be posted to the metadata server using the MetadataTool utility, and they can have multiple build jobs in different branches associated with them.

    • Users can be added as watchers to particular build health issues via the metadata server (intended to be done by an automated process), which causes a notification to be shown on the client allowing them to acknowledge or dismiss it.

    • Users can be nominated to fix a particular issue, which suppresses the notification for any watchers.

    • Users can close a build health issue by clicking on the red “Close Build Issue” button in the UGS status panel, and entering the CL that contains the fix.

    • Anyone can subscribe to notifications that are not acknowledged after a certain period of time.

    • A “Build Health” button in the status panel allows reviewing any open build health issues at a time. To enable a project, set the “ShowBuildHealth” option (under the [Options] section) to 1 in the UGS config file, and post-build issues using the newly added MetadataTool.

  • New: Errors in the log now display in red, and warnings now display in yellow.


  • New: Implemented a DocumentPolicy metadata tag for structs, classes, and enums, which can be used to turn documentation validation on for:

    • Tooltips for classes, structs, enums, and functions.

    • Tooltips for properties, including uniqueness for copy-and-paste bugs.

    • Tooltips for enum entries, including uniqueness for copy-and-paste bugs.

    • Tooltips for function parameters, including uniqueness for copy-and-paste bugs.

    • UIMin and UIMax for float properties.

    • UIMin and UIMax settings for float parameters on Functions.

  • New: UHT optimization now yields 1.1-times wall-time speed improvement on a project.


  • Bug Fix: Fixed UnrealVS compatibility with Visual Studio 2019.

  • Bug Fix: Fixed performance problem with P4VS Helix Visual Studio Plugin, due to the UnrealVS Plugin listening to all property change events and updating the command-line combination every time.


  • Bug Fix: Fixed recursive surface snapping by ignoring attached children Actors in raycasting to world.

  • Bug Fix: Descriptions passed from the Source Control Editor dialog now populate in Perforce again.

  • Bug Fix: Fixed a crash that happened when resolving last transaction authors in the Multi-User history.

  • Bug Fix: Soft Objects Path will not become invalid when saving a new level with the name Untitled.

  • Bug Fix: The standalone PIE window no longer has its backbuffer sized smaller than the requested resolution.

  • Bug Fix: Fixed an issue where the Blueprints File > Developers sub-menu was not opening until clicked.

  • Bug Fix: Fixed an issue where crashes occurred when trying to use Launch On with a newly created level.

  • Bug Fix: Editor now properly closes Asset Editors and maps when purging those packages in Multi-User.

  • Bug Fix: Deselecting a locked Actor now clears the selection highlight correctly.

  • Bug Fix: Improved the layout and appearance of the Per-Platform Overrides widget.

  • Bug Fix: Fixed a crash that happened when using the keyboard arrow keys or the gamepad to navigate Editor UI.

  • Bug Fix: Class pickers in the Details panel now check whether or not a dropped class passes the class filter, preventing a crash that occurs if an invalid class is dropped on it.

  • Bug Fix: Fixed an issue where the Actor transform widget was not updating its position when selected Actors move during simulation.

  • Bug Fix: Transform > Attach to Pawn is no longer an Advanced property and is now visible in the Details view of a Controller blueprint again.

  • Bug Fix: Cleared the dirty flag before purging a package, preventing the prompt. The prompt was shown when a level that doesn’t exist outside a Multi-User session was purged (when leaving the session). The level is saved in the session workspace and is not deleted, so the user should not be prompted to save it once they leave the session.

  • Bug Fix: When a user leaves a session, the Multi-User system performs some cleanup to remove session-only transactions. If a level was created in a Multi-User session and the user left the session while that world package was dirty, the system would revert those transactions and that process involved deleting/reloading the map. The delete action was unexpectedly recorded by the Multi-User system as a transaction (map deleted), because the system was still connected to the Editor events when this happened. The issue was fixed by unregistering the Multi-User calls back before performing the cleanup. When a level that was created in a session (and only exists within that session) was the active world when the user left the session, the Editor would not unload it. The level could be edited, but could not be saved. Reset the world to the default level template when this situation is detected.

  • Bug Fix: Fixed a cast converting a pointer in a derived class rather than the desired base class. Since only the base class member was used, no problem occurred.

  • Bug Fix: Fixed a state consistency problem encountered in a Concert client session when a client disconnected. The list of connected clients was updated after broadcasting the disconnection notification. Calling GetSessionClients() during the callback would return an inconsistent list. Removed the client from the list before broadcasting its disconnection. Updated a comment left in the Concert active session about this particular case.

  • Bug Fix: Updated the algorithm to better detect the important activity from the transaction.

  • Bug Fix: UPROPERTY specifiers were not reflected for FTransform.

  • Bug Fix: Reduced excessive amount of error messages from invalid data inside composite data tables.

  • Bug Fix: Fixed Concert Presence showing up in camera previews in Multi-User.

  • Bug Fix: Fixed an issue where object selection was not updating when deleting selected objects in Multi-User.

  • Bug Fix: Renaming a Material Asset now immediately updates the name in the Details view.

  • Bug Fix: Fixed an issue where Actors would become partially unselected when clicking a locked Actor.

  • Bug Fix: Added a missing Toolbar. Check style.

  • Bug Fix: Map value text expands outside of the drop down menu.

  • Bug Fix: Fixed a crash happening when user selects Undo after enabling world composition, when no sub-levels are available in the folder. Also made the Levels panel and World Composition panel react properly to undo/redo.

  • Bug Fix: Fixed an issue where piloting Actors with offset cameras causes the Actor transform to be set incorrectly.

  • Bug Fix: Fixed Reset to Default transactions for an issue where custom Reset to Default was not undoable.

  • Bug Fix: Fixed incorrect baking of Materials containing an Emissive property, which was causing pink smears across the outputted texture(s).

  • Bug Fix: Fixed an error in how acknowledged segments in UdP messaging were counted.

  • Bug Fix: Fixed an issue in the StartFinalPostprocessSettings function of FSceneView where crashes occurred due to Family > Scene being nullptr, and added code to prevent a crash if Family is nullptr as an additional precaution.

  • Bug Fix: Fixed a rare issue where a crash is caused by LauncherServices updating UI on the wrong thread.

  • Bug Fix: Made ALODActor not relevant for calculating level bounds; contained Actors are already contributing, and this prevents non-center bound pivots impacting the level bound size.

  • Bug Fix: Fixed a crash occurring in GameplayTagQueryCustomization when user modifies a GameplayTagQuery that is a child property.

  • Bug Fix:

    • Added an option named “Enable Multi-User Toolbar Button” in the Multi-User settings panel, to install or not install the Multi-User button in the Level Editor toolbar. By default, the button is not installed.

    • Limited the user Display name to 32 characters.

    • Limited the default session name to 128 characters.

    • Prevented the entering of invalid characters as the default Session Name, default Save Session As and default Session to Restore.

    • Added validation on the server command line when specifying default settings, to ensure they are consistent with the Settings panel.

    • Fixed setting display name “VRAvatar Actor class” as “VR Avatar Actor Class”.

  • Bug Fix: Made sure a progress bar is shown for clusters using the HLOD outliner.

  • Bug Fix: When user clicks elsewhere when renaming something, it now commits the changes.

  • Bug Fix: Updated TraceResult when clicking in the level viewport to respect AllowSelectTranslucent.

  • Bug Fix: Fixed a scenario in which autosave would not run.

  • Bug Fix: Fixed a problem where Reset to Defaults button did not show up for properties in the Actor Merging dialog.

  • Bug Fix:. Updated the CanCloseEditor function of FMainFrameHandler to prevent closing the Editor if a modal window is on screen.

  • Bug Fix: Improved the logic for determining whether or not an HLOD cluster is out-of-date, by checking whether or not it has any valid sub-actors, and whether or not they are still linked to the ALODActor.

  • Bug Fix: Updated source control integration of GetOpenedOnly operations to look in the project directory instead of the root directory.

  • Bug Fix: Updated the orbit camera to work properly with piloted Actors.

  • Bug Fix: SPropertyEditorEditInline: Fixed the inability to edit properties whose editability is not constant.

  • Bug Fix: Fixed a crash caused by pressing the Delete key while dragging an Actor in the Scene outliner.

  • Bug Fix: Fixed an issue with canvas slot resize with the mouse in Designer when display scaling is different than 1.

  • Bug Fix: Fixed an issue where the Curve Editor was not being drawn in Matinee.

  • Bug Fix: Mesh painting commands are now registered on module load instead of on activation, which allows users to change keybindings before switching to the mode for the first time.

  • Bug Fix: Fixed an issue for Scene Outliner not refreshing added Actors during PIE.

  • Bug Fix: Fixed a crash in Multi-User when editing a Blueprint instance containing object references.

  • Bug Fix: Fixed the mirror scale option in the Details panel.

  • Bug Fix: Fixed the developer folder filter in SClassViewer.

  • Bug Fix: Prevent asset view from eating all other modifier combinations with CTRL + C.

  • Bug Fix: Resolved an issue that could cause manually overridden mesh draw distance data to be lost during a project version upgrade.

  • Bug Fix: Fixed ensure when having the source control provider panel open while joining a Multi-User session

  • Bug Fix: Removed some outdated and confusing logs at SkeletalMesh import.

  • Bug Fix: For static mesh vertex painting, ensure all LODs are updated when filling all LODS. Fill also now respects bPaintOnSpecificLOD for static meshes.

  • Bug Fix: Adjusted Scale Gizmo’s universal handle hitbox.

  • Bug Fix: Use Custom Depth as Mask no longer persists once the High Res Screenshot dialog closes.

  • Bug Fix: Disallowed using Square Brackets in a Folder Name to prevent Meshes from being unusable inside the Folder.

  • Bug Fix: Fixed an issue for assert for missing EndSection call.

  • Bug Fix: Fixed DPI scaling on text in a few viewports.

  • Bug Fix: Fixed a crash that could occur in the Editor after importing a skeletal mesh LOD.

  • Bug Fix: Reimporting a skeletal mesh with the vertex color option is now set to Ignore, and no longer overrides the existing vertex color data.

  • Bug Fix: Fixed a bug causing Scene Export to not preserve the scene hierarchy.

  • Bug Fix: Fixed a bug causing PCX textures to have a corrupted alpha channel after they are imported.

  • Bug Fix: Fixed and issue where Delete was not working on selected text when the ALT key was held down.

  • Bug Fix: Fixed parsing errors in RendererSettings.

  • Bug Fix: Uses the CSV factory to import the .csv or .json file to the data table to avoid crashing when a Data Table is opened.

  • Bug Fix: Fixed a bug in the Static Mesh import window that could disable the Vertex Color import option.

  • Bug Fix: The BlueprintActionDatabase is now forced to release the references on the BP during the Purge so that the BP gets garbage collected as soon as there are no maps referring to it anymore.

  • Bug Fix: Fixed a serialization / versioning issue with MeshDescription, and fixed 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: Unified the code used by the Editor and project launcher, to fix incorrect an Editor executable being used for cooking when using the project launcher.

  • Bug Fix: Gameplay Tag—When the gameplay tag dialog opens we now focus the search field.

  • Bug Fix: Fixed a bug where a crash occurred when attempting to perform some BSP operations on a Level that has been created in the Content Browser.

  • New: Major Multi-User Browser UI refactoring:

    • Added a toolbar to containing buttons to launch (or kill) the local server, create a session, join (or cancel joining) the default session, and join, archive, restore, or delete a session.

    • Merged the server/session list view into a table using three columns (Session Type, Session Name, Server Name).

    • Added text search to quickly lookup a session or server.

    • Added primary and secondary column sorting.

    • Added the View Option to quickly filter archived and/or active sessions, or to exclude all servers except the one configured as Default in the settings.

    • Changed the UI flow to create new sessions. Sessions are now created by adding a row to the table rather than by using a pop-up.

    • Updated the icons.

    • Merged the ActiveSession and the Browser.

    • Inlined all operations in the List view.

    • Removed ConcertSessionOptions and SConcertSettingsDialog files because their functionalities were inlined in ConcertBrowser.

    • Added animated feedback when looking for available servers or sessions.

    • Added a view below the server/session list to display the selected session details.

    • Added a button that is displayed in the middle of the session list view to launch your local server when no Multi-User servers are found.

    • Added a button that is displayed in the middle of the session list view to create a new session when no Multi-User sessions are available.

    • Added hint text that is displayed in the middle of the session list view when all available sessions are filtered out.

    • Added an entry to launch the Multi-User Browser from the Editor menu: Windows > Developer Tools > Multi-User Browser.

    • Added a status bar below the session list view to display how many sessions on how many servers are available and how many are filtered out (if any).

    • Added support for renaming sessions from the Multi-User browser if the client is the session owner. Select a session and enter Rename mode using the F2 key, the right-click context menu, or a single slow click.

    • Detected and reported an invalid session name interactively as the user types the session name (for example, session name has invalid characters, or the session name is too long).

    • Added a double-click handler on archived and active sessions rows (restore/join actions).

    • Added a context menu when right-clicking an archived or active session.

    • Added a 128x128 Icon in the plugin Resources folder.

  • New: Removed PresenceManager and SequencerManager wrapped function in IConcertSyncClient interface in favor of an IConcertClientPresenceManager and IConcertClientSequencerManager interface that can be accessed through IConcertSyncClient in the Multi-User code.

  • New: Added commands to adjust the brush falloff and strength to mesh painting mode.

  • New: Made the CL description and info fields selectable in the Editor’s revision history widget.

  • New: A confirmation dialog pops up when placing actors in sublevels that aren’t checked out when under source control, or outside the bounds of small sublevels.

  • New: Now saves the changelist description when Submit to Source Control Window is canceled or fails to submit.

  • New: Added a Search box to the Reference Viewer, as well as a Zoom to Fit (Home) entry to the node context menu.

  • New: Respect RF_Transient object flag in World Outliner.

  • New: Improved the tooltips for Actor and Material Merging dialog.

  • New: Exposed a Blueprint function to get the transform of a user presence in Multi-User. Added an optional parameter to JumpToMultiUserPresence Blueprint function to provide a transform offset. Added a Blueprint function to set presence visibility by client id in Multi-User.

  • New: Added the ability to auto select the default device to SDeviceOutputLog and fix static initialization shutdown bug in SOutputLog.

  • New: Source Control History: bind Escape key to close the window.

  • New: Using Force Delete on an Asset that is open in an editor no longer closes all open Asset Editors; it only closes those editors that the Asset uses.

  • New: Fixed an issue where Actor Picker was not filtering by Allowed or Disallowed classes.

  • New: Renamed Window Size to Window Resolution in Play In Editor Settings.

  • New: Mesh painter settings are now stored in EditorPerProjectUserSettings.

  • New: Search by class internal and display names in UMG Editor Palette view.

  • New: There are now better error messages when trying to drag and drop Assets in the World Outliner in certain situations.

  • New: Fixes for UI appearance after level preview changes.

  • New: The Blueprint Compilation Errors dialog that pops up after triggering Play In Editor now has hyperlinks to all Blueprints that are failing to compile.

  • New: Sound Debugging—Added an extra check to see if we are filtering sounds using AudioSoloSoundCue or AudioSoloSoundWave when printing for the Stat SoundCues or Stat SoundWaves cmd. This way we can filter and only see what we want. UnrealEngine: RenderStatSoundWaves()—If we have a solo sound name filter and the current wave instance does not contain any of the filter text, then we will print the wave. RenderStatSoundCues()—If we have a solo sound name filter and the current wave instance does not contain any of the filter text, then we will print the sound cue.

  • New: Created SCustomDialog which allows for a dialog to be created with any SWidget as its contents, and with any number of buttons.

  • New: The Collapse/expansion state of the UMG hierarchy items is now saved when filtering starts, and restored when filtering ends, so that any mutations during filtering do not affect the state the user has explicitly set.

  • New: Added support for copy, paste and duplicate on data table rows.

  • New: The UMG hierarchy search now includes the widget class name (and display name) on top of the widget name.

  • New: Added missing parameter/default values for debug draw functions.

  • New: Support added for math expressions in the margin shorthand textbox.

  • New: Miscellaneous fixes for level streaming UI and workflow:

    • Removing invalid levels from the Levels UI will no longer ensure.

    • Added a minimum size for the warning about placing Actors outside level bounds, and the warning will not trigger if you are working in the only unlocked level.

    • The level-swapping button is now fully clickable, and is hidden when there is only one level.

    • The selected Actor Level text layout has been improved.

    • We now force unloaded levels to load if you select an unloaded level from the button in the Viewport.

  • New: Added drag-and-drop to add elements to an Array.

  • New: Added a spinner for Location and Scale in the Transform section of the Details view.

  • New: Content Browser does not override window position when the Play In Editor window is centered.

  • New: Added an OnAssetsCanDelete delegate that can be used to prevent Assets from being deleted. ObjectTools now queries the new delegate before attempting to prompt, replace references, and/or delete an object or list of objects.

  • New: Merge Actors Tool—It is now possible to choose between InstanceStaticMesh and HierarchicalInstanceStaticMesh in the Instancing tool.

  • New: Added a prompt on disconnection for session owners when the session has un-persisted changes in Multi-User.

  • New: Added Arcball and Screen Rotate to the Rotation Gizmo.

  • New: Activated Multi-User auto-connection flow even when the default configured server is offline:

    • The Concert toolbar buttons shows Join even if the default configured server cannot be found.

    • The connection routine runs in the background until the server is found, then it connects.

    • Added auto-connection feedback using the asynchronous notification system.

    • User can cancel auto connection from the banner or the toolbar button that displays Cancel if the auto-connect routine is running.

  • New: Changed the prefixes on new empty classes and new UObjects on new classes created by the Editor so that they are consistent with UE coding standards.

  • New: UPROPERTY meta tag EditCondition now supports a full-fledged expression parser using C++ syntax. This provides support for expressions like “MyBool && MyInteger == 5”. This expression supports all numeric types, booleans and enums tagged with UENUM, as well as most comparison operators.

  • New: Added auto-archiving support to the Concert server. The server will now auto-archive the active sessions on clean shut down rather than deleting them, to prevent teams from losing work.

  • New: Added APIs to archive active Concert session. The client can archive an active session at any point in time. The session is copied from the temporary working directory of the server into its Saved folder.

  • New: Added APIs to delete archived Concert session from a server. The client can request the server to delete archived sessions when they are not required anymore.

  • New: Fallback to development config for launching Multi-User server when the currently used configuration server is not found.

  • New: Added settings to change the Concert server working and saved path.

    • User can specify the command line:

    • .\UnrealMultiUserServer.exe -ConcertWorkingDir="C:\Temp\Intermediate" -ConcertSavedDir="C:\Temp\Archives"
    • Modified ConcertUtil function, DeleteDirectoryTree to use a specified path to move before delete, instead of always assuming that moving to the intermediate directory was fast.

  • New: Transactions can be checked to see if they can be undone after they are finalized through IsTransient. If IsTransient is true, then they skip the undo buffer. Transient transactions are currently transactions that contain references to PIE objects or that generate a no-op once finalized.

  • New: Now acquires lock or warns user when editing a package that does not support live transactions, and releases the lock when saving the Asset in Multi-User.

  • New:

    • Disabled the Multi-User Join button on the Level Editor main toolbar if the client did not enable a plug-in compatible with the server to communicate (such as UDP Messaging).

    • Prevented the client from auto-connecting if auto-connect is enabled but the client did not enable a plug-in compatible with the server to communicate (such as UDP Messaging).

    • Prints a warning in the Project’s output log reporting that the UDP Messaging plug-in is disabled when they select to launch an MU Server from the Editor.

    • Prints a warning in the Project’s output log reporting that the UDP Messaging plug-in is disabled when they select to open the Multi-User Browser.

    • Prints a warning on the Multi-User server console if UDP messaging plug-in is not enabled.

    • Added a warning notification in the Multi-User Browser informing the User that UDP Messaging needs to be enabled.

  • New: Enabled iterative syncing of Multi-User sessions that have an active client cache. Since sessions are now identified by a unique ID, we no longer delete the client-side cache of a session when leaving it. This allows us to load this cache when re-joining the session and sync only the missing data.

  • New: Added persistent versioning information to Multi-User sessions, which is used for:

  • Transactions that include the version index in their payload data, so that they can be deserialized with the correct version information.

  • Checking the serialization version for equality when a client joins the session, which ensures that everyone is working with the same serialization code.

  • Checking the serialization version for compatibility when restoring an archived session, so that a session cannot be restored by a client too old to process its data.

  • New:

    • Changed the Multi-User persist prompt question to the following: “You are about to leave a session containing changes. Do you want to persist the changes?”

    • Added the Cancel button to the dialog. Yes = show persist dialog, No = don’t persist and leave, Cancel = don’t leave the session.

    • In the Persist Dialog, if user selects to cancel persisting, the user goes back in the session (he doesn’t leave).

  • New: Allow the ImportAssetCommandlet to execute with only an Import Settings file. Old code was looking for at least 2 arguments and wasn’t counting for the file.

  • New:

    • Added the UpdateLocalClientInfo function of FConcertClientSession, allowing the code to update the avatar classes (VR + Desktop), avatar color and display name.

    • The function does not update the historical transaction (color and display name). The history remains untouched.

    • The changes performed with the UpdateLocalClientInfo function are only applied to the current session.

  • New: Optimization when saving thousands of Actors.

  • New: Expose Static Mesh Sockets to Python.

  • New: Added a new console variable to enable/disable playback syncing of Sequencer scrubbing in Multi-User. This variable is also exposed in the Sequencer toolbar when connected to a Multi-User session.

  • New: Multi-User now saves client side session data to keep track of files persisted from a particular session. This means that persisted files are tracked across multiple connections to a particular session from a specific editor launch.

  • New: Universal Scene Description (USD)

    • Added memory tools to handle std allocated objects coming from the USD SDK.

    • Fixed hierarchy issues by adding components to represent additional xforms between the asset and the model.

    • Added support for vertex colors and added the vertex color material by default when no material is specified.

    • USD import into level will use the C++ scene factory by default, instead of the Python scene factory.

  • New: Improved performance of layer visibility toggling on big scenes.

  • New: Improved deselect performance.

  • New: Improved multi-selection performance.

  • New: Importing BMP images using Bitfield compression is now supported.

  • New: The level cleanup output is more verbose now, listing all objects that were detected as leaked.

  • New: Improved Editor responsiveness when a selected Actor contains many others.

  • New: Added a visualizer for IES data on point lights and spotlights.

  • New: Improve performance of creating a new level over an existing one in some cases.

  • New: Always send analytic data when enabled.

  • New: Gameplay Tags—In the Properties view, there’s now a Remove button beside tags in a tag collection.

  • New: Added custom “developer tool” to MainFrame. Removed OutputLog dependency from MainFrame.

  • New: Added SessionSummary analytics event that triggers on every shutdown, which will make it easier to write queries against analytics data.

  • New: Add DetailView and SinglePropertyView to UMG widget. They are only available in Blutility.

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

  • New: Make components that are added to a Blueprint have their IsDataValid functions get called when IsDataValid is called on the Blueprint.

  • Improvement: Material baking blur now utilizes Hyper-threading.

  • Deprecated: Direct access to some UStaticMesh Editor-only members has been deprecated, which should now be accessed through public accessors.

  • Deprecated: The VR Mesh Editor presented at GDC 2017 is no longer supported. The Mesh Editor plugin will be removed from the engine in an upcoming release.

  • Deprecated: Improved Concert modularity:

    • Renamed ConcertUICore module as ConcertSyncUI.

    • Moved ConcertFrontend Content folder into ConcertSyncClient Content folder.

    • Prevented ConcertSyncClient module to depend on ConcertUICore module.

    • Moved Multi-User specific files/functionalities from the ConcertFrontend module into the MultiUserClient module.

    • Moved shareable UI elements found in ConcertFrontend module (for Multi-Users/Disaster Recovery) into ConcertSyncUI module.

    • Explicitly passed IConcertSyncClient interface to widgets to reduce coupling with the modules.

    • Removed ConcertFrontend plug-in—The plug-in functionality was previously split into MultiUserClient plug-in and ConcertSyncClient plug-in.

    • Made the MultiUserClient plug-in the one that a user must activate in the Editor.

    • Users that previously had the Multi-User plug-in installed must uninstall it, and install it again. This is because the module previously used to expose the plug-in (ConcertFrontend) was replaced by the MultiUserClient module.

Content Browser

  • Bug Fix: Level names are now updated when the World Asset is renamed from the Content Browser.

  • Bug Fix: Content Browser folder colors are now retained when renaming a folder.

  • Bug Fix: Fixed a crash occurring when reloading Blueprints that have derived types already loaded. Reduced Asset reloading batch size to 1 to improve correctness when reloading many Assets.

  • Bug Fix: Fixed Translucent User Interface materials not being drawn on asset thumbnails.

  • New: Improved UI material thumbnail generation.


  • Bug Fix: Fixed a crash that occurred when deleting an instance from a Blueprint.

  • Bug Fix: Fixed a Foliage “Snap to Floor” crash when snapping on foliage that does not have a valid base component.

  • Bug Fix: Fixed an issue where foliage selection was not clearing the selection of all Instance Foliage Actors.

  • Bug Fix: Fixed race condition on load, for foliage light maps that could lead to invalid lighting on some foliage.

  • Bug Fix: Foliage now checks for a valid level in the PostLoad function.

  • New: New Foliage Type—Blueprint Actor enables using the Foliage Editing mode to paint Actors instead of StaticMesh.

  • New: Added commands to adjust the Foliage Mode brush Paint and Unpaint densities, defaulting to CTRL + or CTRL + ] and CTRL + SHIFT + and CTRL + SHIFT + ].

  • New: Added support for drag and drop of a Collection onto the Foliage Palette (sharing of FT Presets). Support was added to anything that uses the ExtractAssetDataFromDrag function of AssetUtil.

  • New: Fixed bad lightmap UVs on instances when using foliage.DensityScale.

  • New: The mesh painting settings Enable Brush Flow, Ignore Back-Facing and Color View Mode are now persisted between Editor sessions. Clamping for settings is now read from the UProperty ClampMin/ClampMax values.


  • Bug Fix: Prevented a possible crash if the LODIndex does not exist in the Primitives static mesh list.

  • Bug Fix: Fixed Landscape Spline tangent handles so they move with the cursor when edited.

  • Bug Fix: Allow spinning for Transform property in the New Landscape UI.

  • Bug Fix: Fixed an issue where landscape LOD calculation was not taking LOD scale into account.

  • Bug Fix: Fixed an issue where Create Adjacent Landscape Proxy was not setting the proper LandscapeSectionOffset.

  • Bug Fix: Prevented a possible crash if GetDynamicMeshElement was called but InitViewCustomData was not called yet.

  • New: Added ALT + Drag functionality to Landscape Splines for duplicating control points.

  • New: The user can now specify what Screen Size LOD0 should be; the default is 1.0.

  • New: Landscape > Sculpt > Flatten tool > Flatten Mode > Interval now captures the closest interval set by the terrace interval value in world space when the left mouse button is pressed to start the Flatten operation, and proceeds to Flatten to that target height until the Flatten operation is finished by releasing the left mouse button.

  • New: Landscape component recreates Material Instances when a Material is destroyed by the Delete Asset dialog. This fixed crashes occurring when using the Delete Asset dialog.

Material Editor

  • Bug Fix: Fixed an issue for when the Material Instance Editor was not properly loading the override state of the subsurface profile.

  • Bug Fix: Added a scrollbar to the Material Parameters panel.

  • Bug Fix: Fixed an issue with incorrect values of TextureSize and GradientPixelSize in cooked builds.

  • Bug Fix: Material Default Parameters view now does not display a scrollbar unless one is required.

  • Bug Fix: Updated the Material If expression to properly evaluate whether the result is a Material attribute.

  • New: Added a parameter’s source function or material to its tooltip.

  • New: Renamed the material expression ShadowReplace to ShadowPassSwitch, and added tooltips.

  • New: Added functionality to MaterialEditingLibrary: Get Static Switch Parameter Value, plus matching Get X Parameter Value functions for Materials (for scalar, vector, texture, and static switch). Also added a getter to check material usage flags.

  • New: Added a function to the Material Editing Library to get children of any Material or Material Instance.

  • New: Realtime option added for User Interface Material previews.

  • New: Now the Subsurface Profile Override is treated like the other Material Override properties in the Material Instance Editor UI.

  • New: The Material hierarchy is now hidden in the Material Editor if the user is editing a function, adding a “no instances found” item if there are no material instances.

  • New: Adding default text in cases where a parent material is not found.

Media Framework

  • Bug Fix: Cleaned up the Media ticker thread.

  • Bug Fix: Fixed an issue for race condition in startup movies due to invalidating a texture while getting its size.

  • Bug Fix: Fixed media sounds dropping out during garbage collection.

  • Bug Fix: Media ticker thread shutdown time was reduced.

  • Bug Fix: MediaFramework: Fixed multi-threaded access to the sink in MediaClock.

  • Bug Fix: MediaPlayer—Events are hidden in the Blueprint Editor Details panel because they should not be used there.

  • Bug Fix: MoviePlayerSettingsDetails—Fixed an issue where copy movie requester was showing up when it should not.

  • New: Added HAP Video Decoding support with custom Windows Media Foundation transform.

  • New: Added Apple ProRes support.

  • New: The MediaPlayer can now be created before the media module is loaded.

  • New: Startup movies on the Windows platform can now be displayed at 1920x1080.

  • New: Added a new synchronization widget in the Timecode Synchronizer. Added labels to the Timecode display.


  • Bug Fix: Calling a Python-generated function no longer causes a crash when called from Blueprints, or with non-POD output data.

  • **Bug Fix: **Set GIsRunningUnattendedScript to True when running the Python commandlet. This suppresses some UI that commandlets cannot deal with correctly.

  • Bug Fix: Made the created Widget transient to allow saving the Editor Utility Widget while it is open in a tab.

  • Bug Fix: Fixed the incorrect signature of RunAssetsThroughFilter and UseFilterToExcludeAssets in IAssetRegistry.

  • Bug Fix: When changing levels, recreated the tab Widget to avoid holding a reference to the previous level.

  • New: Added scriptable extension points to the Data Validation system. Python scripts should register themselves with the EditorValidatorSubsystem, while Blueprint and C++ validators can be found automatically. These validators do not require a custom class, but instead take in an individual asset as an argument to run tests on.

  • New: Blutility updates to add more generic base classes and libraries for Editor scripting.

  • New: Added extra control over executing Python commands:

    • You can now get back the execution result and log output from running a Python command, as well as control the execution mode of the command and whether it should be run in “unattended” mode.

    • This is handled by the new ExecPythonCommandEx function of IPythonScriptPlugin, which takes an FPythonCommandEx struct containing the input flags, mode, and command, as well as fields to fill in with the result and log output.

    • ExecuteFile is the default mode to preserve existing behavior. However, since the ExecuteStatement mode allows for a REPL-like environment, there is now an additional command executor available (“Python (REPL)”) which lets you build and test Python scripts in a similar manner to an interactive command line Python environment.

  • New: Added getters for the Material parameter names to the Material Editing Library.

  • New: Added support for connecting to an existing Editor instance, in order to remotely run Python commands on it. This setting is to Off by default. To enable it, you need to turn on remote discovery in the Project Settings for the Python plug-in, which will make your Editor discoverable for remote execution (through external scripts using the remote_execution.py module).

  • New: You can now set up Editor Utility Blueprint asset to run at startup, based on the Config file.

  • New: Added Material Editing Library script-callable functions to find the source of parameters (in other words, did the parameters originate in the material itself, or in a nested function?).

  • New: Exposed the Asset Registry GetDependencies and GetReferencers functions to scripting.

  • New: Added Blueprint Diff action to Editor Utility Widgets.

  • New: Exposed the import data table to Blueprint and scripts.

  • New: Added a Blueprint function library for executing Python scripts from Editor Utilities.

  • New: Added a spawn tab node for Editor Utility Widgets to the Editor Utility subsystem.


  • Bug Fix: When navigating Sequencer tracks with a keyboard, hidden or otherwise unselectable objects are no longer selected.

  • Bug Fix: Include Render Passes remove button in the Render Movie Settings of the Sequencer no longer crashes if the array is empty.

  • Bug Fix: Sequencer Animations are no longer jittery with a RateScale > 0.0.

  • Bug Fix: Fixed an issue with Event Tracks, adding an Event Track to cause it to be added to both the Object Binding and the folder the Object Binding was located in.

  • Bug Fix: Copy and paste for a property track now replaces the existing property tracks of same type, rather than creating a duplicate.

  • Bug Fix: Calculating Auto-Tangents for MovieSceneFloatChannels no longer resets the tangent handle values if the preceding key is a constant key. This was legacy behavior, before evaluation was changed to not take tangent values into account when evaluating constant keys.

  • Bug Fix: Added equality operators to fix serialization issues with the movie scene track and subsection data.

  • Bug Fix: Blueprints are now correctly marked as being modified when user modifies event endpoints.

  • Bug Fix: Tracks in Sequencer can now be renamed by clicking them, similar to the World Outliner.

  • Bug Fix: Converting possessable object bindings to spawnable object bindings should no longer create duplicate tracks.

  • Bug Fix: Fixed an issue where Sequencer folder labels became gray when they had items inside of them.

  • Bug Fix: Sequencer no longer scrolls to the parent track when selecting child sequencer nodes.

  • Bug Fix: Animation and geometry section playback will now play the last frame when not looping.

  • Bug Fix: Fixed an issue in Sequencer where additive animation tracks were not working with less than 1.0 weight.

  • Bug Fix: Fixed a crash that happened when the user was editing a Sequencer Blueprint and attempting to Play In Editor before recompiling the edited Blueprint.

  • Bug Fix: Fixed an issue where events were occasionally being skipped at end of sequence playback and looping.

  • Bug Fix: Fixed a crash happening when setting the struct type in the defaults of a Blueprint MovieSceneEventParameters property.

  • Bug Fix: Fixed actor reference tracks that operated on soft Actor properties.

  • Bug Fix: Fixed a vulnerability that caused object path channels to end up with hard references to Actors.

  • Bug Fix: Fixed a crash when reloading a level sequence Asset that had the sequence director open.

  • Bug Fix: Changed the take and sequence recorders to use the correct property name rather than the property’s display text for its property lookup.

  • Bug Fix: Actor reference tracks are now used for any soft object Actor reference as well.

  • Bug Fix: Made it impossible for movie captures to capture the same frame twice.

  • Bug Fix: Fixed a one-frame delay between hovering over a key and being able to select it.

  • Bug Fix: Sequencer view now correctly refreshes when undoing changes to nested tracks.

  • Bug Fix: Added a transaction for renaming track nodes.

  • Bug Fix: Fixed a bug in the sequence player which was causing titles to be displayed incorrectly.

  • Bug Fix: UMovieSceneFolders now ensure that their child content actually exists. Missing content will be removed on load, and a warning message will appear in the logs. Adding child items to a folder now enforces that it does not exist in any other folder in the same movie scene.

  • Bug Fix: Fixed an issue with the Sequencer Marquee selection being stuck in an On state after using the context menu to paste keys.

  • Bug Fix: Sequencer now skips past deprecated functions for events.

  • Bug Fix: Use SetNextPositionWithEvents when playing; this fixes a problem with notifications not firing on the first frame. This used in conjunction with ticking the Sequencer first, and fixes an issue with a double-ticking of a montage when prerequisites are not set up first.

  • Bug Fix: For Movie Scene Capture—CompositionGraphCaptureProtocol now does not stop on comma (,) separators, so you can specify multiple passes at once. This fixes a regression and does not add any new behavior to CompositionGraphCaptureProtocol.

  • Bug Fix: Sequencer now allows attach and path sections to support infinite ranges. This fixes an upgrade issue where existing sections would not load as infinite.

  • Bug Fix: Sequencer now forces animation playback to be Custom when playing back a Sequencer Animation Asset, even if the character is trying to force itself back to Blueprint.

  • Bug Fix: Sequencer now does not clear keyboard focus on commit for frame number text boxes. This fixes an issue where the right-click Properties menu disappears when you type in a frame number. This was marked as a regression when editing the Start Frame Offset because it was a float property before, but when it was changed to a frame number property, it inherited this behavior.

  • Bug Fix: Sequencer—Dragging marks. Fixed a missing transaction/modify for add/remove marked frame. Right-click menu for hovered marked frame now uses HitTestMark instead of testing the single frame that the mouse is over.

  • Bug Fix: Sequencer now uses the GetLastValidTime function instead of StartTime+Duration when looping playback is reversed.

  • Bug Fix: Sequencer now snaps to playback range when dragging keys and sections if the setting is enabled.

  • Bug Fix: Fixed crashes caused by Null sections that may have been left behind by an undo action. Sequencer now removes Null sections on the PostLoad function of UObject. Added a function called RemoveSectionAt which removes a UMovieSceneSection, given the index to the array of sections on the UMovieSceneTrack.

  • Bug Fix: Made some Blueprint categories consistent. Changed “Cinematic” to “Cinematics”; “Cinematic” and “Sequencer” to “Sequence” to follow existing categories.

  • Bug Fix: Sequencer now shows decimal places up to the zero-padding value. Fixed an issue with buzzing in time displays by setting the minimum desired width based on the Min/Max view range.

  • Bug Fix: If Allow Level Edits Only is enabled, Sequencer now disables editing values in its Details panel so that accidental edits cannot be made to the Sequencer Asset.

  • Bug Fix: Sequencer now only extends an existing section if Autokey is on.

  • Bug Fix: Texture streaming toggle in Movie Scene Capture also sets r.TextureStreaming.

  • Bug Fix: Disable Editor only functions in the events quick binding.

  • Bug Fix: Sequencer now only allows setting/scrubbing time if the mouse button held down was within the time scrubber region. This fixes a bug where if you double-click a shot and hold the mouse down on the second click and drag, it will still set time. Tested multiple combinations of setting time—click and release on the scrubber, click and release on the timeline, click and drag on the timeline, click and drag without the drag being in the timeline area.

  • Bug Fix: Fixed an issue with command line sequence render.

  • Bug Fix: Sequencer now allows for event receivers in addition to the object binding.

  • Bug Fix: Disabled Copy menu for category nodes (in other words, copying Location, Rotation or Scale individually is not supported).

  • Bug Fix: If the offset into an audio clip is beyond the bounds of audio duration, Sequencer does not play the audio.

  • Bug Fix: Fixed a crash occurring when Cast to UStructProperty failed.[br]

  • Bug Fix: Fixed an issue where audio evaluation was crashing when there is no sound.

  • Bug Fix: Fixed and issue where Vector Property Track Editor was improperly setting values.

  • Bug Fix: Take Recorder—Added a non-throttled button for the Marks button in Take Recorder, so that clicking the Marks button doesn’t slow down the Editor.

  • Bug Fix: Take Recorder now sorts take numbers.

  • Bug Fix: Moved up/down/left/right/space to Sequencer-only hotkeys, so that they do not operate on both the Viewport and Sequencer when the Viewport is in focus.

  • Bug Fix: After unbinding and setting the animation mode, tick and refresh on restore to force the restored pose. You need to manually turn on SetUpdateAnimationInEditor(true) before TickAnimation as well.

  • Bug Fix: Sequencer now wraps the quick binding submenu in a max size box.

  • Bug Fix: Changed the Movie Scene Folder API to automatically call Modify() on itself. This solves a lot of issues where Modify was not getting called before using the API, which caused inconsistencies when using Undo/Redo.

  • Bug Fix: Cinematic Viewports now correctly enables Game View mode when activated.

  • Bug Fix: Fixed significant performance impact occurring when opening a Cascade Particle system before opening Sequencer. Sequencer was causing Cascade Viewports to endlessly do an expensive re-render.

  • Bug Fix: Fixed multiple components being added. This was a result of adding the event callback OnActorsAddedToSequencer in GetHandleToObject. This would cause issues because the call stack is GetHandleToObject > LightComponent GetHandleToObject > PointLight AddDefaultTracks GetHandleToObject > LightComponent. (This fails to find the first guide because the parenting structure is not set up yet). The fix is to move OnActorsAddedToSequencer to CreateBinding.

  • Bug Fix: Fixed the start/end offset upgrade paths for audio, skeletal, and geometry cache sections. Upgrade should be done based on the display resolution, not the legacy resolution.

  • Bug Fix: Restored the pre-animated state on PreCompileBlueprint since the current cached state will no longer be valid. Evaluation is forced when the Blueprint is compiled, to put objects back at their evaluated state.

  • Bug Fix: Fixed an issue where skeletal reverse was not using the complete sequence length to compute the reversed time.

  • Bug Fix: Sequencer now ensures bMouseDownInRegion is cleared on mouse up. This fixes a bug where double-clicking a shot to open it sometimes also sets the current time.

  • Bug Fix: Added a check for the active subsequence when getting subsequence IDs.

  • Bug Fix: Fixed a missing UPROPERTY() for the deprecated StartOffset.

  • Bug Fix: Matinee to Sequencer—Added support for existing component bindings and camera cuts.

  • Bug Fix: Matinee to Sequencer—Fixed component binding so an existing component binding is used if found.

  • Bug Fix: The old max tick rate is set only if it is unset during an update, so that it is not overwritten during playback.

  • Bug Fix: Sequencer now forces refresh immediately upon splitting a section. Otherwise, the trimmed section will be in a delayed restore state after the new section, causing the evaluation to be out of date.

  • Bug Fix: Sequencer now refocuses on what was previously focused when setting the current time with the Play Time widget. This allows the user to do these actions without needing to click to focus after setting the time: Spacebar to play, CTRL + G to set a time, Spacebar to play.

  • Bug Fix: Sequencer now clears/restores focus only on SetLocalTimeDirectly and changes to weak_PTR. This fixes issues where focus would clear when scrubbing in sequencer.

  • Bug Fix: Movie Scene Capture now always renders from the root master sequence (transform the range). This fixes a bug where tracks in the master sequence would not be in the correct time space.

  • Bug Fix: Fixed a weighted tangent case where cubic solves are not between 0 and 1.

  • Bug Fix: Added Modify() to camera anim/shake track to fix undo/redo.

  • Bug Fix: Take Recorder will now force a role to ROLE_Authority for client spawnables.

  • Bug Fix: Sequencer now allows easing handles only if there are supported blend types.

  • Bug Fix: Movie Scene Capture now allows game sounds if capturing audio. This fixes intermittent audio not being captured when rendering a movie.

  • Bug Fix: Sequencer now sets replicates only if HasAuthority.

  • Bug Fix: Sequencer now defaults the snapshot’s active shot to the current sequence in case there are no shots being rendered. This fixes an issue where {Slate} and {TakeNumber} do not work.

  • Bug Fix: Movie Scene Capture now forces the Engine to show flag path tracing on with -PathTracer. This fixes an issue where if you render from the command line (which launches the Editor in PIE); it does not enable path tracing.

  • Bug Fix: Moved the OnStartedPlaying function to within first update in the UpdateTimeCursorPosition function. This fixes an issue where setting the hud/player visibility was getting stomped on later.

  • Bug Fix: SetLocalTime now always scrolls into view unless a sequence is playing and the Autoscroll setting is off. Tested this with the Autoscroll setting Off to ensure that when a sequence is playing, it does not scroll; also tested to ensure that when jumping to the next key, it does auto-scroll to the key. Tested that when typing in an out-of-view frame number to jump to, it also auto-scrolls.

  • Bug Fix: Sequencer now defers force evaluation until the next tick, to avoid reentrancy when compiling director Blueprints.

  • Bug Fix: Sequencer now updates with the channel metadata name. Otherwise, the key area was getting the name Location instead of Location.X. This fixes a subtle bug that appeared when copying and pasting keys. On undo, the key areas would get their names updated from Location.X to Location, Location.Y to Location, and Location.Z to Location. Then the keys would get copied with those key area names and would all be pasted to the same channel.

  • Bug Fix: Added an option to force refresh the Details panel when initializing Sequencer. This is disabled in the Actor sequence, since it can cause the Details panel refresh to be reentrant because it is initialized from the Open in Tab button in the Details panel.

  • New: Added an option to group selected Sequencer items into a new folder.

  • New: Added AnimClass Property Track to Sequencer for Skeletal Mesh Components.

  • New: Added support for filtering which Sequencer tracks are displayed. Current filters include audio tracks, event tracks, level visibility tracks, particle tracks, skeletal mesh objects, camera objects, light objects, and Live Link tracks. Object-binding tracks can be filtered based on which sublevel the object belongs to. Plug-in developers can also easily add new filters. Additionally, filtering by text has been reworked to be more intuitive.

  • New: Added a new OnPreSequencerInit delegate called before Sequencer initialization, to allow modification of the initialization parameters (such as extending the toolbar).

  • New: The level streaming system in Movie Rendering now flushes each frame during movie capture, to ensure that streaming levels are fully loaded at the start of each frame in order to avoid pop-in mid-shot.

  • New: Added support for FBX Animation import/export using Sequencer.

  • New: Autosave is now suppressed during playback and recording of sequences.

  • New: Added support for converting object bindings with multiple bound objects to Spawnables in the Sequencer timeline.

  • New: Added an option to World Outliner to browse to an Actor in Sequencer if an open sequence controls the Actor.

  • New: Added support for blending multiple audio samples in a single Sequencer track.

  • New: Displayed a source frame indicator for SubSequence and Shot tracks.

  • New: Implemented a duplicate option for Sequencer keys.

  • New: The Sequencer timeline now focuses on the time slider when it jumps to a new position using the playback controls.

  • New: AutoKey now flattens tangents to avoid overshoot.

  • New: Fixed an issue for sending out Live Link curves for facial during Sequencer playback.

  • New: Restore State now works with Animation Sequences.

  • New: Sequencer can now inform the renderer of simulated previous frame transforms for animated objects on camera cut frames (such as for cut-frame motion blur). This works best for real-time sequence playback or captures with no warm-up frames. Note: This is currently an opt-in feature that is enabled through a CVAR: r.MotionVectorSimulation 1.

  • New: Level Sequence Editor Blueprint library added to allow Editor Utility Widgets to open, play, and stop a sequence in the Editor.

  • New: Sequencer now ticks separately. This is needed so that sequencer Actors can tick first, putting objects in their desired locations, then allowing other systems to respond. This fixes special cases where sequencer would tick animation again if it had ticked before Sequencer.

  • New: Add “Animatable Property Changed” transaction to SequencerObjectChangeListener before it broadcasts to the Track Editors. This is because there can be more than one Track Editor for each property type, so multiple transactions were being put on the stack for changing properties like Visibility.

  • New: Added “Select Camera” to the right-click context menu of the camera cut section.

  • New: Take Recorder now sets infinite length when recording starts, rather than when initializing the level sequence.

  • New: Added a hotkey (CTRL + A) to add selected Actors to Sequencer.

  • New: Changed the save icon and added ***** to the breadcrumb to indicate when the Asset is dirty and needs to be saved.

  • New: Added Movie Scene Capture as a BlueprintType.

  • New: For Movie Scene Capture: Added -WriteFinalCutProXML and -WriteEditDecisionList command line options.

  • New: For Movie Scene Capture—Added {sequence} as an allowable tag to movie scene capture output.

  • New: For Movie Scene Capture—Added -shot as a command line option for rendering a specific shot.

  • New: Allow for Skeletal Mesh components inside of child Actor components.

  • New: Fixed autotracking. On a pre-edit change, the changed property is checked against CanKey. This didn’t work for structs, where the property chain would be something like DepthOfField > Focal Distance. A fix was made to support structs, but this broke generic properties because it would check CanKey with the property chain LightComponent > Intensity. The fix here is to find the keyable property and then use the remaining property path. For example, for intensity, the property path will be Intensity. For Focal Distance, the property path will be DepthOfField > Focal Distance.

  • New: FCPXML—Now looks for level sequence Asset without an extension. Added more log errors for clip or audio Assets that are not found.

  • New: Search is now performed through all levels (persistent and streaming) to find Actors with the given binding to export.

  • New: Added Project Settings to Take Recorder settings UI.

  • New: Scroll timeline to newly created sections if they’re not in view.

  • New: Display track node is red if the property track is not bound to a valid property.

  • New: Added ShowBurnin and HideBurnin functions.

  • New: Expand parents when scrolling into view, like the World Outliner.

  • New: Made the Override Instance Data read-write by Blueprint so it can be set in Blueprint.

  • New: Repeater Event Tracks now fire properly when playing in reverse.

  • New: Movie Scene Capture: Expose delay every frame to the user for raytracing. Value is overridden by path tracer sample pixel.

  • New: Show an error when sub display rates do not match. Changed error widgets to EVisibility::Visible so that their tooltips appear when hovered over.

  • New: Added support for track editors to add tracks for all the selected object bindings.

  • New: Added section bounds to cached key positions for track lane. Renamed ObjectTrack to CombinedKeysTrack, and allow other tracks besides object tracks to display combined keyframes (such as the audio track).

  • New: Added BP delegate for Take Recorder states: started, finished, cancelled, slate changed, take number changed.

  • New: Added {Time} for burnin option on takes.

  • New: Now you can expand filtered nodes when they are searched for.

  • New: Split GetSubsceneName into GetSubsceneTrackName and GetSubsceneAssetName.

    • Appends slate and take number to Actor source sub level sequences.

    • Changes logic to find the matching track name rather than the asset name when replacing subsections.

    • Swaps the order of names for audio, level vis, and live link track names to make it more consistent with Actor sources. For example, if you are recording Scene_1 and Take 10 for Cube, the sub level sequence will be called: Cube_Scene_1_0010 rather than Cube. As another example, if you are recording Scene_1 audio, the sub level sequence will be called: Audio_Scene_1 rather than Scene_1Audio.

  • New: Added an option for the custom frame rate in Movie Scene Capture. This allows the custom frame rate to be a configuration that isn’t reset every time you render a sequence (which sets the frame rate).

  • New: Added bEmitChanged to SetSlate and SetTakeNumber in Take Recorder, so that firing events can be controlled.

  • New: An Output error message is generated if a channel is not found in SetValueInChannel.

  • New: Added a stretch/shrink box to add or remove space in the timeline.

  • New: Added a camera cut in Take Recorder if there is a camera component (not just if it is a camera Actor).

  • New: Split the Event track menu to triggers/repeaters, instead of having to always create a trigger section and then a repeater.

  • New: Added default key interpolation settings to the main menu bar.

  • New: Display nodes now can show the Add Object Bindings menu and the Add Tracks menu. By default, display nodes do not show these. However folder nodes do, so you can add these tracks directly to a folder.

  • New: The Sequencer window now closes when the map changes.

  • New: Added back SetRange, but with frame numbers in display resolution. Added SetRangeSeconds.

  • New: Added GetActiveCameraComponent function to get the camera for the active camera cut. Camera cut evaluation can be allowed, but disable binding to the player when CanUpdateCameraCut is false.

  • New: Added a setting to determine whether to show the outliner info column.

  • New: More Python extensions:

    • Added set parent, set property name and path, set_start_frame, set_end_frame, bounded sequencer_examples.py

    • Added a current focal length property track for cameras, modified to use set_start_frame and set_end_frame.

  • New: Added MovieSceneTrack and MovieSceneSection as BlueprintTypes so that they are accessible in Blueprint.

  • New: Pressing CTRL + F in the Sequencer or Sequencer Curve Editor will now jump keyboard focus to the search Widget, allowing you to quickly search the tree.

  • New: Added ability to paste onto the selected object binding track, so that you can copy a component from one binding and paste it onto another component.

  • New: Decoupled keep cursor in playback range while scrubbing with key/section snapping to playback range.

  • New: Added component/property tracks for selected objects when adding through the +Track menu.

Static Mesh Editor

  • Bug Fix: Updated BodyInstanceCustomization to notify when collision is set back to default, so we can update collision visualizations. Updated the Static Mesh Editor to refresh collision visualization on instances when the source mesh collision profile is changed.

  • Bug Fix: Remove Selected button is now disabled in the UV channels dropdown of the Static Mesh Editor when only a single UV channel remains.

Editor and Tools

  • Bug Fix: Fixed a bug in the Property Editor which would cause inconsistent behavior with the expanded and collapsed state of arrays and external properties.

  • Bug Fix: Fixed ensure after undoing following a paste operation in the Editor graph.

  • Bug Fix: Clicking the Clear All button for tag queries now updates the data table viewer when the query is part of a data table row.

  • Bug Fix: Fix FSoftObjectPath/FSoftClassPath properties to handle Use Selected button and copy/paste; this fixes UI in the game mode defaults panel.

  • New: The behavior for right-clicking a node or pin in an EdGraph can now be overridden in FGraphEditorEvents. The Blueprint Diff graph uses this feature.

  • New: Improved the tooltip text for restricted gameplay tags.

Gameplay Framework

  • Crash Fix: Fixed a crash that occurred when copy pasting some child Actor components.

  • Crash Fix: Added a null check in spawn Actor to prevent crashing when called with a null class.

  • Crash Fix: Worlds are now marked “pending kill” when a user leaves them, so that the game cannot attempt to reuse them. This prevents a crash with confusing error messaging when attempting to reuse a world in that way.

  • Crash Fix: Fixed a crash when user selects an instance of an Actor which contains a recently-compiled Blueprint component.

  • Crash Fix: Fixed a call in FSoftObjectPath’s TryLoad function, because some code references to Actors in a loaded sublevel would refuse to reload the level in place and then crash.

  • Bug Fix: The Category dropdown for components is now more consistent with regard to what can and cannot be changed.

  • Bug Fix: Fixed a check to see if the GE owner is authoritative before modifying the timers for periodic effects. This resolves a log-spam issue.

  • Bug Fix: Subsystem collections no longer keep their outer alive inappropriately.

  • Bug Fix: UDataTable log messages now properly reflect their functions.

  • Improvement: Reworked UpdateOverlaps’ internal API to use TArrayView and thereby not require that all input arrays are TArrays with allocations on the heap. Converted MoveComponentImpl to use an inline array of FOverlapInfos. Prevents many allocations when objects move within a few overlapping volumes.

  • Bug Fix: Fixed an ensure that occurred when adding sublevels as part of CommitMapChange.

  • Bug Fix: Gameplay Abilities that responded to gameplay events can no longer result in the removal of other abilities triggered by the same event.

  • Bug Fix: We now clear ChildActorTemplate on an instance if the child Actor is set to a different class.

  • Bug Fix: Fixed a bug where similar paths would not be properly scanned in -Game mode. We no longer scan the path if it matches a path that has already been scanned or if it is in the file path of a child that has already been scanned.

  • Bug Fix: Reordered the code in PreActivate so that it set the current ability info before applying tags that would potentially block and cancel other abilities. This avoids potential bugs where you end up in a loop that calls back into the current ability and tries to do something that needs the current info set.

  • Bug Fix: Adjusted log levels for LogNetPlayerMovement to make Log and Verbose output less spammy, and moved some existing logs down a level to more verbose levels.

  • Bug Fix: Removed an old log in GameplayAbility.cpp that caused spam on output and was supposed to be temporary.

  • Bug Fix: Fixed ServerTravel to use the correct URL parser to extract map names. This fixes bugs occurring when user travels to maps without using a full path.

  • Bug Fix: Added a comment to SetTimer to clarify that InRate and InFirstDelay are in seconds.

  • Bug Fix: Added LastClientAckRealTime to character movement client data, to track the last time (undilated) that a client receives any Ack from the server for movement; this includes good moves and corrections. Also clarified the comments on some other timestamps.

  • Bug Fix: Added an option to InterpMovementComponent to disable swept collision movement and to set the teleport type.

  • Bug Fix: Made the following UProjectileMovementComponent helpers public instead of protected: ComputeVelocity(), ComputeMoveDelta(), ComputeAcceleration(), ComputeHomingAcceleration().

  • Bug Fix: Instanced components are now correctly attached to Blueprint constructed components.

  • Bug Fix: Moves saved by CharacterMovementComponent are now allowed to combine when changing between static base components. This saves bandwidth and reduces server RPC cost when running across many static pieces. Changing dynamic pieces still requires flushing the move, because the relative location changes. The CVar p.NetPreventMoveCombiningOnStaticBaseChange can be enabled to revert to old behavior.

  • Bug Fix: Combined fixes for bandwidth and server performance related to client character move. Character client moves can now be combined when attached to objects, even if the previous location was overlapping with a solid object that blocks movement. Attachment to an object carries the character along anyway regardless of those cases, and the character can be blocked by what it’s attached to as well. This was preventing client throttling when attached in this way. Move combining is allowed when the attachment Relative Location and Rotation changes in a very small threshold, to account for jitter from Transform updates. This happens especially when the character is attached to simulating objects. The GetClientNetSendDeltaTime function allows small control rotation changes when using the Stationary send rate, to account for jitter when attached/standing on objects.

  • Bug Fix: SceneComponent attach replication now properly handles snapping behavior for Relative Location and Rotation.

  • Bug Fix: Fixed an issue where Actors were ending up at the wrong location when user was undoing a sublevel visibility change for sublevels with a location offset.

  • Bug Fix: Forced a substep of falling character movement when the motion would pass the jump apex point. We now compute the time to the apex point and refund the remaining time for the next iteration. This also more accurately triggers the NotifyApex functionality because it is triggered after the movement that reaches the exact apex point. It can be disabled by the setting p.ForceJumpPeakSubstep 0 if the user does not want this for some reason.

  • Bug Fix: Fixed an issue where per-instance added components were not attached to the correct Blueprint-created component when the Actor was duplicated.

  • Bugfix: Spectator pawns now correctly go through the full unpossess lifecycle when the DestroySpectatorPawn function is called.

  • Bugfix: Fixed an issue where component instance data cache was not applied correctly to a root component that is attached to another Actor.

  • Bugfix: Fixed an issue occurring with the FindTeleportSpot function when finding locations for spawning an Actor (before BeginPlay). It now applies the proposed Z adjustment to all XY position permutations, instead of only applying it to the last of the XY-only permutations after all of the XY-only options failed. When an adjustment axis is nearly zero, more permutations are tried rather than duplicating the four axial permutations. The behavior of the FindTeleportSpot function for Actors that have begun play has not been changed.

  • Bugfix: Fixed an issue where you were unable to spawn four or more players when there is only one Player Start object available. Note that it is still preferable to include multiple Player Start objects to avoid contention when Player Starts are occupied.

  • Bugfix: Fixed a crash occurring when unloading a streaming level after changing bIsStatic in the level Details.

  • Bugfix: Light subclasses no longer display two sets of properties in the Details panel.

  • Bug Fix: The default class type of SpawnedSpectator now matches the type specified by the GameState.

  • Bugfix: Fixed a bug where GameplayTags were not properly redirected when using ImportText if the GameplayTags were renamed.

  • Bugfix: Fixed the result of the GetDirectionAtSplineInputKey function of USplineComponent for scaled objects.

  • **New: **The ActorLineTraceSingle function of AActor is now correctly marked const.

  • New: Framework - Provides functions to get the MinimalView from a SceneCaptureComponent.

  • New: Scene Capture Component - Added a way to configure the capture view using the minimal view from a camera.

  • New: Framework - Split the functions for GetPixelBoundingBox and GetPixelPoint into static functions that do not require you to rebuild the FSceneViewProjectionData. Rebuilding is expensive, and if you have the projection data, you can now run through these calculations a lot faster.

  • New: SceneCapture2D - Added a new property to allow you to control the near clipping plane of the scene capture component.

  • Improvement: CharacterMovement: Deferred “limit air control” code in the PhysFalling function until we actually need the result, which is only after a collision. This reduces the number of calls to the CalcVelocity and NewFallVelocity functions from 2 to 1 in normal cases. Added a virtual ShouldLimitAirControl function for deciding if we want to limit air control at all. This is useful for falling modes which are more like flying (low gravity or anti-gravity).

  • Improvement: Optimized UpdateOverlapsImpl (in UPrimitiveComponent) to manipulate pointers to FOverlapInfo structs rather than the large structs themselves. This reduces the cost of this function by 10 percent or more.

  • Improvement: Improved the comments for UProjectileMovementComponent regarding interpolation, to make it clear that you must do additional hookups aside from just turning on “Interpolate Movement” (in other words, point it to the interpolated visual component and plug in network updates).

  • Deprecated: Deprecated PostPhysicsComponentTick has been removed from UPrimitiveComponent.

  • Deprecated: Deprecated the Pauser function of AWorldSettings, and replaced it with the PauserPlayerState, GetPauserPlayerState and SetPauserPlayerState functions.

  • Deprecated: The PawnList function of UWorld has been removed, and instead of using FConstPawnIterator you should use TActorIterator or TActorRange. FConstPawnIterator has been reworked to be a wrapper around TActorIterator<APawn>. This should allow for seamless backwards compatibility for most operations that would have been done with an FConstPawnIterator, however FConstPawnIterator might be removed in the future.

  • **Deprecated: **The AddPawn, RemovePawn, and GetNumPawns functions of UWorld have also been deprecated.


  • Bug Fix: Allow unloaded String Table Assets to be picked by text properties.

  • Bug Fix: Fixed the “compile” localization gather INI being ignored by source control when editing a localization target in the Localization Dashboard.

  • New: Added the Join function to FText as a way to combine delimited text in a localization-friendly way.

    • Updated FTextBuilder to use this to join several generated lines together, rather than building a single FString which loses all the localization information.

    • Note: FTextBuilder will now consistently add a line when any of its “AppendLine” functions are called. Previously, it might have done nothing if the builder was empty and indentation was disabled.

  • New: Optimized the localization gather for Assets by caching which fields from a type require gathering for localization.


  • Crash Fix: Fixed a crash with Seamless Travel caused by Network GUIDs being received or cleared during a transition.

  • Crash Fix: Fixed crash if a socket failed during a send.

  • Crash Fix: Fixed a rare crash that could occur when replicating an Actor subobject.

  • Crash Fix: Fixed a crash that could occur while processing fast shared bunches in the replication graph due to additional remote calls occurring.

  • Crash Fix: Fixed an issue in the GridSpatializaition2D node for the replication graph that could cause a crash if a replicated Actor had an invalid position.

  • Crash Fix: Fixed a rare crash when initializing a replication shadow state buffer with a missing archetype.

  • Bug Fix: Calling ForceRelevant on a dormant static Actor will now force the actor to be processed until all connections have replicated it.

  • Bug Fix: Fixed cases where properties whose Replication Conditions changed and could not be replicated until they changed again.

  • Bug Fix: Prevented Packages, Objects, or Classes loaded by Network Async Loading from being garbage collected — this could cause assets (especially Blueprints) to appear to never load on clients.

  • Bug Fix: Updated RepLayout to not pass raw pointers around, and instead used type-safe wrappers.

  • Bug Fix: Fixed NetProfiler reporting double Custom Delta Property size.

  • Bug Fix: Fixed some issues where Role and RemoteRole would get stuck when changing Possession with multiple clients.

  • Bug Fix: Fixed an issue with Actor channel clean-up in the replication graph.

  • Bug Fix: Fixed some Oodle analytics errors.

  • Bug Fix: Fixed edge cases in RepGraph that could cause crashes referencing invalid Actor Channels or Object Replicators.

  • Bug Fix: Fixed an issue where RepNotifies for BitFields may pass in an incorrect previous value.

  • Bug Fix: Fixed network driver clean-up when initializing listen server fails.

  • Bug Fix: IPv6 addresses no longer require square brackets by default when serializing in a FURL. Now, Square brackets are only necessary when expressing an address and a port number — this allows for consistent address representation with most platform network APIs.

  • Bug Fix: Fixed an issue with dynamic subobject replication that could cause components to be leaked on the client.

  • Bug Fix: Fixed an issue where connections could be initialized into a bad state if connecting to the same address and port as a prior connection.

  • Bug Fix: Initialized FSteamAuthHandlerComponent::State to Uninitialized

  • Bug Fix: Made Demo Recording Timeslicing properly use milliseconds.

  • Bug Fix: Fixed an issue where a server could receive data from the client on a closed Actor channel. The server would then try to open the channel, fail, and report that to the client, which would start explicitly nacking all packets containing references to that channel.

  • Bug Fix: Corrected typo and renamed UReplicationGraphNode_ConnectionDormanyNode to UReplicationGraphNode_ConnectionDormancyNode.

  • Bug Fix: Blueprint Replicated Property Conditions are now properly serialized out with UProperties so that they are not lost in packaged games.

  • Bug Fix: The engine now waits to broadcast “Party Initialized” until Replicated Data is received. If the local player is the party leader, we record that the data is received when initializing. Additionally, Social Parties do not trigger PartyInitialized broadcasts until the Replicated Data is received.

  • Bug Fix: Fixed an issue where a listen server without a microphone will drop clients with a microphone if voice is enabled.

  • New: The -UE4Port command-line option for the Pixel Streaming WebRTC Proxy Server has been renamed to -UE4 and supports the “Address:Port” format rather than only accepting a port. This enables a Proxy to connect to a UE4 instance running on a different machine or to use address to connect to an instance on the local machine.

  • New: Added CVar, enabling Oodle to skip compressing packets below a particular size. If tuned to skip packets that fit within a single ethernet frame (CVar value of approximately 18), it will reduce CPU usage while theoretically keeping the same network performance — on-the-wire bandwidth stays the same, but bandwidth calculations for ISP/service costs will be affected.

  • New: Added comments and documentation for Object Replication, Connection Establishment, Packet Sending and Receiving, and other networking code.

  • New: Added better tracking of dependent Actors in the replication graph so that we can guarantee they will be removed on destruction.

  • New: Added MaxSecondsInReceive and NbPacketsBetweenReceiveTimeTest property to limit the amount of time the Receive Tick can process incoming packets. Setting both values and the IpNetDriver will stop processing incoming data when the limit is reached.

  • New: Added “net.SkipReplicatorForDestructionInfos” to control whether clients should attempt to avoid the creation of object replicators and shadow states while processing destruction info bunches from the server.

  • New: The engine will now print socket error strings in log messages in test and shipping executables.

  • New: Made the WithValidation tag for server RPCs optional.

  • New: Added configurable throttling of client to server camera update calls that could consume all the available bandwidth at high frame rates.

  • New: Made a number of scope cycle counters in networking functions conditional behind the net.EnableDetailedScopeCounters Cvar. This should allow FramePro captures to be faster by default while preserving the ability to get detailed information as needed.

  • New: Added notification to all active network drivers when an Actor is destroyed.

  • New: Added DISABLE_REPLICATED_PROPERTY macro to explicitly disable the replication of a networked property in GetLifetimeReplicatedProps. This is needed since we will start warning when we detect replicated properties not registered in GetLifetimeReplicatedProps

  • New: Added DISABLE_ALL_CLASS_REPLICATED_PROPERTIES macro to disable the replication of all replicated properties of a given class.

  • New: Added RESET_REPLIFETIME macro that allows you to reenable a networked property that was disabled in a base class.

  • New: Added new Analytics Structures that can be used to more accurately track Queued Actor Channels, Network Async Loads, and Connection Saturation.

  • New: Added ability to limit the spatialization 2D grid of the replication graph to a specific region via SetBiasAndGridBounds. When the optional grid bound is set, we clamp the player view locations to the closest grid in the bounded region instead of growing the grid list to its location. Additionally, when adding Actors, we limit the available cells to coordinates inside the region.

  • New: Added experimental AES256 GCM packet handler implementation.

  • New: To help connection stability, we now allow socket errors to happen for a configured delay before killing connections.

  • New: Added packet reordering for out-of-order packets received on the same frame. These packets will now be processed normally instead of being dropped, reducing packet loss in this case.

  • New: Ensured a connection’s PlayerController and current view target (Pawn) are processed first in the RepGraph gather list.

  • New: Improved Actor prioritization when using the replication graph.

  • New: Connections’ view targets and their owning Actors (usually the Player Pawn and Controller) are now prioritized higher.

  • New: Increased the default range used for distance-based priority from 30 m to 600 m, since all Actors beyond this range have the same applied priority scaling.

  • New: To prevent and detect the generation of bad dictionaries, added extra safeguards to the Oodle dictionary generator.

  • New: Improved a log message in UReplicationGraph::ProcessRemoteFunction when an Actor is not valid for replication or if an Actor is being destroyed.

  • New: Simple HTTP web server functionality can now be leveraged via the newly added FHttpServerModule and IHttpRouter public interfaces.

  • Deprecated: Deprecated CDKeyHash and CDKeyReponse strings on the net connection.

Network Profiler

  • Bug Fix: Network Profiler now correctly reports the size of RPCs with parameters larger than 8 KB.

  • Bug Fix: Fixed an issue preventing large profiles from loading in the network profiler.

  • New: Added OnNetworkProfileFinished delegate in Network Profiler, which executes when a network profile has finished being written to.

  • New: Added average time value to Network Profiler Actor list view.

  • New: Process identifier is now automatically added to network profile filenames.


  • Crash Fix: Fixed a crash when the replay spectator controller is created on a dedicated server.

  • Bug Fix: Fixed issue with Fast Arrays and Replays, where checkpoints could delete elements.

  • Bug Fix: Fixed RepNotify functions not being called on Dynamic Actors spawned into sub-levels that are streamed out and back in before garbage collection during replay playback.

  • Bug Fix: Fixed an issue with the serialization of net field exports in replays.

  • Bug Fix: Fixed an invalid backward-compatibility check in replay playback with dynamic arrays.

  • Bug Fix: Fixed a case where backward-compatible replay warnings were generated when receiving a remote call with no parameters.

  • Bug Fix: Fixed error handling for replay checkpoints attempting to serialize corrupt strings.

  • Bug Fix: Fixed an issue when loading a replay checkpoint where Actors were incorrectly attempting to register network GUIDs.

  • Bug Fix: Fixed a thread safety issue in the local file replay streamer when setting an error condition.

  • Bug Fix: Reduced memory spike of the ExportGUIDArchives when Demo recording is enabled and a client receives several new Actor channel bunches in a single frame.

  • Bug Fix: Fixed an issue where information about destroyed net start-up Actors could be missing when scrubbing past a replay checkpoint.

  • Bug Fix: Fixed a crash that could occur when starting replay playback from a console command.

  • **Bug Fix:** Fixed an issue where some replicated properties in the world settings would not be reset properly when scrubbing a replay.
  • New: Added “demo.FastForwardLevelsPausePlayback” to control whether streaming levels will pause playback while they wait for streaming replay data to be available.

  • New: Removed recording of Character interpolation samples from replays in favor of standard replicated movement.

  • New: Added a call to enable flushing of active replay streamers.

  • New: Added a call to update the current playback time to the network replay streamer interface.

  • New: Added multi-perspective demo viewing functionality — this allows for multiple viewports to see the same demo from different angles during playback.

  • New: Added a config option to allow the demo net driver to filter out specific multicast RPCs.

  • New: Added the ability to use exec commands on an arbitrary replay streamer class.

  • New: Added “demo.JumpToEndOfLiveReplay” to control whether or not to fast forward to the end of a live replay when playback starts.

  • New: Added “demo.LoopCount” for playing replays a specific number of times rather than infinitely looping.

  • New: Added the full replay URL as an argument to the replay streamer when starting a recording.

  • New: Added a method to enable game code to determine when replay playback is in the middle of finalizing the fast forward process (calling RepNotify functions).

  • New: Added the ability to set an analytics provider on a replay streamer.

  • New: Adding logging of replay header flags when playback has started.

  • New: Added the option to use -replaystreamer= or -replaystreameroverride= on the command-line for testing.

  • Improvement: Reduced log spam when recording replays with the LocalFileNetworkReplayStreamer implementation.

  • Improvement: Increased the default max buffered stream chunk count in the local file replay streamer.

  • Improvement: Changed the engine default replay streamer from null to a local file. The local file streamer has improved game thread performance and supports additional replay features.


  • Crash Fix: FCurlHttpRequest no longer crashes in GetContent or GetContentLength if the request has no payload.

  • Crash Fix: Fixed a crash in HandlePartySystemStateChange code in USocialParty.

  • Crash Fix: When creating other members, the system could crash if there was no existing local member. InitializePartyInternal now always initializes the local player’s party member first to avoid this situation.

  • Crash Fix: The SocialToolkit no longer fires an inappropriate assert when another platform user is logged in already.

  • Crash Fix: Fixed a crash that occurred when trying to modify a session that has not yet been created when using the Steam OnlineSubsystem.

  • Crash Fix: Fixed a Steam crash that occurred when the engine was unable to read or modify the steam_appid.txt file while using development builds.

  • Bug Fix: Fixed a memory leak when storing Json in FVariantData.

  • Bug Fix: AppleHTTP no longer leaks memory when validating SSL certificates.

  • Bug Fix: We now unflag missing XMPP when a party state changes from CreatePending to Active. This fixes party functionality degraded state not updating if a previous party was Disconnected when we left it.

  • Bug Fix: Fixed memory corruption caused by using mismatched allocators in VivoxVoiceChat.

  • Bug Fix: URL handling code now removes the web link preceding “?” before parsing “&” separated value parameter pairs.

  • Bug Fix: Fixed a bug where Google OAUTH scopes were wiped during logout and reloaded from .ini, but the scope added in code during initialization was not being re-added.

  • Bug Fix: When changing the party leader, OnDemoted will now wait to broadcast on a Social Party Member until after the leader has been reassigned.

  • Bug Fix: Fixed invites to private matches using the Steam Overlay not sending lobby data due to insufficient permissions.

  • Bug Fix: Steam voice no longer stops broadcasting when seamless travel takes place.

  • Bug Fix: Fixed matchmaking and session join issues when using the Steam OSS without using the Steam NetDrivers.

  • Bug Fix: Fixed a thread safety issue in the HTTP module’s libcurl implementation where a response could be considered complete before the result code was set.

  • Bug Fix: Requests in the HTTP module’s libcurl implementation could return that they completed successfully despite receiving an invalid HTTP response code; these requests now fail.

  • Bug Fix: Fixed an issue where Steam lobbies stopped updating the joinability status if the “maximum number of connections” property was frequently modified.

  • Bug Fix: Fixed Steam library paths being hardcoded in the Linux build script’s rpath.

  • New: Implemented CreateSessionIdFromString for Steam’s Session interface.

  • New: Added certificate SPKI hash pinning support with FSslCertificateManager to the HTTP module implementation for iOS and Mac.

  • New: Added RestoreParties and CleanupParties functions to IOnlinePartySystem to facilitate a client’s party state from a backend service. Added OnPartyInviteRemoved when an invitation is removed.

  • New: We have exposed FVariantData type suffix and enabled FVariantData to create a JSON object from a string.

  • New: Added config settings for whether we should leave a party on disconnect, and whether we should cache parties for join on disconnect

  • New: The VivoxVoiceChatPlugin now has delegates to respond to connection, login, and channel state changes.

  • New: Added PATCH verb support for Curl

  • New: There is now an option to always send invitations on the primary party system in addition to platform invitations.

  • Removed: Replaced deprecated Google+ scope with basic userinfo scope.


  • Bugfix: Paper2D editor viewport mouse operations when using scale > 1 are no longer offset.


  • New: Exposed Transform attributes to the field components.

  • New: Added an option to have outer bounding regions for MBP.

Collision Detection

  • New: We now skip invalidating collision if no changes were applied when calling SetCollisionResponse functions.

Physics Asset Editor

  • Bugfix: Disallow moving elements/constraints in physics asset editor when simulating to prevent breaking operation stack.

Rigid Bodies

  • New: Add setting to stop simulating Anim Dynamics below a minimum timestep

  • New: Add setting to stop simulating Rigid Body nodes below a minimum timestep.


  • Bug Fix: Async loading textures no longer stall the game thread in PostLoad when using async loading packages.

  • Bug Fix: Adjusted the way our embedded web browser’s user agent string is generated. This will make the browser look more familiar to pages that check against the user agent.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: Added missing DX12 RHI for ReadSurfaceData with FLinearColor Output.

  • New: (Mac and iOS) Changed how dsyms and stripping are handled. Now only generates the dsym if we strip, and only strips in Shipping (unless command lines override it, see alwaysgeneratedsym in UBT).

  • New: Reworked virtual memory API to support page caches and heterogeneous memory architectures.

  • New: Converted hardcoded FPlatformInfo table to DataDrivenPlatformInfo.ini sections.

  • New: Fixed up ALL platform header files to match new required naming conventions for HAL files (XXXPlatformFile.h, not XXXFile.h, and all platforms must have a header file, even if it just #includes another one, like iOSPlatformTime.h just #includes ApplePlatformTime.h).

  • New: Optimize Tonemap function for non-mobile. Use Quad intrinsics to cheapen the cost of the sharpen function. Gives around 15% speedup.

  • New: Added UnrealBuildTool.GetAllEngineDirectories(string OptionaSubDirectory) that makes it easier to get, for instance, all Config directories under Engine and any PlatformExtensions. Properly scans PlatformExtensions for DataDrivenPlatformInfo files.

  • Improvement: Optimized Metal render pipeline creation code to improve load times on Apple platforms.

  • Improvement: Moved mapped .ubulk files to .m.ubulk so that they can be aligned and not compressed without affecting other bulk data, such as textures.

  • Improvement: If you were depending on dsym files in non-Shipping builds, they are no longer generated by default in non-Shipping because they are slow to generate, and almost never needed (for instance, Instruments can use the source executable instead of a dSYM to symbolicate).

All Mobile

  • Bug Fix: Fixed a black screen displaying for several seconds after the splash screen when not using a startup movie or the early preload screen system.


  • Crash Fix: Fixed a crash on Android when trying to Replay Cinematic using IBM streaming. Adding VideoDecoder$FrameUpdateInfo to proguard exceptions.

  • Crash Fix: Fixed an assert in dump_syms when using Android’s clang toolchain and possibly newer clang on Linux x64.

  • Crash Fix: Fixed issue with missing class definition causing a crash on KitKat.

  • Bug Fix: Fixed an issue that was causing some devices to improperly be reported as gamepads.

  • Bug Fix: Restored support for Exit and Quit on Android.

  • Bug Fix: Allow forwarding Back button to Java on Android.

  • Bug Fix: Fixed a compile issue for Android x86 with Media Player.

  • Bug Fix: Fixed an issue with gamma correction for GLES 3.1 external texture sampling, which was causing brightness problems with video playback.

  • Bug Fix: Fixed logging of store version.

  • Bug Fix: Fixed an issue where Generated SymbolizeCrashDump for Android was invalid.

  • Bug Fix: Fixed default superclass for GameActivity (controlled by GameActivitySuperClass property in /Script/AndroidRuntimeSettings.AndroidRuntimeSettings).

  • Bug Fix: A directory for packageInfo.txt is now created if it doesn’t exist.

  • Bug Fix: Fixed LLM reporting for meshes on OpenGL RHI.

  • Bug Fix: Fixed an issue with inability to summon the virtual keyboard on Android 9.0 with TargetSDKVersion=28. Now you can manually request focus when clicking on an EditText.

  • Bug Fix: Fixed an issue where Intent was passing extra data to be consistent between SplashActivity and GameActivity.

  • Bug Fix: We now keep Profile override from ConifgRules only if OverrideProfile is set.

  • Bug Fix: Disabled Oculus plugins on Android X64 (Intel) since they are not supported.

  • Bug Fix: Fixed staging of libUE4.so for Ant builds on Android.

  • Bug Fix: Fixed an issue attempting to use NetworkRequest.Builder on KitKat.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: We now default controllers to use hat d-pads on Android.

  • New: Per-device memory bucket rounding can be enabled from ConfigRules with MemoryBucketRoundingAddition variable (defaults to 384 if not set).

  • New: Added an MD5 hash check of Android build template files to invalidate intermediate source from previous packaging.

  • New: Enabled intercepting Java-side logging on Android with a callback.

  • New: Added gameActivityAfterMainViewCreatedAdditions to the GameActivity.java.template for UPL.

  • New: Added an option to split OBB into main and patch if it exceeds OBB size limit (bAllowPatchOBBFile in project settings).

  • New: Added a permission validation tool for Android that checks final merged AndroidManifest.xml in APK against permission_whitelist.txt in the project’s Build/Android directory.

  • New: Added Safe Zone handling with detection of insets and display cutout for portrait and landscape orientations.

  • New: Added optional handling of activity resize events for Android. (Android.EnableNativeResizeEvent console variable).

  • New: Added support for UPL to insert a finalizing section at end of onCreate (gameActivityOnCreateFinalAdditions).

  • New: Pass on hardware (SRC_Hardware) and chipset (SRC_Chipset) information for use in device profiling matching rules.

  • New: Actions can be inserted whenever the software keyboard opens or closes on Android with UPL (gameActivityResizeKeyboardAdditions).

  • New: Enabled use of display cutout region on certain Android models (see SplashActivity.java).

  • New: Added handling of required permissions at startup in SplashActivity with com.epicgames.UE4.GameActivity.StartupPermissions in AndroidManifest.xml (comma-separated list).

  • New: Added support for store version offset by architecture, so multiple APKs may be active for building and have different store versions in manifest (required to upload to Google Play Store).

  • New: Android device profile matching rules (AndroidDeviceProfles.ini) will now be picked up from Android platform’s config directory if present.

  • New: Added native Android trace support.

  • Improvement: Removed unneeded Java imports.

  • Improvement: Better chipset identification checking in ConfigRules (ignore case).

  • Deprecated: Disabled GameApplication for Android projects still using Ant (Note: Gradle should be used from now on; Ant is depreciated).


  • Crash Fix: Fixed a crash with offscreen framebuffer mode (multi-threading) when switching to fullscreen.

  • Bug Fix: Added missing NtoHS, HtoNS, NtoHL, and HtoNL implementations in ICMP module.

  • New: HTML5 platform support will be migrated to GitHub as a community-supported Platform Extension and no longer officially supported by Epic in upcoming releases.[br]



  • Bug Fix: Fixed an issue on iOS devices where the Metal renderer was consuming CPU time unnecessarily in simple scenes which were not GPU bound. This was causing overheating, especially on iPhone X.

  • Bug Fix: Implemented a workaround for fast::sincos inaccuracy.

  • Bug Fix: Dismissing an alarm in a project no longer leaves the project’s sounds muted.

  • Bug Fix: When compiling to Metal convert local constant arrays to the new safe_array template, which sanitizes input addresses. This should reduce the number of bad-access GPU timeouts according to Apple.

  • Bug Fix: Fixed an issued with reflection brightness of 0 causing problems when inverted on A11 and A12 GPUs.

  • Bug Fix: Fixed running developer iOS builds with the address sanitizer enabled.

  • Bug Fix: Now only allowing use of frame-buffer fetch in fragment shaders for iOS Metal as they aren’t supported in any other shader stages.

  • Bug Fix: Fixed an issue with com.apple.developer.associated-domains when the value is a string, not an array, by adding CODE_SIGN_ENTITLEMENTS in the project file.

  • Bug Fix: Builds with dSYM Options Enabled now compile correctly.

  • Bug Fix: Fixed a bug where iOS failed during the build step with OSS Facebook plugin enabled when there are spaces in the project path.

  • Bug Fix: iPhonePackager now works properly with HiDPI monitors.

  • Bug Fix: iOS logging is now possible for all non-shipping builds, even if the xCode debugger is not attached.

  • Bug Fix: Fixed the path for dSYM.zip for embedded DLL compiles.

  • New: Implemented a BackgroundHTTP prototype feature. This allows you to make HTTP download requests that will attempt to continue downloading even while your app is backgrounded.

  • Bug Fix: Fixed the iPhonePackager signing of .ipa files with extensions or frameworks (the changing bundle ID does not currently work with extensions due to bundle ID re

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.strictions).

  • New: We now support separate MSAA and resolve targets on Metal MRT for iOS devices. This means the Forward renderer can support MSAA the same as it does on macOS.

  • New: Enabled animation memory-mapped IO on iOS. Saves 10–20 megs of memory.

  • New: Added method to FiOSAppDelegate query if recording permission is present.

  • New: Enabled Memory Mapped IO for Audio on iOS. This can save memory by letting the OS toss audio memory and reload it from flash as needed.

  • New: Changed how framework signing for dylibs works. Remove the framework searching from Xcode into UBT.

  • New: The DeploymentServer will no longer query for iOS or tvOS devices when the project does not have iOS or tvOS as supported targets.

  • New: Enabled optional high-quality voice chat.


  • Bug Fix: Fixed linking to libs with spaces in their paths.

  • Bug Fix: Bundled the Linux Toolchain for installed builds if they exist.

  • Bug Fix: UE4 can now have spaces in its install path.

  • Bug Fix: SDL is now initialized before trying to request info from the VulkanRHI.

  • Bug Fix: Fixed Linux not using RHI thread by default.

  • Bug Fix: Fixed RM64 builds by Implementing missing non-SSE Math FPU Vector functions:

    • VectorMask_LT(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_LE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_GT(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_GE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_EQ(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_NE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMaskBits(const VectorRegister& Vec1)

  • Bug Fix: Fixed an issue where the callstack frames could ignore up to the value of the si_value from the signal, possibly cutting off all the frames.

  • Bug Fix: Fixed lingering tooltips.

  • Bug Fix: Fixed testvulkan samples with UEs aarch64 SDL libraries.

  • Bug Fix: Provided callbacks to handle negative time deltas gracefully.

  • Bug Fix: Minimizing a maximized window no longer steals events from Slate.

  • Bug Fix: Temporarily disabled Editor fullscreen for Linux.

  • Bug Fix: Fixed Compute Skincache for Linux during a cook.

  • Bug Fix: Fixed a bug where the ShaderCompileWorker was crashing when setting FORCE_USE_STATS ShaderCompileWorker was passing “-ReduceThreadUsage” command line, and FTaskGraphInterface::Startup() wasn’t getting called, so FTaskGraphInterface::Get() was returning NULL and crashing ShaderCompileWorker processes.

  • **Bug Fix: **Added code that calls FPlatformProcess::OpenProcess() in EngineSessionManager.cpp when checking previous crash data, and it is crashing on Linux—since this method isn’t implemented for FUnixPlatformProcess. As a temporary solution, because OpenProcess() is a limited function in comparison to CreateProcess(), it can only be used to check if the process ID is running.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: Implemented ThreadStackWalkAndDump and CaptureThreadStackBackTrace for Unix Platform.

  • New: Added Linux game splash screen support.

  • New: Symbols are now hidden by default for non-monolithic builds for Linux/Mac.

  • New: Uses SF_VULKAN_SM5 as the default null shader language over GLSL_150.

  • New: Added SDL2 EG Wayland_Vulkan_GetRequiredInstanceExtensions.

  • New: Files created on Linux will now have permissions 664 versus the old way of 644—which is the same as Mac—to unify the platforms on file permissions.

  • New: Made unresolved symbols a compile-time error on Linux.

  • New: SDL2: Update to newer 2.0.10 version SDL 2.0.10 changes: https://icculus.org/~icculus/dotplan…10-changes.txt

  • New: Implemented FPlatformMisc::GetPlatformChunkInstall() for Linux.

  • New: When using WaitAndFork, you can now supply an exit code in a child process to request that the parent close as well.

  • Improvement: Optimized how to focus out events are handled, preventing ~150ms hits when opening/closing context menus or tooltips.

  • Improvement: Improved functionality for the support extensions Export/Import Open/Save dialog in the Slate File Dialog Window.

  • Improvement: Implemented a better Linux CreateGuid. This can be disabled with -norandomguids command-line option.

  • Improvement: Reduced monolithic binary sizes.

  • Deprecated: Disabled GoogleVRHMD on Linux until the library is bundled.


  • Crash Fix: Fixed a crash in the Slate File Dialog window when clicking on an empty space in the drop-down menu.

  • Bug Fix: Fixed failing to link to the Steam API when running on Mac OS platforms.

  • Bug Fix: Disabled HDR support on macOS older than 10.14.4 to work around an issue with older GPU drivers.

  • Bug Fix: ShaderObj files no longer accumulate in the /tmp/* directory when cooking shaders for Mac. When using native shader libraries we will emit them from the DDC to the right place.

  • Bug Fix: Changed the way we restore the macOS binary shader cache, as this may help on Intel/Nvidia Metal drivers.

  • Bug Fix: Mac Python—upgraded to 2.7.14 (bringing this in parity with Win64 and Linux)

  • Bug Fix: Fixed a Mac crash caused by an attempt to access info about a disconnected display before the display reconfiguration event was received.

  • Bug Fix: On macOS, properly disambiguated Intel command-buffer failures.

  • Bug Fix: Setting a compute shader in MetalRHI should not affect the graphics tessellation state or we’ll fail to go down the proper DrawPatches rendering path and ultimately assert on a missing PrologueEncoder.

  • Bug Fix: Fixed few compile errors caused by new warnings introduced in latest Apple Clang (Xcode 10.2).

  • Bug Fix: Resolved requests from Nvidia and Intel to aid Metal performance:

    • Swaps back to Managed uniform buffers to improve performance on discrete GPUs.

    • Disables the parallel command-buffer encoding on Intel & Nvidia as the small command—buffers hurt more than they help—can be forced on with the -metalparallel command-line option.

    • Allows forcing on async. compute with -metalasynccompute so NV can A/B test whether it helps.

  • Bug Fix: Moved the 'patchCount variable to the device address space in Metal tessellation shaders to avoid an Nvidia driver bug.

  • Bug Fix: Re-enabled XGE for cross-building for Linux on Windows.

  • Bug Fix: When entering the default crash handler, it is now set to current thread.

  • Bug Fix: Removed conditions on include paths for QtCreator.

  • Bug Fix: Now using the new dsymutil with Xcode 10.2 to check the version of dsymutil before looking for alternates.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: For non-Shipping Mac builds, enabled MetalRHI’s internal GPU/Metal debugging tools by default to provide more information about problems—this means that bugs that aren’t 100% reproducible should still report more useful information to help identify the problem. Also fixed the location of where the GPU debugging for macOS is enabled so that it is actually useful.

  • New: All the GPURestart logs are now copied into the .log file for non-sandboxed UE4 projects so that we don’t need to gather sysdiagnose from Macs to report bugs to the GPU vendors. Only happens when the crash is caused by a GPU error.

  • New: Improved startup movie playback performance on macOS by using I/O Surface backed pixel buffers.

  • New: Reports all thread backtrace when a hang happens.

  • New: Implemented ThreadStackWalkAndDump and CaptureThreadStackBacktrace.

  • New: Added TCFRef for managing Core Foundation Ref lifetimes.


  • Bug Fix: When HMD display resolution is not zero, you can now override with HMD resolution in FSceneViewport::ResizeFrame().

  • Bug Fix: Fixed an issue with JNI dependency that was causing a compile issue.


  • Bug Fix: Fixed Windows directory watcher fail when watching over 63 directories.

  • Bug Fix: Fixed compilation errors on Windows when using a WinSDK version later than 10.0.18362.0 due to header conflicts in the networking layer.

  • Bug Fix: Fixed TryGetWindowsSdkDir only checking for null instead of IsNullOrEmpty.


  • New: Added support for compiling with Clang 8 on Windows.

  • New: Added support for creating client and server targets from custom-made installed builds. Use the “-set:WithClient=true” and “-set:WithServer=true” BuildGraph arguments to enable this.

  • New: Renamed IsFunctionImplementedInBlueprint to IsFunctionImplementedInScript.

  • Bug Fix: Fixed Wait function on Event class when given a large FTimespan.


  • New: Made SaveRoleArtifacts virtual so it can be overridden.

Gameplay Framework

  • New: Any subclasses of ALight must now have a VisibleAnywhere light component property similar to how ASpotLight or ADirectionalLight do. Otherwise, no light properties of that subclass will be visible in the details panel.

  • Bug Fix: Fixed the scope name of GetAllActorsWithInterface in UGameplayStatics::GetAllActorsWithInterface.


  • New: Replication Graph now supports child connections! To add support for UChildConnections in a project’s custom replication graph node, iterate through the FNetViewer array given to your GatherActorListsForConnection function by the FConnectionGatherActorListParameters argument instead of using the single FNetViewer attribute from the same structure.

  • New: FInternetAddr structures can now be queried for the protocol they hold, which is useful for platforms that support multiple Internet protocols. With this change, the previously-implemented enumeration types for detecting sockets/address protocols has been deprecated in favor of using FNames for flexibility. The SocketSubsystem has also been updated with the following changes:

    • GetAddressInfo results now hold error code information for easier messaging and debugging.

    • GetAddressFromString has been introduced as a way to easily serialize a platform address to the proper structure. For most platforms, this functionality is equivalent to doing a pton operation, so no resolution is done in this function.

    • CreateInternetAddr now takes no arguments and returns a newly created FInternetAddr for the platform which can then be filled as needed.

    • The synchronous version of GetHostByName has been deprecated.

    • The asynchronous version of GetHostByName now uses GetAddressInfo to query host information.

  • New: Major refactor to the underlying network structures so that they primarily use network address datatypes (FInternetAddr) instead of strings to represent locations. This change reduces overhead and conversions when preparing to communicate over the network. It also deprecates several functions, primarily affecting projects that either interact tightly with, or contain their own implementations of, PacketHandler/HandlerComponent, NetConnection, or NetDriver, or that inherit from IpNetDriver or IpNetConnection.

    • General: Net addresses like the LocalAddr and RemoteAddr properties in platform-specific NetDriver/NetConnection code are now stored in the base NetDriver/NetConnection classes, respectively.

    • Projects that implement their own NetDriver or inherit from IpNetDriver: LowLevelGetNetworkNumber is now handled by the base class, and is no longer a pure virtual. LowLevelSend now takes an FInternetAddr as the input address, no longer relying on a string. FDisconnectedClient classes now store constant FInternetAddr information, as they should not tamper with address structures.

    • Projects that implement their own NetConnection or inherit from IpNetConnection: GetAddrAsInt is now deprecated as it cannot be supported by all platforms. GetInternetAddr is also deprecated as it allows for modification of the underlying connection data while in mid-connection; use GetRemoteAddr instead. RemoteAddressToString is no longer a pure virtual, and is handled in the base class.

    • Projects that implement their own PacketHandler/HandlerComponent: IncomingConnectionless, Outgoing, Incoming, and OutgoingConnectionless have all been updated to use FInternetAddr instead of strings.


  • New: Forward declarations of party enums will now need to include a size.

  • New: Internal party fields have been marked const. Use of FOnlineParty::Config should be replaced by FOnlineParty::GetConfiguration.

  • New: OnPartyStateChanged now takes a fourth parameter for the previous state of the party.

  • New: Various party delegates now have a “Const” version. For example, OnPartyConfigChanged gives a non-const FPartyConfiguration, while OnPartyConfigChangedConst returns a const FPartyConfiguration. The “Const” version is recommended where possible.

  • Deprecated: GetParty, GetPartyMember, and similar party-related functions now return const shared pointers instead of non-const shared pointers. Some non-const functions have been deprecated in favor of their const variants.


  • New: Added TArray64, which is a TArray with 64-bit indexing. Allocators must now define a SizeType which is the signed type used for representing indices and counts. FDefaultAllocator64 and TArray64 aliases added to enable a 64-bit-indexed version of TArray. Some forward declarations removed which no longer compile because they are now aliases instead of classes.


  • New: Replaced global frame minimal graphics pipeline state TSet with a TSet per DynamicPassMeshDrawListContext. This removes RW lock contention when global TSet is accessed by multiple threads, improving performance.

  • Deprecated: The following RHI typedefs have been deprecated; please use the regular pointer versions (for example, instead of FSamplerStateRHIParamRef now use FRHISamplerState*):

    • FBlendStateRHIParamRef

    • FBoundShaderStateRHIParamRef

    • FComputeFenceRHIParamRef

    • FComputeShaderRHIParamRef

    • FDepthStencilStateRHIParamRef

    • FDomainShaderRHIParamRef

    • FGeometryShaderRHIParamRef

    • FGraphicsPipelineStateRHIParamRef

    • FHullShaderRHIParamRef

    • FPixelShaderRHIParamRef

    • FRasterizerStateRHIParamRef

    • FRayTracingPipelineStateRHIParamRef

    • FRayTracingShaderRHIParamRef

    • FRenderQueryRHIParamRef

    • FSamplerStateRHIParamRef

    • FShaderResourceViewRHIParamRef

    • FTextureReferenceRHIParamRef

    • FUnorderedAccessViewRHIParamRef

    • FVertexDeclarationRHIParamRef

    • FVertexShaderRHIParamRef

    • FUniformBufferRHIParamRef

    • FIndexBufferRHIParamRef

    • FVertexBufferRHIParamRef

    • FStructuredBufferRHIParamRef

    • FTextureRHIParamRef

    • FTexture2DRHIParamRef

    • FTexture2DArrayRHIParamRef

    • FTexture3DRHIParamRef

    • FTextureCubeRHIParamRef


  • Crash Fix: Fixed crash cases where the low-level Material Uniform Buffer allowing invalid texture types to be bound. Now, texture will be replaced with appropriate default white texture.

  • Crash Fix: Added additional check for valid UTexture when binding to Material Uniform Buffer which avoids potential for rare crash due to data race.

  • Crash Fix: Fixed multiple crashes due to swapchain being out of date when using “DelayAcquire” mode.

  • Crash Fix: Fixed a crash that could happen with Dynamic Resolution causing query leaks.

  • Crash Fix: The DebugData of a cached FMeshDrawCommand was not cleared, when RemoveCachedMeshDrawCommands was called causing a rare crash when other FMeshDrawCommands was present. Only present in non-shipping builds.

  • Crash Fix: Fixed a crash if scene proxy emits more than one mesh batch.

  • Crash Fix: Fixed a crash issue with Instanced Static Meshes built through a Blueprint Construction Script.

  • Crash Fix: Fixed a rare crash in Volumetric Fog initialization.

  • Crash Fix: Fixed rare crash in mesh draw command caching during a Material update.

  • Crash Fix: Fixed crash in DrawTileMesh with a Translucent Material.

  • Crash Fix: Fixed a crash that could happen at runtime with Instanced Foliage.

  • Crash Fix: Fixed a crash issue with Translucent Materials using the “SceneDepth” node.

  • Bug Fix: Fixed cooked builds not working with OpenGL on Windows. SM4 was incorrectly selected while SM5 was cooked.

  • Bug Fix: When updating the instance transforms, UHierarchicalInstancedStaticMeshComponent would reallocate the instance buffers, that the vertex factor, FInstancedStaticMeshVertexFactory, has a pointer to. Added MarkRenderStateDirty so its updated

  • Bug Fix: Some unused resources (structured buffers) are null on D3D10. Point to a dummy black resource, in order to not hit checks().

  • Bug Fix: Addressed a fix for VB/IB lock with RLM_ReadOnly and Offset !=0.

  • Bug Fix: Fixed an issue where UAV overlap was never enabled for RenderDoc check happening too late for some SLI settings.

  • Bug Fix: Fixed dangling pointers when a Reflection Capture proxy is removed from the scene.

  • Bug Fix: Fixed an issue where meshes with a large number of elements could unnecessarily reserve a large amount of memory.

  • Bug Fix: Fixed an issue where IndirectArgsBuffer Static Meshes would be skipped.

  • Bug Fix: Fixed dereferencing null pointer in FRealtimeGPUProfiler at exit.

  • Bug Fix: Fixed an issue with “StationaryLightOverlap” view mode in Forward shading.

  • Bug Fix: When rendering in extreme resolutions, the Editor now clamps Volumetric Fog texture to hardware limits.

  • Bug Fix: Fix a race condition between “JoinFreeBlock” and “ReleaseBuffer” in Vulkan.

  • Bug Fix: Fixed a case where Static Meshes with MinLod greater than 0 may stop rendering when used in Instanced Static Mesh Component.

  • Bug Fix: flipped logic to only strip duplicate vertices when not supporting deferred, instead of when supporting mobile. This fixes builds that supports both Deferred and Mobile Forward renderer where you need the data to be not stripped.

  • Bug Fix: Fixed “Shader Complexity” view mode showing no instructions when running in Simple Forward Shading.

  • Bug Fix: Fix for first line being repeated in screenshots of float32 types.

  • Bug Fix: Added command list manager fence to release resources instead of frame fence.

  • Bug Fix: Fixed shader generation of RWByteAddressBuffer on HLSLcc platforms, such as Vulkan, OpenGL, Metal, and more.

  • Bug Fix: Packaged Metal shader source will now go into a zip file rather than a .tgz so it can be done on Windows builds too. It does this asynchronously while generating the Metal libraries. This file is stored in the MetaData folder so should be moved out of the content and not get packaged.

  • Bug Fix: BoneMatrices will now use an SRV on all Metal platforms. This ensures that out-of-bounds access is handled properly.

  • Bug Fix: FPackedMaterialClosestHitPayload now stores uints instead of ints. That should fix hitKind() that was not working properly.

  • Bug Fix: Fixed surface errors from the Metal shader compilation tools.

  • Bug Fix: Fixed Distance Field DDC key setup for non-default “r.DistanceFields.MaxPerMeshResolution” and “r.DistanceFields.DefaultVoxelDensity” values.

  • Bug Fix: Texture copies on Metal require exact format matches. Iit will not perform any texture conversion for you.

  • Bug Fix: Remove rendertarget size clamp from UTextureRenderTarget2D. UTextureRenderTarget2D can now be larger than the backbuffer.

  • Bug Fix: Shader workarounds to push alpha to be opaque when it is very close (but not quite). This fixes the alpha of Composure layers that were occasionally slightly transparent but were intended to be opaque.

  • Bug Fix: Fixed implementation of FD3D12CommandContext’s “RHICopyBufferRegions” when using multi-GPU to retrieve and use resources relevant to the parent device of current FD3D12CommandContext. It fixes transition validation errors due to incorrect handling of duplicate underlying resources in source or destination lists.

  • Bug Fix: Fixed an issue preventing Decals from appearing in Environment Reflection Captures.

  • Bug Fix: The Engine now uses texture views in MetalRHI’s RHICopySubTextureRegion and RHICopyTexture to avoid a slower path that copies via a temporary buffer.

  • Bug Fix: Disabled Auto Exposure for Distance Field Visualization view modes.

  • Bug Fix: Fixed compiling shaders to Metal that use SceneDepth nodes but do not write any color targets and only depth. If a shader writes nothing at all then it will assume float4 input for the fragment fetch binding.

  • Bug Fix: Tile and Triangle rendering now use Index Buffers to work around Manual Vertex Fetch issue.

  • Bug Fix: Fixed an issue where view uniform buffer would not update back to full screen translucency parameters.

  • Bug Fix: Fixed an issue where scaling of R and B were swapped in FD3DFloatR11G11B10 to linear conversion.

  • Bug Fix: Fixed an issue where Render Targets would not update during Cooking.

  • Bug Fix: Fixed OverrideFarClippingPlaneDistance not being taken into account in Hierarchical Instanced Static Mesh Culling.

  • Bug Fix: Made MetalRHI work in terms of FRHIRenderPassInfo rather than the older FRHISetRenderTargetsInfo structure.

  • Bug Fix: Preserved content written by MaterialSetupCS when voxelizing primitives in Volumetric Fog.

  • Bug Fix: Fixed a race condition with BSP models and cached mesh draw commands.

  • Bug Fix: Fixed Mesh Vertex Paint LOD being clamped to 0 if an Actor includes a mesh component with no valid mesh data set.

  • Bug Fix: Fixed the collision view mode when tessellation is enabled on Static Meshes.

  • Bug Fix: Fixed an issue where a “Draw Material to RenderTarget” node invoked in the first frame of an application would result in the render target being immediately cleared afterwards.

  • Bug Fix: Pseudo texture sampling has been improved and will now sample correctly with respect to voxel center. This will now be more similar to hardware.

  • Bug Fix: When using Metal RHI’s internal “fast” validation check, the depth-stencil-state against the Metal render pass configuration to ensure depth and stencil writing will work and fail if not.

  • Bug Fix: In Metal RHI tidied up the way we release private textures back in to the pool early so as to avoid placing them back in the pool twice or attempting to put nil into the pool. This change also includes the use of “setPurgeableState” behind the console variable “rhi.Metal.ResourcePurgeInPool”, which is off by default.

  • Bug Fix: Fixed the validation of Metal shader versions so that it works correctly with the latest and future versions.

  • Bug Fix: D3D12 frame fence is now advanced in FD3D12Adapter’s “EndFrame” function, which happens regardless of whether the application is minimized. DefaultContext.ReleaseCommandAllocator() and GetGPUProfiler().EndFrame() steps are now also performed in FD3D12Adapter::EndFrame(), which fixes command allocator memory bloat when game is minimized. This solved GPU resource release/recycling when the game is minimized that lead to resource exhaustion and eventual crash.

  • Bug Fix: Resolve an issue with the Perceptual Quantizer (PQ) by converting it to properly use Nits (absolute units) for LUT indexing. By explicitly converting to Nits, the LUT has more correct quantization, resulting in better quality results.

  • Bug Fix: Fixed Vulkan validation messages not working starting with SDK version 1.1.85…

  • Bug Fix: Fixed some Metal shader translation bugs:

    • “Texture*Array.Load” needs to split the array index out of the vector coordinate for Metal.

    • The “GetDimensions” function needs to support the array-length/depth output argument.

    • “RemovePackedVarReferences” no longer is inserting new variables at the top of the function, and not the same scope as the source variable, which won’t compile in cases where structs are used as temporaries and not function arguments.

  • Bug Fix: Hardened “MetalUniformBuffer” by caching all the data fetched from the “UniformBufferLayout” such that the RHI thread never needs to access it.

  • Bug Fix: Various fixes to the Metal buffer memory reporting.

  • Bug Fix: Paper2D render proxy now reports the correct previous frame world transition for motion blur and temporal anti-aliasing.

  • Bug Fix: Fixed Decal fade in/out Blueprint API.

  • Bug Fix: Fixed an error when attempting to run screen space denoising passes with “r.Shaders.Optimize=0”. The error is reported when shader compiler doesn’t remove resources from the shader, so they remain in the reflection data but high level code does not set them. Solution in this case is to always fill all slots of “FSSDSignalTextures” with one of the valid textures that are already present there.

  • Bug Fix: Fixed MTLHeap alignment restrictions not being honored when allocating from MTLHeap.

  • Bug Fix: Don’t resolve timing queries until command buffer is submitted. Fixes a validation issue with calling functions that are not allowed inside render passes.

  • Bug Fix: Fixed implementation of TD3D12Texture2D<RHIResourceType>::UnlockInternal when using multi-GPU (mGPU). A common FD3D12ResourceLocation is used for all nodes in the LDA chain, therefore only the last FRHICommandUpdateTexture should take ownership of the resource and release it once it executes.

  • Bug Fix: Fixed selected Static Mesh collision color material override.

  • Bug Fix: Fixed a compilation error with PixelStreaming in WebRTC Proxy for Debug configurations.

  • Bug Fix: Simplified the way ranges are allocated and freed in “FMetalSubBufferMagazine” to avoid having to allocate/deallocate memory. This wouldn’t have been leaking (it will always be referenced) but it will consume more memory than necessary as the number of magazine’s increases.

  • Bug Fix: Fixed rendering artifact that looked like Z-fighting caused by depth varying between the depth and base pass.

  • Bug Fix: Fixed an issue with Widget3D render proxy to have correct local-to-world transform.

  • New: New Screen Pass API for implementing pixel shader post process passes with new Render Graph system.

  • New: Added world position offset support for Skeletal Meshes.

  • New: RHIMapStagingBuffer/RHIUnmapStagingBuffer can now be used without any blocking.

  • New: Added FirstArraySlice and NumArraySlices to FRHITextureSRVCreateInfo struct.

  • New: Vulkan app info will now include build changelist as the application version (for easier ID by the drivers).

  • New: UseGPUScene is now used to calculate DDC key.

  • New: Initial RHI validation layer is now aiming to find cross-platform issues. Use “-RHIValidation” to enable it. Current RHIs supporting it are D3D11 and Vulkan.

  • New: The frame buffer is now used as shading cache when not refracting.

  • New: Added Unfiltered MipGenSettings to generate mipmaps without averaging texels.

  • New: Added an option to globally force using DXC for D3D shaders. This is intended for testing compatibility and correctness when using the new compiler. Set “r.D3D.ForceDXC” to 1 to enable this behavior. D3D12 RHI is required to run shaders compiled with DXC.

  • New: Renamed “FSceneViewFamilyBlackboard” to “FSceneTextureParameters”.

  • New: Added ability to enable Capture Mode automatically when Intel GPU is attached.

  • New: Mark pooled Metal resource objects as volatile when they are placed into the pool awaiting reuse, for textures after two frames we’ll actually reclaim the memory and just keep the MTLTexture around. This should save memory when streaming as it allows the OS to reuse the memory for other allocations. It does not purge Metal resources that are still owned by RHI objects - that would require much more bookkeeping.

  • New: Added NVIDIA Aftermath support for DX12. It can be enabled with “-gpucrashdebugging”.

  • New: Initial work to support creating additive “patch” shader libraries from the metadata of two different cooked builds.

  • New: Separate static buffers from dynamic buffers when sub-allocating MTLBuffers to reduce fragmentation. Though level streaming tends to result in a lot of fragmentation even for static buffers. Also, changed the sub-buffer heap to use broader allocation ranges so that we fill empty space better. Make sure to use a sensible minimum alignment on each platform rather than the minimum allocation size as that also reduces wastage.

  • New: The command “gpuvalidation” is now also accepted together with “d3d12gpuvalidation” to enable the validation layer to be consistent with the Vulkan RHI.

  • New: A Clearer message is now shown when running the Engine with “-d3ddebug” and the Windows Graphics Tools are not installed.

  • New: “GPUScene” is now enabled for Vulkan.

  • New: Small rewrite of the GPU readback framework to support texture readback using the fence to avoid stalling.

  • New: Added a basic Shader/GPU driven debug rendering. Simple API: allocate, bind (for PS), draw. Support only wire-quad/cross/line drawing.

  • New: Added “position” and “normal” stream support to certain vertex factories.

  • New: Change vertex factory interface to use an enum instead of a bool for selecting between default vertex stream and position only stream.

  • New: Added support for enabling/disabling keeping shader debug info stored per-platform. Use the following:

    • This can be overridden per-platform in the [ShaderCompiler] section of the Platform’s Engine.ini by adding “r.Shaders.KeepDebugInfo”.

    • Added support for exporting the debug info on platforms where it can be stripped and stored as separate files with “r.Shaders.ExportDebugInfo” and this is also per-platform.

    • Added “r.Shaders.ExportDebugInfoMode” to control how the exported files are stored. Use 0 for loose or 1 for an uncompressed archive.

  • New: Added dummy Reflection Capture uniform buffer to “FMeshPassProcessorRenderState”. It is used for drawing tile meshes where no scene exists, but Forward Rendering Material Shaders require something bound for this buffer.

  • New: “MaterialShader” and “MeshMaterialShader” will now use the new shader permutation API.

  • New: Added R32G32_UINT format support.

  • New: ShaderPrint debugger now helps with compute shader debugging.

  • New: Composure has been changed to support Color Grading and White Balance from floating point Post Processing LUT. The Composure Layers inherit Post Processing Parameters from the Scene Camera, so color correction controls can optionally be enabled separately for each “CGLayer”.

  • New: Added support for RDG_GPU_STAT_SCOPE.

  • New: Driver blacklist now supports filtering by Date as well as by Version.

  • New: Moved GPU profiling tools into RenderCore to allow RenderGraph to utilize them.

  • New: Changed Pixel Streaming’s default H264 level to 52 instead of 51. This means video encoding handles 4K (3840x2160) by default. When only up to 1080p streams are required, you can pass in “NvEncH264ConfigLevel=NV_ENV_LEVEL_H264_51”.

  • New: Updated Vulkan included headers to

  • New: Implemented mGPU virtualization on a single GPU in D3D12, enabled via -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 4 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: Metal command-buffer failure debugger in the vein of Aftermath toggled with “r.GPUCrashDebugging” prior to running the game or by using the -metalgpudebug command line flag. Requires TileShaders on iOS (iOS 11, A11) or macOS 10.14 (memoryBarrier) - it will automatically disable itself on other configurations. By default every draw call is instrumented on macOS and every 10th on iOS as TBDR GPUs suffer a much larger performance penalty. On failure it should report the last Vertex + Fragment pair to succeed and then a more detailed list of the following commands where we believe we failed. To get the best use of the output you need the Stable.csv files and the SF_METAL.tgz file for the build so you can track the PSOs back to their HLSL and Metal shaders.

  • New: Exposed “DistanceFieldAtlas” classes to other modules. It is required to have Custom Mesh Proxies generate their own Distance Field data outside of the engine module.

  • New: Compiled out all support for Metal tessellation shaders from the MetalRHI runtime and remove all vestigial references to geometry shaders using the new preprocessor flags. It resizes all the various arrays to eliminate unused entries which were previously SF_NumFrequencies in size.

  • New: Implemented a new MetalRHI debug feature “rhi.Metal.ResetOnPSOChange” which will reset all the resource bindings on each graphics PSO change to track down any missing resource bindings.

  • New: Added a tiled blue-noise image. The image is a tiled set of seven 256x256 blue noise patterns. Image data sets donated by Jacopo Pantaleoni and converted to a single uasset texture: BlueNoise.uasset.

  • **New: **The Material Instance Editor will now display a message if an invalid texture is assigned to overridden parameter. There is no feedback if an invalid parameter is set on a Material Instance Dynamic (MID) but will silently replace with default white texture.

  • New: Consolidated “r.GraphicsAdapter” so that you can also now use “-graphicsadapter=N” for D3D11, D3D12 and Vulkan. This deprecates the old “D3D12.GraphicsAdapter” console variable.

  • New: Enabled the “RHICopyToResolveTarget” function to be overridden on individual platforms.

  • New: Added Static Mesh’s “MinLOD” to the asset registry so it can be viewed in the Content Browser (either in column view or searched using advanced search syntax). Note that unloaded Static Meshes won’t show this information until they are loaded or resaved once, which puts the information into the asset registry for future use.

  • New: “DumpStaticMeshDrawListStats” now also dumps octree stats.

  • New: For PixelStreaming, added the command line argument “-PixelStreamingReceiveStringMaxLength” to allow for larger amounts of data to be sent from Browser to UE4, default value is 1024 bytes.

  • New: Canvas rendering now uses MPC uniform buffers correctly.

  • New: Permit defragging of FMetalSubBufferHeap by moving allocations from newer to older buffers at a specified number of bytes per-frame (rhi.Metal.HeapBufferBytesToCompact). Only allocations ‘owned’ by an RHI object can be defragged. Temporary allocations for texture streaming can’t be, they should only last a frame anyway.

  • New: Implemented mGPU support for FD3D12DynamicRHI::RHIUpdateUniformBuffer.

  • New: Changed area source representation of Spot Light from a sphere to a disk.

  • New: Niagara Mesh particles can now access velocity and corrected integration math to derive prev position.

  • New: Refactored vertex factory initialization in Instanced Static Mesh Scene Proxy.

  • New: The files added in “ShaderDebugInfo” are now put into a unique folder based on the StaticParameters. This allows you to see and compare shaders from multiple permutations. Also, in the D3D11 compiler, a description of the different parameters are appended at the end, for information.

  • New: Removed an RHI Thread stall of 2ms to 6ms with enqueue copymiplevels.

  • Improvement: We now allow for better overriding of Vulkan PSO functionality.

  • Improvement: Refactored canvas, canvas tile, and triangle rendering by removing dead code and cleaning up data flow.

  • Improvement: Improved performance when deleting Instanced Static Mesh instances with physics representations.

  • Improvement: Stability improvements in ShaderCompileWorker error report handling.

  • Improvements: ShaderComplexity improvements:

    • Added support for Mobile Preview in the Editor.

    • Translucent Materials now show their native instruction count in Forward renderer to avoid 0 cost error.

    • Fixed Scene Pre-Pass not being taken into account in the complexity result.

    • In Deferred shading, disabled all renderpasses except for Depth, Editor HitProxy, and DebugViewMode.

  • Deprecated: Deprecate OpenGL4 and D3D10 from the TargetedRHI list in the Editor. A deprecation warning will now show when starting the Editor with OpenGL4.

  • Deprecated: Removed usage of previously deprecated Draw{Indexed}PrimitiveUP.

  • Deprecated: SetRenderTarget and its family of functions are now removed per deprecation on last release.

  • Deprecated: Marked RHICopySubTextureRegion has been deprecated.Instead, use “RHICopyTexture”.

  • Deprecated: The “CreateGeometryShaderWithStreamOutput” and “RHICreateGeometryShaderWithStreamOutput” APIs are now deprecated; please use a compute shader technique for equivalent functionality.

  • Removed: Multiple algorithms to perform depth of field in the Deferred shading renderer have been Removed:

    • Gaussian DOF is now Mobile Renderer only. Its settings have been moved to “Mobile Depth Of Field” category of the Post Process Volume and Camera settings. It’s properties are only editable in Mobile Preview while working in the Editor.

    • Bokeh DOF has been removed from this release forward.

    • The old “Circle” DOF algorithm (that could be enabled with r.DOF.Algorithm=0) has been deleted. Only Cinematic (“Diaphragm”) DOF method remains for DOF usage on anything other than Mobile platforms.

    • Note that any content what was using Gaussian DOF or Bokeh DOF in the Deferred Renderer will have DOF disabled. There is no longer a select using “Depth of Field Method.” DOF can be simply disabled by setting the “Depth of Field F-Stop” to 0. Any content that’s using a Cine Camera or directly the Circle DOF method regardless of r.DOF.Algorithm will remain using UE 4.20’s Cinematic (“Diaphragm”) DOF method.

  • Removed: Removed all obsolete optional features from EMetalFeatures that are now universally available (or which depend solely on macOS versus. iOS) and all the associated code that branched based on them. This makes iOS and macOS more consistent as well as removing chunks of code that was no longer necessary.


  • Crash Fix: Fixed a crash when using “Asset Actions > Reload” on an open Niagara Asset.

  • Crash Fix: Fixed a crash in Niagara when deleting the last renderer from a gpu emitter.

  • Crash Fix: Fixed a crash in Niagara when trying to pause a spawned system through Blueprint or C++, which has already completed.

  • Crash Fix: Fixed some issues with replacing deprecated and missing modules and dynamic inputs in Niagara. This prevents crashes and data corruption.

  • Crash Fix: Fixed a crash in Niagara DI if SRVs are not supported.

  • Crash Fix: Fixed a crash that could happen when saving a changed Niagara system.

  • Crash Fix: Fixed possible crash related to shared resource owned by UVectorFieldStatic.

  • Crash Fix: Fixed a Niagara crash if we have more than one GPU data interface.

  • Crash Fix: Fixed a crash with “SetExecutionState” where we need to adjust the DataSet allocation size and instance count before preparing the simulation.

  • Crash Fix: Prevented a crash when closing the Niagara Emitter Editor.

  • Crash Fix: Prevented a crash in the Niagara Script Editor when pressing the Refresh button.

  • Bug Fix: Fixing an issue in Spawn Per-Frame module in Niagara to account for DT properly.

  • Bug Fix: Resolved an issue so that the Dynamic Parameter module now automatically propagates names on the node in the Material Editor.

  • Bug Fix: Dynamic inputs for choosing vectors now properly set default “SpawnGroups”. Skeletal Mesh sampling now has an offset vector built into the module

  • Bug Fix: Fixed an issue in Niagara with the “Engine.Time” parameter not functioning in System or Emitter execution.

  • Bug Fix: Fixed an issue in Niagara where the “Inherit Velocity” module incorrectly had all script constraint.

  • Bug Fix: Velocity modules now all have similar parameterizations, ensuring no mixup of behaviour between applying forces versus impulses and mass. Each now has a coordinate space picker to ensure flexibility and programmability in the stack.

  • Bug Fix: Removed the option to add “Dynamic Input” scripts to Niagara Scripts of any kind (Module, Function, Dynamic Input) in the context menu.

  • Bug Fix: Fixed an issue in Niagara so that Mass no longer defaults to 0 in the default solvers. This fixes sparse emitters that don’t rely on the initialized Particle module.

  • Bug Fix: Fixed an issue with certain Engine parameters such as “Engine.Time” not working in system spawn or update scripts.

  • Bug Fix: v that repaired out-of-date function call in the “Pointer Attractor” module.

  • Bug Fix: Fixed an issue in Niagara where right-clicking the stack and then selecting “Insert Module Above/Below” wouldn’t auto-select the generated search box.

  • Bug Fix: Fixed an issue in Niagara by refactoring Drag to accumulate irrespective of the other forces. High values will no longer invert the applied forces.

  • Bug Fix: Fixed an issue in Niagara so that Sample Skeletal Mesh Skeleton, Surface, and Static Mesh functions now work properly to support LocalSpace sampling.

  • Bug Fix: Resolve some issues with Spawn Beam to ensure good tangent basis derivations on the Start and End positions on a Spline.

  • Bug Fix: Fixed an issue in Niagara with missing transitions for sort buffers and dispatch overlapping.

  • Bug Fix: Fixed an issue where both the Script and Selected Details panels were having the same name in the Niagara Windows sub-menu.

  • Bug Fix: Fixed an issue in Niagara where Skeletal Mesh Data Interface was failing to bind when we use bone only sampling without CPU access to mesh data.

  • Bug Fix: Fixed an issue causing local space Static Mesh sampling to give incorrect results.

  • Bug Fix: Fixed an issue that caused system parameters to not appearing in Particle Event handlers.

  • Bug Fix: Fixed an issue causing vertex interpolators to not work with Niagara renderers.

  • Bug Fix: Fixed an issue that made “Particle.LocalToWorld” being transposed on Niagara Mesh renderer.

  • Bug Fix: Fixed an issue where Sprite Size Scale by Velocity had Solve Forces and Velocity as a post-dependency, and would have one frame old data as a result.

  • Bug Fix: Fixed an issue which could cause flickering of GPU simulations in the Niagara Editor.

  • Bug Fix: Fixed an issue in Niagara for “Get Spawn Interpolation” always returning 1 on a GPU simulation when interpolated spawning is enabled.

  • Bug Fix: Add validation for “UParticleModuleLocationBoneSocket” to ensure that all LOD levels have a matching count for SourceLocations if they will tick on update. The index is stored on the particle on spawn, so if an update module has less entries we would index out of bounds.

  • Bug Fix: Fixed an issue which would affect reactivation of Niagara Systems.

  • Bug Fix: Fixed an issue with depth-only rendering position not matching base pass rendering due to shader compiler optimizations.

  • Bug Fix: Fixed an issue where data interface calls were not being stripped correctly during compilation for the VectorVM.

  • Bug Fix: Niagara particles will now take into account the “PerViewTranslation.”

  • Bug Fix: Niagara fix GetTriCoordVertices VM binding and reading off the end of the array Niagara fix GetVertexUV reading off end of the array.

  • Bug Fix: Niagara only writes HLSL data interface functions for methods that are used

  • Bug Fix: In Niagara, moved deferred system instance deletion into the World Manager to ensure that render commands have completed before we perform deferred deletion.

  • Bug Fix: Niagara now caches player view locations in the World Manager and uses the cached locations inside the system instance tick to set the LOD.

  • Bug Fix: Fixed an issue with Niagara Mesh Vertex Factory Shader to assign the “Local To World” vector correctly so that it’s correct when used in Materials.

  • Bug Fix: Fixed an issue in the Niagara Sequencer integration where you could end up with duplicate frames when using the “System Life Cycle” Track.

  • Bug Fix: Fixed several issues which were causing Niagara systems to recompile on open and during cooking. Also, added console commands to reset the internal state of systems which continue to recompile after the code fixes. These commands are “fx.PreventSystemRecompile” and “fx.PreventAllSystemRecompiles”.

  • Bug Fix: Fixed an issue where activating an already active Niagara component would reset it. It now does nothing if it’s not being forced to reset, which matches Cascade’s behavior.

  • Bug Fix: Fixed an issue that caused deferred deletion of system instances having circular references to the system, which causes both the system and instances to not be destroyed if the system will no longer tick.

  • Bug Fix: Fixed an issue for potentially not deleting contexts if the batcher was set to nullptr.

  • Bug Fix: Fixed an issue where deferred data in the batcher was potentially not getting destroyed.

  • Bug Fix: The Min and Max Velocity in the Niagara “Fountain” template are no longer switched.

  • Bug Fix: Don’t use Cached Emitter in destructor. With deferred deletion the Cached Emitter can be garbage collected before we perform instance destruction. This fixes a memory leak with “ParticleDataSet” which wasn’t deleted for CPU systems.

  • Bug Fix: Fix flickering caused by inconsistent position calculation between prepass and base pass on CPU Cascade Sprites.

  • Bug Fix: Fixed an issue in Cascade for a race condition between MeshProcessor and VertexFactory on Sorted Particles. This resolves accessing incorrect sorted particle index buffer due to binding being made between we determined the last buffer.

  • Bug Fix: Fixed an issue in Niagara with incorrect max ThreadGroup count.

  • Bug Fix: Fixed an issue with “Clears VariableToMetaData_DEPRECATED” on Niagara Graph’s “PostLoad” after migrating the old data.

  • Bug Fix: Fixed an issue with Niagara to handle nullptr for TextureReferenceRHI, which can happen during cooking

  • Bug Fix: Fixed an issue with Niagara where it could infinitely loop if a system instance is complete.

  • Bug Fix: Fix to Shader Complexity on Forward Shading when using the Velocity buffer.

  • Bug Fix: Fixed an issue with numeric pin’s connection lines sometimes being colored incorrectly.

  • Bug Fix: Fixed some issues in Niagara’s simulation shader cooking. Now, GPU shaders will never be cooked for CPU emitters. The Editor has better error messaging and it is printed to the cook log. This can also prevent several types of crashes from happening.[br]

  • Bug Fix: Fixed circular TSharedPtr’s found in Niagara causing Editor resources to not be released.

  • Bug Fix: Fixed Niagara Mesh Particle Camera Facing not using the correct World Position.

  • New: Niagara random sampling functions now support a fixed seed input which allows the randomness to be driven by a single number instead of a combination of seeds.

  • New: Added a toggle in Niagara under “Simulation” tab of the Emitter/System Editor to enable synchronized resetting of Emitters and to open Systems that include that Emitter.

  • New: Added support for Sprite Cutout Geometry in Niagara.

  • New: When adding Niagara Template Emitters to systems, we now disable data inheritance from the parent emitter. There is also an option to break the inheritance connection for Emitters in Systems.

  • New: In the Niagara Script Editor, the Metadata UI has been moved to a tab on the right and is editable by selecting the parameter in the “Parameters” tab. This more closely matches the workflow in Blueprints and prevents some issues with the Details tab on the left.

  • New: It is now possible to trigger Niagara systems from “Anim Notify” tracks. Use Anim Notify’s “Play Niagara Effects” and Anim Notify State’s “Timed Niagara Effect”. These work similarly to “Play Particle Effect” and “Timed Particle Effect.”

  • New: Added automatic tessellation for Niagara Ribbons.

  • New: Large refactor of Niagara’s Renderers.

    • Fixed several thread safety issues.

    • Avoids copy of particle data to Render Thread giving some performance and memory optimization.

    • Improved clarity of renderer code and Emitter Instance.

  • New: Moved Niagara Skeletal Mesh HLSL from code to a separate shader file Implement missing GPU functionality for triangle/bone/ vertex Skeletal Mesh sampling, specific bone/specific sockets

  • New: Added Bone Rotations to Niagara’s Skeletal Mesh Data Interface.

  • New: Niagara “Set Fixed Bounds” now works with GPU emitters.

  • New: Added option to override bounds of all Emitters in a System through the System Details panel.

  • New: Moved Niagara shader files from Engine to Niagara Plugin folder.

  • New: Added a Niagara menu option to display script (CPU and GPU) instruction counts.

  • New: Skeletal Mesh DI interpolation:

    • Skeletal Mesh Interface can now optionally interpolate in its “Get Skinned Data” function.[br]

    • Updated “Sample Skeletal Mesh Surface” module.

    • New utility op “Get Spawn Interpolation” function could be useful for other things.

  • New: In the Niagara Script Editor, we added support for multiple accepted values for visible and edit conditions on script inputs and add properties for common meta-data rather than using the name-string map to define them.

  • New: In Niagara, we’ve enabled Compute Dispatch Overlap by default.

  • New: Moved variable metadata interaction from the “Variables Metadata” header in the Script Details panel to using the Parameters and Selected Details panels instead. This makes it similar to how Blueprint variables are presented and edited.

  • Selecting variables in the Parameters panel works concurrently with selecting nodes in the Graph, but only one selection is valid at a time.

  • New: Added a warning for multiple renderers if its a GPU simulation as we don’t currently support this.

  • New: Added particle GPU sorting for GPU Niagara simulation when using Sprites and Meshes. Use the following console variables:

    • “Niagara.GPUSorting” controls whether GPU sorting is enabled.

    • “Niagara.GPUSorting.CPUToGPUThreshold” controls if CPU particles should be sorted through the GPU path.

    • “Niagara.GPUSorting.BufferSlack” controls the slack when increasing/decreasing the GPU sort buffers.

    • “Niagara.GPUSorting.MinBufferSize” minimum size for the GPU sort buffers.

    • “Niagara.GPUSorting.FrameCountBeforeShrinking” controls how many frames before shrinking GPU sort buffers.

  • New: Niagara Skeletal Mesh sampling uses 4x3 for Bone matrices. The Matrix Storage Type was changed from “StructuredBuffer” to “Buffer” to support more platforms.

  • New: When we don’t have a dynamic parameter set in Niagara, we will take the Material default rather than overriding with 1,1,1,1 This differs from the functionality in Cascade but is more intuitive.

  • New: Torus Location rewritten and optimized to support:

    • Random or Direct set location modes.

    • Torus, TorusKnot, or Ring modes.

    • Space transforms and offset vectors.

    • Output vectors for Tangent, Bitangent, and Normal for the parametric surface.

  • New: Location modules now support Coordinate Space input options for more user control.

  • New: Niagara Module Scripts now have an “Expose to Library” tag that allows non-library scripts to be filtered out when adding modules in the stack.

  • New: Niagara Module Scripts can now be dragged-and-dropped into the stack from the Content Browser.

  • New: Added new Dynamics inputs to Niagara to create custom Float/Int/Color/Quat/Vector2D/Vector from booleans in the stack.

  • New: Added support in Niagara for Sample Skeletal Mesh module to use random or direct set sampling modes, and they can toggle between sampling triangles or vertices.

  • New: Added simple search to Niagara’s Script Graph Editor. Pressing Ctrl+F (default binding) will bring up a Text Search Bar that can find named nodes and pins.

  • New: Niaraga now supports SpawnGroups for the SpawnRate, Spawn Per-Unit, and Spawn Per-Frame modules.[br]

  • New: Pendulum Constraint has been refactored to apply forces before the solver and apply its constraint afterwards. Established a framework around the “Calculate Accurate Velocity” module to allow multiple constraints to be satisfied and still retain inertia.

  • New: Sample Skeletal Mesh Skeleton has been refactored to include “Deterministic Randoms Independently” choosing sampling coordinate spaces for all three sampled attributes Interpolated spawning Sampling bone rotation Comments Metadata

  • New: Added Niagara support for exporting full tangent basis from Bezier and Catmull Rom spline functions. These have also been optimized.

  • New: SubUV Animation Module now supports Linear or Random frame selection.

  • New: Compiling Niagara Scripts or Systems now presents compile messages in a new Niagara “Message Log” tab. It can be found in the Niagara Script and Niagara System Editor. Compile messages notify whether compiling the Niagara Script or System was successful, and provide one-click access to the source of compile errors if any have occurred.

  • New: Added a new Niagara module to provide an “official” module to perform the “Camera Offset” function (similarly to what is in Cascade).

  • New: Niagara - Searching in the Stack view now finds linked parameters, making it easier to search for the usage of specific named parameters in an Emitter or System.

  • New: Added improvements to Niagara Ribbon rendering:

    • Added a new “facing” mode with “Custom Side Vector” that now uses the Particle’s “Ribbon Facing” attribute to dictate the vector that the ribbon width is extended along.

    • There is a new parameter with “Curve Tension” that defines how sharp the ribbon is.

    • Several Tessellation parameters have been exposed.

  • Improvement: Niagara optimizes compile times by switching to Static on the solver.

  • Improvement: In Niagara, mesh rotation has been split out into a separate solver with proper dependencies, which reduces the instruction count of the default solver to 40% in cases where rotations do not need to be calculated. “Apply Initial Forces” has been updated to provide spawn script dependencies.[br]

  • Improvement: Modified Skeletal Mesh Skeleton location in Niagara to automatically set Ribbon ID to the sampled Bone index to make Ribbon default behavior more clear.

  • Improvement: Niagara script compile errors no longer fail a cook. Instead, they will print to the log as warnings.


  • Crash Fix: Fixed crashes that could occur when building lightmap in levels with Foliage where the Foliage.DensityScale is less than 1. With density scaling, the removed instances need to be skipped when setting up lightmap UVs after encoding them.

  • Bug Fix: Fixed issues where overbright specular highlights with Decals in the Forward Renderer. Roughness is now clamped to a reasonable level and the Normal is normalized post blending.

  • Bug Fix: Reflection Capture component now honors Detail Mode setting in the same way other components do.

  • Bug Fix: Fixed an issue with Static Light sources not rendering correctly inside Reflection Captures.

  • Bug Fix: Fixed some issues where translucent objects were not correctly applying Sky Light changes.

  • Bug Fix: Fix ProjectionDepthBiasParameters being applied twice when evaluating subsurface scattering with the float3 CalculateOcclusion version. (used in ShadowQuality 1 or 3/4 with non-Gather4 support).

  • Bug Fix: Fixed an issue with missing reflection on pure specular surface.

  • New: We now support Static textured Area Lights in Reflection Capture and change the lights to be additive instead of lerping them

  • New: We’ve added the ability to move selected Atmosphere Sun Directional Light (used by the Atmospheric Fog component) by holding CTRL+L while moving the mouse around. This updates the Directional Light orientation.

  • New: Added the ability to set Reflection Capture supersampling by the console variable “r.ReflectionCaptureSupersampleFactor”.

  • New: Enabled Atmospheric Fog component to affect illuminance of the selected Atmosphere Sun Light during runtime and in lightmass. You must enable “Atmosphere Affects Sun Illuminance” under the “Sun” category first.

  • New: We now force Reflection Captures to use full rough materials allowing for better representation of metal contributions in Reflection Capture volumes.

  • New: Disabled sun rendering in reflection captures from AtmosphericFog component to avoid double sun specular contribution, which is already handled analytically when rendering Directional Lights.

  • Improvement: Improve Virtual Texturing (VT) support for Lightmaps. When VT lightmaps are enabled, the Editor doesn’t generate non-VT lightmaps by default (controllable by console variable). It enables VT Lightmaps to avoid size restrictions imposed on regular lightmaps and should reduce the number of lightmap sheets generated, potentially improving batching.

  • New: Expanded Sky Light and Reflection Cubemap limits to the target devices limits. There is a warning if cubemap may use a large amount of memory based on the request.

  • New: The per-object directional shadow map cast distance now increases with the size of the object when large enough. Added the console variable “PerObjectCastDistanceRadiusScale” to control it. Set to 8 by default.

  • Deprecated: Movable Lights will now always be invalid for the LightGUID. They will only be assigned when a light is made Static or Stationary and the existing Movable Lights have had their GUID cleared.

Ray Tracing

  • Crash Fix: Fixed a crash where a data interface proxy is in an instance batchers deferred destroy queue and the owning UObject is destroyed on the game thread. The destroy will enqueue a render command to delete the proxy leaving the stale proxy inside the deferred destroy queue. We now ref count the RT proxy, allowing the destroy to be deferred until after the instance batcher has been destroyed or ticked.

  • Bug Fix: Fixed pre-exposure application when rendering Ray Traced Translucency.

  • Bug Fix: Disable normal-culling when casting a shadow ray from geometry with Hair Material. Use proxy light direction and hair tangent direction to reconstruct a plausible normal for ray biasing.

  • Bug Fix: Fixed exposure not being taken into account in Ray Tracing barycentrics and view mode.

  • Bug Fix: Fixed an issue with Unlit Materials not showing in Ray Tracing Reflections. As a small side effect, LightCullMask calculations now only happen when direct lighting flag is enabled.

  • Bug Fix: Ray Tracing no longer creates vertex buffers when ray tracing is not enabled, which saves a significant amount of memory on scenes that have large Landscapes.

  • Bug Fix: Use “DispatchRaysIndex” function to initialize a fake “SV_Position” in Ray Tracing Material Shaders.

  • Bug Fix: Fixed an issue where SSAO is applied to Ray Tracing Debug view modes.

  • Bug Fix: Fixed naming inconsistencies in Ray Tracing parameters.

  • Bug Fix: Fixed an issue where Stochastic Rect Light would not respect the Light’s “samples per pixel” parameter.

  • Bug Fix: Fixed an issue Ray Tracing view mode not saving correctly between sessions.

  • Bug Fix: Fixed Ray Tracing Debug visualization view modes not using tonemapping or any other post-processing.

  • Bug Fix: Render Target recycling should not happen if Ray Tracing was prearranged by other code.

  • Bug Fix: Fixed an issue where Post Processing passes will no longer order incorrectly in Ray Tracing Debug view mode.

  • Bug Fix: RayTracing Translucency now relies on “Payload.Hitkind” to refract the ray.

  • Bug Fix: Fixed issues where “PrepareRayTracingShadows” was missing some denoiser requirements.

  • Bug Fix: Alpha-masked materials are now correctly handled during shadow Ray Tracing.

  • Bug Fix: General stability fixes for Skeletal Meshes in Ray Tracing.

  • Bug Fix: Provided cone-angle culling behavior from the point-source location to provide mimic lighting function for Ray Tracing Shadow and Global Illumination.

  • Bug Fix: Tonemapped Ray Tracing Debug view modes should now use pre-exposure.

  • Bug Fix: Added the console variable “r.RayTracing.GlobalIllumination.EnableTwoSidedGeometry” to Ray Traced Global Illumination. It’s enabled by default.

  • Bug Fix: Resolved a packaging race condition that caused Static Meshes to be missing from Ray Tracing effects in a packaged project.

  • Bug Fix: Fixed some issues with Ray Traced Global Illumination energy explosion caused by two problems: 1, neglecting to include tMin and tMax in the “IsHit” function comparisons, 2, adding normal-based biasing on subsequent path chains. Correctness was verified with path tracing after comparing results under FurnaceTest.

  • Bug Fix: Fixed a shadow artifacting with raytraced directional occlusion.

  • Bug Fix: Fixed an issue with the Path Tracer with invalidation caused by a precision issue.

  • Bug Fix: Fixed an issue with the Path Tracer with invalidation when the projection changed, for example, Field of View…

  • Bug Fix: Fixed wrong composition between Ray Traced Reflection and cubemap/sky when pre-exposition is enabled.

  • Bug Fix: Fixed a bug that caused Path Tracing to not respect the object “Cast Shadows” flag.

  • Bug Fix: Fixed a regression that made pure specular brdfs render black in Path Tracing mode.

  • New: IES Profiles are now supported in Ray Tracing Reflections and Translucency passes.

  • New: Clear Coat shader model in Materials now match the Raster technique when used with Ray Traced Reflections.

  • New: Ray tracing scene now explicitly holds references to all FD3D12Resources that are bound to the SBT to prevent them from being released while some ray tracing commands may still be in flight. Added a command to explicitly clear all SBTs for a scene, which releases resource references and allows resources to be immediately reused.

  • New: Ray Traced Reflection can now sample Reflection Capture volumes as the last reflection event (avoids causing black metal material in reflections). Enabled using r.RayTracing.Reflections.ReflectionCaptures.

  • New: Implemented support for multiple instance transforms within one FRayTracingInstance. This is now used in FInstancedStaticMeshSceneProxy’s function “GetDynamicRayTracingInstances”, which can generate thousands of instances. This gives a significant CPU performance improvement in scenes with many Instanced Static Meshes.

  • New: Added “cast ray traced shadows” Material flag in the Material Editor.

  • New: Ray Traced Shadows now consider geometry to be double-sided by default. This is controllable by console variable with “r.RayTracing.Shadows.EnableTwoSidedGeometry”.

  • New: We now use 64-bit hash of the shader bytecode in FRayTracingPipelineStateInitializer to generate a more robust shader table signature.

  • New: Added Halton sequences as a set of RenderResources.

  • New: Implemented support for loose parameters (global constant buffer) for Ray Tracing Hit Shaders.

  • New: Added a new console variable to test enable/disable all Ray Tracing features at once with “r.RayTracing.ForceAllRayTracingEffects”.

  • New: Added memory stat counters for bottom and top level acceleration structures.

  • New: Implemented support for DXR callable shaders. Callable shaders are similar to hit shaders, but they can be invoked from RayGen shaders without tracing any rays. They have records in the shader binding table and allow local parameters to be bound. The total number of callable shader slots/records must be declared when creating a Ray Tracing Scene. Each record must be filled using the function “SetRayTracingCallableShader” command, which is similar to “SetRayTracingHitGroup”.

  • New: Added an optional any-hit material support to SkyLight pass. r.RayTracing.SkyLight.EnableMaterials (default = 0) allows support for visibility tracing against masked materials.

  • New: Changed “r.RayTracing.SkyLight.EnableTwoSidedGeometry” default to 1 to match ray traced shadows behavior.

  • New: Changed the Blueprint Sky Sphere template (BP_Sky_Sphere) to now have “Is Visible In Ray Tracing” disabled by default so that we do not need to exclude all Unlit geometries out of the Ray Tracing Acceleration Structure.

  • **New: **Acceleration structures and other resources are now created on all GPUs. Ray Tracing commands are handled by “FD3D12CommandContextRedirector”.

  • New: Added automatic Ray Tracing pipeline state object cache eviction. By default only up to 50 full pipeline states are kept in the cache. This reduces the likelihood of Editor crash when many Ray Tracing Shaders are being continuously loaded, for example, when shaders are recompiling.

  • New: Added optional any-hit material support to the AmbientOcclusion pass. Use the console variable “r.RayTracing.AmbientOcclusion.EnableMaterials” (default = 0) to enable support for visibility tracing against Masked Materials.

  • New: Added support for Procedural Geometries and intersection shaders in Ray Tracing.

  • New: Added “ERayTracingGeometryType” to differentiate between triangle and procedural geometries.

  • New: Changed FRayTracingGeometryInstance’s “Mask” default value from 0 to 0xFF, as it’s a more sensible default (0 causes geometry to be invisible).

  • New: Added basic resource usage stats for ray tracing. Use stat D3D12RayTracing to show the report.

  • New: Adding methods for World Position reconstruction, primary ray creation, and camera-relative depth biasing.

  • New: Parameterize DirectionalLight next-event ray to be consistent with other “infinite” rays.

  • 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: Implemented asynchronous Ray Tracing pipeline creation within single frame. Render thread now immediately returns after requesting a pipeline and actual compilation happens on a separate task. RHI command list that’s associated with RTPSO request is set to depend on the creation task.

  • New: Increases number of bins used for sorting rays during Ray Traced Reflection rendering.

  • New: Implemented separate compilation and run-time caching of Ray Tracing shaders and linking into final pipeline state objects. This significantly improves Ray Tracing PSO creation performance when loading new shaders into an existing large scene.

  • New: Shader reflection data is now used to more accurately compute how many view descriptors to allocate for Ray Tracing resource descriptor heaps.

  • New: Use structured buffer for Ray Tracing light constants.

  • New: Implemented parallel compilation of shaders when creating the ray tracing pipeline state object.

  • New: D3D12 root signature size warning is now only reported in verbose mode and only for non-Ray Tracing root signatures.

  • Improvement: Sample generation has been decoupled from ray traversal in the Sky Light pass. We’ve created “GenerateSkyLightVisibilityRays” compute shader. We leverage the “QuasiRandom” sequence and infinite light properties of Sky Light to cache importance-sampled ray directions for the “RayTracingSkyLight” ray generation shader, that amounts to noticeable performance improvement without observable increases in variance. This is set in the console variable “r.RayTracing.SkyLight.DecoupleSampleGeneration” (defaults to 1). It decouples sample generation from ray traversal.

  • Improvement: Ray Traced Reflection bounces are now correctly terminated on accumulated roughness.

  • Improvement: Reduced the number of descriptor heaps that are kept alive in D3D12RayTracing. Default shader tables no longer allocate heaps. Unused heaps are now released after 100 frames.

  • Improvement: Refactored Ray Tracing payload structures and removed redundant miss/hit shaders. All Ray Tracing payloads now inherit from a common base that contains ray intersection distance (HitT). Most Ray Tracing effects now use a single common miss shader that simply sets the HitT of the common base payload to a negative value.

  • Improvement: Improved our Ray Tracing Debug view modes:

    • They now use DebugViewModeRendering to avoid polluting the regular post processing pipeline.

    • Opacity view mode inverted to match Raster buffer visualization mode.

    • Gamma is now applied only in the modes that need it.

  • 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 one of our unreleased sample projects, approximately a 1.5x speedup in Infiltrator). This optimization assumes that the contents of uniform buffers will not change during a frame. Use the console variable “r.RayTracing.CacheShaderRecords” (default = 1) to turn off caching.

  • Removed: Removed “bIsDynamic” from FRayTracingSceneInitializer, as dynamic refit is not currently supported.

  • Removed: Removed mutual exclusivity between Ambient Occlusion and RTGI. This bypasses an RTGI artifact that produces poor ambient values.


  • Bug Fix: Resolved an issue that caused all Materials using Material Parameter Collections to recompile when added or removed.

  • Bug Fix: Added a new FMaterialCompiler method with “getTextureForExpression.” Previously, this logic was implemented in terms of “GetParameterType” and “GetParameterUniformExpression” but these methods are overridden to do nothing in the Lightmass Material compiler. By moving this logic to a new method, Lightmass can continue to override the previous methods but still work correctly with the new method. This fixes Materials that use Texture Objects causing them to show up black during Lightmass bakes, which means they didn’t reflect any indirect light.

  • Bug Fix: Fixed possible non-deterministic cooking with UMaterialInterface because of how we resolve texture references.

  • Bug Fix: Fixed an issue with Material Parameters sometimes not updating if a large numeric value is assigned. Setting the value to “- 1.0f” in an attempt to force inequality to be true will fail for very large floating point values, where precision is greater than 1.

  • Bug Fix: Fixed some cases where a UMaterial invalidation would fail to invalidate child UMaterialInstances.

  • New: Added 8-bit and 16-bit data Texture Groups.

  • New: Tessellation now works in Vulkan and OpenGL.

  • New: Added Mesh Distance Field downsampling capability during serialization time (compressed and not compressed). The variable “DownSampleMeshDistanceFieldDivider” can be used per-platform.

  • New: Added a compute shader for generating Mips on platforms that do not have native support. This enables users to set the sampler type in Editor on a Canvas Render Target. It fixes bAutoGenerateMips not working in Editor, too.

  • New: Material cooking now replaces the full shader map ID with a hash which reduces the size of the runtime data.

Mobile Rendering

  • Crash Fix: Fixed a case where Skeletal Mesh with “Render Static” option would crash Editor in Mobile Preview

  • Bug Fix: We now prevent Materials attempting to use SceneDepth in the Vertex Shader in Feature Level ES3_1. It is not supported but was not protected against setting it, causing a shader compile error on those devices.

  • Bugfix: Android GLES no longer flips Y axis on any pass that could be used as input for Post Process Material. The GLES Y axis flip only on final tonemapper or last material in the after tonemapper Post Process Material stage.

  • Bug Fix: Fixed a case where filmic tonemapper with MSAA enabled was producing slightly darker image on iOS devices.

  • Bug Fix: Fixed an issue with incorrect intensity on Materials that use High Quality Reflections.

  • Bug Fix: Fixed occasional flickering that could occur on mobile devices with Mali GPUs when running with Vulkan.

  • Bug Fix: Fixed wireframe-like corruption on Decals when running on iOS and some Android devices.

  • Bug Fix: Fixed incorrect timing for a rendering thread on iOS devices, for example, Stat Units.

  • Bug Fix: Fixed issues with Issues with SceneDepth Material node usage in post-process materials

  • Bug Fix: Fixed issue with High Quality Depth of Field on mobile devices running Vulkan.

  • Bug Fix: Fixed issues with occasional artifacts with bloom rendering on iOS devices.

  • New: Added experimental support for auto-instancing on mobile, which is disabled by default. It can be enabled with the command “r.Mobile.SupportGPUScene” in DefaultEngine.ini. It requires Metal, Android Vulkan or OpenGL ES3.1.

  • New: Material ‘Pixel Depth Offset’ feature will be disabled by default when packaging your project for mobile platforms. Enable it with the console variable “r.Mobile.AllowPixelDepthOffset”.

  • New: Software Occlusion culling now supports Instanced Static Meshes as occluders.

  • Deprecated: Disabled Vulkan support for Adreno5xx based devices running on Android version earlier than 8, because of driver issues with input attachments usage.


  • Bug Fix: Removed stall on DX11 rhithread caused by csvprofiler.

  • Bug Fix: Resolved an issue where FRealtimeGPUProfilerEvent was forcing the Query to wait.

  • New: Added the command line argument “-usedcomponents” to liststaticmeshes. It dumps the StaticMeshComponent usage count for UStaticMeshes and all used components by path. It strips Mobile data when running in builds that can’t accurately count mobile data.

  • New: Added throttling capabilities when copying Mesh Distance Fields to Atlas Distance Fields. This can be enabled with the console variable “r.DistanceFields.ThrottleCopyToAtlasInBytes”.

  • New: Replaced global frame minimal graphic pipeline state TSet to a TSet per DynamicPassMeshDrawListContext. It removes RW lock contention when global TSet is accessed by multiple threads.

  • New: Added float3 version of FastExp.

  • New: Shaved some memory off of FVertexFactory FLocalVertexFactory. It went from 1072 bytes to 480

  • New: Optimized UploadDynamicPrimitiveShaderDataForView so that it doesn’t upload entire scene primitive buffer if the current view doesn’t have dynamic draws.

  • New: Base pass can now output velocity data for movable objects with no Static Lighting (in both Forward and Deferred Renderer). This saves CPU draw call submissions. In base Vertex and Pixel Shader pass, uniform variable OutputVelocityBuffer is tested to output or not velocity data. It’s configurable per-project and/or per-platform when using the console variable “r.BasePassOutputsVelocity”.

  • New: Added the command line argument “-CountApplicableToMin” to listtextures to see how many textures would be affected by changing the minimum required streaming LODs.

  • New: Added AbsoluteTime Queries to FD3D11RenderQueryBatcher, like occlusion batches. At the end of every frame, readback of all the available queries are scheduled.

  • Improvement: Added a new Geometry Cache code that is significantly faster to decode and enables multithreaded decoding for additional speed. The Geometry Cache will have to be reimported to take advantage of this improvement.

  • Improvement: Changed Subsurface Occlusion to use a fast exp, instead exp.

  • Improvement: We now skip half of UpdateGPUScene work when bAllowStaticLighting is set to false.

  • Improvement: Saved 24 bytes from FRenderResource for platforms that set PLATFORM_NEEDS_RHIRESOURCELIST to 0.

  • Improvement: Optimized RenderAssetStreamingMipCalcTask so that a low priority task is now approximately 2.3 times faster.

  • Removed: Removed NVIDIA 20xx workaround for Vulkan on drivers 430.yy or newer.

Post Processing

  • Bug Fix: Fixed pre-exposure issues with Decal Emissive and Planar Reflection.

  • Bug Fix: Fixed some errors in the Eye Adaptation (Auto Exposure) readback logic that made the engine read invalid pre-exposure entries. Enabled pre-exposure by default on all platforms that have “r.EyeAdaptationQuality 1”.

  • New: Enable stencil testing for Post Processing Materials. The stencil can be written to Post Process input 0 if able and copy Post Process Input 0 to target if unable. It allows SM4 to make a copy DS if necessary and allows the Post Process Material to use Blend modes to composite onto output.

  • New: Added Post Process option to Motion Blur to set the Target Frame Rate for Shutter Angle.

  • New: Added functionality to force FFT Bloom Convolution texture to be resident so that Bloom functions properly under memory texture streaming pressure.

  • New: Disabled writing alpha from the Tonemapper if Anti-Aliasing is disabled. This leaves the alpha channel with a value of 1.


  • Bug Fix: Fix crash when changing Skeletal Mesh and the Persona Viewport is showing some bones (whether selected or all hierarchy).

  • Bug Fix: Added -m option to always mangle symbols for dumps, and by default, send all stderr to “nul” on windows.

  • Bug Fix: PropertyNode no longer stores the internal index for sets and maps, and instead, stores the logical index. This was causing a crash when deleting multiple entries from a map because the physical index overruns the size of a copy of the map (for instance, in an object created from a CDO) because it does not copy the gaps in the map.

  • Bug Fix: Fixed Skeletal Mesh temporary build structure to support high precision tangents.

  • Bug Fix: Import all blend shapes even if they have the same name using the FBX Unique ID to identify them.

  • Bug Fix: Keep the Skeletal Mesh asset user data when reimporting

  • Bug Fix: Keep the cloth binding when reducing a source model with itself has the source LOD

  • Bug Fix: Fixed Skeletal Mesh to compute normal with MikkT to use the connected triangle island with a smoothing group instead of only the smoothing group.

  • Bug Fix: Added option to control if the material can be reordered to the FBX file material order.

  • Bug Fix: Fixed an issue where the import settings of Static Mesh and Skeletal Mesh would not have the same restriction in the Assets Detail Panel as with the Import Dialog.

  • Bug Fix: Fixed conversion from Skeletal Mesh to FRawMesh — bi-normal vector should now be able to compute something like (Z^X) * biNorm Sign.

  • Bug Fix: Made sure Static Mesh reimport of embedded LOD can also remap the section info map.

  • Bug Fix: Made sure to restore the section data (cast a shadow and compute tangent) when reducing a Skeletal Mesh.

  • Bug Fix: Fixed FBX file open conversion attempting to open the FBX file twice — the conversion was bad the second time.

  • Bug Fix: Fixed FBX Static Mesh importer — will not fail on import if not all parts have completely degenerated.

  • Bug Fix: Fixed it to ensure that the FBX exporter correctly configures the FBX SDK timeline properties.

  • Bug Fix: Fixed a bug where, when exporting a scene to FBX, the Collision Meshes would not be placed correctly.

  • Bug Fix: When a Skeletal Mesh LOD gets imported and the skeleton is not compatible previously made the import fail, preventing the addition of a material slot if the create material was chosen in the import options.

  • Bug Fix: Fixed a bug where the “Vertex Color” import option would always be overridden to “replace” when no existing Vertex Color data was present.

  • Bug Fix: FBX skeletal mesh importer now sends a token error if there is any NAN or zero-scale in the imported bone transform.

  • New: Added support for an option to allow for implicit uploading of crashes.

  • New: The Framepro ConnectionChangedCallback now passes the filename of the current capture into any delegates that are registered for it.

  • New: A new function was added to the ViewportClient class to validate if permanent Capture is required. By overloading it in GameViewPortClient, we can prevent the game from getting a permanent capture of the mouse if the console is active.

  • New: Added a portable call stack hash for crashes.

  • New: Added Tooltip support to the Visual Logger, which shows the time and all logs (both normal and shape descriptions) for the closest point in a timeline track

  • New: Added OnBeforeHandleSystemError in FCoreDelegates to move registry writing for editor analytics before main crash reporting, since killing the editor process once the “Fatal error!” dialog pops up (and then freezes for a while during crash reporting) would cause an abnormal shutdown to be reported. This should help reduce the number of crashes being reported as abnormal shutdowns because the analytics are never written out.

  • New: Added delete custom attribute curve to FBX reimport menu.

  • New: Enabled inline reduction of Skeletal Mesh custom LOD.

  • New: EditorUtilityWidgets now has ShowWorldContextPin enabled so that the editor Widgets can make choices about what World they’re interacting with — whether it is the Editor or Game World.

  • New: The 360 StereoPanorama Plugin has been renamed to PanoramicCapture with the following updates:

    • Merged left and right eye images into and single top and bottom image to support top and bottom stereo standard.

    • Output several types of buffers, including AO, Metallic, Roughness, Depth, Basecolor, Worldnormal, and FinalColor for post compositing in other DCCs.

    • Always output depth pass in 32-bit, since the 8-bit depth pass is not usable.

    • Added support for post-process volumes with blendables.

    • Disabled undesired screen space post processes by default since they create color bandings and black bars in the output.

    • Added Blueprint with settings to output the best quality captures.

    • Added Blueprints to view 360 stereo stills and movies for GearVR and Oculus.

    • Using console commands, exposed new parameters to set bit depth and render passes.

    • Switched all containers and calculations using FLinearColor to ensure everything stays in 32-bit/channel to avoid quality loss.

    • Added support for 8-bit (PNG) and 32-bit (EXR) format.

    • All logging info is now under the “Message Log”.

    • Users can now output in monoscopic.

    • Added monoscopic capture support to support post processes and blendables in the same way that stereoscopic does.

Virtual Production

  • Crash Fix: Fix for a Maya crash occurring when unloading the Live Link Plugin.

  • Crash Fix: Fixed a crash that occurred when starting PIE with VirtualCamera Game Mode when you have an Oculus headset plugged in. Activating the Game Mode changes the tracking system, which does not have an HMD device.

  • Crash Fix: Fixed a crash on shutdown — Used to call a virtual function in the destructor of SMediaFrameworkCapture, and fixed synchronization issue with SharedPtr on the render thread in MediaCapture.

  • Bug Fix: Fixed the incorrect loading of movement stabilization values from presets in Virtual Camera.

  • Bug Fix: Fixed a reset of Slate in the Take Editor that occured on entering PIE when using the Virtual Camera.

  • Bug Fix: Fixed an issue where the recording button was disabled in Virtual Camera when trying to record over a previous take.

  • Bug Fix: Focus on the PIE window is now enforced when starting or stopping recording using the Virtual Camera.

  • Bug Fix: Improved the thread safety of MediaCapture.

  • Bug Fix: Fixed an infinite loop occurring when closing a game with MediaCapture enabled.

  • New: RemoteSession now supports sending controller input to the host machine.

  • New: Enabled the Virtual Camera to run in-game, though you cannot use it to create a new take and view previous takes.

  • New: Added an option to display the MediaProfile name in the Main Frame status bar.

  • New: Only the correct VR controllers show up in the editor config. The “None” option has been deleted because we always want a controller selection — VirtualScoutingController and VirtualScoutingTeleporter match names.

  • New: Improved the Media Player and time code synchronizer toolbar UX, separating the main button from the combo box.

  • New: VP Bookmarks are now notified when a map has changed in the editor.

  • New: Added CustomTimeStep that ticks only when a new timecode is available.

  • New: Live Link has been revamped to better accept arbitrary data. Data is now associated to a role describing the underlying data structure.

  • New: Live Link sources and subjects settings can now be saved to a preset so you can reconnect easily.

  • New: Live Link Subjects can now have preprocessors to manipulate incoming data before being buffered, custom interpolator and support various translators if other output roles can be supported.

  • New: Actor’s component can now be easily controlled via Live Link with the Live LinkComponentController.

  • Deprecated: Live Link now associates a role to data.

  • Deprecated: When pushing data, instead of using PushSubjectSkeleton and PushSubjectData, use PushSubjectStaticData and PushSubjectFrameData with the right Live Link Role.

  • Deprecated: Generic GetSubjectData is now deprecated when fetching data from Live Link — now, use EvaluateFrame with the right role.

  • Deprecated: Whitelisting a subject is now deprecated — calling SetSubjectEnabled now enables and disables subjects.

  • Deprecated: FLive LinkFrameData and FLive LinkSubjectFrame structures are now deprecated. You can now define your own data structure to stream using FLive LinkBaseStaticData and FLive LinkBaseFrameData.

  • Deprecated: Live LinkComponent Blueprint functions are now deprecated. Use the globally accessible functions like GetLive LinkEnabledSubjectNames, GetLive LinkSubjects and the new node EvaluateLive LinkFrame.


  • New: Added Scalable Display Easy Blend Integration with support for:

    • Planar Configurations

    • Curved Surfaces

    • Spherical (Dome) Surfaces

  • New: Added Warp and Blend/MPCDI, integrating the industry-standard implementation of MPCDI, including:

    • Defining how multiple displays and typically projectors are combined to create a single seamless display.

    • Supporting MPCDI 1.0 Standard.

    • Supporting 2D and Advanced 3D (A3D) Profiles.

  • New: Extended Render API extension, providing means to easily access these functionalities:

    • Projection and synchronization techniques.

    • Stereoscopic modes.

    • Warp and multi-viewports.

    • Tracking, inputs, and custom post-processing.

    • By substituting their own implementation, users can achieve customization that enables them to get nDisplay for their projects.

    • Made it such that the user Implementation can be made in separate modules without UE4 source code.

  • New: In-camera pixels, including:

    • Support for secondary asymmetric frustum overlay.

    • Improved resolution of the camera takes.

    • Parallax effects provided by camera tracked frustum.

    • Separated set lighting from camera movement.


  • Bug Fix: Dragging a widget from a non-canvas parent to a canvas in the UI editor no longer causes the widget to be offset.

  • New: Made several improvements to game controller handling in UI code:

    • Made a focus change callback to FNavigationConfig that can be used to override focus changes or play a game-specific effect.

    • Added NavigationAction enum and functions to navigation config to replace hardcoded keys like Virtual_Accept. This can be overridden by a game to handle game-specific remapping.

    • Fixed SSlider to use navigation instead of key input, which fixes deadzone handling and allows remapping.

    • Added some functions to KismetInputLibrary to query navigation; this is useful for UMG widgets that handle input themselves.

  • Deprecated: Legacy localized fonts are now disabled by default.

    • These have been “soft” deprecated since 2014, were formally deprecated (emitting a warning if used) in 4.22, and will be removed in 4.24.

    • They can be temporarily enabled again by setting Slate.EnableLegacyLocalizedFallbackFont to 1.

      • You should instead ensure that your font assets are set-up correctly by using this overview.


  • Bug Fix: Updated MaterialProxySettings and MaterialOptions customizations, so that they adjust metadata for their FIntPoint instances instead of adjusting metadata for all FIntPoint properties.

  • Bug Fix: Fixed .IsEnabled for single column widgets (buttons). The enabled state was being blocked by IsPropertyEditingEnabled.

  • Bug Fix: Addressed issues where password fields were not ignoring word breaks, and SHIFT + DELETE was not cutting text.

  • Bug Fix: Fixed an issue with the SInputKeySelector OnKeySelected event, where it was not firing when clearing the selected key.

  • Bug Fix: Game and Editor now have separate navigation configs.

  • Bug Fix: Fixed an issue where SCombobox returned as unhandled when input is captured and the menu is closed.

  • Bug Fix: Fixed a bug in SButton::OnPaint() where the ColorAndOpacity property was ignored for rendering.

  • Bug Fix: Corrected instances of SListView Garbage Collecting a UObject in ListItems while being used by the List, which caused an assert.

  • Bug Fix: Addressed issue where SpinBox widget would clamp initial values to the slider min/max instead of the true min/max.

  • Bug Fix: Fixed navigation in ListView widget not working as expected toward the end of the list when it contains a large number of items (over 500K) and partial items are visible.

  • Bug Fix: Corrected ListView widget not scrolling to end of list when it contains a large number of items (over 500K).

  • Bug Fix: Fixed issue where properties in sub-categories wouldn’t appear in the details panel for an EditInlineNew object.

  • Bug Fix: Updated curve struct customization to disable editing on curves when the corresponding property isn’t editable.

  • New: Added extension points to level editor toolbar blueprint menu.

  • New: Included bRequireFocusForGamepadInput CVar to filter out incoming gamepad input when the editor doesn’t have focus.

  • New: When the SlateUI draw event fires it appears as “SlateUI - {WindowTitle}” instead of “SlateUI”.

  • New: Removed padding from scrollbar borders which prevented having a scrollbar thinner than a certain width.

  • New: When moving array elements in the Blueprint Editor, the element being dragged will now highlight.

  • New: Added “Down” touch click method to match mouse click types.


  • Bug Fix: Fixed a bug where variables were duplicated when dragging and dropping in the hierarchy view.

  • Bug Fix: Correction to the Replace With context menu option of the hierarchy view to keep the original name when it’s not a generic name.

  • Bug Fix: Fixed UComboBoxString not broadcasting all changes when the slate widget is not ready.

  • Bug Fix: Updated WidgetComponent to no longer display screen-space widgets when owning actor is hidden.

  • Bug Fix: Fixed events not firing on first frame of UMG animations.

  • Bug Fix: Corrected OnDragCancelled to now trigger when pressing Esc while dragging a UMG widget.

  • Bug Fix: Fixed case where copying and pasting Canvas Panel Slots in UMG Animations would have a broken reference.

  • Bug Fix: Removed erroneous “Search Start” header from “All Named Widgets” menu.

  • Bug Fix: Centered the notch unsafe zone in the iPhone XS Max and XR Blueprint Widget templates.

  • Bug Fix: Fixed the copy & paste of a Widget with named slot that creating a copy of the widget in the root.

  • Bug Fix: Fixed Widget Component collision width when “Draw at Desired Size” is enabled (both for plane and cylinder cases).

  • Bug Fix: Corrected a problem with drag and drop in the Designer and Hierarchy view that caused widgets to be incorrectly set to Transient after a drop.

  • Bug Fix: Widgets will no longer reorder when being moved in the widget editor.

  • Bug Fix: Fixed a problem when ComboBox::SetSelectedIndex() is called while CurrentOption is not set.

  • Bug Fix: Stopped log spamming when copying and pasting widgets by removing the parent slot property from the exported text.

  • Bug Fix: Stopped UComboBoxString from recreating default STextBlock when changing selection.

  • Bug Fix: Fixed WidgetBlueprint compilation to enable BindWidget on widget in a parent WidgetBlueprint.

  • Bugfix: Making sure the bottom bar safe zone is defined to extend the whole length of the phone.

  • New: Added MinAspectRatio to SizeBox.

  • New: Adding Child to Grid now takes in a row and column.

  • New: Expanded support for binding multiple widgets to binding tracks in UMG animations.

  • New: Added getter for the scroll offset of the bottom of the ScrollBox.

  • New: Filter custom rows in UMG Details View.

  • New: Exposed support for getting and setting hint text for UMultiLineEditableText and UMultiLineEditableTextBox from code and blueprint.

  • New: Exposed GridSlot’s SetNudge function to blueprints.

  • New: Added user-defined min/max to sliders to Slate and UMG.

  • New: Updated UMG WidgetComponent default behavior was changed to handle hit test differently.

    • The inner SlateWindow used by the component now uses visibility SelfHitTestInvisible by default which means that a hit test in an empty portion of the WidgetComponent window will let the mouse hit pass through.

    • All data created with previous versions will keep the previous default value of Visible.

  • New: Added GetText() method to URichTextBlock.

  • New: Now includes support for UMG bindings for integer to float.

  • New: Included Favorites in the Palette view.

  • New: Supports changing WidgetStyle (FTextBlockStyle) on MultiLineEditableText in Blueprint. New: Supports changing WidgetStyle (FEditableTextBoxStyle) and TextStyle (FTextBlockStyle) on MultiLineEditableTextBox in Blueprint.

  • New: Exposed FDesignerExtension in UMG Editor to public interface to allow users to create UMG Designer extensions.

  • New: Updated the copy/paste in the Hierarchy view to keep the current name and add _X at the end instead of generating a new name.

  • New: Added new Play Animation nodes with a Finished output pin

  • New: Unlinked UMG default colors from editor settings colors.

  • New: Fix for font material not applied correctly on rich text.


  • Bugfix: Fixed an out-of-bounds read when detecting a main view for Instanced Stereo Rendering.

  • Bugfix: Set the instanced uniform buffer for mobile multi-view.

  • Bugfix: Using FXRTrackingSystemBase::GetRelativeEyePose eyes were reversed. We had the left eye on the right, and right eye on the left.

  • New: The parent for scalars is now used instead of providing suggested bindings for both child paths in OpenXRInput.

  • New: VR Mode and VR Preview can now be selected when the WMR plugin is enabled, and there is no headset attached.

  • New: Updated the OpenXR plugin to version 1.0.


  • Bugfix: Fixed a call to LoadModuleChecked when not on the game thread.

  • Bugfix: Fixed missing image and object scanning session type checks.

  • Bugfix: Merged in a UDN fix for orientation where AR sessions were not enabling the autofocus flag if requested.

  • Bugfix: Fixed a bug where Android clients were not locked into a minimum or maximum vertical camera rotation if the ARCore plugin was enabled.

  • Bugfix: Fixed the ARKit camera being allocated on the render thread causing assertions.

  • Bugfix: Updated the AR rotation to match the change to using UI orientation instead of device orientation.

  • Bugfix: Fixed mismatched sRGB flags in the ARKit environment capture probes.

  • Bugfix: Fixed missing retain for the ReferenceObject that is passed into the completion handler by ARKit.

  • Bugfix: Turned sRGB off for the camera image that comes from the remote AR device.

  • Bugfix: In UARPlaneGeometry’s DebugDraw() function, previously PersistForSeconds and OutlineThickness were ignored for BoundaryPolygons, now passing them through.

  • Bugfix: Packaging for HoloLens when project root directory is different from uproject name no longer fails.

  • New: Added a method to set the friendly name of a candidate object.

  • New: ARKit camera image texture objects now take device orientation into account.

  • New: Hooked up the ARKit2 scene understanding API to our AR layer.

  • New: Added some scene understanding support to our AR layer.

  • New: Added UARCameraImage support for ARKit.

  • New: Changed how tracked geometries are removed when restarting a AR session on ARKit.

  • New: Removed the pause of the existing session on ARKit when restarting sessions, as it was not needed and introduced delay.

  • New: Removed an ensure from ARKit updates that was no longer valid after a session restart.

  • New: Reworked ARKit pass-through camera rendering to use the UARTextureCameraImage that is updated per frame on the render thread.

  • New: Changed the ARKit camera texture conversion to use linear color space.

  • New: Added an AR session configuration option to enable/disable scene understanding detecting closed meshes in a scene.

  • New: Added support for AR systems that can match planes to slopes.

  • New: Added MRMesh generation (collision, nav mesh, and rendering) for AR planes and AR tracked images on ARKit.

  • New: Hooked up the AR delegates for Add/Update/Remove of tracked geometry for HoloLens.

  • New: Added a factory method to return the singleton AROriginActor to the requesting AR system.

  • New: Added support for an underlying mesh to be part of UARTrackedGeometry.

  • New: Added an AROriginActor for AR systems to spawn when they need to place UActorComponent derived components into the world.

  • New: Removed the tvOS blacklist for the Apple Image Utils plugin.

  • New: Removed the beta tag from the Apple Image Utils plugin.

  • New: Moved Apple Image Utils from Experimental to Runtime.

  • New: Added support for the AR platform’s unique id for tracked items.

  • New: Added delegates so that AR apps can use an event based approach rather than polling for changes.

  • New: Added some console commands to control face AR data logging: “FaceAR StartFileWriting” to start writing, “FaceAR StopFileWriting” to stop writing, “FaceAR SavePerFrame” to write a file each frame when logging is enabled, and “FaceAR SaveOnDemand” to write a file on close of the app or on user command.

  • New: Added a material node for converting screen space UVs to passthrough camera UVs.

  • New: Reworked Face AR console command support. The commands are now thread safe.

  • New: Added the update scene understanding AR support to the Magic Leap AR API.

  • New: We remove all tracked geometry immediately when the user restarts a session and has the reset tracked geometry flag set to true, instead of waiting for ARKit to send the notifications of removal. Changed the removal notification to handle removing items that we removed manually.

  • New: Added support for speech when remoting to HoloLens 2.

  • New: Allow iOS projects to offer optional ARKit features without setting the device capability that requires ARKit compatible hardware. To do this add the following to DefaultEngine.ini

    • [/Script/AppleARKit.AppleARKitSettings]

    • bRequireDeviceSupportsARKit=false

  • New: Updated ARCore to version 1.7.

  • Deprecated: Deprecated the ARKit pass-through material since it is no longer valid. Use UARBlueprintLibrary::GetCameraImage() to get a UARTextureCameraImage object instead.

  • Deprecated: Removed ARKit classes that were marked deprecated and for removal in 4.22 or earlier.

  • Deprecated: Removed the unused texture cache and various Y/CrCb properties from ARKit classes. Use the AR camera image object instead.


  • Crashfix: Added a fix and logging for a crash in UE4Editor_SteamVR!FSteamVRModel::GetRawMeshData().

  • Crashfix: Fixed a crash caused by an incorrect assertion in OculusHMD.

  • Crashfix: Fixed a crash in the late update manager when a collection was modified on the game thread while the rendering thread was walking the contents in a ranged-for loop.

  • Bugfix: Fixed a potential race condition in SteamVR stereo layers.

  • Bugfix: Fixed bug where the delta rotation on Oculus splash layers was ignored instead of applied every other frame.

  • Bugfix: Fixed a bug where world locked stereo layers were shown as tracker locked stereo layers on Steam VR.

  • Bugfix: Fixed showing external textures, such as media framework textures on Stereo Layers, on OpenGL ES.

  • Bugfix: Fixed an assertion in SteamVR when showing splash screens was auto enabled.

  • Bugfix: Fixed a bug where there was inconsistent rendering between left and right eye when r.SeparateTranslucencyScreenPercentage was less than 100.

  • Bugfix: Fixed a bug that made it impossible to reenter a Daydream game after dismissing the “Place phone into daydream headset” dialog at the start of the game.

  • Bugfix: Fixed a bug where custom depth-based rendering was rendering incorrectly with instanced stereo enabled.

  • Bugfix: Fixed a bug where the Oculus Touch Gamepad Special Left/Right inputs were swapped.

  • Bugfix: Fixed pixel shader not being bound when rendering the SteamVR spectator view.

  • Bugfix: Fixed a race condition that could occur in late update handling.

  • Bugfix: Fixed bug where GPU simulated particles with depth-buffer based collision would not collide with world geometry on Oculus.

  • Bugfix: Reduced logging of SCE_VR_TRACKER_ERROR_TIMESTAMP_OUT_OF_RANGE when the Move Motion Controller is turned off during Launch on PSVR.

  • Bugfix: Reduced logging when AllocateDepthTexture is being called every frame on OculusVR.

  • Bugfix: Reduced logging on Oculus Rift when running PIE with more than one player.

  • Bugfix: Fixed a SteamVR plugin controller latency issues that was causing jittery movement and some major artifacting with Temporal AA.

  • Bugfix: We no longer log an error after re-enabling stereo rendering from Blueprints on Oculus Rift.

  • Bugfix: Reduced logging in Oculus Rift by not waiting on the same frame multiple times in OculusHMD_Splash.

  • Bugfix: WMR HMD worn state events now function correctly.

  • Bugfix: Downsampled translucent rendering now also sets the instanced view uniform buffer.

  • Bugfix: Updated certificate requirements to package for HoloLens 2. “CN=” is now required in the company name when creating a certificate.

  • Bugfix: Fixed mobile preview when in sRGB mode and no editor elements are composited (G key press).

  • Bugfix: Moved the InstanceFactor to draw command submission rather than building to avoid an ensure when instanced stereo is turned on.

  • Bugfix: Moved the cubemap flip to the correct code path.

  • **Bugfix: **Updated enqueuing of render command handling device rotation.We shouldn’t enqueue a render command inside of the delegate handling device rotation - this ends up being unsafe due to the render thread being suspended. Now the new pass-through image is stored, and enqueued on the next GT tick.

  • New: Added Set/GetLeftTexture to UStereoLayerComponent. This allows dynamic access to both eyes’ stereoscopic cubemap layers.

  • New: Fixed the texture color order for FSteamVRTexture and extended FSteamVRTexture to work outside of the editor.

  • New: Upgraded OpenVR for Steam VR to version 1.5.17.

  • New: Added instanced stereo rendering support for instanced particles.

  • New: Added Vulkan mobile multiview support.

  • New: Updated Oculus runtime to version 1.37 for Rift-S support.

  • New: Converted parts of the SteamVR plugin to use the OpenVR module context.

  • Deprecated: Removed Cardboard iOS platform support from the GoogleVR plugin.

Upgrade Notes

  • New: Added a new blueprint-callable function, GetAllMorphTargetNames, to USkeletalMesh to retrieve all morph target names.


  • New: Container allocators must now define a SizeType member typedef, which must be a signed integer, representing the type of any indices or element counts passed through the API of the allocator. User-defined allocators must add this typedef or they will no longer compile when used by TArray.

  • New: TArray’s template signature has changed and existing forward declarations will no longer compile. “Containers/ContainersFwd.h” should be included to get the correct forward declaration of TArray.


  • API Change: Some editor-only UStaticMesh UPROPERTYs have been deprecated, and should now be accessed using new accessors, namely:

    • SourceModels: There is now a small API in UStaticMesh for manipulating the source models data. In general, access to the SourceModels array should be replaced by the GetSourceModels function; in addition there are the GetNumSourceModels, GetSourceModel(LOD), AddSourceModel, RemoveSourceModel and IsSourceModelValid functions.

    • SectionInfoMap: Please access this using the GetSectionInfoMap function.

    • OriginalSectionInfoMap: Please access using the GetOriginalSectionInfoMap function.

Media Framework

  • New: Added a global cache for image sequence, which is enabled by default. If you had previously changed the size of the cache for image sequences, then you will need to change the size of the global cache to a similar value, or you will be running with a smaller cache than before. Alternatively, you could disable the global cache in the settings to revert to per-player caching.


  • Bug Fix: The Get and Filter functions on the Asset Registry are no longer pure, as they were potentially expensive operations. This will help to avoid performance issues, but existing Blueprints will need to wire in the new execution pins.

Gameplay Framework

  • New: The parameters of the “Atan2 (Degrees)” and “Atan2 (Radians)” nodes have been changed from “A” and “B” to “Y” and “X” for better consistency with the rest of the API.


  • Bug Fix: There is now an error log when DOREPLIFETIME is not called on a replicated property inside GetLifetimeReplicatedProps. If this is inrended, use DISABLE_REPLICATED_PROPERTY to silence the error. See “UnrealNetwork.h” for more information.

  • New: Introduced MaxNetTickRate, which defaults to 120, to limit how often the net connection ticks. This helps very high framerate clients to replicate without overloading their connections or wasting excessive amounts of bandwidth. MaxNetTickRate is configurable in .ini files by adding “MaxNetTickRate=120” (or your own value) to the “[/Script/OnlineSubsystemUtils.IpNetDriver]” section.


  • New: Steamworks support has been updated to version 1.42 of the Steam SDK. If your project uses the “-force_steamclient_link” flag, you must now bundle it with the following .dll files for the architecture your application is targeting. (Note that these file names are appended with “x64” on 64-bit machines):

    • steamclient

    • tier0_s

    • vstdlib_s

    • These files are typically located in the installation directory of the Steam client software, and are no no longer included with UE4. Place them in the same directory as your “steam_api.dll”, generally located in the Engine’s “/Binaries/ThirdParty/Steamworks/(SteamVersion)/(WindowsPlatformArchitecture)” path.


  • New: Generating stable shader info while cooking is now configurable. This data only needs to be generated if one or more platforms in your project use PSO caching. To do this, you will need to explicitly enable outputting shader stable keys by adding “NeedsShaderStableKeys=true” under the section “[DevOptions.Shaders]” in the engine .ini file for PSO platforms (for example, “AndroidEngine.ini” and “iOSEngine.ini”). This saves disk space and significant time (around 90 seconds in Epic’s use cases) on iterative cooks for large projects.


  • New: Many classes and functions related to texture streaming have been given more generic names, such as references to “Texture” being changed to “RenderAsset”. Game or engine code that use those APIs will need to be updated, and you will need to recompile the appropriate binaries.


  • Deprecated: UnrealGameSync MetadataServer - Deprecated the CIS table in favor of new Projects and Badges tables. Deploying the new server will automatically populate all projects it finds in the existing tables to the new one, but old badge data is not migrated and anything posted prior to the migration will no longer be displayed in UGS.

Virtual Production

  • New: Live Link source factory has been moved to runtime to support creating sources out of editor. BuildCreationPanel, CreateSource and GetMenuType will have to be overloaded to create your widget.

  • New: ILive LinkSource::IsSourceStillValid is now const. If you have overridden this function, you will need to update your override’s signature.

Known Issues
For a complete listing of known issues affecting Unreal Engine 4.23, please see the Unreal Engine Public Issue Tracker.

cool, thanks epic.

Yay :slight_smile: Just finished downloading


So if I get the source for 4.23 and compile Chaos should work. If I load the content examples for 4.23(chaos) they should run???

I’m compiling the source now.

Fantastic - You guys make the world interesting
Thanks for the Landscape Terrain , Hierarchical Instanced Static Meshes, Instanced Static Meshes (ISM) and WPO
Any new encouraging words for transparent/transparency for RT
and more info on the new RT improvements !!

Looking forward to playing about with Chaos!

Is it possible to make Geometry Collections and then move the pieces using Niagara?

VR Preview is still not working. :frowning:

Incredible work as always!

nice, love chaos

I still can’t get 4.23 to open. I get these errors. Someone told me to try to update datasmith manually but it says it is already installed for all compatible engines and there are no options to update…

This is frustrating.

I can’t even view the log if I let it build because it closes before I can read it.

Also, I haven’t edited anything with C++, but I did double click on one of those files in the editor and it opened visual studio but I just closed that.

4.23.0 continuously crashing when opened 4.23 p8 project. (raytrace activated)

strangely at 4.23 p8 ​​there has never been a crash even in unremitting 10-hour studies.

winver : 1903
GPU : rtx2080ti
driver : 436.15 (game ready)

created new project, activated raytrace and crash again.

The “Content Examples” asset pack can not be downloaded for 4.23 in the launcher. Please fix it.

Getting the following error in the command line when running the setup.bat on Windows 10 from the release branch of the github source code:

Failed to download ‘http://cdn.unrealengine.com/dependencies/UnrealEngine-4358751-16521f530c414728b289dbb71f593410/80c1ba699c3de9b0950a5521e587025e7f85f8bb’: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. (PathTooLongException)


Fixed it by moving the folder to the root drive to make the path shorter, then moving it back after setup.

@**decksounds13 I found that completely **UnInstalling Datasmith allowed me to install some of the 4.23 Previews - then re-install Datasmith

Whoop Whoop!!!

So where is the 4.23 update?? I cannot see it anywhere?

@Nocturness I had the same issue. It started to work properly after I launched Ray Tracing with almost all features disabled and then started to enable them one by one (GI, refl, translucency, shadows etc.).