Unreal Engine 4.25 Release Notes

Release notes for Unreal Engine 4.25


What's New

With the release of Unreal Engine 4.25, we continue our mission to provide the most complete, flexible, powerful, and proven real-time 3D creation tool. We have further expanded the toolset to include content creation and editing for more areas of game and visualization development, while improving the feature set and refining workflows for existing tools. Our linear media tools are improved to enable even more immersive and efficient production of linear and cinematic content. Support for existing platforms has been further improved and first-class support has been added for the next generation of gaming consoles.

The more removed designers and creators are from the end product, the more difficult it is to realize their visions. With new and improved systems and tools, Unreal Engine 4.25 enables creators from more disciplines than ever to create, modify, and iterate directly in context in the editor on the final content. Niagara visual effects and Chaos physics have been improved and expanded to provide high-quality, high-performance dynamic simulations. Control Rig and Sequencer now work together to enable in-editor animation of rigged characters. Modeling and sculpting tools have been added to facilitate in-viewport building and updating environments.

Unreal Engine continues to be used in new and exciting ways to produce cinematic and linear content mixed with digital elements. The new Movie Render Manager produces higher-quality rendered output with a streamlined workflow for integrating it into any pipeline. The nDisplay multiple display technology is easier to configure and more powerful than ever making LED walls and large venue displays available to virtually any production. There are also improvements to several areas such as in-camera visual effects, tools for broadcast and live events, motion graphics via 3D Text Animation and the addition of support for generating charts and graphs directly inside of Unreal Editor.

We spend a considerable portion of each release focusing on improvements to support all platforms so your projects can be experienced by everyone regardless of their chosen form factor. In this release, we have added support for the next generation of gaming consoles, which include Microsoft Xbox Series X and Sony PlayStation 5. In addition, iOS and Android have both seen significant enhancements to rendering and development workflows. Augmented reality devices, such as HoloLens 2 and Magic Leap, have new functionality as well as improvements to development workflows.

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

Filippo Tarpini "Filoppi", Doug Richardson "drichardson", Daniel Marshall "SuperWig", Doğa Can Yanıkoğlu "dyanikoglu", "projectgheist", Artem V. Navrotskiy"bozaro", "KieranNewland", "sturcotte06", "ohmaya", Morva Kristóf "KristofMorva", Kalle Hämäläinen "kallehamalainen", Eric Spevacek "Mouthlessbobcat", "mattpetersmrp", "doublebuffered", "SaltyPandaStudios", "Fi",Charles Alexander "muchcharles", Kristján Valur Jónsson "kristjanvalur", "solasin", "zzgyy123", Alex Stevens "MilkyEngineer", Artem Gurevich "glcoder", Konstantin Heinrich "kheinrich188", Jørgen P. Tjernø "jorgenpt", "CA-ADuran", Muhammad A.Moniem "mamoniem", Paul Greveson "moppius", Cristiano Carvalheiro "ccarvalheiro", "farybagj", Robert Khalikov "nbjk667", "ecolp-improbable", "unrealTOM", "fuchuanjian2016", Ilya "Neo7k", Mikhail Zakharov "real-mikhail", Cameron Angus "kamrann", Sam Bonifacio "Acren", Michael Kotlikov "mkotlikov", "Yaakuro", "dbaz", "kshokhin", Joe Best-Rotheray "cajoebestrotheray", Selivanov Artem "broly", Toru Hisai "torus", Lucas Maldonacho "Maldonacho", Maxim Marinchenko "mmarinchenko", Matan Shukry "matanshukry", Ben Hetherington "BenHetherington", "No-Face-the-3rd", Jeong ChangWook "hoiogi", Geordie Hall "geordiemhall","jessicafolk", Franz Steinmetz "Kartonfalter101", "fieldsJacksonG", Rune Berg "1runeberg", "DCvipeout", Nick Edwards "NEdwards-SumoDigital", "harshavardhan-kode-sb", Lukas Tönne "lukastoenneMS", Noah Zuo "NoahZuo", Chris "minimpounminimpoun", Viatcheslav Telegin "vstelegin", Ryan "RyanyiNF", smallshake "smallshake", Sergey Igrushkin "shkin00", Punlord "Punlord', Andrey Chistyakov ,"roidanton", Vasilii Filippov "DrizztDoUrden", Yi Qingliang "Walkthetalk", HugoLamarche "HugoLamarche", Gerke Max Preussner "gmpreussner", "RPG3D", Zak Strange "StrangeZak", "heavybullets", Alexander "DecoyRS", Martin Nilsson "ibbles", Peter Giuntoli "petergiuntoli", Torsten Raussus "Getty", Evan Hart "ehartNV", Arvid Hansen Díaz "DonHansonDee", Gregory Hallam "greghs".

Major Features

New: Next-Generation Platform Support

image alt text

Unreal Engine 4.25 delivers initial support for Sony's PlayStation 5 and Microsoft's Xbox Series X as first-class platforms, and throughout the year we will be updating the 4.25-Plus branch with optimizations, fixes, and certification requirements to support developers launching on the next generation of consoles. Features include platform-specific functionality, such as new audio advancements, initial support for online subsystems, and early support for TRC and XR certification requirements.

New: Unreal Insights Improvements

UX and architecture improvements for Unreal Insights include separate trace browsing and recording, new visualizer process support, and channels for trace organization. This release also includes search and visualization improvements for Timing Insights, and a new Network Insights window to help users optimize and debug network traffic.

image alt text

Unreal Insights UX Improvements (Beta)

With this release, Unreal Insights includes the following UX and architecture improvements:

  • Viewing traces now launches a separate Insights process to clearly separate the browsing and recording of traces

  • When picking up a new trace, Unreal Insights supports auto-spawning a new visualizer process

  • Trace events are organized into channels, and they can be toggled on or off for live sessions from within Insights

    • Users can select channels from the command line.

Timing Insights

Users can now use timing event filters that enable them to improve their search experience. Graph support improvements enable users to trace and visualize metrics for data correlation.

To learn more, read about Unreal Insights.

Networking Insights (Experimental)

To get started, learn how to acquire and use Unreal Insights.

Unreal Insights now includes Networking Insights to optimize, analyze, and debug network traffic. Users can record trace information to visualize network behavior with the following features:

  • Game Instance control to display visible machines during the network sessions being recorded

  • Connection Mode control to visualize outgoing or incoming data

  • Packet Overview panel that displays packet timelines (and sizes) being transmitted or received during a game

  • Packet Content panel that shows a packet's content, such as replicated objects, properties, and remote function calls

  • Net Stats panel that displays trace events for selected packets, including statistics about the total, maximum, and average exclusive or inclusive packet sizes

To learn more, read about Networking Insights.

Animation Insights (Experimental)

image alt text

The editor now includes Animation Insights to visualize gameplay state and live animation behavior. Users can also record trace information to visualize animation behavior with the following features:

  • Channel filtering to select the trace data written out to the recorded data set

  • Source filtering to select the gameplay objects that output trace data

  • Pose, Curve, Blend Weight, Anim Graph, Montage, and Anim Notify tracks

  • Schematic Anim Graph view with a live update that replaces the 'showdebug animation' system

To learn more, read about Animation Insights.

To learn more about Trace Sessions and Trace Recorder, read the Unreal Insights Overview.

New: Niagara is Production-Ready

The Niagara visual effects (VFX) system is now production-ready. The Niagara VFX system is battle-tested for use in a variety of scenarios—from generating effects used in Fortnite to high-end technical demonstration projects and virtual production for TV and film. The user interface is more polished and easier to use, performance and scalability are significantly improved, and we added new features such as audio data interfaces, particle-to-particle communication, and more.

Particle Attribute Reader for Niagara

You can now directly access the properties of other particles using the new Particle Attribute Reader Data Interface. Emitters or systems can directly read parameters of other particles (such as position, color, age and so on), enabling a variety of effects and behaviors such as flocking, distance constraints, trails, and so on.

The Particle Attribute Reader data interface can read particle attributes from the same emitter it is used in, or from other emitters in the same system. When it is reading from its own emitter, it will return data from the previous tick or simulation stage. When the Particle Attribute Reader is reading from a different emitter, Niagara first simulates the emitter it is reading from before the Particle Attribute Reader's emitter. This is so the data interface can return results from the same tick.

Parameter Panel UI Improvements for Niagara

The layout of the Parameter Panel in the Niagara Script Editor has been updated to significantly increase the clarity of parameters used in a Niagara Script. This new layout resembles the layout of the Parameter Panel for Blueprint. Parameters are no longer categorized by namespace (System, Emitter, Particles, and so on), but instead by functional labels describing their use in the Script (Inputs, References, Outputs, and Locals.) You can now also select a parameter's target Namespace using a dropdown menu!

image alt text

image alt text

Parameter Panel, previous versions

Parameter Panel, 4.25 version

Parameters in the Input category can be configured by the user of the Script (previously this was true for Parameters written in the Module namespace.) Parameters in the Reference category cannot be configured. Parameters that are in the Output category include anything the Script modifies. Parameters in the Local category are defined in a Script, and are only valid within that Script.

Audio Oscilloscope and Audio Spectrum Data Interfaces

The new Audio Oscilloscope and Audio Spectrum Niagara data interfaces enable you to connect Niagara systems to the Unreal Audio Engine. Audio Oscilloscope can be used to directly access the waveform of the audio signal, and Audio Spectrum can be used to create a visualization that varies according to how loud the audio is at specific frequencies.

These interfaces are built to have as little latency and performance overhead as possible. By default, these two interfaces will use the final audio from the game, but you can also set them up to use only specific audio submixes.

Niagara Effect Type Assets

Effect Type assets enable you to set up default values for scalability and performance-related settings that are shared between all effects of a particular type in order to maintain consistency and enforce budget constraints across the different types of effects in a project.

Performance Scalability By Platform

Performance scalability for Niagara effects can now be specified on a per-platform basis, enabling simple and clear control of platform scalability while still providing the ability to fine-tune performance where needed.

You can control which platforms the emitter is enabled on using quality levels, such as enabling the emitter only for devices with Low and Medium Effects Quality. For finer control, you can include or exclude specific device profiles in the platform set, using the device profile tree under each quality level.

image alt text

Low Effects platform dropdown

Platform-based scalability can also be specified in the scalability settings of Effect Type assets. See the Niagara Effect Type Assets section for more info.

Emitter Inheritance Reparenting

You can now change the parent of an emitter using inheritance in Niagara after creation, adding even more flexibility and enabling you to restructure assets within your project while preserving the look and feel of the emitter. When the parent is changed, any modules in the child emitter that match the new parent will be updated; but anything that does not match the new parent emitter will be preserved on the child emitter.

When an emitter is selected, the settings menu now contains an option called Update Parent Emitter. Select that option to display a menu where you can select the new parent emitter. Once the new parent emitter is selected, the child emitter will be updated automatically.

image alt text

Click the gear icon to open Emitter Settings

Niagara Scopes for Module Creation

Niagara now has a new conceptual model for module creation called Scopes, which defines information flow from the start to the end of a simulation run. As an example, the System Scope flows down to the Emitter and Particle Scopes; the Emitter Scope flows down to the Particle Scope, and so on. Scopes replace the concept of Namespace. Along with Categories (Inputs, References, Outputs, Locals), this creates more standardization and clarity when you use parameters in the Niagara Script editor.

Existing parameters will be updated to the new paradigm when the user updates to 4.25.

Niagara Scratch Pad

Using the new Scratch pad in the Niagara System and Emitter editor, you can experiment with developing a module or dynamic input for your effect, and see the results in real time by creating modules and dynamic inputs that are contained within the emitter or system asset! You can import module and dynamic inputs scripts from existing scripts assets, and what you create in the Scratch Pad can also be exported to existing script assets or new script assets. You can also use the Scratch pad to create something that is very specific to the system or emitter you're creating. Instead of creating another script asset that has limited utility for other uses, you can just create it in the Scratch pad and it will work within your emitter or system.

Niagara Selection Panel UI Improvements

We've made some improvements to the Niagara System and Emitter Editor! You can now copy, cut, and paste modules, module inputs (including dynamic inputs), and renderers using a right-click context menu. We've also given you the ability to customize module display names, improved module highlights, and created a better UI for Set Variables module naming. Emitter nodes in the System Overview now display thumbnails of the material used in those emitters.

New: Shading Model Improvements

This release sees marked improvements and additions to our material shading models with support for anisotropic properties, true tinted translucent materials with physically accurate properties, and an improved Clear Coat shading model that exhibits a physically accurate response to punctual lights.

These improvements are ideal for those creating materials for automotive and architectural visualization and for media and entertainment.

image alt text

Support for Anisotropic Materials (Beta)

We've implemented our first steps in supporting proper anisotropic materials using the GGX anisotropic formulation. These materials will support punctual IBL lights and reflections on Clear Coat and Default Lit shading models in materials for this release. For area lights, the BRDF falls back to the isotropic response that has been used.

Anisotropic (4.25)

Isotropic (4.24)

To support anisotropic materials, the GBuffer has been expanded to allow for a tangent buffer when BasePass does not emit velocity. An option is exposed to allow vertex deformation through materials to trigger that object to render during the velocity pass, eliminating the need to output velocity during the BasePass. This means that you can enable the tangent buffer and no velocity during the BasePass without losing any functionality.

To enable anisotropic materials in your project, use the Project Settings to set Use Anisotropic BRDF to true. In your Material, the main node now has an input for Anisotropic to control light directionality along its surface.

For additional details, see Shading Models.

Physically Based Translucency

We've added a new physically based translucency shading model, Thin Translucency, that enables materials such as colored or tinted glass to be handled in a single pass. This allows the accurate representation of physically based transparent materials, while also improving quality and performance of glass shaders over previous methods.

image alt text

For example, when creating a tinted glass material, it needs to both add a white specular highlight and tint the background with it. In the past, this effect was only achieved with separate objects to handle white specular highlights, all while performing a complicated setup for them to blend in the right order. The Thin Transparency shading model renders them in a single pass with a physically based shader that accounts for light bounces from the air into the glass and the glass into the air.

Enable the Thin Transparency in your Material by doing the following:

  • Set the Shading Model to Thin Translucent.

  • Set the Lighting Mode to Surface ForwardShading.

  • Plug your texture or color expressions into the Thin Translucent Material Output expression.

For additional details, see the Using Transparency documentation.

Clear Coat Shading Model Improvements

This release sees marked improvements to the physical accuracy of our Clear Coat shading model. The changes to our model coupled with implementing the Path Tracer first has enabled us to increase quality across both our traditional raster and ray tracing techniques from a ground truth image generated in the engine.

4.25 Clear Coat

4.24 Clear Coat

Additionally, Unreal Engine's Clear Coat model was designed with environmental lighting in mind. It now has correct directional response to punctual lights where attenuation and fresnel terms are mostly pronounced for lights with directionality, while environment lighting remains the same.

For additional information, see Shading Models.

New: Chaos Physics System Updates

image alt text

The Chaos physics system is now in active use on shipping seasons of Fortnite and supports the following features:

  • Destruction - High-performance system enabling cinematic-quality levels of destruction on a massive scale in real time

  • Static Mesh dynamics with collisions - Rigid body simulation for dynamic objects in the scene

  • Cloth - Dynamic cloth simulation for clothing, flags, and other fabrics

  • Hair - Strand-based, physically-accurate simulation of hair

  • Rigid-body Skeletal Control - Simplified simulation for items such as ponytails

  • Scene queries - Perform traces into the scene

New: High-Quality Media Export (Beta)

High-Quality Media Export is a successor to the Sequencer Render Movie feature, and is built for higher quality, easier integration into production pipelines, and user extensibility. With High-Quality Media Export you can accumulate multiple render samples together to produce the final output frame, which allows for higher quality anti-aliasing, radial motion blur, and reduced noise in ray tracing.

High-Quality Media Export also supports several other new features to produce high-quality renders, such as the new High Resolution setting that allows tiled renders to overcome GPU memory limits and device timeout limitations. You can also export translucent images (with appropriate project/scene settings), produce 16-bit HDR images with linear data, and save render configurations into assets that you can reuse and share between developers. Lastly, batches are now managed with the new render queue, which allows you to batch render multiple sequences easily, similarly to the rendering process in Adobe After Effects.

Eventually, High-Quality Media Export will replace the existing Render Movie feature in Sequencer. For now, you can access High-Quality Media Export by navigating to Window > Cinematics > Movie Render Queue. Then, add your Level Sequence to the render queue. Please note that High-Quality Media Export does not have the full functionality of Render Movie at this time, so Sequencer still uses Render Movie by default.

image alt text

For more information about High-Quality Media Export, see the High-Quality Media Export Overview.

New: Audio System Updates

New in Unreal Audio Engine are Convolution Reverb processing and Soundfield rendering. Designers can now bring their projects to life with more immersive and realistic audio experiences that envelop their listeners while simulating true-to-life acoustic spaces.

Convolution Reverb

With the new Convolution Reverb effect, you can now digitally simulate realistic acoustics in virtual environments using samples from physical or designed spaces for more realistic reverberation.

  • Convolution Reverb is a data-driven counterpart to more traditional reverb techniques. Instead of simulating reverberation using a combination of delay buffers, filters, and various other DSP topologies, convolution reverb employs audio samples that act as acoustic measurements of real or designed spaces in order to simulate the acoustics of actual rooms and environments.

  • Convolution reverb is commonly used in film and television production to create richer, more lifelike mixes by enhancing the "worldizing" of sounds and dialogue recorded off-set or in a studio, usually during post-production.

Native Soundfield Ambisonics Rendering

Unreal Engine now supports rendering Soundfield Ambisonics to provide a fully immersive spherical sonic experience. Soundfields differ from conventional surround sound because while surround sound assets provide a fair representation of a static sound bed, ambisonic assets envelop the listener, allowing them to rotate within the soundfield, creating more realistic immersion for interactive environments.

image alt text

Visual representations of the first four bands of real spherical harmonic functions. Blue portions are regions where the function is positive, and yellow portions represent regions where it is negative. Image by Inigo.Quilez. This file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license.

  • Soundfields are the audio analog to spherical harmonics for lighting. Using soundfield recordings in-engine as audio "sky boxes," soundfields can be rotated in relation to listener and source orientations.

  • Native soundfields significantly improve spatial depth through ambient sound, regardless of the user's speaker configuration.

  • Since soundfields can be captured from field recordings using specialized microphones, rendering these sound fields significantly increases environmental realism.

New: LiDAR Point Clouds

Bring the real world into your real-time visualizations more easily than ever, with Unreal Engine's built-in support for laser-scanned point clouds.

image alt text

image alt text

We've taken the LiDAR Point Clouds Plugin from the Marketplace, made major improvements to its performance and scalability, added new settings and features, and made it available directly in the Plugins window of the Unreal Editor.


  • Supports several major point cloud formats, including ASCII (.txt, .xyz, .pts) and .las files.

  • Import in the Editor by dropping your file onto the Content Browser, or at runtime using the Blueprint API.

  • Asynchronous import avoids locking the engine while loading the content.


  • Point clouds can cast and receive dynamic shadows — useful for sun and lighting studies.

  • Supports very large data sets, with on-demand streaming of data from files and GPU streaming. A dynamic Level of Detail system keeps performance high, while preserving visual results by prioritizing points in the center of the viewport.

  • Render data using simple points or custom Materials.

  • Multiple coloration techniques (RGB, Intensity, Elevation, Classification, and so on).

  • Extensive color adjustments.

  • Accentuate shapes with an Eye-Dome Lighting technique provided by the included post-process Material.


  • Hide, delete, merge, and extract individual points in the Editor Viewport.

  • Create a collision mesh from the point data.

  • Use the Blueprint API to build new clouds and add points, either in the Editor or at runtime.

New: HoloLens 2 Improvements

HoloLens 2 support in Unreal Engine receives a host of improvements to make applications targeting the augmented reality platform more efficient to develop and more engaging and immersive for users.

image alt text

Image courtesy of Microsoft

  • Unreal now supports App Remoting from a desktop app without Unreal Editor running.

  • We also added OpenXR support (Experimental) displaying pixels on HL2, late stage reprojection, enabled mixed reality capture from a 3rd person camera view, and eliminated render target copies for the frame, depth, and 3rd camera render buffers, which should reduce frame rendering overhead by up to 2 ms/frame.

Azure Spatial Anchors (Beta)

Unreal Engine now includes support for Azure Spatial Anchors for the Hololens 2 to enable holograms to persist in real-world space between sessions.

Mixed Reality UX Tools

  • Unreal now supports the Mixed Reality UX Tools plugin for Unreal, which provides mixed reality developers with a set of UX tools (button, manipulator, near + far interaction, follow behavior) to accelerate development, via an open source plugin on GitHub

  • Unreal also supports simulated hands in the UE4 play-in-editor viewport, which enables developers to use simulated hands to test out mixed reality apps without needing to deploy an app to emulator or device (requires the Mixed Reality UX Tools plugin to provide the hand mesh)

New: Ray Tracing Updates and Ready for Production

With this release, we're excited to announce that Unreal Engine's ray tracing features are now ready for production! Development has continued over the past several releases to get us to this state, and we'll continue to add new features and improve existing ones while maintaining stability and performance.

image alt text

Top left: Fortnite | Epic Games; Top Right: Senua's Saga: Hellblade II | Ninja Theory; Bottom Left: A5 Cabriolet model courtesy of Audi, HDR courtesy of HDRI Haven; Bottom Right: Archviz Interior Rendering sample | Epic Games

This release sees the following additions and improvements:

  • Added support for Niagara Mesh Emitters on the CPU and GPU.

  • Added support for the new Anisotropic shading model.

  • Significant improvements to the quality of our Clear Coat shading model when used with ray tracing features.

  • Added Clear Coat BRDF material support to the Path Tracer for generating ground truth comparisons.

  • Added support for light transmission for Subsurface Profile Materials.

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

New: Navigation Improvements (Beta)

We have made several improvements to working with navmeshes in Unreal Engine 4.25, with an emphasis on improved flexibility and optimization.

Offline NavMesh Builds

You can add -BuildNavigationData to the ResavePackages commandlet to rebuild navmeshes offline. This enables developers to more easily handle navmesh building in a custom build pipeline.

CostLimit Parameters for FindPath Queries

The FPathFindingQueryData structure now features a CostLimit variable. CostLimit places a limit on the collective cost of nodes that can be added to the open list during navigation, providing a means for an early exit from the pathfinding process, especially when handling long paths.

CostLimit has a value of FLT_MAX by default, but you can define a limit manually in FPathFindingQueryData or compute a limit using ComputeCostLimitFromHeuristic.

Fill Collision Underneath for Navmesh

UStaticMeshComponent now has a property called bFillCollisionUnderneathForNavmesh. When this property is set, it will emulate filling the space underneath the static mesh with collision, and navmeshes will not be generated underneath the surface of the object, provided that the object is inside a NavMesh Bounds Volume. This offers a means for optimizing levels with multiple layers of collision by excluding areas where navmesh generation is not desirable.

Time Sliced Navmesh Regeneration with Recast Navmesh Generator

Realtime navmesh regeneration can have a very high processing cost, often leading to long server spikes in networked games. Time sliced navmesh regeneration distributes the process of regenerating nav mesh tiles over a desired period of time, greatly alleviating the potential for processing spikes with non-async navmesh generation.

New: Animation Timeline Refactor (Beta)

image alt text

Asset editors for animation assets now use a Sequencer-like timeline that provides a more consistent look and feel when dealing with animation data. Editing of Animation Montage sections is now done in a dedicated tab with breadcrumb trails and dropdown menus. Additionally, Animation Curves now use a fully-featured Sequencer-like Curve Editor.

New: Animation Compression Improvements (Beta)

The Animation Compression system has been overhauled in order to be more flexible and increase productivity. Plugins can now specify new Animation Compression schemes and compression data structures. Animation Sequences now reference Compression Settings Assets, which contain one or more codecs to apply to the Animation Sequence, replacing the earlier concept of hardcoded "Automatic Compression." Animation compression is now asynchronous and performed as a non-blocking operation inside Unreal Editor so you can continue to work while the compression process runs.

New: Control Rig Improvements (Experimental)

image alt text

Control Rigs have been optimized to be up to 20% faster and use up to 75% less memory! In addition, the overall user experience has been improved with the addition of these features:

  • Visual Debugging and Direct Manipulation for values

  • The hierarchy now supports trees of bones, spaces and controls where controls represent the 3D user interface to the rig.

  • We improved flexibility in user interface design and added full coverage for scripting in Python to automate workflow tasks as well as extended support for Control Rig in Sequence.

New: In-Editor Animation with Control Rig (Experimental)

Using Control Rig, you can animate rigged characters in the Level Editor, and then export assets as animation sequences to use in-game. You can create, save, and visualize the animation all within Unreal Editor. Creating these animation assets directly in Engine also eliminates the need for external, third-party programs.

image alt text

New: Soundfield and Endpoint Submixes (Beta)

Soundfield and Endpoint Submixes (Beta) act to reduce development time when implementing any spatial audio format in Unreal Engine, and provide better control on spatial localization for immersive gameplay.

New: Default Submix Assetization (Beta)

Default submixes can now be defined in audio settings and are treated like any other submix asset, providing faster iteration time. Until now, default sound submixes (master, Ambisonics, reverb, EQ, and reverb plugin submixes) have been hardcoded in UE4, meaning the user's ability to add effects to these submixes has been limited.

New: Master/Sidechain Compression (Beta)

Master/Sidechain Compression (Beta) is an improved method for ducking ambient sounds when the listener's focus needs to be heightened for specific sounds. For example, when an enemy approaches, the sound of their footsteps isn't masked by a louder but more distant grenade explosion. It provides more control for sound designers over dynamic range in sound mixes, and it takes into account the actual audio characteristics.

New: Convert to Blueprint with Child Actors

You can now convert multiple Actors to a single Blueprint Asset with Child Actors using the Convert to Blueprint action in the Level Editor. The new Child Actors option enables you to create a single Blueprint Asset containing a master Actor of any class with copies of all selected Actors (and any modified property values) attached to it by Child Actor Components. Dropping this Blueprint Asset into a level spawns all of the selected Actors as a group.

New: UObject Property Optimizations

  • This is an API update, and the refactor should go unnoticed by end-users who do not work with the source code.

  • Plugin developers should read the UProperty minor release notes.

UProperty has been refactored to be FProperty, meaning properties marked with the UPROPERTY macro no longer carry the overhead of being a UObject. This refactor has a few positive impacts:

  • Loading performance, especially when loading a large number Blueprints

  • Garbage collection performance, especially when a project has a large number of Blueprints

  • Memory savings, tests in Fortnite show a memory savings of over 30 megabytes.

  • Performance improvements include:

    • UObject iteration (there are fewer objects to check)

    • FProperty casts are three times as fast as UObject casts.

    • FProperty iteration is almost twice as fast as UProperty iteration.

New: Visual Dataprep Improvements (Beta)

We've made the Visual Dataprep system both more approachable for beginners and more flexible for power users.

The graph editor now has a distinct look and feel that better reflects its execution and data flows:

image alt text

Instead of a Blueprint-style node graph connected by wires, it emphasizes the linear sequence of actions. Clearer visual cues help users add new steps to the actions, and colors help differentiate filter blocks from operator blocks.

In addition:

  • We've exposed the most common Dataprep actions to Blueprint and Python. Your custom editor scripts can drive imports through the Visual Dataprep system, and even set up new dataprep graphs with actions, filters, and operators.

  • We've added some new Select By blocks to filter objects by Layer, by vertex count, or by triangle count.

  • Several new Operator blocks offer additional options for setting up your scene and your Assets, such as the ability to add random offsets to the 3D positions of your Actors, flip the facing directions of triangles in your Static Meshes, replace Asset references, and more.

For more information, see Visual Dataprep.

New: Datasmith Support for PLM XML

Large-scale CAD projects rely on Siemens PLM XML as a standard for rich interoperability between specialized 3D applications — now we've added real-time visualization in Unreal Engine to its growing list of uses.

The Datasmith CAD Importer imports PLM XML files, offering all the features it offers for other data formats. The import process automatically imports geometry from referenced files, preserving scene hierarchy and placement, and offering non-destructive reimport that preserves changes you make in Unreal. It converts PLM XML User Data to Datasmith Metadata, and even creates a Variant for each PLM XML Product View that you can use with the Variant Manager.

For more about the basics of using Datasmith, and what you can expect from the import process, see Unreal Datasmith.

New: Datasmith Interop Improvements

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


  • You can now take better control over the triangular meshes used in Unreal to render parametric surfaces in your Rhino file. Whenever you import a scene from a Rhino file, you can now choose between two different tessellation strategies for the parametric surfaces in the file:

    • You can have Datasmith tessellate all parametric surfaces for you, using the tessellation settings you provide in the Import Options dialog. (This is the only option in 4.24.)

    • You can reuse triangular meshes that were previously created by Rhino and are stored in your Rhino scene. If you are happy with the tessellation you have achieved in the Rhino renderer, this strategy allows you to preserve that same tessellation for your real-time visualizations in Unreal Engine.

  • Datasmith now imports Rhino points as empty Actors. This preserves their placement in scene hierarchies, and allows you to put placeholders and points of interest in the Rhino scene that carry through into your real-time visualization.

  • Datasmith now imports technical metadata about Rhino objects as Tags on the Actors.

For detailed information, see Using Datasmith with Rhino.


You can now integrate Datasmith exports into Dynamo scripts, to take more control over automating your processes for producing real-time visualizations of your designs. The Datasmith Export Plugin for Revit now includes a plugin for Dynamo: DatasmithDynamoNode.dll. This plugin contains a new DatasmithDynamoNode.Export3DViewsToDatasmith node, which you can use to batch export multiple 3D views from Revit to .udatasmith files.

You can specify the Revit document you want to export, the path of the generated .udatasmith file, the IDs of the 3D views you want to export, and the desired level of tessellation for triangular meshes generated by Revit.

We've also made many other fixes and improvements:

  • Entities that have a starting point in Revit, such as Walls, Railings, Pipes, and Wiring, now have their pivot placed at the correct position in Unreal.

  • You can now export Revit family files (.rfa) to .udatasmith files, in addition to Revit project files (.rvt).

  • Imported Textures are now correctly labeled in the Content Browser to correspond to their Revit sources. Similarly, the Static Mesh Components for objects such as curtain wall panels also show improved naming.

  • PBR Material classes from Revit should now import with their visual properties intact, rather than as uniform grey.

  • Actors in Unreal now store Tags to indicate whether the corresponding object in Revit has been flipped or mirrored. This can help you automate dataprep operations that need to apply special treatment to those flipped or mirrored objects.

For detailed information, see Using Datasmith with Revit.

New: Variant Manager Improvements

The Variant Manager helps you set up multiple different variations of your Level in advance and swap between these variations at runtime. In this release, we've made several ease-of-use improvements to the Variant Manager UI that help you set up your Variants the way you want them:

image alt text

  • You can now set external image files as thumbnails for Variants.

  • You can swap out any bound Actor in a Variant and replace it with a different Actor instead.

  • You can reorder the captured properties of any Actor by dragging them to new positions. This helps you keep the most critical properties easily visible.

  • If you capture color properties, you can now set their values more easily using a color picker.

  • You can now capture more camera settings from Cine Camera Actors.

  • When you set up a Variant to call a Blueprint function on activation, the function now receives additional arguments for context: the Level Variant Set Asset, the Variant being activated, and the Variant Set that owns the activated Variant. This context helps you set up complex responses. For example, you might want to activate other Variants that you consider dependencies.

For details on the Variant Manager, see Working with Scene Variants.

New: Live USD Improvements (Beta)

We've enriched the Unreal Editor's support for the Universal Scene Description (USD) interchange format from Pixar, making it easier to construct an asset management pipeline from your choice of scene construction and animation tools. In this release:

  • Bringing USD data into the live USD Stage is now faster and more responsive, with multi-threaded import and better rendering performance.

  • Each USD Layer is now brought into its own Sequencer track, allowing you to work with each Layer's objects and animations separately.

  • The importer brings the USD Purpose of your scene objects into Unreal. In the Editor, you can switch the visual representation of your scene between the different purposes supported by USD — default, render, proxy, and guide.

  • The importer now supports USD Point Instancers, setting up your Unreal Engine scene automatically with a Static Mesh instance to match each object created by the Point Instancer.

  • You can assign Unreal Materials to your USD Primitives.

  • The USD Python API is now exposed in the Unreal Editor. You can use it to control your USD scene from within your Python editor scripts.

  • If you use a custom USD schema, you can now hook up custom C++ callback functions to handle your own data structures.

For an overview and usage instructions, see Universal Scene Description in UE4.

New: Editor Performance Improvements

We continue to make significant performance gains in every new release, especially when dealing with very large scenes. Performance improvements added in Unreal Engine 4.25 include:

  • Efficiency of shader compilation through Incredibuild has been improved by 90% in some cases, leading to a 5x decrease in distributed shader compilation time with our internal setup.

  • Proxy mesh creation process is now better at scaling with the number of CPUs and can easily result in processing time reduction of more than 3x for complex setup.

  • Bulk convex hull computation on big scenes can be more than 100x faster than before and takes 4x less memory in some scenarios, taking a multi-hour long process to a couple minutes.

  • Material baking improvements have made it up to 14x faster and 3x less memory hungry than before, performance improvements may vary depending on which GPU backend is used.

  • Improvements in how Datasmith handle data reimports will result in a healthy decrease of both reimport times and memory usage.

  • A rework of how Datasmith CAD scenes are saved will make new CAD scenes save and load take seconds instead of minutes.

  • Datasmith VRED and DeltaGen FBX import workflow will now feel a lot snappier on huge FBX files.

  • Distance fields are now computed a lot more efficiently on many core CPUs leading to 5x reduction in processing time and better core utilization.

  • Exporting video production to PNG files is faster than ever and will make use of new instruction sets capabilities like AVX-2 when detected on your computer. It's now possible to export a 4K video to loose PNG files in real-time on 16 Core CPUs.

New: Disaster Recovery Improvements

The latest version of Disaster Recovery uses less memory, handles bigger assets (larger than 2 GB), and is faster. We added a new recovery hub (Windows > Developer Tools > Recovery Hub) to delete existing recovery sessions. Because recovery sessions can be quite large, we added a new setting to enable users to select the location for storing recovery sessions.

New: Editor Paint Mode Improvements (Beta)

The Mesh Painting system has been overhauled to provide a smoother workflow and enable more productivity and extensibility for advanced teams.The toolset functionality is maintained from the previous version of Mesh Paint, with some additional benefits:

  • It has a cleaner UI.

  • There is no reliance on Physics traces.

  • (Advanced users) You can extend vertex painting so you can paint other vertex data.

Mode selection is now in the Toolbar, rather than being tabs on a panel. When you enter Mesh Paint mode, the selection tool is now separate from the painting tool.

image alt text

These features are not supported in VR mode.

New: In-Viewport Modeling and Sculpting Improvements (Experimental)

We continue to make major improvements in our experimental set of tools for working with geometry directly within the Unreal Editor Viewport, progressing with every release toward the goal of achieving complete, end-to-end workflows for geometry modeling and adaptive mesh sculpting.

In this release, we've also introduced several mesh repair tools aimed at correcting minor issues with imported Assets, especially those that come from CAD applications. These offer the ability to fill holes, to move pivot points relative to the geometry, and to generate and adjust UV mappings interactively.

New: Default Rendering Feature Levels for Mobile

OpenGL ES3.1 and Metal 2.0 are now the default feature levels for Android and iOS projects, respectively. Vulkan, ES3.1, and Metal 2.0 all have similar features, enabling us to establish better feature parity between mobile platforms. They will also enable us to take advantage of advancing mobile technology to establish better feature parity with desktop/console.

OpenGL ES3.1 and Metal 2.0 will be enabled by default on new Android and iOS projects, and you can set them as your preview feature level in the Unreal Editor. Projects migrating from previous versions of Unreal will be upgraded to these feature levels by default.

The OpenGL ES2 and Metal 1.2 rendering feature levels have been removed from Unreal Engine.

New: Android NDK 21b Update

We are updating Unreal Engine to Android NDK 21b in 4.25. This provides numerous Android toolchain optimizations and bug fixes, and Android libraries using recent NDK versions will now be compatible with Unreal Engine.

To facilitate this change, Unreal Engine now requires a new setup process for Android projects. Instead of using Codeworks for Android, you will now need to download and install Android Studio 3.5.3 from the Android developer archive. Once you have completed installation, locate the SetupAndroid script in your Engine/Extras/Android folder and run it to complete the process. This script is available in formats for Windows, MacOS, and Linux.

If you have installed CodeWorks for a previous version of Unreal Engine, we recommend that you uninstall it before using the SetupAndroid script. You can do this by running the CodeWorks uninstaller, then deleting the directory where CodeWorks was installed.

If you need to support older versions of NDK for previous installations of Unreal Engine, you should install NDK 14b using Android Studio and manually target the NDK path accordingly in your Android project settings. For more information on how to support this, refer to our blog post concerning the NDK 21 update. Note that this is only necessary to do this if you are simultaneously supporting 4.25 and older installations of Unreal Engine. If you are not migrating to 4.25, you can continue to use Codeworks installations safely.

While the 4.25 preview versions used NDK 21, the 4.25 release now uses NDK 21b. If you have already set up NDK 21, you can download the required components by running SetupAndroid again once you update to 4.25.0.

New: iOS Launch Storyboards

Unreal Engine now uses iOS Launch Storyboards for launch screens on iOS. Launch storyboards support animation and are also able to dynamically scale content to the user's screen size, providing a more polished launch experience.

Launch Storyboard Options

To use launch storyboards, create a LaunchScreen.storyboard file in XCode and place it in your project's Engine/Build/IOS/Resources/Interface/ folder. After that, enable the Storyboard option in the Project Settings > Platforms > iOS. Any static launch screens you have created will no longer be packaged on iOS builds. Instead, your storyboard will act as your launch screen.

For the convenience of projects requiring a placeholder, the engine will automatically package a default storyboard for games that do not have Use Custom Storyboard enabled. You can change the static launch image for this storyboard by placing it in the Launch Screen Image field. This should be a PNG with no alpha channel, and for maximum compatibility with different aspect ratios and layouts, it should have square dimensions.

As of iOS 13, Apple now requires developers to use launch storyboards and will no longer accept submissions with static launch screens. For more information, refer to Apple's documentation on launch screens and storyboards.

New: Android App Bundles

Android App Bundles are a new upload format for the Google Play Store. Instead of building, signing, and managing separate APKs for each target device specification, users can upload a single AAB file. Google Play's dynamic delivery system then uses that AAB to generate a final APK optimized for the end user's device configuration automatically. This greatly streamlines the process of preparing builds for the Google Play Store. Additionally, the final APKs distributed through app bundle builds can have a maximum size of 150 Mb instead of the previous limit of 100 Mb. Note that projects not using app bundles will still use the 100 Mb limit.

To use app bundles, enable Generate bundle (AAB) in your Project Settings under Platforms > Android > App Bundles. When you package your project for Android, it will package it as an AAB instead of an APK. Unreal Engine will also automatically generate a universal .APK for testing purposes alongside your app bundle build.

App Bundles do not currently support the use of Android expansion files (.OBBs).

New: Swappy Frame Pacer for Android (Beta)

Unreal Engine now integrates the Swappy frame pacing solution from Google's Android Game SDK to improve synchronization between Unreal Engine games' rendering process and Android's display pipeline. When enabled, this provides more stable frame rates and improved latency on touchscreen input for Android games.

To enable Swappy for your Android projects, add the config variable a.UseSwappyForFramePacing=1 to the device profiles you want to use it in, and use r.setframepace [value] to set the refresh rate of frame pacing to the desired frame rate.

New: Virtual Texturing on Mobile (Experimental)

Virtual Texturing is now available as an experimental feature on mobile devices. You may utilize virtual texturing by following the same steps as you would for a desktop project. For more information, refer to the Virtual Texturing documentation.

Note that runtime virtual textures do not currently have texture compression, which means that they will use roughly 4x the expected amount of memory. Additionally, to ensure that your project has the necessary resources to utilize virtual texturing, we currently recommend targeting ES3.1 or Vulkan-compatible Android devices and iPhone 8 or newer.

New: Eye Adaptation on Mobile (Beta)

Eye adaptation,or auto-exposure,is now available for mobile projects in addition to desktop and console platforms. This feature enables developers to re-create the effect of the human eye adapting to changes in brightness.

To use eye adaptation, you must enable MobileHDR to activate post-processing on mobile. You can do this in your Project Settings under Engine > Rendering > Mobile.

You must also set both the r.EyeAdaptationQuality and r.Mobile.EyeAdaptation console variables to a value higher than 0 to enable eye adaptation itself. The r.EyeAdaptationQuality variable is configured through the sg.PostProcessQuality scalability setting, which can be found under [PostProcessQuality] section in BaseScalability.ini. The r.Mobile.EyeAdaptation variable is set directly in the device profiles found in BaseDeviceProfiles.ini. It is disabled by default in the Android_Low and Android_Mid device profiles, as well as for some low-end iOS devices.

Though eye adaptation should not have a significant performance cost, if for any reason you need to disable it, you may set r.Mobile.EyeAdaptation to 0.

New: Niagara Simulation and Iteration Stages (Experimental)

Simulation Stages enable a set of modules to evaluate over all particles prior to the next stage's modules. This enables simulations that require you to update all particles before the next algorithmic step is started, such as constraint solving, height field water simulation, and position-based dynamics.

Iteration Stages are a new concept where the dispatch count is driven by a particular data interface rather than the particle count. There are also several Data Interfaces that utilize this concept, such as the Grid2D Collection which modifies 2D grid data for simulations like 2D fluids.

Simulation Stages and Iteration Stages are experimental and currently limited to emitters using GPU simulation.

New: Eye Adaptation (Auto Exposure) Improvements

Eye Adaptation (also called Auto Exposure) sees significant changes this release by unifying existing parameters and settings to make it much more user-friendly.

image alt text

The following improvements and features have been added:

  • Unified metering modes for Histogram and Basic to converge to a middle grey point rather than have separate convergence points on the histogram.

  • New Exposure Metering Mask using a texture mask to control pixel influence on the screen.

  • Added a toggle to Adjust Physical Camera Exposure when using the Manual metering mode to explicitly use the Camera Post Processing settings when working with exposure.

  • Improved HDR (Eye Adaptation) visualization mode to include explicit post process settings information and histogram information.

    • Also, there is a new debug visualization mode to identify pixels that are very bright and dark so that they are excluded from the HDR calculation.

  • Improved the Exposure Compensation Curve with the HDR (Eye Adaptation) visualization to be clear where the X and Y axis values of the curve originate.

  • Made changes to the perception of exposure speed so that moving up or down the curve happens at the same speed.

These changes do break backwards compatibility with any projects using a previous version of Unreal Engine. While there is an upgrade path in place, we cannot guarantee that the look of your project will be maintained. See our tech blog "How Epic Games is handling auto exposure in 4.25" with detailed information about these changes and how they may affect your projects.

For additional information, see Eye Adaptation (Auto Exposure).

New: Hair and Fur Rendering Updates (Beta)

Work on our hair rendering and simulations features continue as it moves into Beta feature development. For this release, we have a number of improvements to workflow, performance, lighting, and more.

image alt text

Workflow Improvements:

  • Grooms are now transferable between meshes so long as the mesh shares the same UV space.

  • There are additional Groom component options for controlling the Root and Tip scale, and the Hair Clip length.

  • Niagara simulations parameters are now editable directly from the Groom component.

    • There are also some curve-based properties available to control Niagara parameters values along the strand.

  • Asset validation and time estimates are now provided when importing complex groom assets.

  • Better handling of Physics Asset interpolation for better collision detection against the body.

  • Added an alternative interpolation method using a radial basis function instead of the triangles rigid transform.

Performance improvements:

  • Hair simulation and rendering sees an overall increased stability and speed, including usage with ray tracing features.

  • We now use a continuous level of detail (LOD) system that decimates a groom as its screen coverage is reduced.

  • Cluster culling is used to break down the groom into smaller clusters which are occlusion culled against the hierarchical depth buffer.

  • Groom Assets now supports derived data cache (DDC), speeding up level load time.

Lighting improvements:

  • The hair system allows for more accurate lighting without a deep opacity map by using a sparse voxelization structure that is GPU-driven. It also allows for thinner voxelization.

  • Lighting channels are now supported for Groom components.

New: Sky Atmosphere Improvements

The Sky Atmosphere component continues development by adding powerful features for creating a large physically based atmosphere.

Per-pixel transmittance (4.25)

No per-pixel transmittance (4.24)

This release sees the following improvements:

  • Light transmittance can now be evaluated per pixel, ensuring correct luminance on a planet surface viewed from space.

  • The planetary atmosphere can now cast a shadow on nearby planetary objects, such as nearby moons.

  • The atmosphere can now be freely moved within the Level.

For additional information, see Sky Atmosphere.

New: Material Layer Improvements (Beta)

Material Layers have been updated with the ability for Blueprint functions to modify Material Layer parameters at runtime and improved behavior when propagating layer changes from a base material to derived ones.

For additional information, see Material Layers.

New: Memory Shader Load Time Refactor

Using our new reflection system, shader related resources have been converted into flat memory images allowing us to deserialize directly from disk to memory with no CPU involvement needed. This has potential to significantly increase load time performance across the engine by letting the reflection system handle differences in memory layout between compilers in a robust fashion.

New: Adding Spatialized Master Audio to Sequencer

You can now add Spatialized Master Audio to a Sequence by attaching audio sections to individual track components at specified times. Audio icons are drawn at the attachment points in the viewport to help visualize the spatialization.

New: Camera Cut Blending

The Camera Cut track now supports blending. This allows you to easily blend in and out of a cinematic or blend between different cinematic cuts. To enable blending, right click on the Camera Cut track node and check Can Blend.

New: Take Recorder Enhancements

There are several new enhancements to streamline using Take Recorder and improving the overall user experience.

Specifying the Frame Rate

You can now select the frame rate you wish to record for a particular sequence. Supported frame rates range from 12 fps (animation) to 240 fps. The default frame rate is based on the timecode provider's frame rate.

Recorded data is now shifted to match the timecode while recording

The recorded sequence now shows the timecode when keyframe data was captured. Live link sources that contain timecode per sample are mapped directly to the sequence with those timecodes. For layered recording, if you record from a previous take, the existing tracks will be shifted to the new timecode where recording starts. This allows you to, for example, record a new camera move in the context of a previous recording. Additionally, save times have improved by five times for all float channels by directly serializing the data. This is particularly important for recording long takes with multiple actors.

New: Template Sequences (Beta)

Template Sequences allow you to easily reuse tracks on multiple objects. They also reduce asset duplication and save time overall. By using a single root binding, similar to Skeletal Animations, the Template Sequence can be added to another Sequence's Track and manipulated like any other animation.

New: HoloLens 2 and the Collab Viewer Template

The Collab Viewer Template now supports viewing your design content in the HoloLens 2.

New: Product Configurator Template

Get a head start on creating your next product configurator by building it in our new template. This template contains sample content that shows the Variant Manager set up with multiple scene configurations, along with a reusable set of UMG widgets that automatically builds a UI to expose those configurations for users to control at runtime.

You'll find the Product Configurator template in the Automotive, Product Design, and Manufacturing category.

New: In-Camera VFX Updates (Beta)

Since our In-Camera VFX tools were first introduced, we've worked with numerous partners to bring the Unreal Engine into real-world film and TV development projects, filming live action scenes in front of LED screens. We've taken all that experience and turned it into several improvements to the existing workflows and tools:

  • Support for multiple cameras shooting against the same screen at the same time, with multiple Unreal cameras rendering their frustums to different sections of the LED wall.

  • You can control the resolution of the areas both inside and outside of the camera frustum. This can help improve performance by lowering the resolution of the LED wall in the areas outside of the view of the physical camera, without losing any rendering quality in the area within the camera view.

  • Greenscreen tracking markers are now easier to set up, and much more stable to work with in post-production: they no longer swim or move on screen.

  • It's now easier to set up a three-layer composition with a virtual foreground element composited on top of a real-world actor or set. You can also control more easily what Layers in Unreal Engine should be hidden from the LED wall.

  • You can take finer artistic control over making the virtual set match the real world set by placing new color correction volumes into the Level, which apply a localized color correction to the scene.

  • You can rotate the rendered output generated by nDisplay, increasing your options for constructing your LED wall.

New: nDisplay Improvements

The nDisplay multi-display rendering technology is a key part of the In-Camera VFX system, supporting many of the improvements listed above. However, we've also made other improvements that should benefit all nDisplay users:

  • You can now assign each nDisplay cluster node to render using a specific GPU.

  • You can opt to have nDisplay use frame synchronization services provided by NVIDIA hardware to synchronize the presentation of each successive frame across the network of cluster nodes.

  • We've made it easier to set up nDisplay to render to curved surfaces. Instead of using PFM or MPCDI to configure how nDisplay needs to warp the final output in order to project it onto curved surfaces, we've implemented a new projection policy that warps the rendered output automatically according to a mesh that you specify in the nDisplay Blueprint API.

New: Motion Graphics Improvements

We've made it easier to create compelling motion graphics directly in the Unreal Editor without having to switch out to external design tools. You can get on-screen graphics done faster, and design them right in the context of the virtual world.

  • 3D Text Animation (Beta): With the new Text 3D Character Transform Component, you can now use Sequencer to animate the translation, scaling, and rotation of your 3D Text objects character by character, instead of animating the entire line of text as a single unit.

  • Charts and Graphs (Experimental): You can now set up visualizations for statistical data directly in Unreal. The new Data Charts Plugin offers pre-made Blueprints that extract statistics from Data Table Assets and visualize the numbers as bar charts, pie charts, or graphs.

New: Tools for Broadcast and Live Events

This release includes several new features and improvements that make it easier to develop and work with virtual sets, compositing video feeds, and augmented reality (AR) in the context of live broadcasts.

The following improvements and features have been added:

  • Composite Plates are a Camera Blueprint that lets you project the video feed onto a plane or onto a set of Static Mesh objects in the scene. It enables broadcasters to place their talent virtually into the 3D scene at any specified depth they like, removing the need to choose whether objects are tagged as foreground or background. You can also use this technique to simulate a full environment by filming a real-world location from a given angle, then projecting that image or video feed onto scene geometry. Both of these techniques work because the composite plates are projected onto the geometry in 3D space from the camera's perspective.

  • Improvements to Green Screen Keyer that improve the quality of the existing chroma keying system.

New: DMX Support (Experimental)

This release introduces Experimental support for connecting Unreal Engine to external controllers and devices that use the DMX protocol. With bi-directional communication and interaction over ArtNet and aSCN networks, you can control stage shows and lighting fixtures from Unreal, and pre-visualize the show in a virtual environment during the design phase.

New: Magic Leap Improvements

For developers targeting Magic Leap, we added support for setting up shared world experiences using new GameMode, PlayerController, and GameState classes. On the API side, we added more utility APIs for content persistence and API integrations for Connections and camera intrinsics. We also revamped the AugmentedReality interface to make migration of handheld AR projects to Magic Leap easier and improved performance and stability of Zero Iteration. To aid in debugging and optimization, we added Visual Studio Debugger support for Blueprint-only projects and provided support to change thread affinities via config vars.

New: Dynamic Geometry Support for SteamAudio

You can now take advantage of Steam Audio's dynamic geometry support in Unreal. Individual static mesh components can be moved, rotated, or scaled independently and Steam Audio will update the acoustics appropriately. Find out more about this new feature in the SteamAudio plugin and a video demo here.

New: Platform SDK Upgrades

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

image alt text

  • Windows

    • Recommended:

      • Visual Studio 2019 v16.5

    • Minimum:

      • Visual Studio 2017 v15.6

    • Windows SDK 10.0.18362

    • NET 4.6.2 Targeting Pack

  • IDE Version the Build farm compiles against

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

      • Minimum Supported versions

        • Visual Studio 2017 v15.6

      • Requires NET 4.6.2 Targeting Pack

    • Xcode - Xcode 11.1

  • Android

    • Android Studio 3.5.3

    • Android NDK r21

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

  • ARCore

    • 1.7

  • ARKit

    • 3.0

  • Linux "SDK" (cross-toolchain)

  • Oculus

    • 1.44

    • API Level 23

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.44

  • Lumin

    • 0.23

  • Steam

    • 1.46

  • SteamVR

    • 1.5.17

  • Switch

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

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • PS4

    • Orbis SDK 7.008.001

    • System Software 7.008.021

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • XboxOne

    • XDK: July 2018 QFE-9

    • Firmware Version: Recovery February 10.0.18363.9135

    • Supported IDE: Visual Studio 2017

  • macOS

    • SDK 10.15

  • iOS

    • SDK 13, 12, and 11

  • tvOS

    • SDK 13, 12, and 11

Major Upgrade Notes

Cooked Data Compatibility

Unreal Engine 4.25 includes some major serialization changes to improve load times. A side effect of these changes is that cooked data is no longer compatible between Win32 and Win64 executables. Projects will need to cook two sets of data to support both build types. However, 64bit Windows will still run Win32 executables so shipping only a Win32 version could be an option for some projects that wish to support 32 bit Windows.

Load Time Improvements

Depending on the platform, users may experience a 10-20% load time improvement because of UObject optimizations, general rendering and physics optimizations, and low overhead serialization for materials and shaders.

Win32 Support

We are officially deprecating our Win32 support. It will be included in Unreal Engine 4.25 and Unreal Engine 4.26, but support for 32-bit Windows operating systems will be removed in a future release.

GitHub Release Branch

If you use GitHub to access the source code for Unreal Engine, you may see two separate branches: 4.25 and 4.25-Plus.

We recommend that everyone use the 4.25 branch unless you have been specifically advised by Epic to use 4.25-Plus for your title.


  • The OpenGL ES2 and Metal 1.2 rendering feature levels have been removed.


  • Motion Controller keys were deprecated in 4.24 and are now fully removed in 4.25.

Release Notes


  • Bug Fix: UAIDataProvider_QueryParams: Fixed data binding for Boolean values.

  • New: UEnvQueryTest_GameplayTags.SetTagQueryToMatch was added to support the EQS test class in native code.

  • New: Added a Project option to tell the AI Perception System to forget Actors with perception past the Max Age duration.

  • New: AIPerceptionComponent: Added functionality to allow clearing of perception data by making ForgetAll callable from Blueprint.

  • New: UEnvQueryInstanceBlueprintWrapper.OnQueryFinishedEvent can now be accessed from native code by calling the GetOnQueryFinishedEvent function.

  • New: SpawnAIFromClassnow allows callers to specify the Owner of the spawned AI agent.

Behavior Tree

  • Bug Fix: Behavior Tree restarts that were caused by execution requests queued for branches getting deactivated while applying search data can now be prevented.

  • New: Blueprint-implemented Behavior Tree nodes can now specify a custom name that will appear on the nodes in the Behavior Tree Editor.

  • New: Added functionality to allow custom BrainComponents to run, as well as allow BrainComponents to be set up as components on AIController and run automatically when Actor is possessed by the AIController.

  • New: Added functionality to support the use of UBlackboardKeySelectoroutside Behavior Tree Editor.

Debugging Tools

  • New: Navigation path debug drawing now uses NavTestRenderingComponent to draw arrowheads indicating the path direction.

  • New: Corrected minor typographic errors in Gameplay Debugger user interface.

  • New: While using Simulate in Editor, Actor filtering in UGameplayDebuggerLocalController now allows non-Pawn AActor selection.

  • New: Added new GameplayDebugger console commands:

    • EnableGDT(for legacy support)

    • gdt.Toggle

    • gdt.SelectPreviousRow

    • gdt.SelectNextRow

    • gdt.ToggleCategory

  • New: Verbose logging for start and stop queries were added to EnvQueryManager.

  • Bug Fix: UPathFollowingComponent::RequestMoveWithImmediateFinish and UPathFollowingComponent::AbortMove were made consistent in terms of handling given move requests' bStopMovementOnFinish value.

  • Bug Fix: Fixed how ARecastNavMesh.DefaultMaxSearchNodes gets applied to make it consistent.

  • Bug Fix: Fixed FNavAgentProperties::IsNavDataMatching to make it respect null-navigation-data properly.

  • Bug Fix: Fixed how NavigationSystem rebuilds Static and DynamicModifiersOnly NavData in Play in Editor and Game modes, if bAutoCreateNavigationDatais set to False.

  • Bug Fix: Fixed ARecastNavMesh::ReplaceAreaInTileBounds to properly apply the requested new area type.

  • Bug Fix: Fixed a navigation filter bug resulting in it not blocking null-area navigation links.

  • Bug Fix: Fixed navmesh polygons so they can connect diagonally across tile boundaries.

  • Bug Fix: Fixed a bug in NavigationSystem so that registration of CustomNavLink from a different world is now prevented while in Play in Editor. Multiple NavigationSystems may coexist (For example, Editor, Client Game, and Server Game worlds) so now any given NavigationSystem instance performs a single flush of the global pending queue to register the links associated with their outer World.

  • Bug Fix: Fixed a navmesh rasterization issue, where a wrong offset on the vertical axis caused some voxels to be rasterized outside of their source geometry. This also addresses a side effect where a NavModifier aligned with geometry would not mark the navmesh, even when taking cell height into account.

  • Bug Fix: Fixed Chaos convex mesh indices winding so that triangle normals point outward for nav collision.

  • Bug Fix: Fixed rasterization area merging when adding new spans. Navmesh now generates correctly on a slope.

  • Bug Fix: Fixed a NavigationTestingActor path reset issue when toggling bSearchStart.

  • Bug Fix: Fixed updateSlicedFindPath not behaving like findPath (missing check for DT_UNWALKABLE_POLY_COST).

  • New: Added support for a cost limit in Detour pathfinders and added a parameter in the navigation query, DetourNavMeshQuery.

  • New: Added a minimum CostLimit value to FPathFindingQuery::ComputeCostLimitFromHeuristic. Exposed the minimum CostLimit parameter in NavigationTestingActor.

  • New: Added an option to prevent navmesh generation under terrain.

  • New: Added LogNavigationDataBuild to output a basic build summary in the log.

  • New: Added an option to the ResavePackagesCommandlet to rebuild navigation data. This option will check out, save and check in dirty packages only.

  • New: Added a callable-in-editor function for copying endpoints from NavLinkProxy's simple links over to smart link.

  • New: NavMesh links debug drawing was streamlined to more easily distinguish active links from inactive ones.


  • Bug Fix: BeginPlay() is now called appropriately on Anim Instances linked to Anim Notifies.

  • Bug Fix: Curve compression now prevents curves from collapsing into a single value when using all constant keys.

  • Crash Fix: Control Rig nodes are no longer evaluated twice in Animation Tracing.

  • Crash Fix: Initialization of linked layer/graph nodes no longer crashes when the Anim Instance is re-used.

  • Crash Fix: Anim Instances using linked Anim Instances no longer crash on re-use.

  • Crash Fix: Calling undo after adding a slot in Anim Montage Editor no longer crashes.

  • New: Animation Notifies are now optionally propagated to and from linked Anim Instances with propagation options for each linked Anim Graph/Layer node. Grouped Layer nodes propagate as a whole; so, if any grouped Layer nodes propagate, all nodes in the group will propagate as well.

  • Crash Fix: Removed use of AllSortedComponentData in Animation Budget Allocator Debug HUD that was causing a crash.

  • Bug Fix: Added extern keyword to VirtualBonePrefix declaration to prevent it from ending up in every .cpp file.

  • Crash Fix: Remapping an additive animation no longer crashes.

  • Bug Fix: Deleting virtual bones no longer displays the "GetBoneMatrix(x) out of range of Spacebases" message.

  • Bug Fix: Linked instances are now cleaned up properly on unlink and reset, ensuring that Anim Notify states are fired off correctly and any playing Anim Montages are correctly terminated.

  • Bug Fix: Scrubbing an Animation in Sequencer no longer crashes.

  • Bug Fix: Fast-path is no longer incorrectly disabled for array properties.

  • Bug Fix: Const transform accessors in FAnimInstanceProxy are now correctly marked.

  • Bug Fix: Reloading Skeleton with unsaved virtual bone changes no longer causes an ensure.

  • Bug Fix: Stepping through a geometry cache now shows the frame corresponding to the time set in sequencer.

  • New: Animation compression is now exposed to plugins and uses Compression Assets in place of Compression Schemes.

  • New: Animation compression is now performed asynchronously when opening the Unreal Editor, similar to the way shaders are compiled.

  • New: Gameplay Abilities can now specify the Anim Instance on which to play a montage.

  • New: There is a new plugin to support reading Live Link Animation and Transform data inside of Control Rig.

  • New: There is a new Animation Blueprint event callback that is called when the Linked Animation Layers are initially initialized.

  • New: CSV Animation stats are updated and expanded.

  • New: Error messaging around the default curve compression asset has been improved.

  • New: Added ISPC optimization for Animation for Windows, Linux, Mac and Android platforms.

  • Bug Fix: Cooking of conformed-on-load interface graphs is now deterministic.

  • API Change: Anim Nodes now name their node properties without using the node GUID.

Animation Assets

  • Crash Fix: Calling undo after editing a curve no longer crashes.

  • Crash Fix: Deleting a Pose before base Pose no longer crashes.

  • Crash Fix: Removing a curve through an Animation Modifier no longer crashes.

  • Bug Fix: Loading cooked Animations in Unreal Editor no longer causes an ensure.

  • Bug Fix: Cooking with smart names on USkeletons is now deterministic.

  • Bug Fix: Montage Sections panel now scrolls when it gets too large.

  • Bug Fix: Right-click dragging to scroll on Anim Notify tracks now works correctly.

Animation Blueprints

  • Crash Fix: Doing a fast-path copy of FName values in FExposedValueHandler no longer crashes due to differing size of the type between compile and run time. Ensure that non-compatible types always skip the fast copy path.

  • Crash Fix: Moving or renaming an Anim Blueprint no longer crashes.

  • Bug Fix: Fix compilation crash after adding an animation Blueprint interface with duplicate names

  • Bug Fix: Implemented several fixes for the RandomPlayer animation BP Node:

    • Fixed a problem where we would advance twice during the update loop if we both exceeded the loop count and blending had finished, resulting in a possible double play of the same animation in shuffle mode.

    • Related to the double-advance problem, changed the shuffle generation so that it's done after popping the last shuffle value, to hint to it directly which value was the last one to be used so that the permutations are non-contiguous.

    • Ignore empty play entries and entries with zero play chances in random mode.

    • Ensure we play each sequence fully, instead of just the portion from blend stop to end. This eliminates the "popping" effect when transitioning between animations.

  • Bug Fix: Derived classes of FAnimNode_StateMachine no longer fail to compile in Animation Blueprints.

  • Bug Fix: Changing the Widget Mode on a bone in the Anim Blueprint Editor no longer causes an infinite loop.

  • Bug Fix: State machine recorded weights are now correctly reported.

  • Bug Fix: Split pins now work correctly in Animation State Machine states.

  • Bug Fix: The Control Rig Anim Node ticking no longer ticks the sub tree multiple times.

  • Bug Fix: Control Rig now initializes correctly from Sequencer.

  • Bug Fix: There are no longer duplicate Hide Unrelated nodes in the Animation Blueprint Editor.

  • New: Reroute nodes for Pose links now use a Pose icon.

  • New: ApplyMeshSpaceAdditive now has extended alpha support including support for boolean and curve controlled alphas with clamping.

  • New: Added Blend Space node debug widgets to display the current sample of the Blend Space when debugging.

  • API Change: The interpolating solver is available as a templated helper class, called TRBFInterpolator in RBF/RBFInterpolator.h. It can be used to smoothly interpolate any N-dimensional target value for any M-dimensional input values, assuming a suitable distance metric exists.

Animation Tools

  • Crash Fix: Deleting curve keys in Animation Curve Editor no longer causes a crash.

  • Crash Fix: Interacting with the Animation Insights transport controls when a session is tracing to an external application no longer crashes.

  • Crash Fix: Calling undo after adding an Anim Montage segment no longer crashes.

  • Bug Fix: PostUpdateAnimation is now called on linked instances if NeedsUpdate on the main instance returns false.

  • Bug Fix: Animation Curve Editor auto-zoom now works consistently.

  • Bug Fix: Renamed curves displaying now display the correct name when edited directly.

  • Bug Fix: Highlight of Loop button in Anim Editor is no longer triggered by Reverse button.

  • Bug Fix: Linked-instance asset players are no longer ticked twice when a post process graph is enabled.

  • Bug Fix: Undo/redo no longer closes Details panels for Anim Notifies

  • Bug Fix: Renaming curves in the Animation Timeline now marks the asset as dirty and can be undone/redone.

  • Bug Fix: Reverse playback of an Anim Montage now sets the play rate of the Anim Montage instance correctly.

  • Bug Fix: Sync marker selection has been improved. \

  • Bug Fix: Reported number of frames in the Montage Editor is now accurate.

  • Bug Fix: Anim Notifies can no longer be dragged outside of the notify area.

  • Bug Fix: Editing the section time of an Anim Montage no longer crashes.

  • Bug Fix: Anim Montage sections now refresh correctly when edited via the Details panel.

  • Bug Fix: Anim Sequence frames can now be added from the Curve Editor view.

  • Bug Fix: Anim timeline now allows access to times outside the Anim Sequence range.

  • Bug Fix:

    • Right-click dragging on an Anim Notify track to scroll no longer flickers.

    • DPI scaling is now correct when drag/dropping Anim Notifies.

  • New: Unreal Insights channel filtering plugin now has a "Trace Data Filtering" Tab which allows for setting individual Trace Channel states and allows for specifying Presets, or groups of Channels that should be enabled together.

  • New: Implemented ControlRigLayerInstance to support Sequencer layering using ControlRig Tracks

  • New: Implemented Additive Control Rig to be used in Sequencer for layering/tweaking Animations.

  • New: Added simple multi effector FABRIK rig unit.


  • Bug Fix: Bones metadata from FBX are now transferred to the Anim Sequence at import.

Skeletal Mesh

  • Crash Fix: Calling USkinnedMeshComponent::SetSkeletalMesh() after destroying its ChildPoseComponent no longer crashes.

  • Bug Fix: The SetVertexColor engine test no longer fails when skin cache is enabled.

  • Bug Fix: The AlternativeSkinWeights engine test no longer fails when using skin cache mode.

  • New: The maximum number of bone indices allowed per Skeletal Mesh section is increased from 255 to 65535.

  • New: The maximum number of bone influences per vertex is now 12.

  • New: Support for variable influences per vertex has been added and is used by default for meshes with more than 8 bone influences.

  • New: Vertex color is now used as a factor when blending between original tangents and recomputed tangents when Skeletal Meshes are rendered via skin cache.

  • New: Added Niagara support of unlimited bone influences per vertex for Skeletal Mesh rendering.


  • Crash Fix: Fixed a crash that occurred when attempting to set a delay line for a submix effect length beyond a statically allocated maximum length.

  • Crash Fix: No longer crashes when the maximum for audio sources is reached and stopping sources are enforced but not observed by spatialization/modulation plugins.

  • Crash Fix: Fixed a memory scribble/crash in the OSC plugin when passing empty strings as a payload in message members, or when sending messages larger than 1024 bytes.

  • Crash Fix: Fixed a rare crash due to a race condition when stream caching is enabled and stat audio streaming is turned on.

  • Crash Fix: Fixed a crash that occurred when FAudioCaptureAndroidStream::CloseStream was called on a stream that was already opened.

  • Crash Fix: Fixed a rare crash in the Google Resonance plugin due to a race condition.

  • Crash Fix: A PGO crash in NonRealtimeAudioRenderer has been fixed.

  • Crash Fix: If a USoundWave has the Is Ambisonics flag set to true but is not a four-channel file, this will no longer cause a crash.

  • Bug Fix: Removed a shadow variable that could cause XAudio2 to go silent if in an extreme performance-heavy state.

  • Bug Fix: Fixed a bug that occurred when importing audio files that caused playback of out-of-date audio or no audio play at all.

  • Bug Fix: The sound file importer no longer prompts for a template update if reimporting a sound, and no longer logs to the display if a sound is stopped due to reimport.

  • Bug Fix: Audio engine no longer goes silent when swapping from a null device.

  • Bug Fix: Fixed a hang when using -deterministicaudio during PIE (Play in Editor) shutdown.

  • Bug Fix: Fixed the SoundCue Undo feature that resulted in SoundWavePlayers being left in a state where sound wave data would stop loading in the editor.

  • Bug Fix: Overflow is now prevented in audio output by clamping before converting from float to PCM on a master output.

  • Bug Fix: Changed the default value of the audio underrun timeout value from 0 ms to 5 ms to be generally more defensive against platforms requesting audio at too high of a rate.

  • Bug Fix: Added an optional config to wait for audio to be rendered before falling back to submitting an underrun buffer.

  • Bug Fix: Fixed a race condition between USoundWave being garbage collected and the AudioMixerSourceBuffer destructor.

  • Bug Fix: Fixed a race condition with rapid stop() then start() calls on a procedural sound.

  • Bug Fix: Fixed an issue with the buffer read/write in audio renderer.

  • Bug Fix: Fixed iOS issues with audio playback and iOS notifications such as a user's Alarm Clock.

  • Bug Fix: Moved StopLowestPriority/StopLowestPriorityThenPreventNew to use culling logic instead of eviction so it would no longer require evaluation of priority via a call to the SoundBase parse.

  • Bug Fix: Fixed an issue with modulation output curves reordering incorrectly when modifying output curve values in the editor.

  • Bug Fix: The output curve is now hidden when the respective sound control modulation patch is bypassed.

  • Bug Fix: Various bug fixes were made for Time Synth.

  • Bug Fix: Incorporated Microsoft's replacement DLL files for XAudio2_9 to fix missing audio on Win8 when running in Win7 backward-compatibility mode.

  • Bug Fix: Memory usage of the VoIP system has been greatly optimized.

  • Bug Fix: Fixed a minor leak that would occur when multiple audio components tried to play the same USoundWaveProcedural.

  • Bug Fix: Fixed an issue in cook for some short assets when stream caching was enabled for iOS/Switch.

  • Bug Fix: Changes to the Compression Quality slider while stream caching is turned on no longer leads to aberrant playback behavior.

  • Bug Fix: Fixed an issue that would occur in priority sorting if an audio source was set to bAlwaysPlay and had an overall volume greater than 1.0f.

  • Bug Fix: Various issues that would occur if a server were cooked with stream caching enabled have been fixed.

  • Bug Fix: Made a fix for an audio hang at exit, such as during a PGO build, when using the NonRealtimeAudioRenderer.

  • Bug Fix: Fixed a regression issue in the SoloSound console command.

  • Bug Fix: There was an issue where the Preselect At Level Load field on the Random sound node would sometimes not actually cull child nodes. This has been fixed.

  • Bug Fix: Sounds failing to cull on priority by the concurrency system has been fixed.

  • Bug Fix: Fixed a rare COM initialization failure.

  • New: The dynamic volume mix feature is now available for Sound Classes.

  • Bug Fix: Fixed the stub issue for source descriptions in stat sounds when running the audio mixer.

  • New: Added color options for the debug body text for audio debugging.

  • New: Added a CVAR, au.DisableAppVolume, for debugging in IDE while the app is backgrounded.

  • Bug Fix: For Natural Sound attenuation falloff, when dBAttenuationAtMax is set to a value larger than the default minimum of -60 dB, it no longer causes looping sounds to virtualize even though volume doesn't go to 0.

  • New: Added the ability to specify whether a sound should continue to attenuate, go silent, or hold the maximum value when beyond the bounds of the attenuation shape.

  • New: Added a bool return to the message payload array requests in the OSC API to determine whether it failed, or if the value is fresh.

  • New: Added Blueprint functions to convert the Object path to and from the OSCAddress.

  • New: Added the ability to remove OSC containers at index.

  • New: Fixed pattern matching for wildcarding over a span of containers/methods.

  • New: Added serialization for .ini files to control audio modulation mixes, with the audio modulation plugin to set game mixes without recooking the game.

  • New: Mixes can now also activate any bus they act on if the bus is not already active.

  • New: Integrated an update to SteamAudio, which brings dynamic geometry support and a number of bug fixes.

  • New: Added the CVARs osc.servers, osc.server.connect, osc.server.connectById, osc.clients, osc.client.connect, and osc.client.connectById to manipulate and test OSC client/server connections.

  • New: Added submix assetization for all master submixes that gives users better control over the master submixes and master submix effects.

  • New: Added the ability for a user to set up distance-based sends to an array of submixes defined in attenuation settings.

  • New: Added the ability to modify submix effect chains from Blueprint (add, remove, or replace).

  • New: The Synthesis plugin is now enabled by default for new projects.

  • New: Added soundfield submixes, endpoint submixes, and soundfield endpoint submixes to the engine, as well as extensible interfaces for soundfield formats and audio endpoints that are external to the audio engine.

  • New: Added the ability to attenuate sound priority as a function of distance in attenuation settings.

  • New: FAudioDevice lifespans have now been fully decoupled from the UWorld, meaning that you can arbitrarily spawn and use instances of the audio engine in code. This is useful for building profilers, or for rendering audio for arbitrary systems. \ Example usage: \ FAudioDeviceParams DeviceParams; \ DeviceParams.Scope = EAudioDeviceScope::Unique; \ MyAudioDeviceToRecord = AudioDeviceManager->RequestAudioDevice(DeviceParams);

  • New: Added a noise gate to outgoing VoIP audio that can be controlled with the CVAR voice.MicNoiseGateThreshold. This is useful because it can be controlled separately from silence detection.

  • New: Added voice.debug.PrintAmplitude to print the current outgoing loudness of the microphone.

  • New: Made minor CPU optimizations to the VoIP system.

  • New: Added voice.playback.ResyncThreshold, which can be used to target a given audio latency in order to better sync incoming VoIP with other systems.

  • New: Added support for stereo VoIP input/output.

  • New: The user can now scale distance attenuation ranges of attenuation settings via Sound Class properties.

  • New: Added an option to override the default chunk size for streaming audio on most platforms.

  • New: Added the console command au.streamcaching.FlushAudioCache to flush the audio stream cache. Various updates to the stat audio streaming debug view were also made.

  • New: Added the ability to safely resize the stream cache at runtime using the au.streamcaching.ResizeAudioCacheTo console execute.

  • New: For clarity, the Oculus Audio plugin now prefixes its logs with the words "Oculus Audio".

  • New: Added voice.MicInputGain and voice.MicStereoBias CVARs to control the loudness and panning of outgoing VoIP audio.

  • New: By default, VoIP will now be prioritized over all other audio sources. If you want VoIP sources to have the same priority as other audio sources in the engine, set au.voip.AlwaysPlayVoiceComponent=0.

  • New: Added the ability to patch both outgoing microphone audio and incoming VoIP audio out of the VoIP engine using FVoiceInterface::GetMicrophoneOutput() and FVoiceInterface::GetRemoteTalkerOutput().

  • New: Added missing Solo/Mute icons.

  • New: Moved the AudioCaptureModuleName spec to an .ini setting, and updated all relevant .ini files.

  • New: Added a sort-by-priority feature for stat sounds; only shows pertinent information when sorting by a given field.

  • Improvement: You can now disable the full path for a debug.

  • Bug Fix: The MaxDistance calculation is now correct for box attenuation.

  • Improvement: There is now a debug draw CVAR (au.3dVisualize.Listeners 1) to help debug if a listener is in or out of bounds for third person. Previously it was off by default with au.3dVisualize.Enabled 1).

  • Improvement: Upgraded XAudio2_7 to XAudio2_9 to improve audio device-swapping support on a PC, and for general stability improvements.

  • Improvement: Improved XAudio2Device logging; reduced log spam by adding a log-once behavior.

  • Deprecated: Moved fast reverb to default and removed the fast reverb asset.

  • New: Updated debug exec console commands to have new "au" prefix instead of the now deprecated "Audio" prefix.

  • Deprecated: The "Audio" prefix has been replaced by the new "au" prefix.


  • Bug Fix: Fixed Gauntlet support for 32-bit Android builds. 32-bit builds are considered but discarded if 64-bit versions are also present.

  • Bug Fix: Fixed issue where new/changed screenshots could not be approved in the editor on some platforms (Mac/Xbox/Switch).

  • New: All test methods now return a boolean to indicate if the test passed or fail. Implemented new macros run those methods and, if they return false, insert a "return false" in the code, so that it exits the current test immediately. This lets programmers write automated tests much faster.

    • See comments and example in Core/Public/Misc/AutomationTest.h

  • Improvement: EngineTest runtime caps the number of threads used in System.Core.Misc.LockFree to reduce the run time on machines with many processors.


  • Bug Fix: Reused the default scene root node when creating a Blueprint from an actor that has a root node named the same as default scene root (most likely an "empty actor")

  • Bug Fix: Removed a legacy "always compile on save" code path for LSBPs.

  • Bug Fix: Fixed an editor crash caused by leaking Blueprint context menu actions for new sublevel script actors.

  • Bug Fix: Removed an inconsistent tool tip from the interface list on BP editor.

  • Bug Fix: Now allowing an interface function graph to be converted in the case where the interface function has changed and should now be placed as an event.

  • Bug Fix: Fixed duplicated default scene root when creating a new Blueprint subclass from an actor in the level.

  • Bug Fix: Deferred the serialization cost of unloaded Blueprint asset search data versioning info from editor startup.

  • Bug Fix: Fixed improper context menu options. Blueprints now conform to an interface when it refreshes to ensure you cannot make graphs with the same name as an interface.

  • Bug Fix: We now clear any existing reference to a class object on a new connection to the 'Class' input pin for the 'GetClassDefaults' node.

  • Bug Fix: Fixed the nativized Blueprint class code output debugging tool to include interface types.

  • Bug Fix: Reduced the overall time spent constructing search result nodes during a global Blueprint search. This should significantly improve the overall Find-In-Blueprint search speed in large-scale projects with lots of content.

  • Bug Fix: Optimized Blueprint compilation dependency checking when large numbers of Blueprints are loaded.

  • Bug Fix: Fixed a Blueprint compilation error that would result when a custom event was bound to a server-only delegate.

  • Bug Fix: Changed Blueprint editor tab history to work across the entire Blueprint.

  • Bug Fix: Fixed a typo in code that's emitted for properties that reference explicitly-mapped 'noexport' struct fields in nativized Blueprint code.

  • Bug Fix: Fixed an invalid cast in nativized Blueprint code for converted user-defined enum fields.

  • Bug Fix: Fixed incorrect target platform names for some client/server configs that led to an ensure at cook time with Blueprint nativization enabled.

  • Bug Fix: Updated menu item labels for the native AttachToActor/AttachToComponent APIs to better tell them apart in the Blueprint editor context menu.

  • Bug Fix: Removed the clearing of keyboard focus when showing the details panel because it caused errors when undoing while a property edit still had keyboard focus. Clearing the keyboard focus during the process of the undo would cause another transaction to start, breaking the current undo transaction.

  • Bug Fix: Fixed an incorrect platform name being used in manifest lookup for some cook targets during Blueprint nativization.

  • Bug Fix: Fixed blind reinstancing of natively-constructed nested subobjects during class-owned sub-object initialization in nativized Blueprint C++ code.

  • Bug Fix: UCLASS metadata now supports a 'CustomThunkTemplates' class so that CustomThunk nodes can be nativized.

  • Bug Fix: Updates force deleting to also replace references on Actors with no owning World (previously these actors were just ignored). This ensures in the correct results of objects created in actor components such as Child Actor Component and in Sequencer.

  • Bug Fix: Updated Blueprint graph to cancel ZoomToFit on nodes when panning with the middle mouse button.

  • Bug Fix: Self pins are now properly automatically converted to soft object references when required.

  • Bug Fix: Viewing a Blueprint actor in the Blueprint Editor Viewport no longer changes a custom thumbnail zoom level when the zoom level is really close to the actor.

  • Bug Fix: Fixed asset registry discovery slowdown caused by logic that was trying to build up a cache of component type information.

  • Bug Fix: Fixed bug that would cause Blueprint default values to be lost after a Blueprint member variable was renamed

  • Bug Fix: CompileAllBlueprints commandlet now re-instances, ensuring that it does not later crash during garbage collection.

  • Bug Fix: Fixed deterministic cooking issue with multicast delegates on components bound in actor event graph.

  • Bug Fix: Fixed issue where Blueprint compilation errors trigger a modal dialog in unattended mode.

  • Bug Fix: Fixed bug that would cause references in UI code to be updated to point at the child Blueprint after compiling the child Blueprint (or Blueprint that resulted from duplication.)

  • Bug Fix: BlueprintDisplayName and BlueprintDescription now get cleared on the new copy when duplicating a Blueprint asset.

  • Bug Fix: Prevented deprecated async action factory methods from showing up in the BP context menu (unless the show deprecated functions setting is enabled.)

  • Bug Fix: Toggling the 'Expose Deprecated Functions' setting now takes effect immediately rather than requiring an editor restart.

  • Bug Fix: Fixed native struct-typed variables on spawned Blueprint instances not being initialized to the modified default value of any non-reflected field of the struct exposed for edit through a details customization.

  • Bug Fix: When checking for zombie members in a user defined struct, now ensure that container types get checked as well.

  • Bug Fix: Using "Assign selected Actor" in the context menu of an event node in a level Blueprint to assign an event to an unrelated type of actor will no longer cause a crash.

  • Bug Fix: Fixed bug where subobjects of Blueprint classes that were async loaded in the editor would stick around forever as phantom objects, which could cause crashes or corruption when changing maps.

  • Bug Fix: Ensured that the RF_DefaultSubobject flag now persists when copying an object in the level editor.

  • Bug Fix: Fixed the cause of NewClass != OldClass assertion failure when async loading Blueprints in the editor.

  • Bug Fix: Fixed a crash in the Blueprint debugger when hovering over container types inside a function call.

  • Bug Fix: Fixed non-functional collision in a nativized Actor Blueprint containing one or more components set up to use a custom collision profile.

  • Bug Fix: Fixed a bug introduced in 4.24 where soft object and class references on Blueprint pins were not being properly tracked for cooking/reference viewer. Any assets that were saved in a 4.24 version of the engine and are missing references can be resaved to fix this.

  • Bug Fix: Changed duration of a notification toast in the Blueprint Editor to improve visibility.

  • Bug Fix: Added compilation validation for pin connections on tunnel nodes, allowing the proper display of error messages when changing input pin types on macro graphs.This additional validation may point out errors that were previously undiscovered in Blueprints.

  • Bug Fix: Fixed graph pin default values being editable even when set to read-only/

  • Bug Fix: Fixed issue introduced in 4.24 where breakpoints or navigation could cause multiple tabs to be open at once for the same function.

  • Bug Fix: Updated Unreal Header Tool to properly support int64 variables that are marked with with ExposeOnSpawn metadata.

  • Bug Fix: UBlueprintGeneratedClass::GetAuthoritativeClass() returns itself as the authoritative class when it's cooked and therefore has no source UBlueprint.

  • New: Made the "Select Function" drop down searchable on Create event nodes.

  • New: Added Blueprint support for FIntPoint.

  • New: Added conversions from int64 to int32 and to uint8 (byte).

  • New: Decoupled Blueprint indexing from the search thread in order to take advantage of multiprocessing, and improved the overall Find-In-Blueprints experience while indexing.

  • New: Added GetPlatformUserDir to Kismet function library.

  • New: Added additional type support(bool, string, name, and Object) for the "Format Text" node.

  • New: Added an IsEmpty function to String types in the KismetStringLibrary.

  • New: Now allowing TArray, TSet and TMap elements to be visible in the SCS tree if the container is marked as Visible/Editable.

  • New: Users now have the options to display access specifiers for functions and variables in the "My Blueprint" window. This feature can be enabled by selection the view options for the "My Blueprint" and selecting "Show access specifiers in My Blueprint view"

  • New: Exposed Runtime Virtual Texture assets to Blueprint.

  • New: Optimized component instance data determination and application when rerunning construction scripts. This can significantly speed up rerunning the construction script when using AddComponent nodes in the User Construction Script.

  • New: Implemented variadic function support for Blueprints

    • Variadic functions are required to be a CustomThunk marked with the "Variadic" meta-data. They can then be used from a custom Blueprint node to accept arbitrary arguments at the end of their parameter list (any extra pins added to the node that aren't part of the main function definition will become the variadic payload).

    • Variadic arguments aren't type checked, so you need other function input to tell you how many to expect, and for a nativizied function, also what type of arguments you're dealing with.

  • New: Exposed TransformVector4 as a static function to Blueprint. This will allow users to transform vectors by 4x4 matrix in BP.

  • New: Added a BlueprintFileUtils plugin to expose file system operations to Blueprint.

  • New: The output array of GetAllActorsOfClassWithTag will now use the type of the input class if a class literal is used.

  • New: Now allowing container pins in "make" nodes and structs to be empty by default. This will auto generate the default value if none is provided. This makes the experience of using custom UStructs more fluid and prevents there being a node with a compiler error by default.

  • New: Added horizontal view mode to the Blueprint diff tool.

  • API Change: Removed unused variable UBlueprint::SearchGuid.


  • Crash Fix: Fixed a crash when a sparse multicast delegate gets destroyed mid-execution.

  • Crash Fix: Fixed UAnimCurveCompressionCodec serialization crash when loading cooked content in the editor.

  • Crash Fix: Fixed a server crash when an asset file exists but can't be read.

  • Bug Fix: Fixed GDB pretty printers for FString, FName, FMinimalName, FNameEntry and TWeakObjectPtr.

  • Bug Fix: FString::Mid now gracefully handles negative start and negative count inputs. \ FString::RemoveAt can no longer leave an unterminated string.

  • Bug Fix: Ensure that unsaved and unused Blueprint classes are removed from the class hierarchy cache when deleted.

  • Bug Fix: Added the name of failing struct to the bad alignment assert message in UScriptStruct::InitializeStruct.

  • Bug Fix: Fixed FName number parsing from unterminated strings—copy the number to a temporary buffer until we have an overload of Atoi64 that takes the input length. The generic implementation of Atoi64 for TCHAR converts the input to ASCII then converts that to an integer. For unterminated strings, this could cause an access violation or convert an obscenely large input to ASCII.

  • Bug Fix: Fixed a race condition in FOutputDeviceRedirector that was corrupting logs. Calling EmptyBufferedLines() before serializing the buffered lines was allowing their memory (owned by FLogAllocator) to be reused by buffered lines from other threads before the main thread had consumed them.

  • Bug Fix: Added support for passing "abscrashreportclientlog" and "nullrhi" command line arguments to crash reporter monitor.

  • Bug Fix: Fixed ensure messages disappearing in editor log. Calls to PanicFlushLog should only happen on crashes, and not ensures. For ensures on any thread other than the main thread the editor log, which is not thread safe, the editor will lose these messages. On crashes we don't care about, like on non thread-safe output devices since we will not recover, we are only interested in the log file.

  • Bug Fix: Fixed incorrect sandboxed paths. When the argument is an already sandboxed path, ConvertToSandboxPath was adding another copy of the path to the end. We need to test if the path is inside the full sandboxed path before testing if it's inside the project directory (since the former is inside the latter).

  • Bug Fix: Fixed incorrect callstack in crash reports. When a ensure was reported before a crash, the callstack from the crash was added to the ensure stack frames. This is because the debug helper instance used to analyze the minidump is a singleton and not designed to be reused. Use the GetNew method to create a new instance of the helper, and delete the old one.

  • Bug Fix: Fixed TIndirectArray::operator=(TIndirectArray&&) The default version of the move assignment operator fails to free the pointed at data in the existing array before assigning, and thus the current contents were all leaked.

  • Bug Fix: Implemented a faster version of FRandomStream::GetFraction that doesn't require a type conversion to integer and back to float. This fix affects any use of FRandomStream::GetFraction, which will now return a different value for the same seed.

  • Bug Fix: VS2019 v16.5.0 compilation fixes.

  • Bug Fix: Changed logic in FArchiveFileReaderGeneric::InternalPrecache to avoid buffer shrinking. Previously, the buffer could potentially be shrunk to a very small size if you read data at the end of a file before seeking to the beginning and continuing to read other data.

  • Bug Fix: Fixed VS2019 compilation issues with int32 to bool implicit conversions.

  • Bug Fix: The engine will now skip Collecting Garbage during initial load because it's not safe since garbage collection token streams may not be assembled yet.

  • Bug Fix: When cooking by the book, the engine will now check if the specified target platforms are editor platforms and reject them if so. This is to prevent common mistakes when manually entering cook command lines that result in crashes when cooking.

  • Bug Fix: Fixed TFastReferenceCollector not setting the serializing object when processing TMap and TSet references that resulted in issues with finding all references.

  • Bug Fix: Changed how the engine detects trashed user structs—instead of looking at field lists, it's now going to be using dedicated functions.

  • Bug Fix: Fixed FAsyncPurge::TickGameThreadObjects not respecting Garbage Collector time limit that could lead to bigger hitches on the game thread (regression).

  • Bug Fix: Reduced stack size usage by LogTrace in debug builds.

  • Bug Fix: Change the cached World reference in ULandscapeInfoMap to a TWeakObjectPtr to safeguard against order or destruction issues on World unload.

  • Bug Fix: Fixed incorrect UObject archetype caching when the object's Outer is still pending load.

  • Bug Fix: Fixed a crash when accessing TSubclassOf default object when its class is null.

  • Bug Fix: Fixed Tickable objects sometimes failing to register when re-allocated with the same address as previously destroyed ones.

  • Bug Fix: Fixed application hanging in MapProperty serialization.

  • Bug Fix: FORCEINLINE functions that were made virtual in FAsyncLoadingThread.

  • New: Removed _VTABLE define in favor of fvisibility-ms-compat. This will hide symbols but keep type visibility as default (for example, exported) over needing to explicitly mark the types as exported.

  • New: TResizableCircularQueue now supports non-trivial types and default constructed pod types.

  • New: Added an implementation of Robin Hood hash table optimized for small keys and values.

  • New: Added float/double comparison function (FMath::IsNearlyEqualByULP) that compares floats according to the number of units-in-last-place differences (rather than using an absolute tolerance value).

  • New: Added double version of FMath::IsNaN and FMath::IsFinite.

  • New: AddAnnotation function (in various annotation classes) now consistently supports moving incoming annotation data.

  • New: FString::Left, LeftChop, Right, RightChop, Mid, ConvertTabsToSpaces, and TrimQuotes now have inline versions.

  • New: FString:: Left, LeftChop, Right, RightChop, and Mid now have rvalue versions.

  • Added rvalue overloads for Left, LeftChop, Right, RightChop, and Mind.

  • Added inline version of TrimQuotes.

  • New: FPaths::ProjectSavedDir now returns const FString&.

  • New: Added the ability to stop a demo after a CSV profile completes with -csvDemoStopAfterProfile.

  • New: Added a CSV_PROFILER_USE_CUSTOM_FRAME_TIMINGS preprocessor macro to enable a game to call FCsvProfiler::BeginFrame and EndFrame instead of using the engine defaults.

  • New: Added new API for querying extra development memory. In the CSVProfiler, this gets reported as metadata and by default, it subtracts the dev memory from the free memory stat.

    • This is controllable with the csv.AdjustPhysicalFreeForExtraDevMemory CVar.

  • New: Added FPathViews as an analog for FPaths that use FStringView and FStringBuilderBase. This includes implementations and tests for:

    • GetCleanFilename

    • GetBaseFilename

    • GetBaseFilenameWithPath

    • GetPath

    • GetExtension

    • GetPathLeaf

    • Split

    • Append

  • New: Optimized FFileHelper::BufferToString to eliminate its use of a temporary allocation. Converting UTF-8 inputs was using a temporary TCHAR buffer the same size as the output. The conversion is now done directly into the allocation for the target string.

  • New: Optimized engine startup times by creating and polling fewer streamable handles. This targets AssetManager::ChangeBundleStateForPrimaryAssets().

  • New: For CsvToSVG 3.31, reduced event spam by grouping duplicate events if they appear within a certain number of pixels of each other, including:

    • Displaying the count

    • Reducing the frequency of event lines

    • Reduce the alpha when spamming occurs

  • New: Implemented an experimental Robin Hood hash table container for performance-critical code.

  • New: Attempting to read past the end of a file on Windows will once again return false rather than being silently truncated. All platforms should now treat this as an error.

  • New: Running with -LLM enabled now handles more memory allocations than before.

  • New: Fixed a potential (but rare) deadlock when attempting to load pak file data from multiple threads at once.

  • New: Added warning to FBulkDataBase::GetCopy to highlight cases where it would be faster to let the method allocate the buffer rather than allocating one up front.

  • New: Added and used StringFwd.h for string builder and string view declarations. Including StringFwd.h in place of forward declarations offers more flexibility to change how these types are declared.

  • New: Cleaned up FQueuedThreadPool interface to make it easier to plug in alternative implementations.

  • New: Backed out pull request (submitted as CL10610795 ) for TInterval::ToString() because it interacts poorly with some as-yet-unidentified change which was robo-merged later from another stream.

  • New: VS2019 compilation fix for #include because VS2019 only supports #include as per the standard.

  • New: Added TryMalloc(), which may return a nullptr if the memory allocation request cannot be fulfilled.

  • New: Made refcount validation conditional (only in Debug or when slow checks are enabled).

  • New: Added mimalloc allocator from https://github.com/microsoft/mimalloc because it performs better than mimalloc in cooker benchmarks. We still default to TBB malloc until the behavior has been explored in more depth.

    • To opt in to mimalloc, pass -mimalloc on the command line.

  • New: Fixed -nothreading logic not working properly due to one-time initialization of flag before the command line has been set.

  • New: Added SCOPE_MS_ACCUMULATOR (used now to track load times via on-screen stats, but can be used generally).

  • New: Changed the AsyncPreload stuff to be opt-in by platform.

  • New: Garbage Collector will now only run clustering code if clusters are enabled and when actual clusters are allocated.

  • New: When doing incremental unhashing, Garbage Collection will no longer log each iteration to reduce log output.

  • New: Fixed an issue with the resave commandlet not being able to perform a P4V commit after the UAsset was resaved.

  • New: Added event tag suppression to OutputDeviceMemory.

    • Fixed ring buffer writing when bounds crossed.

  • New: Cleaned up Garbage Collector Token Stream generation code and merged token debug info with the token stream to reduce data duplication and simplify the API.

  • New: Added -skipiostore UAT option to help with batch files that specify -iostore.

  • New: Added FReferencerFinder helper class that finds all objects referencing the provided list of objects. This is similar to FArchiveHasReferences but up to 16x faster.

  • New: Disabled filename extension exclusions when using pak files in an editor build.

  • New: Move module manager extra search path configuration out of FModuleManager::Get() and into a seperate function which is called from the launch engine loop after the platform files are created. This ensures that editor builds that use pak files have the paks mounted before we start scanning for data driven platform *.ini files.

  • New: Pak platform file changes to support mounting pak files in the editor.

    • Always look for pak files in the standard locations to determine whether we should create the platform layer.

    • When looking up a decryption key, check the registered list for all guids, even empty ones. We want to support pak mounting in non-monolithic builds where we don't have an embedded key.

    • Remove the initialization-time check that the decryption key exists for pak files with an encrypted index. The condition to test is more complex when considering editor pak mounting, and we will get a meaningful error almost immediately afterwards anyway.

  • New: Don't try and load plugin manifests in editor builds

  • New: Optimized GetArchetypeFromRequiredInfoImpl by reusing cached archetypes

  • New: Inlined IsGarbageCollectionWaiting so that it doesn't appear in profiles

  • New: Kismet reinstancing code will now use FReferenceFinder instead of FArchiveHasReferences to improve reinstancing performance

  • New: If Garbage Collector Clustering is disabled, Garbage Collector will now run with code responsible for handling clusters compiled out to avoid unnecessary checks.

    • Actor clustering will now be disabled if clustering is disabled in general

    • Added a separate setting for clustering generic assets (gc.AssetClustreringEnabled) to be able to enable actor clustering independently from asset clustering as it was possible in the past

  • New: Included the global UObject array memory usage in 'obj overhead' command report

  • New: Added 'obj overhead [-detailed]' console command to print out the total memory overhead of UObject hash tables and maps

  • New: FORCEINLINE IsCollectingGarbage to fix performance hotspot.

  • Improvement: Extended FStringView to make it easier to use as a drop-in replacement for FString where appropriate The family of functions that return a slice of the view has been mirrored from FString, including the variants of Left, Mid, Right, and Trim. Like FString, Equals and Compare are now available and case-sensitive by default. View literals are now available, such as TEXT("Value"_SV). A string view is now treated as a contiguous container of characters which makes it compatible with many algorithms.

  • Improvement: Fixed up some code for C++17 compilation ( std::binary_function, std::unary_function and register keyword are all deprecated).

  • Improvement: Fixed missing vtable for FActorTickFunction.

  • Improvement: Garbage Collector optimization where class reference will now be completely ignored by the Garbage Collector for instances of native classes. Additionally, the Outer reference will not be processed for Packages. \

  • Deprecated: Deprecated fixed string builders for 4.25. Fixed string builders are difficult to use correctly in many cases, and when used correctly, offer no performance or memory improvement over an extendable string builder of the same size.

  • Deprecated: Removed FGenericPlatformMisc::HandleIOFailure since it's no longer in use.

  • Deprecated: Removed rollup support from DDC interface since it is no longer useful.

  • Deprecated: Added deprecation warnings when using the old (non-EDL) loading path in cooked builds and when cooking. Toggling EDL off in Project Settings will also result in a deprecation pop up in the editor. Deprecation warnings can be disabled by adding the following lines to DefaultEngine.ini in the project's config folder:

    • [/Script/Engine.StreamingSettings] s.DisableEDLDeprecationWarnings=True

  • Removed: Removed deprecated TWeakObjectPtr operator=.

  • Removed: Removed FAsyncUncompress.

  • Removed: Deleted deprecated functions from UnrealString.h

  • Removed: Removed FPaths functions marked as deprecated for 4.18.

  • Removed: Removed deprecated Histogram functionality.

  • Removed: Removed (miscellaneous) deprecated functions from:

    • App.h

    • AssertionMacros.h

    • MonitoredProcess.h

    • Serialization/CustomVersion.h

  • Removed: Removed deprecated functions from Compression(.cpp/.h).

  • Removed: Removed deprecated functions from OutputDevice(.cpp/.h)

  • Removed: Removed redundant UPackage::AddReferencedObjects function.


  • Bug Fix: Fixed a crash in the cooker difference check caused by FArchiveProxy not forwarding on calls to SetSerializedProperty() and SetSerializedPropertyChain().

  • Bug Fix: Fix to make sure SandboxDirectory is always absolute.

  • Bug Fix: Fix to handle an invalid platform passed to the cook commandlet without a fatal assert.

  • Bug Fix: Fixed extra DDC puts when DDC logging is enabled on the command line.

    • Before the fix, enabling verbose DDC logging with -ini:Engine:[Core.Log]:LogDerivedDataCache=Verbose was causing extra idempotent puts because of checks for the DerivedDataCache commandlet that checked for "DerivedDataCache" anywhere in the command line.

    • Check for "Run=DerivedDataCache" avoids the problem.

  • Bug Fix: Fixed path prefix comparison when cooking with ErrorOnEngineContentUse. This is a fix for not being able to cook plugins content.

  • Bug Fix: Fixed iterative cooking on Windows when the project is outside of the root directory but on the same drive.

  • Bug Fix: Fixed the following cook performance and correctness issues in UPackage::Save.

    • Cook Performance:

      • Avoid performance cost of calling CreateTempFilename() for cases where we don't actually need a temp filename (cost involves a FileSize check with the file system).

      • Avoid the performance cost of calling FileSize() to get the saved size of packages and use the recorded buffer size instead (which gives uncompressed sizes).

    • Correctness:

      • When saving packages asynchronously, the UPackage::FileSize field was populated with the filesystem size of the package, but since that may not have been written yet by the async writer, it was often set to (uint64)-1.

      • When computing the MBWritten cook stat, make sure that bulk data is included in the accumulated total and that the stat isn't calculated incorrectly in DiffOnly modes.

      • Temporary files would be left lying around if the package was determined to have no exports or to have been completely nativized.

  • Bug Fix: If chunk size is too small, abort generation of streaming install manifest.

  • Bug Fix: To fix log spam (of about 1.8 GB in cook logs), changed ShaderPipelineCacheToolsCommandlet's log to verbose.

  • New: Moved MD5 computation on writer thread during package save.

  • New: Improved cook times by avoiding re-computing the static parameter values twice during calls to FMaterial::CacheShaders (once in FMaterialResource::GetShaderMapId and again in FMaterialResource::GetStaticParameterSet) by enabling the MaterialInstance to store a cached parameter value set and re-use it in selected scopes (only applied to FMaterial::CacheShaders for now, but may be applicable elsewhere). Testing notes include:

    • QAGame produced the same WindowsNoEditor cooked data (barring metadata that had some non-determinism issues) with/without this change.

    • InfiltratorDemo looked visually correct on Win64 with and without cooked data.

  • New: Added SessionPlatforms to record the platforms being cooked in the current CookByTheBookSession or CookOnTheFly request. This fixes the performance issue of unnecessarily generating AssetRegistries for unused platforms when cooking in the editor.

  • New: Optimized IsEventDrivenLoaderEnabledInCookedBuilds for commandlets like the cooker.

  • New: Reduced iterations on Material Functions in UMaterialInstance::GetStaticParameterValues by changing the underlying API to do lookups for multiple parameters at the same time. Tested by a full cook with debug code that checked (using check()) whether the parameter values and expression IDs output from the old code path was equal to the parameter values and expression IDs output from the new code path.

  • New: To save time when the sandbox directory has many files to delete, delete the Sandbox directory asynchronously while the rest of the cook goes ahead.

  • New: Reduced cost of GetDependentFunctions on UMaterialFunction. Changed the following:

    • Introduce IterateDependentFunctions as a method to reduce temporary allocations when computing dependent functions.

    • Add transient UMaterialFunction::DependentFunctionExpressionCandidates field (computed in PostLoad and PostEditChangeProperty) with only function expression types that we might have dependent functions on to reduce the amount of time we spend iterating on FunctionExpressions and casting them to see if they're a type we could have to get dependent functions from.

  • New: Reduced cost of FMaterialUpdateContext and RecacheMaterialInstanceUniformExpressions to save 4 minutes off of a large dataset cook time. Changed the following:

    • FMaterialUpdateContext doesn't create a FGlobalComponentRecreateRenderStateContext instance unless FApp::CanEverRender is true.

    • FGlobalComponentRecreateRenderStateContext stores FComponentRecreateRenderStateContext instances in a TArray instead of a TIndirectArray to avoid excessive numbers of individual allocations and frees.

    • FGlobalComponentRecreateRenderStateContext doesn't create FComponentRecreateRenderStateContext instances for components that aren't registered or those that don't have a render state created. Analysis of the code shows that constructing those component contexts is pointlessly hitting the allocator (or bloating the TArray) because they will not do any useful work in their destructor.

    • RecacheMaterialInstanceUniformExpressions doesn't incur the cost of a TObjectIterator if FApp::CanEverRender() is false, as static analysis of the code shows no useful work done within the iteration if FApp::CanEverRender() returns false.

  • New: Optimize significant callers of FName::ToString to save about 30 seconds when cooking a large title

  • New: Add debug context to DDC requests that take the key as a parameter The existing GetSynchronous, GetAsynchronous, and Put functions are deprecated in favor of the DebugContext overloads.

  • New: Optimized FindTargetPlatform and its most expensive caller during cooking to save 42 seconds of wall time when cooking a large project.

  • New: Optimized ShaderPipelineCacheToolsCommandlet to reduce the execution time of the build command by 90 percent on a large title—time savings affect full, iterative, and single-package cooks.

  • New: To help with profiling, added named events to package saving.

  • New: Optimized IsEventDrivenLoaderEnabledInCookedBuilds() to not query the config system for the current state, but just use the global cvar variable that the config system writes to.

  • New: In the Cooker, do not traverse primitive components to update the material (resulting in a minor speed improvement).

  • Improvement: Major update which makes -DiffOnly cooks 20x faster to help find non-deterministic cooking issues. Testing on a large title showed a 99.6 percent reduction in the cost of FindAssetInPackage and a 95 percent reduction in the overall -DiffOnly cook time.

  • Improvement: Made the following API change:

    • A type that derives from FDerivedDataCacheInterface will need to change to the new API for GetSynchronous, GetAsynchronous, and Put that have a DebugContext parameter.

  • Improvement: Improved DDC error when no backends are available.


  • Bug Fix: Fixed an out-by-one bug with -avg for CsvCollate 1.31. The stats were being divided by csvCount-1 instead of csvCount.

  • New: Added CsvCollate support for search patterns via -searchpattern .

    • Fixed out-by-one error with logging

    • Added -recurse argument to make recursion optional

    • Listed CSV files to log

  • New: Added CsvCollate 1.32- metadata filtering support.

    • -metadatafilter "key0=value0,key1=value1,..."

Memory Profiler

  • Crash Fix: Fixed crash if UEngine::AddOnScreenDebugMessage was called in threads other than the Game thread. This fix secured the usage of UEngine::PriorityScreenMessages and UEngine::ScreenMessages.

  • Bug Fix: Fixed a bug occurring in scenarios where reporting ensures to the Crash Report Client would overrun a fixed size string buffer. This issue appeared after two ensures fired, since the dynamic string buffers lifetime was equal to the crash reporting thread, and only reset on initialization.

  • Bug Fix: Added back stats instrumentation of local Blueprints function calls.

  • Bug Fix: Fixed FName batch loading check (OldUsedSlots == UsedSlots) in EngineTest.

  • Bug Fix: Prevented use of Hidden enum entries as default values for UHT exposed functions. These enum entries aren't exposed to Blueprints and Python, so they were causing UI issues or script syntax errors.

  • Bug Fix: Crash report client doesn't need full access handle to runtime when monitoring. This behavior triggered anti-cheat warnings in some cases. Use a limited access flags instead.

  • Bug Fix: Made StaticFindObject handle "any package" search with specific package name supplied in object path, fixing the ambiguous search warning.

  • Bug Fix: Fixed issues with plugin stack traces not resolving correctly. Disabled on demand symbol loading due to an issue where modules that are not in the main binary directory would not have symbols loaded correctly. This manifested as "UnknownFunction" entries in the logged stack trace. External crash reports were not affected.

  • Bug Fix: Fixed unterminated number parsing for new FName constructors with fixed length.

  • Bug Fix: Made StaticFindObject handle nested subobjects when searching for any package without a package pointer.

  • Bug Fix: Fixed LevelStreaming when changing desired level between request and completion with a loaded level. Pending unload is never processed and the state machine stays indefinitely in the LoadedNotVisible state.

  • Bug Fix: Fixed file helper utilities not returning failure when closing/flushing fails.

  • Bug Fix: Fixed FMacPlatformProcess::GenerateApplicationPath to prevent searching applications anywhere on the machine (anything indexed by Spotlight) rather than just looking under the Engine directory (as specified by the function's documentation).

  • Bug Fix: Enable TStrongObjectPtr to be created during static initialization.

  • Bug Fix: Added static assert to TPointerIsConvertibleFromTo to stop it from being instantiated with incomplete types and giving wrong answers.

  • Bug Fix: Fixed error message in FMatrix::ErrorEnsure().

  • Bug Fix: To handle Presaves that cause a circular reference that loads the package being saved again, moved ResetLoaders after Presave.

  • Bug Fix: Fixed WriteTableAsJson to enable writing utf8 so that FillDataTableFromJSONFile and applications other than Unreal can recognize and parse the file type.

  • Bug Fix: Changed FConfigFile::UpdateSections to preserve relative location of modified sections in the ConfigFile.

  • Bug Fix: Fixed transient properties being written out during JSON object serialization.

  • Bug Fix: Fixed TArray and FString assignment ignoring previously reserved memory.

  • Bug Fix: Fixed PURE_VIRTUAL containing code with commas in it.

  • Bug Fix: Fixed WindowsPlatformFile not handling greater-than 32bit read and write sizes correctly.

  • Bug Fix: Improved argument type deduction for TLess and TGreater.

  • Bug Fix: Fixed various LLM scope counters, added some missing texture scopes, and removed the explicit RHIMisc scopes from uniform and structured buffers so the parent scope is used. This makes tracking down buffer memory much easier (and more correct), as the various calling scopes will inflate rather than a single large RHIMisc scope containing all uniform and structured buffer allocations.

  • Bug Fix: Added GetTypeHash() support to TWeakObjectPtr properties.

  • Bug Fix: Fixed StaticFindObject() search for any package with substring package. names

  • Bug Fix: Fixed FName construction to avoid stomping the stack for long names.

  • Bug Fix: Fixed CString::Strspn and Strcspn.

  • Bug Fix: Fixed value FGenericPlatformMemoryConstants::TotalPhysical, which wasn't being set on Windows. Before the fix, it was initialized to zero without being set.

  • Bug Fix: Use UsedPhysical memory stats in LLM captures for memory allocated like on mobile devices to provide more accurate data.

  • Bug fix: FLazyName handles literals with "_[number]" suffix and ASCII literals, which unintentionally created an eager FName and converted that to a FLazyName.

  • New: Deprecated FCustomVersionContainer::GetRegistered, replacing it with a new thread-safe API, which includes the following changes.

  • Common use case:

    • The most common use case of getting a single registered version has changed:

      • Old: CustomVersionContainer::GetRegistered().GetVersion(Guid);

      • New: FCurrentCustomVersions::Get(Guid).GetValue();

  • Advanced use cases:

    • More advanced use cases that compare multiple custom versions should use new FCurrentCustomVersions::Compare instead of looping over versions and doing lookups.

  • New: Implemented unique Algo to remove duplicates from a range (similar to std::unique).

  • New: Allowed TruncToFloat intrinsics used on platforms that support them. Also, added SSE and AVX defines to allow specifying availability on PC, MAC, and Linux.

    • SSE and AVX defines have ALWAYS_HAS and MAYBE_HAS variants to distinguish between available to compile and available to run without the need to check cpuid.

  • New: Added FName length bounds-checking on top of existing check() to guard against malicious input in shipping builds.

  • New: Optimized unversioned array property loading.

  • New: Added a parameter to GetActorBounds and GetComponentsBoundingBox to recursively inspect sub-actors. Also added generic ForEachComponent utility function on actor, and merged code from GetComponent/GetActorBounds/GetComponentsBoundingBox/ ... to benefit by avoiding building an array of components in place. Modifying the list of components in the functor is prohibited (like in C++ range-based iterators), otherwise, users can still use GetComponents to retrieve components in a local list and perform changes afterwards.

  • New: Added another variant of DrawCoordinatesSystem.

  • New: Fixed FArchiveFileReaderGeneric to always align buffer sizes to a power of two in order to take best advantage of hardware I/O.

  • New: Implemented graceful handling of ue4stats files that don't have frames.

  • New: Enabled 'if constexpr' support on more compiler versions.

  • New: Added a UE_STATIC_ASSERT_COMPLETE_TYPE(Type) macro that causes a compile error if Type is incomplete.

  • New: Added functionality for bImplicit send configuration variable when Crash Report Client runs in monitor mode. This allows a game to automatically send crash reports without user interaction, displaying a native OS dialog when completed.

  • New: Optimized FCborStructSerializerBackend (used by MessageBus/UdpMessaging) to encode TArray/TArray as a byte stream rather than an array of numbers, approximately reducing message sizes by a factor of two.

  • New: Added move construction between TArrays with different-width heap allocators (for example, TArray to TArray64).

  • New: Added GetGeneratedTypeName(), which creates a non-portable static string representation of any C++ type.

  • New: Made FPrimaryAssetId FString constructor explicit, added new faster construction paths and StringBuilder << support.

  • New: Added rvalue support to TSharedPtr::ToSharedRef, TWeakPtr::Pin, and TSharedFromThis::AsShared.

  • New: Removed unnecessary circular dependency load deferring work during property serialization when EDL is enabled.

  • New: Exposed working directory for FInteractiveProcess.

  • New: Added ProcessHandle getter in FMonitoredProcess and FInteractiveProcess.

  • New: Added Algo::ForEach.

  • New: Added a predicate version of LoadFileToStringArray, which filters lines based on content.

  • New: Made the following classes final when they already had a final virtual destructor:

    • TGraphTask

    • FD3D12StagingBuffer

    • FOpenGLGPUFence

    • FOpenGLStagingBuffer

    • FD3D11StagingBuffer

  • New: Separated out FArchiveState from FArchive so that it can be queried from FStructuredArchive without providing access to the entirety of the underlying FArchive.

  • New: Added PLATFORM_COMPILER_HAS_FOLD_EXPRESSIONS feature check macro.

  • New: Added operator* for TOptional.

  • New: Used a fixed-size inline buffer for the pimpl in FStructuredArchiveFromArchive to avoid frequent allocations.

  • New: Added FName batch serialization and aligned up IoStore chunks to 16B. The batch serialization is used by the new IoStore and AsyncLoading2.

  • New: Tagged property serialization optimizations.

  • New: Added stateful deleter support to TUniquePtr. Also, fixed TUniquePtr's assignment operator which takes a TUniquePtr with a different deleter.

  • New: Added UE_ASSUME macro that works on both MSVC and Clang.

  • New: Fixed wasteful slack being allocated during TCHAR* -> FString construction.

  • New: Implemented LexFromString from FStringView for primitive types.

  • New: Optimized byte swapping to use intrinsic code provided by MSVC and Clang, resulting in up to 6x faster performance on MSVC. Also, Clang was able to optimize the generic C++ code into the intrinsic equivalent.

  • New: Added UE::String::BytesToHex and UE::String::HexToBytes, which do not require FString as input or output.

  • New: Added FName::TryAppendAnsiString as an optimization because most names are not wide.

  • New: Implemented the following engine init optimizations and new string conversion paths.

    • Added:

      • Core string conversion paths

      • FString::Append() and += overloads to avoid pointless temporaries when appending C strings

      • UTF32 <-> TCHAR string conversion macros

    • Optimized:

      • QuotedString parsing

      • Property parsing

      • PackageName

      • SoftObjectPath

  • New: Added TEqualTo as a binary predicate to perform equality comparison of its arguments.

  • New: Added the following:

    • Algo::Replace can be used to replace FString::ReplaceCharInline on array views of characters such as on a view of a string builder.

    • UE::String::ParseLines can be used to split a string view on line endings to find the non-empty lines in the view. The intent is to replace functions like FString::ParseIntoArrayLines and FFileHelper::LoadFileToStringArray.

    • UE::String::ParseTokens[Multiple] can be used to split a string view on one or more single-character or multi-character delimiters. The intent is to replace FString::ParseIntoArray.

    • Extend Algo::CompareByPredicate to allow the input ranges to be different types and to take them by universal reference.

    • Extend TArrayView and MakeArrayView to allow array views to be created from initializer lists.

  • New: Extended StringBuilder to make it easier to use in place of repeated FString concatenation. The new functionality includes:

    • AddUninitialized

    • Appendf

    • Join

    • JoinQuoted

    • RemoveSuffix

    • Reset

    • Integers can now be written to string builders using operator<<

  • New: Extended FSHAHash for string view and string builder.

  • New: Added string view constructors and a string builder append operator to FName.

  • Improvement: This major improvement includes unversioned property serialization disabled by default, resulting in 2x faster loads and 6x more compact compared to tagged property serialization. The most important differences to tagged properties are the following :

    • Assumes code and data schema matches

    • Only used in unversioned (cooked) packages

    • Doesn't store field types nor converts values when field types change

    • Does't handle name or GUID redirects

    • Doesn't store memory-wise zero properties

    • It's based on property indices instead of property names/tags

    • The metadata is placed in a compact header instead of tags/metadata being interleaved with data

  • Improvement: Optimized iteration-heavy StreamableManager functions.

  • Improvement: Optimized FPackageName::GetShortFName.

  • Improvement: Optimized FPackageName::TryConvertFilenameToLongPackageName to save 13 seconds of wall time when cooking a large project.

  • Improvement: Added initial capacity for container allocators so containers can start with inline allocator capacity. Speeds up TBitArray, TMap and TSet construction and initial insertion.


  • Bug Fix: Fixed TArrayView Natvis sometimes not working correctly.

  • New: Changed FNameEntryId visualizer to always display all names without any quotation marks.

  • New: Added FStatNameAndInfo visualizer, using it to visualize FStatMessage in non-debug builds.


  • Bug Fix: Fixed PerfReportTool issue when adding numeric and non-numeric metadata to summary metadata columns. When this happens, we just convert the column to strings instead of throwing an exception.

  • Bug Fix: Fixed collated/email display when there are missing values. Instead of displaying nothing for that entry, compute min/max/avg only for values that exist.

    • Added support for map overlay summaries

    • Added support for limiting decimal places for CSV graphs

    • Reduced report size by limiting decimal places for CsvToSVG graphs.

  • New: Added boundedstatvalues summary type for visualizing particular stats between two events, with configurable columns.

    • Each column displays a stat value, computed with one of the following formulas: sum, percentoverthreshold, percentunderthreshold, average and streamingstressmetric (the latter is used for File I/O)

    • Added support for shared summaries (set up once and use in multiple reports)

    • Added snapToPeaks property for graphs, so that it can be disabled in some cases (for example, with smooth graphs).

  • New: Added support batched graph generation for PerfReportTool. This update increases performance by 30 percent over the old multi process method, and significantly lowers CPU and disk usage.

    • Fixed determinism issues with report generation (Test cases are now identical between runs)

    • Enable with -batchedgraphs

    • Added batch and multi thread support via response files for CsvToSVG

  • New: For PerfReportTool 4.01, batched graph generation is enabled by default.

    • Disable with -nobatchedgraphs

    • Report generation is 33 percent faster and no longer consumes the entire CPU

Unreal Insights

  • New: New concept "channels", which categorizes events into named groups. This allows users to manage the amount of trace data generated. Channels are disabled by default, and can now be toggled during live sessions.

  • New: "Developer/TraceDataFilters" plugin contains UI for controlling channels in Unreal Insights and Gameplay Insights.

  • Improvement: Unified command line argument to control events, "-trace=channel1,channel2,...". This replaces the previous arguments. For example "-trace=cpu,frame,bookmark" enables cpu profiler events, frame markers and bookmarks.

Session Info
  • New: New "Session Info" tab showing general info for current trace session being analyzed.

  • New: Available info: session name, URI, analysis status, session duration, analysis modules.

Store Browser Start Page
  • New: Added a splash screen to appear each time session analysis is started in a separate process.

  • New: Added "Auto-start" toggle option to allow session analysis to automatically start for new live sessions. It is also possible to set a filter by Platform or by Application Name (for live trace sessions allowed to auto-start).

  • Improvement: Changed Unreal Insights workflow to start in "Browser mode" (the old "Start Page"). Trace session analysis is now started in a separate process ("Viewer mode"), for each session being analyzed. A single Browser window can be open at a time.

  • Improvement: Improved tooltip for traces in the Trace Sessions list.

  • Improvement: Renamed the "..." button to "Explore" (Explore the Trace Store Directory).

  • Removed: Removed Start/Stop recorder functionality.

Asset Loading Insights
  • Crash Fix: Fixed crash when selecting Object Type Aggregation Tab on second open of a trace session.

  • Bug Fix: Fixed Timing Insights to have the layout persistent.

  • New: Added "-OpenTraceFile=file.utrace" and "-OpenTraceId=id" command line parameters to force UnrealInsights to start analysis of the specified trace file or id. In this case Unreal Insights starts directly in "Viewer mode").

  • New: Added "-Store=address:port" command line (also as "-StoreHost=address -StorePort=port") to be able to connect Browser with a specified trace store.

  • New: UnrealInsights now loads 'Default' phase plugins. Find the plugin at:

    • Animation/GameplayInsights

    • Developer/TraceDataFiltering

  • New: Analysis: Implemented reading from session while holding write lock. Added support for recursive session read/edit scopes and multiple concurrent session readers.

Networking Insights
  • Improvement: Changed the Networking Insights tabs to open automatically only if the trace has net events.

Networking - Packets view
  • Crash Fix: Fixed rare crash (trying to use an invalid ConnectionIndex).

  • Bug Fix: Fixed infinite loop if zooming in (vertically) too much.

  • Bug Fix: Fixed package selection being reset if selection is made too soon.

  • New: Added key shortcuts for selected package / package range:

    • Left/Right --> selects previous/next package

    • Shift + Left/Right --> extends selection (multiple packages) toward left/right side

    • Ctrl + Shift + Left/Right --> shrink selection (multiple packages) from left/right side

  • New: Added highlight for packets with at least one event matching the filter (by NetId and/or by Event Type). The packets with no event matching the filter will be displayed with a faded color.

Networking - Packet Content view
  • New: Added "Find Packet" UI on top of packet breakdown visualization:

    • Previous / Next buttons + PacketIndex editbox.

  • New: Added "Find Event" UI:

    • First / Previous / Next / Last buttons --> to navigate between (filtered) events

    • By NetId checkbox + NetId editbox --> to enable filtering by NetId

    • By Type checkbox + EventType readonly editbox --> to enable filtering by EventType. The EventType can be set by double clicking in NetStats or an event in Packet Content view.

    • "Highlight" checkbox --> to enable the Packet Content view to highlight only the filtered events (shows all other events with faded colors).

  • Bug Fix: Fixed sorting of net stat groups (always by name).

  • Bug Fix: Fixed issue where scope IDs of zero could sometimes be traced out from dynamic scopes.

  • New: Cleared up load time profiling instrumentation--mainly removed tracking and reporting of internal EDL events. Added support for having multiple async loading threads. Added AsyncLoading throughput graphs.

  • New: Implemented tracing of network traffic to Unreal Insights, which allows capturing all game network traffic which can be visualized using the new Network Insights tab.

Timing Insights
Timing view
  • Crash Fix: Fixed a rare crash where a log message had a null category name.

  • Crash Fix: Fixed a rare crash when trying to display a timing event having no name (invalid timer).

  • Bug Fix: Fixed the vertical scrolling issue with track being discovered on the fly (for example, total vertical height of all scrollable tracks is now properly computed all the time).

  • Bug Fix: Fixed "auto snap to limits" for vertical scrolling to allow "any position inside view" when the total height of all tracks is less than the height of the view.

  • Bug Fix: Fixed the tooltips not showing the hovered timing event correctly in some situations (when a previous event has EndTime equal with StartTime of hovered event).

  • Improvement: Improved performance by using draw state caching for each track.

Graph tracks
  • Bug Fix: Fixed high-DPI issues with graph tracks. It fixes issues when Unreal Insights runs inside the UE4Editor. Support for high-DPI is still disabled in Unreal Insights standalone application.

  • Bug Fix: Fixed issues arising from tracks being zero-size when they 'scale-in' at first.

  • New: Added a colored bullet next to each series in the context menu (for easier correlation). Also the list of series is now scrollable in the context menu.

Timers view
  • Bug Fix: Fixed tooltips not appearing on Linux when the trace session is first opened.

  • New: Added highlight/filtered mode for a selected timer. Double clicking a timing event (in the Timing view) or a timer (in the Timers list) will highlight all timing events of the same type (timer). The other timing events are displayed with a faded color. Double clicking an empty space (in the Timing view) or same filtered timer (in the Timers list) will reset the filter.

  • New: Added the ability to scrub the Time Marker (the orange vertical line; one set by clicking a message in the Log view) by holding Ctrl or Shift and scrubbing the ruler track. The time marker now also displays the time, similar to the current time readout.

  • New: Added warning red line on sides of timing view when trying to over-scroll using key shortcuts (Ctrl + Left/Right/Up/Down) or using Shift + Mouse Wheel.

  • New: Added ">" in front of the name of the selected (pinned) track.

  • New: Added Frame timing tracks (for Game and Rendering frames) to correlate frame index and duration of each frame with gpu/cpu timelines. The two tracks can be made visible using the R key shortcut or using the "Tracks" menu.

  • Bug Fix: Fixed auto vertical zoom to allow bigger value ranges (was initially limited to around 10^6, now should be around 10^18 -- for a 100px height graph).

  • New: Added toggle header state to Frame timing tracks. When expanded, the respective track will draw vertical marker lines on edges of each frame (overlapping the entire view).

  • Improvement: Improved navigation by using a pinned track for vertical position reference when scrolling or zooming. Ex.: Pinned track will remain at a stable vertical position relative to mouse pointer while panning. Also, the pinned track will remain at a fixed vertical position when scrolling horizontally using the scrollbar.

  • Bug Fix: Fixed Ctrl + Double Click in Timing view not keeping the selected timer visible in Timers view. Ctrl + Double Click action selects a new timing event (and the corresponding timer in the Timers list), but also selects the time range of the selected event. When time selection is updated the aggregation stats is re-computed and timers list is re-sorted, so the selected timer needs to be made visible again.

Counters view
  • Improvement: Changed double click on a counter to also turn on visibility of the Graph track when adding a graph series for the respective counter.


  • New: Added an option (-forcecompress) to UnrealPak that forces all compressed files inside a pak to be compressed, even if the compression results in a larger file size.

  • New: Added memory freezing target platform layout into DataDrivenPlatformInfo (removed from TargetPlatform) so that UnrealPak can get it—although UnrealPak no longer needs it with index freezing disabled.

  • New: Added support for disabling secondary order in UnrealPak to reduce fragmentation in platforms that use delta patching.


  • Crash Fix: Fixed a crash when switching Variant Manager Variants during Standalone Game mode.

  • Crash Fix: Fix a crash when importing a VRED variants file with invalid transform variants data.

  • Crash Fix: Fixed several crash issues around the MDL Importer.

  • Bug Fix: Resolved many issues related to SubLayers when using the USD Stage window.

  • Bug Fix: Fixed SubLayers disappearing when reloading a stage with the USD Stage window

  • Bug Fix: Fixed translucent VRED materials not importing with Translucency Blend Mode override.

  • Bug Fix: Fixed object metadata not importing correctly from Cinema4D scenes.

  • Bug Fix: Fixed behavior of Variant Manager Enum property captures so that the widgets now behave similarly to the Details panel.

  • Bug Fix: Fixed imported animations ignoring source framerate when importing VRED and DeltaGen FBX files.

  • Bug Fix: Fixed an issue where the string shown when dragging an editor Actor onto a Variant Manager Variant.

  • Bug Fix: Fixed animations imported from DeltaGen FBX files behaving incorrectly when multiple animations per Actor are present on the same timeline.

  • Bug Fix: Fixed some Cinema4D files not being imported completely due to allocation issues.

  • Bug Fix: Fixed missing objects and scene hierarchy when importing some Cinema4D scenes.

  • Bug Fix: Fixed an issue where the wrong transformation was applied on some parts. These parts have a transform with a pitch component of +/-90 deg (Rotation around the right axis (around Y axis)). During the import process, a lot of conversions of the transforms are done: World transform to Local transform to World transform and these repeated conversions generate numerical errors. A fix is now in place to avoid this problem.

  • Bug Fix: Fixed additional internal Cinema4D import options being exposed to Blueprint and Python scripting.

  • Bug Fix: Fixed Actors with zero scale being discarded when importing Cinema4D scenes.

  • Bug Fix: Fixed materials properties not being captured when enabling auto-expose on the Variant Manager. Fix additional Actors being captured when dragging Actors to the level with auto-expose enabled.

  • New: Added support for IES light brightness when importing Cinema4D scenes.

  • Bug Fix: Fixed animations not resetting properly when reloading the USD stage from the USD Stage window.

  • Bug Fix: Fixed light/fog color property captures in the Variant Manager not correctly detecting when they differed from the current values.

  • Bug Fix: Resolved an issue with Variant Manager Actor selection clearing when selecting through the editor Actor's components on the Details panel.

  • Bug Fix: Fixed objects not referenced by any IFC project being ignored importing IFC files.

  • Bug Fix: Fixed extra geometry being imported from Cinema4D scenes with Connectors and Atom Arrays.

  • Bug Fix: Fixed texture tags not being propagated from parent Actors when importing Cinema4D scenes with Datasmith.

  • Bug Fix: Resolved incorrect transform when importing VRED or DeltaGen FBX scenes with Actors that have 90 degree rotations on the Y axis.

  • Bug Fix: Applied fixes for materials being imported from Alias Wire files.

  • Bug Fix: Fixed the reimport of GLTF scenes not recognizing asset changes in some circumstances.

  • Bug Fix: Fixed errors when using the Construct Object from Class node with some Variant Manager classes on Editor Utility Blueprints.

  • Bug Fix: Fixes for nested SwitchActors overriding each other's effects.

  • Bug Fix: Fixed DeltaGen SwitchVariants targeting the wrong objects on imported scenes in some circumstances.

  • Bug Fix: Fixed warnings when importing IFC scenes without lightmap generation.

  • Bug Fix: Fixed incorrect SpecularGlossiness to MetalRoughness conversion when importing GLTF files. Also fixes all textures being imported as sRGB mode.

  • Bug Fix: Fixed primitives not animating after their visibility was toggled from the USD Stage window.

  • Bug Fix: Fixed some shader compilation errors in the MDL Importer.

  • Bug Fix: Fixed an issue about duplicates in scene hierarchy from a Revit Datasmith export.

  • Bug Fix: Fixed mesh collapsing mechanism incorporating prims that were invisible, when using the USD Stage window.

  • Bug Fix: Fixed an issue with Rhino import for UV orientation and UV mapping transform.

  • Bug Fix: Fixed reimport of Datasmith materials.

  • Bug Fix: Fixed incorrect location of spawned Actors using Spawn Actors At Location operation.

  • Bug Fix: Fixed an issue with the glTF Importer for importing materials with an ambient occlusion map.

  • Bug Fix: Fixed an issue with the AxF Importer for the import of materials with a period (".") in their filenames. We now provide better error/warning messages.

  • Bug Fix: Fixed rounding errors on LevelSequence section sizes for animations created with the USD Stage window.

  • Bug Fix: Fixed wrong normals orientation on wall entities exported from Revit Datasmith.

  • Bug Fix: Fixed illegal characters in texture name don't survive datasmith export.

  • Bug Fix: Fixed an issuer where Dataprep Merge and Proxy Mesh Operators leave empty mesh Actors in the hierarchy.

  • Bug Fix: Fixed an issue where importing a new LOD on a StaticMesh asset imported with Datasmith would prevent that asset from being reimported.

  • Bug Fix: Fixed an issue during a DatasmithScene reimport where the parent material of a material instance would change and cause incorrect results.

  • Bug Fix: Fixed a bug where reimporting a Datasmith scene with different import options would not have any effect on the imported asset.

  • Bug Fix: Fix importing of linearly-interpolated animations from Cinema 4D scenes.

  • Bug Fix: Fix Relative Location, Rotation and Scale properties not being captured by the auto-expose feature of the Variant Manager when the Actor is manipulated via the viewport handles, in some situations.

  • Bug Fix: Fixed an issue during a DatasmithScene reimport where the user's changes would not be reapplied properly to the lights in the scene after the reimport.

  • Bug Fix: Fixed some situations producing empty dummy rows on the USD Stage window primitive tree view.

  • Bug Fix: Fixed imported DeltaGen materials being shared when they have different AO textures.

  • Bug Fix: Fix incorrect camera transform correction when opening z-up USD stages with the USD Stage window.

  • Bug Fix: Fixed an issue with Rhino that resulted in incorrect use of mapping channel id.

  • Bug Fix: Fixed missing export timing information in datasmith files exported from revit.

  • Bug Fix: Fixed an issue with glTF that resulted in geometry normals imported when degenerate triangles present.

  • New: Enabled Blueprint runtime access to the IsActive function of the Variant asset

  • New: The DatasmithCore module is now available at Runtime.

  • New: We now support "Smooth", "EaseIn" and "EaseOut" curve interpolation modes when importing animations from DeltaGen FBX files.

  • New: Use mesh labels for imported Static Mesh asset names when importing IFC scenes.

  • New: It's now possible to reorder Variant Manager property capture rows.

  • New: The Variant Manager Actor binding selection is now synchronized with the editor Actor selection.

  • New: We now re-use identical Static Meshes when importing Cinema4D scenes.

  • New: Added sRGB flag control for imported Datasmith texture elements.

  • New: It's now possible to rebind Actors to existing Actor bindings on the Variant Manager.

  • New: Added support for loading (and quickly toggling the visibility of) USD purposes on prims imported with the USD Stage window.

  • New: Added options to control purposes to load and view, as well as payload behavior when opening USD stages via the USD Stage window.

  • New: Added color picker widgets for captured color and linear color properties in the VariantManager.

  • New: Auxiliary files will now only be auto-completed on import options dialog for VRED and DeltaGen scenes if they match the filename of the scene exactly.

  • New: VariantManager FunctionCallers now also provide access to the Variant, VariantSet and LevelVariantSets asset.

  • New: Added support for capturing CineCamera properties with the Variant Manager.

  • New: Added additional buttons on the top of the Variant Manager window for adding Actor bindings and property captures.

  • New: Save CAD patch into Static Mesh polygon group for re-use in Geometry tools.

  • New: Added support for animation and track delays when importing DeltaGen animations from FBX files.

  • New: Added sharing of a common USD stage cache between the USD Stage window and Python scripting.

  • New: Enabled support for Shininess textures imported from DeltaGen FBX files.

  • New: We now allow controlling the offset and scale of SubLayer animations from USD Stages (when importing using the USD Stage window) by using the Sequencer and SubSequence tracks.

  • New: Added combo boxes to edit primitive Kind and Purpose on the USD Stage window.

  • New: Improved the logging and display of all errors and warnings emitted from the USD SDK when using the USD Importer. modules.

  • New: Added support for Rhino sub-object materials to be imported.

  • New: Added support for Rhino extrusion render meshes to be imported.

  • New: Added support for undo/redo for most actions when using the USD Stage window.

  • New: Added the PLMXML Importer.

  • New: Added support for Rhino pivot set to geometry bbox center.

  • New: Fixed incorrect names on Subcomponents imported with Datasmith.

  • New: Updated Dataprep operation "Spawn Actors At Location" to support Blueprint based Actors.

  • New: We now support the option to export Revit Structural Steel Connections.

  • New: Added an option to Dataprep for folder importer to use multi-process import to speedup import on multi-core CPUs.

  • New: You can now batch export Revit views.

  • New: Implemented filter by layer for Dataprep.

  • New: Revit can now export proper pivots location on entities.

  • New: Export Revit.DB.FamiliyInstance.Mirrored/Handflipped/Facefliiped as tags.

  • New: Added support for exporting Revit PBR materials.

  • New: Added a TranslateScene method to populate the Datasmith scene.

  • New: Implement an operation to add tags to Actor/component for Dataprep..

  • New: Added an option in Dataprep to implement a filter for Actors based on the number of triangles and/or vertices.

  • New: Added an option in Dataprep to implement an operation to add meta-data to asset/Actor/component.

  • New: Added support for importing points from Rhino models.

  • New: Added Entity Tags to Rhino.

  • New: Implemented "Randomize Transform" operation for Dataprep.

  • New: Implemented consolidate operation for Dataprep.

  • New: Added support for the MDL Importer on Linux.

  • New: Added an option to Rhino import that lets you choose on import whether to have Datasmith tessellate all parametric surfaces for you or whether you want to reuse triangular meshes previously created by Rhino and stored in your Rhino scene.

  • New: Reworked asset preview widget to become more consistent with the Level Editor's Content Browser.

  • New: Added the ability to hide/show Actors to the scene outliner in the Dataprep Editor.

  • New: Export Pipe/Duct Insulation and Lining in correct hierarchy.

  • Improvement: We redid how Variant thumbnails are stored in the Variant Manager allowing setting thumbnails from file and fetching. thumbnails via Blueprint at runtime. Also fixes bugs with thumbnails sporadically disappearing.

  • Improvement: Improved Rhino import to avoid cracks in the mesh.

  • Improvement: Improved performance of datasmith CAD scene save/reload.

  • Improvement: Improved performance of some Datasmith reimport.

  • Deprecated: Previous versions of VRED and DeltaGen FBX importers have had their Blueprints cleaned up. To upgrade, scenes that used those Blueprints need to be imported again, or those old Blueprints need to be copied over from a previous Unreal Engine version.

  • API Change: The python import API for Datasmith now reflects the internal processing. To now access the scene representation, you can call "translate_scene" method on the scene, and the workflow looks like this:

    • call construct_datasmith_scene_from_file()

    • Edit options...

    • call translate_scene()

    • Edit scene...

    • call import_scene()

  • API Change: The DatasmithCore module has been moved from "Engine\Source\Developer\Datasmith\DatasmithCore" to "Engine\Source\Runtime\Datasmith\DatasmithCore".



  • Bug Fix: AutomationTool now looks for the IsBuildMachine environment variable set to 1 to set an implicit -buildmachine argument, rather than inferring it from uebp_LOCAL_ROOT being set. The uebp_LOCAL_ROOT variable is set at runtime, which was causing the IsBuildMachine flag to be set incorrectly for child instances.

  • New: Added support for AutomationTool scripts when using foreign projects, and for game projects to output binaries under their own project directory. When compiling *.Automation.csproj files, the $(EngineDir) property will be set to the appropriate engine directory, allowing the project to resolve assembly references to the correct location.

  • New: Refactored ini key stripping in UAT to be driven by config settings—exposed in the project packaging settings. Added the ability to set a list of config sections to strip while staging.

  • Improvement: Improved startup time when running the BuildCookRun command by lazily constructing metadata for every project in the branch.


  • New: Added option for building the installed engine with VS2019 instead of VS2017:

    • -set:VS2019=true


  • Crash Fix: Fixed UnrealBuildTool crashing (rare) on launch.

  • Bug Fix: Fixed issues where overriding the Visual Studio version from the command-line would not be used in targets, resulting in errors when an option like setting the compiler version was also used. Some command-line arguments are now passed to target creation (specifically, Visual Studio version). Also fixed so that HololensTarget is actually getting configured from setting sources, including command-line and BuildConfiguration.xml which we added attributes to match how Windows targets can be configured.

  • Bug Fix: Fixed Rider projects failing to generate when a program was defined in the game projects folder—this is similar to how VS project generation works.

  • Bug Fix: Added the engine version as a dependency for checking that the module rules assembly was up to date, fixing issues where a new UBT version can attempt to use an old version of the modules rules assembly.

  • Bug Fix: Fixed issue with installed projects trying to use VSCode and getting incorrect IntelliSense for engine source code.

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

  • Bug Fix: Fixed issue in UBT *.ini parsing not combining multiple escaped newlines into a single line.

  • Bug Fix: Fixed log file being written to the Engine directory (even in installed builds). The log is now written to AppData/Local on Windows.

  • Bug Fix: PVS Studio intermediates are now stored in a separate directory to avoid cloberring intermediates for regular builds.

  • Bug Fix: The makefile is now invalidated if resource files or other leaf prerequisites are removed.

  • Bug Fix: Read-only files are now removed when cleaning a target.

  • Bug Fix: Any targets that can't be built on the current host platform are ignored when generating Intellisense data for project files.

  • Bug Fix: Prevent writing compiled assemblies to installed engine directory. Write them to the AppData folder instead.

  • Bug Fix: The C++ standard version is now propagated to the generated project files in order to use the correct environment for intellisense.

  • Bug Fix: Fixed missing UAT/UBT log output on Mac. Standard macros set through the DefineConstants property (for example, "TRACE") were being overwritten by MonoCS, causing TraceLog() function calls to be compiled out.

  • Bug Fix: - Removed extra Engine directory under the UE4 project above the Platform extension directory.

  • New: Added Thread_UseAllCpuGroups to UnrealBuildTool config that enables UBT to use both CPU groups on high-core systems (such as 64-core ThreadRippers).

  • New: Visual Studio solution files and project files are now generated deterministically by UnrealBuildTool to reduce the frequency of solution and project reloads.

  • New: Improved IncludeTool error output when encountering unbalanced curly braces or conditional preprocessor macro blocks.

  • New: Added option to build a list of plugins while not enabling them per target.

  • New: The set of target configurations included in generated project files can now be configured via BuildConfiguration.xml.

    • ProjectFileGenerator/Configurations

  • New: Visual Studio 2019 is now the default compiler and IDE on Windows.

  • New: Added a BuildConfiguration setting for forcing UBT to be built in debug configuration.

    • VCProjectFileGenerator/bBuildUBTInDebug

  • New: Single file compile now works correctly with generated *.cpp files.

  • New: JetBrains Rider is now supported as an IDE from the editor and when generating project files.

  • New: An explicit error will occur if engine modules are out of date when launching the editor, rather than UBT trying to build them and triggering sharing violation errors.

  • New: Added an explicit check for output paths being longer than MAX_PATH on Windows.

  • New: Added support for different analysis modes in the PVS toolchain. Defaults to just using general analysis, but other options can be configured by setting TargetRules.WindowsPlatform.PVS.ModeFlags or by setting TargetRules.WindowsPlatform.PVS.UseApplicationSettings = true to read from the PVS config file.

  • New: A warning is now output if any intermediate path is > 200 characters under the Unreal Engine root directory, to trap MAX_PATH issues running the engine from longer base directories.

  • Deprecated: Generating project files by passing -2017 or -2019 is discouraged—this is due to the lack of visibility this provides to other engine tools that generate project files.


  • Bug Fix: Fixed a problem with auto-update not working correctly if the application is run directly (such as via a pinned start menu icon).

  • Bug Fix: The editor is built with the selected project file even when running a content only project. This ensures that any non-default plugins are enabled.

  • Bug Fix: The latest checked-in version of the UGS config file is now used to determine sync filter and stream settings, rather than the local version.

  • New: Added support for parallel syncing. UGS now internally spawns multiple threads to sync on, and attempts to distribute sync commands evenly between them. Two threads are used by default, but this value can be adjusted from the Options > Application Settings menu.

  • Bug Fix: Fixed syncing of individual changes ignoring selected sync filters.

  • New: By setting the Enable=false parameter on a custom sync category entry in the project config file, sync categories can now be configured as disabled by default.

  • New: The recent projects list is now capped at 10 entries.

  • New: Each project tab now has a color tint matching the configured color tint for the editor frame in that branch.


  • Bug Fix: Exposed the new 'UncookedOnly' UnrealBuildTool module type to UnrealHeaderTool and added 'PKG_UncookedOnly' as the corresponding package flag.

  • Bug Fix: Fixed skipping over PURE_VIRTUAL macros in UnrealHeaderTool.

  • New: To support UnrealHeaderTool error reporting, enabled exception support when building with Clang for Windows.

  • New: Removed requirement for "= true" on AllowPrivateAccess metadata tag.

  • Improvement: UnrealHeaderTool no longer exports Z_Construct_UFunction declarations.


  • Bug Fix: SingleFileCompile mode now works when compiling with PVS static analysis.

  • Improvement: XAML changes to the UnrealVS batch builder panel:

    • Columns are now resizable

    • Label colors come from VS themes and are visible with the dark theme

    • Alignment fixed and dead space reduced


  • Crash Fix: Fixed an issue where DisasterRecovery crashed if the recovery session database could not be open or was corrupted. Fixed an issue where DisasterRecovery was freezing the Editor if the new session database could not be created successfully.

  • Crash Fix: Fixed a crash that occurred when undoing the painting on a Skeletal Mesh.

  • Crash Fix: Fixed a crash that occurred on certain files when using the speed tree importer. Mainly it occurred with those that had multiple assets with the same name.

  • Crash Fix: Fixed a crash occurring with skeletal mesh bake material, and incorrect ID remapping.

  • Crash Fix: Disabled input in Level Editor Viewports when a map is being torn down. Speculative fix - the call stack in the bug looks like we think we have a valid actor pointer, but it is probably getting garbage collected. The log is outputting level unload messages right before the crash.

  • Crash Fix: Fixed a crash that occurred when a selected spline point was removed from the Details panel.

  • Crash Fix: Fixed a crash that happened when compiling a running Editor Utility Blueprint that contained a Details view. Rebuilding the Details view widget after a compile is now a synchronous operation. Compiling multiple times caused the underlying widgets to be cleaned up on the main thread from the compile. The asynchronous Details view task created widgets that were then destroyed by the main thread's compile before finishing the task.

  • Crash Fix: Crash fix for trying to open the Asset editor for an invalid Asset.

  • Crash Fix: Fixed a crash occurring when a user deleted an actor from the level.

  • Crash Fix: Fixed a crash occurring in the Static Mesh Editor after copy-pasting primitives.

  • Crash Fix: Fixed a crash occurring during garbage collection when UObject references a SAssetViewItem().

  • Crash Fix: HISM: fix crash when manually setting a instancing random seed to zero.

  • Crash Fix: Fixed a crash occurring with SPropertyEditorInteractiveActorPicker.

  • Crash Fix: Fixed a crash occurring when saving over an existing level and pressing the ESC key.

  • Crash Fix: Fixed a random crash observed when enabling or disabling disaster recovery during a Multi-User session because 'compiled in' or 'memory only' packages were hot-reloaded.

  • Crash Fix: EditConditions no longer crash when their parent object gets deleted from under them, such as when editing a Blueprint CDO and then compiling.

  • Crash Fix: Fixed a crash that occurs when trying to get SlateApplication in ShouldThrottleCPUUsage if called from a commandlet.

  • Crash Fix: Fixed a crash that occurred after clicking launch if failed and message log was open to 'Packaging Results'.

  • Bug Fix: Fixed the Disaster Recovery to prevent prompting the user to recover a session only containing non-recoverable activities (Multi-User activities).

  • Bug Fix: Editor now logs an error if there is an issue importing a collision model.

  • Bug Fix: Fixed an issue occurring when a static mesh is re-imported with the "Combine Mesh" option off. If the FBX has many different static meshes, it can pick the wrong mesh when re-importing one of them.

  • Bug Fix: Fixed an issue with custom LOD workflow; the Insert LOD into the base mesh function was not updated to work with the latest skeletal mesh build refactor.

  • Bug Fix: Made FBX Import accessible using Blueprint and Python.

  • Bug Fix: Fixed some issues in the proxy merge tool. Static parameters of materials instances are now properly used. In some cases, the tool would only use the first section of a mesh when backing the texture of the merged mesh.

  • Bug Fix: Made sure post-build refactored skeletal mesh has its dependent LODs regenerated after importing the base mesh.

  • Bug Fix: When building a skeletal mesh, Editor now forces the Tangent and Normal options to True if the source data does not have the tangents or normals data.

  • Bug Fix: The mesh click tool now uses hit proxies to find initially clicked Actors.

  • Bug Fix: Fixed an issue in the Node Graph where a deferred Zoom to Fit would be lost due to deferred UI updates.

  • Bug Fix: Added opacity texture to FBX Material instance imports. When importing an FBX, you have the option to import Materials as instances of a base Material, as opposed to creating new Material Graphs for each FBX Material. This change adds the option to import anything connected to the TransparencyColor.

  • Bug Fix: Added support for content plugins in content-only projects. These were not being staged due to a unique target receipt for the project being generated.

  • Bug Fix: When importing animation from FBX files, Editor now only merges Anim layers as needed. Unreal Engine requires all animations be merged to a single layer, so you cannot skip the merge entirely. This change only performs the merge when necessary, keeping the curve fidelity as long as it is part of an AnimStack with a single member. FbxCurveAPI is now using the same code as the FBX animation curve importer. The curve import now supports "tangent break" and "User tangent". Removed bad unit conversion for curve tangent.

  • Bug Fix: Fixed an issue with HLOD Volumes and meshes' offset from origin.

  • Bug Fix: The paint tool and current/next texture is turned off if there are not any paintable textures on the mesh.

  • Bug Fix: Fixed skeletal mesh conversion so that it uses the LODMaterialMap when converting to a static mesh.

  • Bug Fix: Fixed the mesh painting tools to allow navigation if the user is not clicking or painting on a paintable component.

  • Bug Fix: Fixed an issue that prevents shadows from being rendered for dynamically-built static meshes. Added an option to build simple collisions when building static meshes.

  • Bug Fix: Fixed an issue with spline component visualizer regression, which was preventing interaction with spline points in certain circumstances.

  • Bug Fix: Fixed an issue where LoadLevelInstance location offset was not affecting the BSP geometry in a dynamically loaded level. Now a level's ModelComponents also have the same transform applied. This fixes their rendering, physics and static lighting.

  • Bug Fix: Fixed an issue with propagating vertex color to a custom LOD.

  • Bug Fix: Editor no longer tests against zero; instead it tests against nearly zero when computing the tangents for skeletal mesh.

  • Bug Fix: Added missing shutdown/tool ending code to Mesh Paint tools and Mesh Paint mode.

  • Bug Fix: Added a configurable threshold for Morph Target position delta. Also makes the other threshold available in the skeletal mesh build settings.

  • Bug Fix: Fixed the static mesh re-import override of complex collisions.

  • Bug Fix: The asset registry tags are now restored properly after a static mesh re-import.

  • Bug Fix: Moved RawSkeletalMeshData into a private uasset in order to reduce the skeletal mesh asset size when there are a lot of morph targets.

  • Bug Fix: Class View no longer loses selection when losing focus.

  • Bug Fix: Fixed a bug where combo boxes could affect the wrong field when choosing the type for map variables.

  • Bug Fix: Removed Editor Modes are also removed from the set of default modes for a mode manager. Speculative fix for an issue where Activate Mode was attempting to activate an invalid Editor Mode. When modes are destroyed, they may not be removed out of the default modes for the manager, which may cause an Activate after a deactivate to fail.

  • Bug Fix: Mesh Texture Painting no longer allows painting on source textures with more bytes per pixel than the created render target data.

  • Bug Fix: When using the "asset import tasks" in Python or in Blueprints, if you import multiple assets, the result can now return more than one asset per factory import.

  • Bug Fix: Fixed an issue with starting the editor with "-vulkan".

  • Bug Fix: Fixed verbosity of Multi-User/DisasterRecover endpoint discovery/timeout to prevent spamming the log.

  • Bug Fix: Fixed transaction buffer being cleared when hiding Levels.

  • Bug Fix: Updated the look and feel of the lock icons displayed on top of an Asset in the Content Browser when a user in a Multi-User session locked the asset.

  • Bug Fix: Fixed some sub-optimal UV layout packing on some geometries.

  • Bug Fix: Perforce Plugin: Use -P4Passwd cmd argument value when connecting to Perforce.

  • Bug Fix: HideCategories on components in an actor now correctly hides the categories when the actor is selected.

  • Bug Fix: Fixed dynamic tool menu entries appearing at the end of a section.

  • Bug Fix: The New Project dialog no longer shows a second redundant Open button.

  • Bug Fix: Updated session front end to properly hold on to log messages, even if they are currently filtered out.

  • Bug Fix: Fixed a bug with HighResScreenshot arguments being parsed incorrectly.

  • Bug Fix: Fixed validity checks not firing anymore and displaying an error when creating/removing project files on disk with the New Project dialog wizard open.

  • Bug Fix: Fixed an issue where Editor 'SessionSummary' analytic event was not being sent.

  • Bug Fix: The AttachToActor menu is no longer allowed to shrink.

  • Bug Fix: "Snap Pivot to Vertex" now works by holding Alt+V.

  • Bug Fix: Fixed a memory leak in SOutputLog.

  • Bug Fix: The AssetEditorSubsystem now handles windows again, fixing "Restore Open Assets Tabs on Restart".

  • Bug Fix: Fixed an ensure that was generating with the input binding editor panel.

  • Bug Fix: Added a message when there are no Recent Projects available, because it was unclear what was wrong when there were none showing.

  • Bug Fix: Fixed source control errors occurring during rename of file open for add.

  • Bug Fix: Fixed issues where a temporarily set realtime state is saved between editor sessions causing users to be unaware that their viewport is not realtime. Shutting down the editor during PIE or remote desktop were two such cases.

  • Bug Fix: The Component menu in the Actor Details view now filters out allowed classes based on UClassViewerSettings AllowedClasses.

  • Bug Fix: Fixed analytics to emit the Editor SessionSummary event using the correct AppId, AppVersion, SessionId and UserId when emitted from another instance or process.

  • Bug Fix: When you add an entry to an array in a component that is being edited in a locked Details view, it no longer generates asserts.

  • Bug Fix: Fixed an issue where disaster recovery remote endpoint was not re-registering with MessageBus UDP transport layer restarts or auto-repairs.

  • Bug Fix: Added tooltips to Save As error labels.

  • Bug Fix: Fixed VS accessor to make sure source files are placed in the precise module that was selected, and not just a module beginning with the same name.

  • Bug Fix: HideCategories on components in an actor now correctly hides the categories from the Details panel when the Actor is selected.

  • Bug Fix: Font editor monitor DPI scale fixes.

  • Bug Fix: Edit conditions no longer show themselves as duplicate inline toggles when shared between multiple properties.

  • Bug Fix: Fixed Disaster Recovery plugin to prevent reapplying changes that were discarded during the session.

  • Bug Fix: Disable "Hide Folders Containing Only Hidden Actors" for now.

  • Bug Fix: Unregister all delegates when shutting down FEditorSessionSummaryWriter. This is necessary because Shutdown() is called even when the app is not shutting down, but rather when we are only shutting down analytics such as when toggling the sending of analytics in the editor settings.

  • Bug Fix: Set texture render target 2d's default size to 1x1 so that reset to defaults tooltip will say 1 instead of 0.

  • Bug Fix: Changed utility widgets to rebuild on compile instead of on reinstance, because the BlueprintReinstanced delegate fires when unrelated Blueprints are reinstanced as well.

  • Bug Fix: Empty implementations of IPropertyTypeCustomization::CustomizeHeader() will no longer break containers by hiding the header row of a customized struct when the struct is viewed in a container.

  • Bug Fix: Game default map is now correctly set to Minimal_Default when creating a project with Include Starter Content set.

  • Bug Fix: Typo fix: changed PersistenWorld to PersistentWorld.

  • Bug Fix: Fixed a bug where the 'Cancel' button sometimes couldn't be clicked on popup windows.

  • Bug Fix: Fixed issue where the color picker wouldn't update color properties on components after the mouse was released for the first time.

  • Bug Fix: Fixed an assertion occurring when clearing Disaster Recovery widget search field entry.

  • Bug Fix: Source Control: Unattended package save now handles adding new files to source control in more situations.

  • Bug Fix: We now use the display name for asset thumbnails.

  • Bug Fix: Fixed the Multi-User active session widget so that it displays the client location as "N/A (-game)" if the client is in -game, because clients in -game do not emit their presence/level.

  • Bug Fix: When you create a Blank project with starter content enabled, it now opens the Minimal_Default map.

  • Bug Fix: Memory stomp detection in FTickableEditorObject.

  • Bug Fix: Moving a folder with a numeric name (eg. "1", "1234") to another level in the hierarchy no longer causes an infinite loop.

  • Bug Fix: Duplicate names for preview assets should no longer appear on the "Close Asset Editors" dialog. # No longer add preview type "assets" which return false to IsAsset() call as opened assets.

  • Bug Fix: Fixed uncommon scenario which caused some assets to be duplicated when renaming.

  • Bug Fix: We now clamp the Niagara parameters menu to 700 to avoid a flickering bug.

  • Bug Fix: Trying to reload an in-memory-only no longer unmarks it as dirty.

  • Bug Fix: Fixed an issue where pasted arrays would not perform deep copies of instanced objects, because children properties were not being rebuilt.

  • Bug Fix: Combo boxes for enum bitflags will no longer display enum values that have been marked with UMETA(Hidden).

  • Bug Fix: The Class Viewer now scrolls to the selected item on refresh.

  • Bug Fix: When starter content is not available because the user's FeaturePacks folder is missing or empty, the option will not be selected by default in the New Project settings panel and then disappears when trying to reselect it.

  • Bug Fix: Fixed StaticMeshActor losing the root component scale when placed with Surface Snapping enabled in Editor Viewport. # The inverse of the entire matrix was being applied for surface rotation snapping. This caused the scale to be reduced when the value of the transform was used in PlaceActor to multiply with the default transform information.

  • Bug Fix: New Project wizard now correctly lists a Blank project when the Templates folder has not been synced.

  • Bug Fix: Fixed an issue where GUIDs wouldn't be generated properly when they belong to a component attached to a child BP class.

  • Bug Fix: Fixed an issue where the object selector UI was not working if the object was not loaded and had the same name as another object, such as 'Texture'.

  • Bug Fix: Updated package autosaver to suppress the restore dialog when running in unattended mode.

  • Bug Fix: - Added a small version of map check image brush so it shows up properly when using small icons.

  • Bug Fix: Selected text is discernible in the Output log with default settings. Reverted the default setting for the selected text background color to what it was before.

  • Bug Fix: Fixed the Disaster Recovery logs that could spam many 'lost server', 'discovered server' or 'timeout' logs.

  • Bug Fix: Eliminated the need to archive a Disaster Recovery session after a crash or normal exit to ensure the recovery system exit and release all resources in a timely manner, ensuring the crashed session is immediately available for restoration on Editor restart. Added routine to clean up temporary files left over by Disaster Recovery in the project intermediary folder after a crash.

  • Bug Fix: Fixed Multi-User/DisasterRecovery client not canceling in-flight connection task when Connect()/Disconnect() were called in a very short interval.

  • Bug Fix: Fixed the Disaster Recovery service using a dangling reference when unmounting a repository. Fixed the Disaster Recovery service to unregister all request handlers on shutdown. Fixed the Disaster Recovery service to report a repository as mounted if the requesting client already mounted it in a previous request. Fixed Disaster Recovery service to clean up its repository database when a repository doesn't exist anymore on disk.

  • Bug Fix: Fixed potential Disaster Recovery service name collision on the network that could happen if two Editor instances on two different machines get the same Editor process ID.

  • Bug Fix: PIE sessions which launch a new standalone window no longer double render debug safe zones and all PIE options are more consistent with handling r.DebugSafeZone.XXXX cvars.

  • Bug Fix: Reordered instanced components are no longer set to transient and disassociated from the current world.

  • Bug Fix: With SPropertyEditorNumeric, if the value has changed using a slider then set the value without flags to ensure that all the callbacks are called.

  • Bug Fix: Now the unique name is created from the same outer the object will be spawned into.

  • Bug Fix: Stylus input plugin usage of Windows Ink API has been changed, to prevent an occasional deadlock that occurred when moving a mouse or stylus between open windows in the editor.

  • Bug Fix: Fixed an issue where actor picker mode's tooltip was only present on first use.

  • Bug Fix: Fixed analytics to compute session duration and idle time consistently.

  • Bug Fix: Fixed an issue where Place Actor was not showing up in the Level Editor viewport context menu.

  • Bug Fix: Changed the delta on the Number of Players slider so it does not get stuck on the max value.

  • Bug Fix: Changed FAssetEditorToolkit to log invalid saved Assets instead of crashing, because individual Asset editors may not be checking for Asset validity.

  • Bug Fix: Now the mesh adapter is checked to make sure it is valid before using it for mesh paint.

  • Bug Fix: Fixed an issue where Lightmap UV channel was not set to correct index after import.

  • Bug Fix: Fixed an issue on Linux where the EditCondition on a UProperty would sometimes not evaluate properly.

  • Bug Fix: FSoftObjectProperty now correctly respects CanEditChange for properties when edited from the Details panel.

  • Bug Fix: Fixed an issue where Message Bus UDP Messaging static endpoints were not being properly sent when the unicast endpoint was forced to a specific interface. Modified the Multi-User Server launch to bind a different port on the unicast endpoint if the port of the editor is set when it transfers its settings to it. Also added a way to explicitly choose a Multi-User server port for its unicast endpoint when launching it from the editor.

  • Bug Fix: Fixed an issue that occurred during a FBX Skeletal Mesh import, where custom properties on imported skeletons would be applied on unrelated skeletal meshes.

  • Bug Fix: Fixed an issue where the FBX import option "Material Search Location" was sometimes being ignored.

  • Bug Fix: Fixed an invalid material baking result that occurred when "Reuse Mesh Lightmap UVs" is used with a mirrored (negative scale) mesh.

  • Bug Fix: Fixed a race condition in Editor analytic code. Fixed an issue with idle time returned by Editor analytic when Slate did not register any user interaction since the Editor started.

  • New: Added self-registering undo/redo client Reduces boilerplate for the common case where objects register on construction and unregister on destruction.

  • New: Message dialog text and results are now logged.

  • New: Added text verification to SEditableTextBox, similar to SInlineEditableTextBox.

  • New: Added system to whitelist commands.

  • New: FSlowTask improvements:

    • ShouldCancel now ticks the UI from time to time (only on the game thread, max 5 times per second) so that the Cancel button interaction can be checked without artificially calling EnterProgressFrame.

    • Added checks to make sure that EnterProgressFrame and ShouldCancel are only called from the game thread.

  • New: Perforce source control provider now detects login expiration and displays error status in level editor toolbar.

  • New: Niagara Override Parameters are now searchable in the Actor Details view.

  • New: Calls to OpenMsgDlgInt now use FMessageDialog::Open instead.

  • New: Fixed an issue where a long file system scan by DDC caused the system to hang when the Editor was shut down.

  • New: Added a virtual CreateTitleRightWidget() method to SGraphNode, to allow for adding widgets to the far right of the title in a graph node.

  • New: Updated the Tool menu to use a generic blacklist filter.

  • New: Plugins can now disable tabs in the tab manager.

  • New: Added support for command line files to be found inside project, and project plugins' directories.

  • New: Added option to constrain tool menu height.

  • New: When using UI scaling on a high DPI monitor, lines to pins on nodes outside the current viewport now draw correctly.

  • New: Improved the performance of proxy mesh creation.

  • New: When the engine detects that an abnormal shutdown has occurred, we now spoof a crash report and send it from the CrashReportClientApp. "Abnormal shutdown" defined as: the shutdown did not appear to use a known exit path.

  • New: TransactionSystem: Exposed SnapshotTransactionBuffer to Blueprint as SnapshotObject.

  • New: Multi-User: Display which packages are the culprit when failing to join a Multi-User session due to in-memory changes (dirty packages).

  • New: Improved disaster recovery widget:

    • Added 'Show Unrecoverable Activities', 'Show Package Activities' and 'Show Transaction Activities' to the View options.

    • Prevented the 'Recover Through' button from being overlayed on top of 'unrecoverable' activities.

    • Improved the tooltips for 'Recover All' and 'Recover Through' button to make it clear what is recovered and what is not.

  • New: Improved material baking performance.

  • New: Added support for "view modifiers" for editor viewports. These are delegates that allow plugins and other 3rd party code to affect the transform of the viewport. Removed the call to UpdateViewForLockedActor in CalcSceneView because that violated the expectation that this method was only computing some view information based on the current transform/FOV/so on.

  • New: Multi-User: adjusted base transaction transient property filters path in config files.

  • New: Improved the performance of convex hull computation.

  • New: EditCondition now supports bitflags that use enums. Example: MyIntProperty & MyEnum::Flag (and negation by tacking on == false).

  • New: Modified AsyncTaskNotification to add a prompt state, along with a hyperlink for slate-based notification. Added a function to pulse basic notification with a specified glow color while they are pending.

  • New: Multi-User: Added a setting for a different connection validation mode, allowing for a prompt on connection instead of hard failure. Source Control validation now checks if checked out files are actually modified, instead of just being checked out; if validation mode is soft, Multi-User connections are allowed to proceed. There is now hot reload for dirty packages on connection.

  • New: Multi-User: Exposed Multi-User Default Connect to Blueprint along with a mean to query connection errors.

  • New: Added a parameter to thumbnail renderers' Draw function, so that we can instruct them whether to clear the render target or not. This is for fixing thumbnails that render multiple sub-thumbnails to the same render target.

  • New: Added a sine wave deformer to the DisplaceMeshTool.

  • New: Added Perlin noise option to the DisplaceMeshTool.

  • New: CoreDelegates::FCrashOverrideParameters now includes values for SendUsageData and SendUnattendedBugReports. These values are set when the values change in UAnalyticsPrivacySettings and UCrashReportsPrivacySettings respectively.

  • New: Improved the performance of shader compilation when using Incredibuild.

  • New: Added handling of UObject pointers to edit conditions to enable equality, inequality and nullptr checks of UObject pointers in the form of: MyProperty != nullptr, or MyProperty == OtherProperty.

  • New: Added an option to set a custom StarterContent feature pack in a template. This is to allow different sets of starter content to be specified for different project types. The New Project wizard will always create an empty Content directory.

  • New: Optimized AssetView filtering for DataTables.

  • New: Updated actor selection Blueprint nodes to call modify on the selection state, allowing them to be picked up by active transactions.

  • New: Updated "Prompt When Adding To Level Before Checkout" to use cached source control state, instead of running a fresh query each time an actor is added.

  • New: Hidden settings in the new project wizard will now write no values to the config file. This puts more burden on the template writer, but should not cause any template settings to be overwritten by hidden settings.

  • New: EditorViewportClient now supports temporarily overriding the current EngineShowFlags, to temporarily disable rendering features like TAA, Motion Blur, and so on within a specific EdMode.

  • New: Play-In-Editor failures due to invalid credential indexes now give better error logging, instead of a generic "Login Failed" which was easily confused with username/password issues.

  • New: Raised the minimum slot height of the Actor Details panel from 20 to 80 to reduce overlap.

  • New: Multiple improvements to the "View Mode" menu of the Viewport, including a feature request from JIRA UE-81469. Most of these improvements are related to the submenu of "View Mode" called "Buffer Visualization":

    • Issue 1/6 (the JIRA itself): The "View Mode" UI displays as its title the name on the selected category or subcategory chosen by the user (or otherwise the default one). However, this behavior was not consistent across different categories. For the "Buffer Visualization" category, if any of its subcategories were chosen, "View Mode" was only displaying "Buffer Visualization" as title, rather than the particular subcategory chosen. This was not the case for the other 2 categories ("Level of Detail" and "Optimization Viewmode"). Solution 1: The displayed name of "View Mode" is now forced to be the exact chosen (sub)category, regardless of the category ("Buffer Visualization", "Level of Detail", or "Optimization Viewmode").

    • Issue 2/6: The name displayed as the selected "View Mode" was being assigned in parallel with the displayed name of the buttons representing each (sub)category. This resulted in some categories and subcategories having different names in the buttons than in the "View Mode" label itself. The behavior was also not consistent across the different menus inside "View Mode". Solution 2: The displayed name of the chosen label is forced to match the displayed name of the button itself.

    • Issue 3/6: "Optimization Viewmodes" was the only category without an icon. Solution 3: Icon assigned to one of the icons of its subcategories. In particular, the one from "Quad Overdraw".

    • Issue 4/6: "Buffer visualization" was the only category without a proper tooltip, it was displaying a FName, rather than a more human-readable FText. Solution 4: Assigned its tooltip to the FText field of DisplayedName.

    • Issue 5/6: When the subcategory "Overview" (of "Buffer Visualization") was chosen, the displayed name on each individual subwindow that are generated corresponded with limited FNames (rather than a more human-readable text). Solution 5: Assigned their value to the FTexts corresponding to their DisplayedName value.

    • Issue 6/6: Inside the possible Buffer Visualization Materials, LightingModel and ShadingModel are being used interchangeably all over the code, leading to mismatches and confusion for the user. For example, UMaterialInterface and UMaterial use LightingModel, while FBufferVisualizationData (thus FBufferVisualizationMenuCommands and FEditorViewportClient) use ShadingModel.

  • New: Disaster Recovery now has improved scalability, memory footprint and performance.

  • New: Changed the default behavior of the Interactive Tools Framework to auto-accept instead of auto-cancel when the user is swapping away from tools.

  • New: The mesh paint brushes now adapt to the size of the selected mesh.

  • New: Added a warning that displays when passing the wrong type of option class during FBX automated import, instead of silently ignoring the given options.

  • New: When reimporting a FBX file and a material conflict occurs, the user has the option to "Reset to FBX" to resolve the conflict. The conflict resolution was UI not available during automated reimport, so we added a new option called "bResetToFbxOnMaterialConflict" to the automated import. When enabled, any material conflict that may occur during an automated reimport will apply the "Reset To FBX" behaviour automatically.

  • New: We have fixed a number of issues with mouse high-precision mode behavior over Remote Desktop.

  • New: Added the "Res=1280x720wf" format command line argument to set window resolution in a compact way.

  • New: Volumetrics: Updated SubUVMaker by adding the ability to export EXR textures to disk. Made the Blueprint capable of being edited during simulation, which will trigger a recapture using the new settings automatically.

  • New: Volumetrics: Updated SubUV Maker tool to support Motion Vectors, Baked Lighting, Temperature, Normals. Flipbook_MotionVectors Function.

  • New: Volumetrics: Voxelization BP now supports any Actor type as long as it has a MeshComponent. Included examples for using meshes with WPO as forces.

  • New: Added OnEnginePreExit() delegate to core delegates. This delegate is fired off before closing out the AssetTools, WorldBrowser and AssetRegistry modules, for handling shutdown tasks that would require these.

  • New: You can now add metadata to FString and FName UPROPERTYs; this metadata specifies a dynamically called function to get the options that are available to the user in a Details panel.

    meta=(GetOptions="FuncName"), UFUNCTION() TArray<FString> FuncName() const;
  • New: The Disaster Recovery Hub UI is now accessible from the Editor menu by selecting Window > Developer Tools > Recovery Hub where you can explore, import and inspect recovery sessions. Added a Disaster Recovery user setting to configure the root session repository folder (folder containing the recovery sessions). Added a Disaster Recovery user settings to configure how many 'recent' and 'imported' sessions should be kept in the history.

Content Browser

  • Bug Fix: Fixed ensure that occurred while scrolling in the Content Browser.

  • Bug Fix: Columns in the Content Browser's column view can no longer be resized until they are uneditable.

  • Bug Fix: Relaxed project name assumptions when estimating the cook length for an asset.

  • Bug Fix: Fixed an issue where thumbnail editing mode was not responding to mouse drags.

  • Bug Fix: Fixed IsValidFolderPathForCreate so it uses the path on disk for maximum length check.

  • Bug Fix: We now hide dynamic collections from the reference viewer list, as they require frontend filters.

  • Bug Fix: Updated "Submit to Source Control" to include plugin content.

  • Bug Fix: Pressing the delete key now deletes a folder when the folder sources view is focused, even if assets are also selected in asset view.

  • Bug Fix: Text properties now write as basic strings when exporting a Data Table to CSV for diffing.

  • Bug Fix: Fixed an isee where Show Engine Content was a disabled option in debug builds.

  • New: Added "Remove All But This" context menu option to the content browser filters list.

  • New: Fixed a delete pop-up that pointed to the last selected folder after the folder was deleted in the content browser.

  • New: Split asset path validation into two separate checks, to provide clearer messaging to users on length rules.

  • New: Added a "docked" mode for the collections view.


  • Bug Fix: Fixed cook non-determinism in UFoliageTypes.

  • Bug Fix: Fixed foliage non-deterministic cooking by removing unused UProceduralFoliageSpawner::bNeedsSimulation that can change depending on the cooking order.

  • New: Fixed HISM Cluster Tree display not taking into account actor's transform (reported in a UDN).


  • Bug Fix: Fixed a crash that occurred after moving a Landscape Actor to another Level.

  • Bug Fix: Fixed a bug that occurred for NaN in Landscape when zero scale is set. Also clamped bounds to avoid hitting a check.

  • Bug Fix: Landscape now obeys the Render in Main Pass setting correctly.

  • Bug Fix: Previously, there was a problem with bad index buffer generation on mobile landscape. Vertex Key generation was not unique for a 255*255 grid. Removed this, and replaced it with a simpler array lookup. Also removed its use as a TMap key.

  • Bug Fix: There was a copy-paste typo that broke landscape tessellation in 4.24. This is now fixed.

  • Bug Fix: Fixed a crash occurring when using RVT and tessellation together in a landscape material.

  • Bug Fix: Fixed an issue with FTriangleRasterizer DrawTriangle division by zero case.

  • Bug Fix: Fixed a SimpleCollision null DominantLayer crash.

  • Bug Fix: Reimport Tiled Landscape Layer Weightmaps now has the same behavior as Import (no more forcing a normalization of layer weightmaps).

  • Bug Fix: Fixed an issue with landscape simple collision returning incorrect physical material.

  • Bug Fix: Fixed a crash that occurred when entering Landscape Mode with Mirror Tool enabled and mirror point set to 0,0 but without any landscape.

  • Bug Fix: Fixed lost landscape data when opening/making visible a level with non-edit layers data only while the main landscape level has been converted to edit layers : moved copy from old data to layers in PostRegisterAllComponents, which is executed upon making the level visible. Also fixed the logic for detecting data conversion is needed and fixed a crash when cleaning up weightmap layer allocations.

  • Bug Fix: Fixed a crash that occurred when creating a landscape from scratch with edit layers enabled.

  • Bug Fix: Fixed some places in landscape code where the editor LOD override is not respected.

  • Bug Fix: Fixed a crash that occurred when creating a layer info on a list of layers with none assigned yet.

  • Bug Fix: Fixed an issue with ALandscape::PostEditChangeProperty not properly handling transform changes. Fixed an issue where ALandscapeProxy::PostEditChangeProperty was not properly handling Z-scale changes.

  • Bug Fix: Fixed an issue with the update of Physical Material not being propagated properly.

  • Bug Fix: Fixed bad index buffer generation on mobile landscape with subsection vertex count of 256x256.

  • Bug Fix: Fixed an issue with flickering landscape when using edit layers in D3D12.

  • Bug Fix: Landscape Visibility Painting: Fixed the tool so Visibility can be painted even if some Landscape actors do not have a Hole Material set (check per component).

  • Bug Fix: Fixed a crash occurring with landscape grass mesh when there are more mips than the landscape currently has.

  • Bug Fix: Fixed Add Ramp landscape tool debug display when landscape is rotated.

  • Bug Fix: Fixed a crash occurring when unloading a level with a landscape actor being displayed in the details view and both the details and level tools on-screen.

  • Bug Fix: We now support use of grayscale textures for landscape image brushes.

  • Bug Fix: Fixed an infinite loop that occurred when undoing a landscape change.

  • Bug Fix: Fixed a crash that occurred when importing Landscape layers in the New Landscape Tool.

  • Bug Fix: Fixed an issue with landscape component ForcedLOD option.

  • New: Changed display name of Landscape spline control point's "Width" parameter to "Half-Width" so that it reflects what it really controls.

  • New: Removed loose global parameters from landscape vertex factory.

  • New: Landscape Layers: UI Reverse order of Layers.

  • New: Grass map rendering now uses the fixed grid vertex factory. This keeps it independent of view LOD.

  • New: Modify default for Landscape VirtualTextureNumLods from 0 to 6 This new value reduces vertex interpolation artifacts when writing to a virtual texture at the cost of increased vertex count in the runtime virtual texture page render pass.

  • New: Landscape Layers: Collapse Feature.

  • New: Reimport weightmap paths are now stored per tile when importing a tiled landscape.

  • New: Runtime virtual texture world height packing now depends on the volume extents to give optimum precision for each volume.

Material Editor

  • Bug Fix: Added additional validity checks before pinning a weak pointer.

  • Bug Fix: Fixed back facing plane in default camera view in Material Editor.

  • Bug Fix: The Defer Compression default arrow is hidden after compressing a texture.

  • Bug Fix: Fixed an issue where pin names on SetMaterialAttributes node would not match Material input names.

  • Bug Fix: Added a null check when copy/pasting Material nodes. This prevents a rare crash, but it could cause nodes to be pasted improperly when the same crash conditions are met.

  • Bug Fix: Removed MaterialFunction expressions from the list of types that allow parameter conversion.

  • Bug Fix: Fixed an issue where grid lines appeared not to draw in the Material Editor on initial launch.

  • Bug Fix: Updated material editor to save and restore metadata when updating materials.

  • Bug Fix: Fixed the Material Instance Editor to properly respect Undo.

  • Bug Fix: When deciding what to recompile after changing an MF, look at all Material Instances instead of stopping after the first match.

  • Bug Fix: Fixed an issue with layer parameters being inherited from one MIC to another MIC.

  • Bug Fix: Set the stats message log to use a fixed size font, and removed tooltip text that was duplicated.

  • Bug Fix: Channel names for the channel mask parameter are no longer allowed.

  • Bug Fix: The Material layer Parameter Preview panel will no longer crash in the Material Editor.

  • Bug Fix: Added more validity checks to LinkMaterialExpressionsFromGraph.

  • Bug Fix: The visibility of the Material layer parameter is now correctly impacted by static switches.

  • New: Added a GetNumberMaterials function to UEditorStaticMeshLibrary for getting the count of material slots on a static mesh.

  • New: Now Material Editor propagates changes made to layers in the base material to derived Material Instances.

  • New: Removed an unneeded Realtime checkbox on the UI for material viewport.

  • New: Added Physical Material Masks to Materials, which are used to associate multiple physical Materials with a single Material based on a mask. This is only supported when Chaos physics is enabled. In the Material, set the Physical Material Mask to a mask and Physical Material Map to an array of physical materials. In the Static Mesh properties, Support Physical Material Masks must be enabled and additional data will be stored at runtime.

Media Framework

  • Bug Fix: Added code to WmfMediaPlayer to avoid a deadlock during shutdown between a tickable thread asking for player time and the player actually shutting down.

  • New: Introduced a tighter active period for FMediaTicker thread and a new optional feature that destroys players after closing. To use this feature, players must implement GetPlayerFeatureFlag and have the function return True when AllowShutdownOnClose is passed in.

Static Mesh Editor

  • Bug Fix: Fixed the Reset Camera toolbar button in the Static Mesh Editor.

  • Bug Fix: In the Static Mesh Editor, fixed a bug causing the lightmap coordinate index to be stuck at 0 when there were generated LODs in the Static Mesh.

  • Bug Fix: Fixed a bug that could sometimes crash the Editor when trying to visualize convex collision in the Static Mesh Editor.

  • Bug Fix: In the Static Mesh Editor, the "Remove UV Channel" option now supports Undo/Redo.

  • Bug Fix: Fixed a bug that sometimes crashed the Editor when modifying values in the Static Mesh Editor.

  • Bug Fix: Fixed a crash that sometimes occurred when opening the Static Mesh Editor.

  • Bug Fix: Fixed a bug that could prevent the user from using the LOD picker after the number of LODs was changed in the Static Mesh Editor.

  • New: Static Mesh Editor no longer triggers a lighting rebuild while interactively changing the lightmap properties.


  • Bug Fix: Ensured that start-up scripts run when using Python in commandlet mode.

  • Bug Fix: Ensured that Python-wrapped objects have a valid internal state before attempting to nativize them.

  • Bug Fix: PySlate now checks that Slate is available rather than crashing.

  • Bug Fix: Emit RuntimeError (rather than a generic Exception) in Python for Blueprint execution errors.

  • Bug Fix: The OnPythonInitialized notification is now deferred until after start-up scripts have run.

  • Bug Fix: Fixed const-ref parameters passed to Python overridden functions losing their value.

  • Bug Fix: The Alembic Importer now uses the import settings provided by the user script.

  • New: Added a way to force a change notify when using SetEditorProperty in Python or Editor Utilities, even if the value is unchanged:

    • This may be needed if you've edited data on an instance indirectly (eg, modifying an array reference on the object), and need to force a change notification to update some dependent data.

    • In Python, this can be done by passing unreal.PropertyAccessChangeNotifyMode.ALWAYS as the notify_mode argument to set_editor_property. In Editor Utilities, there is a new advanced pin available for setting the "Change Notify Mode".

    • In both cases the default method is to notify only when the value actually changes.

  • New: Exposed the Get/SetEditorProperty functions to Blueprints.

  • New: Exposed enum asset types to Python:

    • They must be accessed via unreal.get_blueprint_generated_types(...) as asset names are not guaranteed to be unique, so they're not added to the unreal module.

    • Once a type has been generated for Python, it will be updated if the underlying asset is changed. Should the asset be deleted then the Python type will be reset to clean state and become mostly unusable.

    • This change also ensures that the Unreal type pointers referenced by the Python are referenced for garbage collection correctly. This will cause a warning if you try and delete an asset with a type used by Python.

  • New: Added a Blueprint node for calling Python with arguments:

    • This allows people to create a Blueprint node that can define a blob of literal Python script, along with wildcard inputs and outputs to be used by the script itself.

    • The node takes care of marshalling data in and out of the Python script, and allows custom Python to be invoked from Blueprints.

  • New: Added set_editor_properties to let you set multiple properties but only emit a single pre/post change notification.

  • New: Marked LevelSequenceFactoryNew as BlueprintType, so Editor utility blueprints/widgets can create Level Sequence Assets.

  • New: Added support to script re-imports of FBX animation sequences.

  • New: Added support to script re-imports of FBX animation sequences.

  • New: Added PropertyAccessUtil to contain the common logic of getting and setting properties in a way that emits change notifications. The existing Python code has been ported to use this, and this can also be used by Blueprints (or other C++ setting properties) to allow property changes that emit change notifications.

  • New: Improved the error message occurring when attempting to create a container property in Python that directly nests another container. This is not supported by the reflection system and is already disallowed, but the error message was confusing. It now gives an error message more like the Unreal Header Tool, and suggests using a struct as an alternative to direct nesting.

  • New: Improved the error message occurring when creating a Python property directly from a container type. It is a common mistake to omit the type or types for the container elements, so this case will now present an error stating the reason and the correct fix.


  • Crash Fix: Fixed a crash that occurred when displaying keys in the cinematic viewport with a large view range.

  • Crash Fix: Sequencer now closes if any of the sequences were reloaded/replaced. This fixes a crash that could occur if subsequences were reloaded while viewing the Master Sequence.

  • Crash Fix: Resolved a crash occurring when using "Store Curves" in Curve Editor.

  • Crash Fix: Creating an actor with a duplicate name no longer results in crashing Editor.

  • Crash Fix: Accessing a child folder after postloading a movie scene folders no longer crashes Editor.

  • Bug Fix: Fixed a Return Early event triggering incorrectly when and event is specified by an object binding, but there aren't any bound objects (ie. spawnable hasn't been spawned).

  • Bug Fix: You can now visit key areas from track, key area, and category nodes only. This prevents selecting keys when object binding nodes are collapsed.

  • Bug Fix: Fixed an issue with transform baking for rig rails. The current position on rail is updated per tick, so the actor needs to be ticked on each baked frame.

  • Bug Fix: Added protection against assigning a sequence that would produce circular dependencies. For example, if the current level sequence is named NewLevelSequence, this fix prevents the user from naming a subsection the same thing (NewLevelSequence, in this example).

  • Bug Fix: Autoscrub now only occurs if you are in a scrubbing state. This fixed double evaluations occurring when autoscroll is enabled during play.

  • Bug Fix: Setting the end range is now exclusive instead of open. This fixes an issue where if you tried to set the end range through the Properties menu, it would be inconsistent with dragging the end range.

  • Bug Fix: Added reentrant guards to prevent starting and stopping recordings while recording is in progress with Take Recorder.

  • Bug Fix: AddGivenTrack now allows for tracks with the same name, and the duplicate check is only done on copy/paste. This resolved an issue that occurred with a previous bug fix.

  • Bug Fix: Fixed an issue with adjusting the animation start time during resizing, and the start time is now clamped to the beginning of the clip.

  • Bug Fix: Viewports are now redrawn after restoring state on close(). This fixes a bug where if Realtime is not enabled in the viewport, closing Sequencer leaves objects drawn in a Sequencer animated state before the next redraw.

  • Bug Fix: A spawnable's object template is now copied so that it is not limited to the given transient outer. This fixes a bug where the DefaultSceneRoot for an empty actor would be lost on a copy/paste.

  • Bug Fix: Fixed the "Transform Selected Sections" tool so that now sections and their keys are transformed.

  • Bug Fix: Expanded the track node if row indices were changed. This fixes an issue where if a multi-row track is regenerated, it shows the multiple rows rather than displaying collapsed rows.

  • Bug Fix: Fixed upper playback range for subframes so that keys that lie beyond the integer frame are evaluated. For example, [400, 800.5] now returns an upper bound frame of 801 so that a key at 800 will be evaluated. This includes tests for frame number range.

  • Bug Fix: Fixed spawnable particles not firing by setting force particles as inactive on spawn by default, as opposed to "not autoactivate".

  • Bug Fix: Fixed subframe end playback range conditions so the playback range excludes flooring and tests the stop condition with GetLastValidTime() rather than with DurationFrames.

  • Bug Fix: Sequencer now only restores pre-animated states on actors that are being removed from the binding. Otherwise, all actors would be restored unnecessarily.

  • Bug Fix: Bake transform now refreshes the skeletal mesh the object might be attached to (just like export fbx performs updates).

  • Bug Fix: Added check for bound component when exporting 3D transform data to properly support applying rotations when exporting camera components in a Blueprint.

  • Bug Fix: Fixed an issue where the name check allowed more characters than the limit when renaming sequencer folders and object bindings.

  • Bug Fix: Return early in GoToEndAndStop now triggers correctly if the sequence player is already stopped and at the end of the sequence.

  • Bug Fix: Fixed an issue where changing levels with ClientTravel was breaking the ability to activate a sequence when using Play In Editor.

  • Bug Fix: Fixed Mute/Solo incorrectly applying to parent binding instead of selected track.

  • Bug Fix: Spawnable objects no longer fall in streamed levels during Play in Editor.

  • Bug Fix: Fixes several usability issues when dragging tracks or sections between rows.

  • Bug Fix: Fixed many special cases when using text search.

  • Bug Fix: ProRes/DNX now defers file creation until after the sequence updates. This allows file format tokens like {sequence} to be replaced with the name of the rendered sequence.

  • Bug Fix: Thumbnails no longer display over blending areas of the Camera Cut track.

  • Bug Fix: Camera bindings now correctly auto-create camera cuts.

  • Bug Fix: Fixed a zooming issue with mouse wheel in CurveEditor while panning with mouse dragging.

  • Bug Fix: Adding a key to a Blueprint component now correctly uses the existing value of the component.

  • Bug Fix: The geometry cache now evaluates correctly from Sequencer when the cache is not visible.

  • Bug Fix: Fixed sections not being visible on some pinned tracks.

  • Bug Fix: Dropping assets onto an object binding now allows the drop to occur below so an asset can be moved to last in the tree.

  • Bug Fix: When building a menu in Sequencer, the common base class now correctly passes to the selected object bindings.

  • Bug Fix: Made several fixes to prevent reentrant play/evaluation during stop.

  • Bug Fix: Sequencer now forcibly ticks if the animation pose has already ticked this frame. This fixes first frame discrepancies if a sequence is played after actors have ticked on a particular frame.

  • Bug Fix: The active animation instance on a skeletal animation component now correctly clears when stopping a sequence. This results in the anim-notifies stopping as expected.

  • Bug Fix: Sequencer now only renders the waveform preview for assets that are currently visible on an audio track section.

  • Bug Fix: BeginSlipSection now calls correctly in Sequencer.

  • Bug Fix: GetUniqueName now returns correctly if the name is already unique.

  • Bug Fix: The Local Time is now set as Looped by default so the evaluation is Play To instead of Jump when autoscrolling.

  • Bug Fix: Fixed an issue where the sequence was not playing again if the world is unloaded and reloaded.

  • Bug Fix: Section easing now updates the section correctly when it is moved or resized through property editing.

  • Bug Fix: Loop markers in audio tracks now render correctly.

  • Bug Fix: The "Add a Camera" button now always displays on the transform track's object binding edit button. This fixes an issue where looking at the spawnable template isn't enough to determine whether a camera exists because the camera component might not exist at the time the button is created.

  • Bug Fix: Resolved an issue that allowed cyclic inclusions within template sequences.

  • Bug Fix: Replicated sequences now increase their sync threshold by client ping. You can verify hitch correction through the "Correcting de-synced play position for sequence..." message in the log. For more information more often, enable "log LogMovieSceneRepl VeryVerbose".

  • Bug Fix: Sequences not considering TimeScale or DemoPlayTimeDilation during playback now functions correctly.

  • Bug Fix: Implemented manual checks for broken tangents on FBX imports to avoid incorrectly passing broken tangents through the import.

  • Bug Fix: Track count display on sub-sequences now functions correctly.

  • Bug Fix: Copying and pasting tracks with multiple subtracks now functions correctly.

  • Bug Fix: Exporting a transform in FBX now correctly exports the combined, whole blended track, instead of just exporting the first section.

  • Bug Fix: Custom Cinematic Camera film back text now correctly receives values for focal length and aperture.

  • Bug Fix: The Director Blueprint is now renamed whenever a Level Sequence is renamed. This resolves an issue where Event Tracks stopped working when Level Sequences were renamed.

  • Bug Fix: Set curve attributes now operate on all curves, rather than just the selection in Curve Editor.

  • Bug Fix: transient flags on spawnable template components now clear correctly. This resolves a bug where components added to an empty actor were not saved.

  • Bug Fix: Prevented a crash that occurred when loading a sequence that has broken data.

  • Bug Fix: UnfocusedVolumeMultiplier should be fixed at 1.0f during movie rendering so that audio doesn't cut out during movie rendering.

  • Bug Fix: Curve Editor: Fixed an issue where the Filter window was not opening for standalone curves; this was caused because no tab manager was provided when creating the curve asset editor's SCurveEditorPanel in FCurveAssetEditor::SpawnTab_CurveAsset, which is needed to create the Filter Window.

  • Bug Fix: Sequencer: If you change a skeleton on a skeletal mesh while its sequence is playing, and then do a restore state the Editor could crash. This is because the Anim Instance is referencing an old skeleton which has a different number of bones. Now Sequencer uses InitalizeAnimScriptInstance so bones/morphs/curves get recalculated.

  • Bug Fix: Sequencer: Import onto objects with the focused template ID. This fixes an issue preventing importing onto an object in a subsequence.

  • Bug Fix: Timecode: Fix crash in details customization when data is empty.

  • New: Added "Time Warping" as a new form of time transformation when looping sequences. This enables you to transform time from a root sequence into a looping sequence and, assuming you know which loop number you are in, you can convert from a local/sub-sequence time back into a root time.

  • New: Sequencer and the sequence API compiler now deal with time transforms that might include looping. The API is mostly backwards compatible, except for inverting a time transform.

  • New: Exporting an FBX through Python now creates spawnables for scripted Sequences.

  • New: Added a PostProcessingMaterial command line argument to specify the post processing material to use for custom render passes in Movie Scene Capture.

  • New: Added a new API for customizing track in/out easing.

  • New: Updated the digits type interface for number padding (such as 02, 002) in Take Recorder.

  • New: The Sequencer clock now uses a global timecode based on the timecode provider, and is now called the Relative Timecode, instead of Timecode.

  • New: The Sub-Sequence and Cinematic Shot tracks now display looping indicators.

  • New: Added a module operator to frame times.

  • New: Added support to search channel and folder names, in addition to track names.

  • New: Keys and channels in Curve Editor can now be copy/pasted.

  • New: Updated Sequencer scripting options to include SetReadyOnly and IsReadOnly to the Level Sequence.

  • New: Updated Live Link log files to reflect updated fps options, with the default setting at 30 fps. You can find this information in the VeryVerbose log file.

  • New: Live Link recordings now discard samples if the sample is outside the start frame.

  • New: Updated Sequencer's scripting to create bindings in the root or local space.

  • New: When you duplicate a possessable object binding, it now duplicates the possessed objects into the current level and assigns them to the duplicated binding.

  • New: Sequences can now be run in Clean Playback Mode, which toggles the game view and hides the viewport UI when running a sequence in-game. Clean Playback Mode automatically defaults to On.

  • New: You can now designate the tooltip display to include the section title, and is useful for when the width of the section is smaller than the section title. This adds tooltips for sections like Shots, Animations, Camera Cuts, and so on.

  • New: Added {date} {month} {day} {year} {time} format strings for Movie Scene Capture.

  • New: Added GetBoundObjects(), which allows access to spawnables through Python scripting by evaluating a frame range.

  • New: Sequencer Audio templates now check for a 0.2s desync (cvar Sequencer.Audio.MaxDesyncTolerance) between expected audio time and actual audio time. This makes it easier to detect the audio play duration after starting Play, particularly when replaying, rewinding, and fastforwarding sequences.

  • New: The Take Number now defaults to 2 digits for better readability. Take Recorder also uses this Sequencer Project Setting when creating filenames and Take metadata.

  • New: In Curve Editor, you can now save loaded curves to the Level Sequence.

  • New: You can now specify an external clock source to interface with Sequencer. This is supported by a new media component that controls the media player and texture to support multiplayer PIE through real-time playback rather than offline, frame-accurate playback.

  • New: Added cvar for controlling net playback synchronization threshold. Sequencer.NetSyncThreshold defaults to 200ms and defines the point at which desync is deemed unacceptable and a force sync is required.

  • New: Take Recorder: Fixed an issue with recording spawned particle systems. Particle systems are spawned and attached to the World Settings Actor. These were not getting picked up when gathering newly created components, because they are scene components on the Actor and not the root component. Also, fixed an issue where the property map needs to be regenerated when adding the world settings actor as a new actor source during PreRecording.

  • New: Renamed Play Rate track to Time Dilation track.

  • New: For command line rendering, the CaptureGammut command line argument now parses names of enum entries as well as numbers.

  • Improvement: ImageWriteTask now uses a TUniqueFunction instead of TFunction to store PixelPreProcessors. This allows storing unique pointers in the PixelPreProcessor tasks.

  • Improvement: Changed the following Curve Editor hotkeys to remove conflicts with other shortcuts in Editor:

    • Transform: Ctrl-T

    • Retime: Ctrl-E

    • Multi: Ctrl-M

  • Improvement: Updated Sequencer to use other minor behaviors in Editor, such as drag/drop and layout/access of menus and toolbars.

  • Improvement: The TRange LexToString now uses "," to split the upper/lower bounds instead of "-" to avoid confusion with negative upper bound values.

  • Improvement: Updated the Cinematic Camera's ratios: Changed 16:9 Digital Film SensorWidth and SensorHeight to 23.76 x 13.365 to match Arri Alexa, and changed 16:9 Film SensorWidth and SensorHeight to 24.00 x 13.5.

  • Improvement: There are several updates to the Sequencer toolbar:

    • Added Save As to the Toolbar

    • Added an Actions menu for operations that manipulate data or selection;

    • Renamed General Options to View Options;

    • Moved Auto Scroll and Show Range Slider to View Options;

    • Removed Go to Time from the menu (it is already in the UI);

    • Removed Show in Content Browser from the menu (it is already in the top Toolbar).

  • Improvement: In Take Recorder, the Animation Asset Name in the Project Settings now defaults to {actor}{slate}{take}.

  • Improvement: Updated Take Recorder settings to the selected Actor is always listed first.

  • Improvement: The Sequence Level Actor now supports RewindForReplay, which stops a sequence when seeking starts in a replay.

  • Improvement: Modified Sequencer network playback so it takes the ping of a player into account when jumping forward in time. This prevents players' systems from constantly needing to resynchronize with the server when playing under high latency situations (resynchronizing with the server causes audio and visual hitches).

  • Improvement: Locked sequences now display a visual indicator with a red border and dims display node text.

  • Improvement: Added tick marks in the audio track display to show audio loop points.

  • Improvement: Improved processing frame rate when outputting video frames as PNG.

  • Improvement: Added keys to the snap field when the user is resizing sections so that resizing sections can snap to keys.

  • Improvement: Added channel extensions for MovieSceneObjectPath.

  • Improvement: Updated marked frames so they are based on the hit index, rather than finding it by the FFrameNumber. Renamed "Clear Marked Frame" to "Delete Marked Frame".

  • Improvement: Dragging and dropping sequences into the tree view now moves items to the root.

  • Improvement: You can now save animations in a Skeletal Mesh track as an AnimSequence. This is also supported by Python.

  • Improvement: You can now change the min/max playback, view, and working values outside of the current range.

  • Improvement: Updated the Cinematic Camera so the Depth of Field method is now Do Not Override to more accurately describe the functionality, as opposed to None. You can also Disable the depth of field completely by overriding the post process settings.

  • Improvement: Sequencer now saves times with FMovieSceneFloatChannel through a serialized buffer, which will significantly speed up Live Link data orders.

  • Deprecated: NewTake in Take Recorder is now deprecated in favor of ClearPendingTake. This lets users simply clear the pending level sequence rather than also clearing out the sources.

  • Removed: Removed the Label Browser option because it was not used.


  • Bug Fix: Fix for crash on exiting VR mode from the taskbar.

  • Bug Fix: Adding a check that we are using the default interactors before warning about legacy UI. This prevents unneeded warnings for Virtual Production.

  • Bug Fix: Fixed a bug causing smooth scrolling with the HTC Vive touch pad in the Unreal Editor VR Mode to be less than smooth, and somewhat erratic.

  • Bug Fix: Fix out-of-date view uniform buffer for selection rendering post-process (broken selection highlights in VRMode).

  • Bug Fix: Changed "Toggle VR" hotkey to add 'Shift' modifier (now Shift+V).

  • Bug Fix: Removed direct null of slate widgets on the VR Editor floating UI because the UI is in the middle of shutting down.

  • New: VR Editor no longer allows transitioning to Play in Editor from Simulate in VR mode.

  • New: Prevent force deleting assets in the Content Browser if VR mode is active. Force deleting is an intensive task that would negatively impact the user experience in VR.

World Browser

  • Bug Fix:** Move WorldTileInfo from old to new package when renaming in the editor: this makes sure to propagate WorldComposition settings for this level.

  • Bug Fix:** Prevent double selection notifications when selecting via the Scene Outliner.

Gameplay Framework

  • Crash Fix: Fixed a crash in FStreamableManager::OnPreGarbageCollect that happened when deletion of one FStreamable caused other FStreamables to be removed from the manager.

  • Crash Fix: Fixed a crash that happened when passing null to SaveGameToMemory. AsyncSaveGameToSlot now properly handles SaveGameToMemory returning false.

  • Crash Fix: Fixed a crash when adding a gameplay tag without a valid tag source selection.

  • Crash Fix: Fixed a crash related to party members not being local players.

  • Crash Fix: Fixed warning messages and a potential crash when adding a component to an instance in the world if the default mobility of the new component was incompatible with the component it would be attached to.

  • Crash Fix: Removed a few ways for attackers to crash a server through the ability system.

  • Crash Fix: We now make sure we have a GamplayEffect definition before checking tag requirements.

  • Bug Fix: UCameraComponent::OnRegister no longer creates editor-only components when running a commandlet.

  • Bug Fix: The Default Physics Volume is now marked as transient to avoid a failure in CheckForWorldGCLeaks. Because it is transient, it will not be saved or loaded.

  • Bug Fix: Actors that have pending latent actions will no longer be automatically destroyed if bAutoDestroyWhenFinished is true.

  • Bug Fix: Local variables in the user construction script now show up in the details panel.

  • Bug Fix: Fixed the oscillation blend out time for camera shakes. Previously, the blend out's OscillationDuration was not used in the calculation, which led to the camera shake ending earlier than it should have.

  • Bug Fix: Fixed an issue with gameplay tag categories not applying to function parameters in Blueprints if they were part of a function terminator node.

  • Bug Fix: TActorIterator and GetAllActorsOfClass will no longer return actors from a level that is in the process of being incrementally removed from world, unless you are in the RemoveFromWorld scope for that level.

  • Bug Fix: UWorld::Async* trace functions will now assert when run outside of the game thread, as this will result in memory corruption.

  • Bug Fix: Fixed incorrectly set social user on a party member when we have multiple local players.

  • Bug Fix: The InvertedAxis array in the input system no longer grows unbounded.

  • Bug Fix: Fixed an issue with gameplay effects' tags not being replicated with multiple viewports.

  • Bug Fix: Fixed an ensure that could occur when a streaming level was removed as a side-effect of updating the streaming state of another streaming level.

  • Bug Fix: Child actors spawned by child actor components now correctly update their positions when moving the component on a per-instance basis.

  • Bug Fix: The split screen game view port client now has higher precision float values when creating the split screen info in order to remove unwanted black bars at higher resolutions.

  • Bug Fix: "ke " console commands no longer attempt to execute commands on Archetype Objects which belong to CDOs. CDOs were already excluded from "ke " commands, but not default subobjects created by a CDO.

  • Bug Fix: The engine no longer attempts to get the NetMode on server worlds before the world is fully set up.

  • Bug Fix: Fixed cooking to remove non-determinism in FStaticMeshLODResources.

  • Bug Fix: Fixed a bug where a gameplay ability spec could be invalidated by the InternalTryActivateAbility function while looping through triggered abilities.

  • Bug Fix: Instance components are no longer lost after undoing an apply to Blueprint transaction.

  • Bug Fix: Children of added instanced components now appear in the details panel without requiring the user to deselect and reselect the actor.

  • Bug Fix: Child actors no longer lose properties set in the parent construction script when changing properties on the child actor component instance.

  • Bug Fix: Fixed crouching clients observed from a listen server popping up briefly before interpolation corrects the location down. Applied the same fix as for simulated proxies on the listen server.

  • Bug Fix: Added smoothing to replicated server world time delta This ensures that spikes in the perceived server world time caused by delayed replication updates are not directly and immediately reflected in the client calls to AGameStateBase::GetServerWorldTimeSeconds() which would be problematic for systems that want to work relative to server world time.

  • Bug Fix: Prevented NaNs (or excessively large input values causing later NaNs) from entering AController::SetControlLocation.

  • Bug Fix: Filled in ServerLastTransformUpdateTimeStamp for simulated proxies with the value of ReplicatedServerLastTransformUpdateTimeStamp, for code paths that may try to read that value instead. Added client and server timestamps to "p.NetVisualizeSimulatedCorrections" output.

  • Bug Fix: We now call UpdateCharacterStateBeforeMovement and UpdateCharacterStateAfterMovement for simulated proxies during simulation. However, the base implementations avoid the crouch state changes in those functions because those are replicated from the server. This is more for overrides to be able to run custom behavior to match the server simulation.

  • Bug Fix: Changed how we handle updating gameplay tags inside of tag count containers. When deferring the update of parent tags while removing gameplay tags, we will now call the change-related delegates after the parent tags have updated. This ensures that the tag table is in a consistent state when the delegates broadcast.

  • Bug Fix: Added location and current client base (if any) to logging in ClientAdjustPosition if the client does not resolve the movement base.

  • Bug Fix: Fixed cases where FMod and VectorMod would fail to return a result within the expected output range for very large input values. This could in turn result in NaN/Inf propagation if for example those values are used with SinCos during Rotator/Vector/Quat conversion. Added some additional ensures during development to catch similar overflow and uninitialized variable issues sooner.

  • Bug Fix: Fixed a bug that caused some per-class properties to read incorrect data in the editor.

  • Bug Fix: We now ensure that per-class properties, if they exist, will be available as Blueprint variable get nodes.

  • Bug Fix: Fixed actor names of user construction script child actors not reflecting the child actor class if the child actor class is changed on the add component node.

  • Bug Fix: Properties inside sparse class data now respect the AssetRegistrySearchable flag.

  • Bug Fix: Rotating movement component now works as expected in standalone.

  • Bug Fix: Modified SetBaseAttributeValueFromReplication to take the old value as an input parameter. Previously, it was reading the attribute value to try to get the old value. However, if called from a replication function, the old value had already been discarded before reaching SetBaseAttributeValueFromReplication so we'd get the new value instead.

  • Bug Fix: We now make a copy of the spawned target actor array before iterating over it inside when confirming targets because some callbacks may modify the array.

  • Bug Fix: Fixed a bug that was causing properties that were marked as asset registry searchable not to be included with asset data in the asset registry.

  • Bug Fix: Fixed a bug where stacking GamplayEffects that did not reset the duration on additional instances of the effect being applied and with set by caller durations would only have the duration correctly set for the first instance on the stack. All other GE specs in the stack would have a duration of 1 second. Added automation tests to detect this case.

  • Bug Fix: Fixed a regression causing actor overlaps to not properly trigger during initial level load even if bGenerateOverlapEventsDuringLevelStreaming was enabled. Fixed some incorrect related comments in the header.

  • Bug Fix: Fixed a bug that could occur if handling gameplay event delegates modified the list of gameplay event delegates.

  • Bug Fix: Fixed a bug causing GiveAbilityAndActivateOnce to behave inconsistently.

  • Bug Fix: Reordered some operations inside FGameplayEffectSpec::Initialize to deal with a potential ordering dependency.

  • New: SpawnActor can now accept a requested name in its SpawnActorParameters. If the name is unavailable, SpawnActor can return null, report an error, or generate a unique name that is available.

  • New: Added the option to include components from child actors when hiding/showing components in SceneCaptureComponent.

  • New: UChildActorComponent::SetChildClass can now specify the template to use instead of the default instance of the desired class. If used on an archetype, the stored template will be a copy of the supplied template. If used on an instance in the world, this will result in a one-time spawn of a child actor using that template, but if the child actor is destroyed and recreated, it will use the original template again.

  • New: Added a version of GetManagedObject to SignificanceManager that is const and accepts const parameters.

  • New: UGameplayAbility now has an OnRemoveAbility function. It follows the same pattern as OnGiveAbility and is only called on the primary instance of the ability or the class default object.

  • New: Camera shakes now have a new actor/component type which defines a "shake source", along with some attenuation settings. Some new Blueprint functions enable users to start camera shakes that are "anchored" to those sources, and whose shake intensities will change dynamically based on the current camera's distance to the respective sources.

  • New: Added the GetActiveCameraShakes function, which gets the list of currently playing camera shakes.

  • New: When displaying blocked ability tags, the debug text now includes the total number of blocked tags.

  • New: Added two broadcast delegates to GameViewportClient. These events listen for UGameViewportClient::InputKey and UGameViewportClient::InputAxis events, respectively. You can access references to these with the OnInputKey and OnInputAxis functions.

  • New: Blueprint creation from the selected in a level is now presented through a modal dialog box that allows specification of the Blueprint name, path, creation mode, and parent class. The available creation modes are via Harvesting Components (previously available from the Blueprints main tool bar dropdown), Subclassing (previously available from the details panel when a single Actor selected), and Child Actor (a new mode that creates an Actor Blueprint with a child component for each selected Actor).

  • New: When harvesting components from multiple actors, the Actor name will now be included in the harvested component name.

  • New: Renamed UAbilitySystemComponent::InternalServerTryActiveAbility to UAbilitySystemComponent::InternalServerTryActivateAbility.Code that was calling InternalServerTryActiveAbility should now call InternalServerTryActivateAbility.

  • New: Improved data validation for sparse class data types. UHT now checks for the following:

    • Max of one sparse class data struct per class

    • Sparse class data struct must inherit from the parent class' sparse class data struct

    • All sparse properties must be BlueprintReadOnly and EditDefaultsOnly

    • Blueprint-assignable delegates cannot be sparse properties

  • New: Continue to use the filter text for displaying gameplay tags when a tag is added or deleted. The previous behaviour cleared the filter.

  • New: Don't reset the tag source when we add a new tag in the editor.

  • New: Added the ability to query an ability system component for all active gameplay effects that have a specified set of tags. The new function is called GetActiveEffectsWithAllTags and can be accessed through code or Blueprints.

  • New: When root motion movement related ability tasks end they now return the movement component's movement mode to the movement mode it was in before the task started.

  • New: Made SpawnedAttributes transient so it won't save data that can become stale and incorrect. Added null checks to prevent any currently saved stale data from propagating. This prevents problems related to bad data getting stored in SpawnedAttributes.

  • API Change: AddDefaultSubobjectSet has been deprecated. AddAttributeSetSubobject should be used instead.


  • Bug Fix: String Table find/load is now deferred until the internationalization system is initialized.

  • Bug Fix: Correctly updated in-memory String Table asset references when a String Table asset is renamed.

  • Bug Fix: Translation Editor now shows stale translations as "Needs Review" rather than "Untranslated".

  • Bug Fix: Fixed an issue where Blueprint components instanced into a Level could lose their localization data.

  • New: Exposed "exclude classes" localization gather option to the Localization Dashboard.

  • New: Added support for splitting localization data into separate PAK chunks during cooking.

    • There is a new packaging setting, LocalizationTargetsToChunk, which lets you specify which of your localization targets should be chunked during cooking.

    • If enabled, any localization entries corresponding to assets will be split into a separate LocRes file for the chunk containing that asset, and will be removed from any chunks (including the primary chunk) that do not contain that asset. This is useful to restrict localized text to the chunk that contains the corresponding asset for the text, and allows localization data to be selectively encrypted based on the chunking rules.

    • At runtime this chunked data will be loaded into the text localization manager automatically when the chunk is loaded.

  • New: Added the ability to filter the metadata gathered by field and field owner types. This allows you to do things like "gather all properties belonging to actors", or "gather everything but functions".


  • Bug Fix: Added support for IsEncryptionEnabled for child connection objects.

  • Bug Fix: Modified the network driver's accumulated time to use double precision. This changes the format of the stateless connection handshake packet used to negotiate a client to server connection.

  • Bug Fix: Added support for non-default allocator in the TArray passed to SafeNetSerializeTArray utility functions. Incoming array size is clamped if it is too large. Issues with bOutSuccess and return values have been fixed.

  • Bug Fix: Fixed a potential underflow error in the AES packet handlers.

  • Bug Fix: Fixed infinite recursion in UIpConnection::HandleSocketSendResult when SocketSend failure occurs with a PendingNetGame.

  • Bug Fix: Only limit the net tick rate if it's lower than the engine tick rate.

  • Bug Fix: Changed UActorChannel::ProcessQueuedBunches to better respect timeslicing. This addresses issues with over-logging warnings regardless of whether or not the channel was simply ignored for processing.

  • Bug Fix: Fixed an edge case in PackageMapClient where the NetGuidCache could return a partially loaded Package.

  • Bug Fix: ServerFrameTime sends the current frame's time instead of the previous frame. PacketInfo payload for ServerFrameTime and Jitter will now only be sent on the first packet of the frame. This reduces overhead when sending large data chunks in a single frame.

  • New: Full address protocol resolution and round robin connection attempts are now made in the IpNetDriver/IpConnection classes automatically. This enables connecting over both IPv6 and IPv4 networks, and takes advantage of platforms that can use both in order to find the best method to connect to a server.

    • Platforms where this behavior is not desired must call DisableAddressResolution either in their connection class constructor or in InitLocalConnection and InitRemoteConnection before calling any base class functionality. This will make sure that resolution is properly disabled for inherited IpConnection classes.

    • For testing, users can take advantage of CVARs such as net.DebugAppendResolverAddress which will always add the value to any address resolution done and net.IpConnectionDisableResolution which will disable address resolution on any future connections made.

  • New: Modified actor tear off to notify all active network drivers when it occurs on the client or server.

  • New: Added the ability to swap local and remote roles when replicating actor properties in the network driver and replication graph.

  • New: Optimized handling of initially dormant actors to avoid adding them to the active network object list for a single frame, only to be immediately removed.

  • New: Added an export for FScopedActorRoleSwap for use by other modules.

  • New: NetConnection will now sample packet loss on every StatPeriod and store the current value along with a rolling average in the InPacketsLossPercentage and OutPacketsLossPercentage variables

  • New: IPv6 support is now included by default in all desktop platform builds, but is disabled. Setting the CVAR net.DisableIPv6 to 0 will enable IPv6, provided there is device OS level support.

    • Network addresses should be passed through a resolution method like GetAddressInfo in order to express the address in the best way possible.

    • SetIp and GetAddressFromString are still usable, but may require address translation in usages where connection protocols are not defined anywhere.

  • New: GetLocalBindAddresses can be used to get all the addresses a machine can use to bind a socket to instead of relying on the first result or just returning a blank address. This new function automatically checks for multihome requirements and uses them as appropriate.

  • New: There is a new implementation of GetLocalAdapterAddresses, allowing for all platforms to obtain all of the network addresses tied to the current machine.

  • New: Generate enums with RepIndex values for native Replicated Properties. These can be used with simple macro expansions to get Rep Indices for properties without actually looking up UProperty pointers.

  • New: Specifying -NetTrace=[VerbosityLevel] on the commandline now implicitly enables the Net TraceChannel.

  • New: Added Jitter calculation to NetConnection. Jitter is the difference in latency between every packet. The closer to 0 it is the more stable the latency is. To support this, packet headers now contain local clock data used to calculate jitter, and EEngineNetworkVersionHistory has been increased to account for new jitter clock time in packet headers.

    • This will cause connections to fail between pre/post engine builds.

  • Improvement: Added configurable IMessageBus and Debug Name to Messaging RPC to improve encapsulation.

  • Deprecated: The RemoteSaturation variable has now been deprecated, and the InBytesPerSecond value will no longer be sent in every packet header.

  • Deprecated: NetConnection's BestLag variable is now private since it is just a mirror of AvgLag.

  • Removed: Deleted IPv6 specific classes, as they've been deprecated for several engine versions.


  • Bug Fix: Fixed incorrect use of a non-squared value in AActor::GetReplayPriority.

  • Bug Fix: Fixed a crash while using Play In Editor replays related to replicated level script actors.

  • Bug Fix: Fixed a race condition where replay events that are added immediately after beginning recording would be immediately discarded.

  • Bug Fix: Fixed incorrect scale on replicated level actors after scrubbing a replay.

  • Bug Fix: Fixed several warnings related to level script actors of streaming levels in PIE replays.

  • Bug Fix: Custom Delta Tracking state will not be created when recording or playing back replays. )

  • New: Removed multiple deprecated replay streamer calls that took user strings.

  • New: Added the ability for games to record arbitrary per-frame data to replays and access this data during playback using FNetworkReplayDelegates::OnWriteGameSpecificFrameData and FNetworkReplayDelegates::OnProcessGameSpecificFrameData.

  • Deprecated: Deprecated UNetConnection's InternalAck flag to eventually make it private.

Replication Graph

  • Bug Fix: Fixed debug actor counting towards the bandwidth budget in the replication graph.

  • Bug Fix: Fix ReplicationGraph ignoring traffic for the saturation calculations when ActorDiscoveryMaxBitsPerFrame is set to 0. This caused the ReplicationGraph to send more data than was budgeted by the MaxInternetClientRate.

  • Bug Fix: Upgraded ReplicationPeriodFrame to uint16 to fix an overflow error when the NetUpdateFrequency is very low.

  • Bug Fix: Fixed a bug with implicit cast of ReplicationPeriodFrame from uint32 to uint8.

  • New: Added a flag to FActorDestructionInfo that ignores the distance culling test.

  • Improvement: DestructionInfo is now always sent to connections that are aware of AlwaysRelevant Actors.

  • Improvement: Optimized ReplicateDestructionInfo by not testing the destroyed actors list every frame. Instead, it will test if viewers are near destroyed objects only after they travel far enough from the previously tested location.

    • You can set Net.RepGraph.OutOfRangeDistanceCheckRatio to 0 to disable this optimization and test the destroyed Actor list every frame.

Socket Subsystem

  • New: Improving Windows GetLocalAdapterAddresses filtering such that only active, up network adapter addresses are returned.

  • New: Socket subsystem now supports creation of FInternetAddrs pre-set to a specific protocol at allocation. This allows for less ambiguity when obtaining/creating an any/broadcast/loopback address.

  • Bug Fix: Fixed MULTIHOME command line argument in SocketSubsystemUnix.


  • Crash Fix: Fixed a crash if a log message is emitted during vivoxclientapi initialization.

  • Bug Fix: Fixed Steam OSS initializing a server when starting a client build. This is an outdated initialization flow that was never meant to be a feature and is no longer necessary to perform at startup. To restore this behavior, set OnlineSubsystemSteam.bInitServerOnClient to true in any Engine*.ini file.

  • Bug Fix: Fixed the error messages in various online latent Blueprint actions to mention the correct action.

  • Bug Fix: Fixed a buffer overrun in FVoiceEngineImpl::ReadLocalVoiceData

  • New: Implemented showing and sending friend messages on Steam. Additionally, implemented the store overlay and functionality for automatically adding a product to the user's cart. Also updated test cases to the existing external UI harness to support the new functionality.

  • New: Modified the approval flow when joining a party to support a group of players joining together.

  • New: In a Pixel Streaming setup, the Signalling Web Server will now attempt to connect to the Matchmaker server at an interval determined by the "matchmakerRetryInterval" setting (the default is five seconds) if the "UseMatchmaker" flag is set to true. This also means that the Signalling Web Server and Matchmaker Server can be started in any order.

  • New: Added the "LastOnline" field to OnlineUserPresence.

  • New: We now provide a copy of the Party Member Data to PostReplication in case validation checks desire to roll back to previous data values.

  • New: Moved NotifyPartyInitialized out of PARTY_SCOPE so game subclasses of SocialManager can override it.

  • New: Added OnlineTracing interface for capturing HTTP/WSS/XMPP traffic.

  • New: VivoxVoiceChat plugin - Exposed rtp timeout settings through RtpConnectTimeoutMs and RtpTimeoutMs in the [VoiceChat.Vivox] section of DefaultEngine.ini.

  • New: Added On(X)Complete stubs in the SocialToolkit and called them from within their respective Handle(X)Complete handlers. The game can now react to these notifications while preserving a robust API.

  • New: Added support for multiple local users to the VivoxVoiceChat Plugin.

  • New: Refactored Leaderboards Interface to admit additional parameters when querying leaderboards. The new possible syntax of the command is: \ ONLINE TEST LEADERBOARDS LeaderboardName SortedColumn NColumnName NColumnFormat ... UserId

  • Improvement: Updated the Online Subsystem to use SteamSDK 1.47.

  • Deprecated: Deprecated Steam voice packet classes. Steam no longer requires any platform-specific functionality as of UE 4.23.


  • Bug Fix: BuildPatchServices will no longer call GLog->FlushThreadedLogs() when not on the main thread during directory chunking.

  • Bug Fix: Failing to load a file during chunking no longer causes an assert.

  • Bug Fix: Fixed an issue where a generated optimised delta between two binaries will break an installation if the destination binary is re-processed as different data, replacing the original manifest at the same version string.

  • Bug Fix: MergeManifests preserves the original, newly generated buildid rather than clobbering it with one of the input manifests.

  • Bug Fix: Extended the life of the IOptimisedDelta instances to match the FBuildPatchInstaller to avoid race conditions for destruction that occurred when finishing FBuildPatchInstaller::Initialize.

  • Bug Fix: Removed an unnecessary, explicit delete of resume data when completing an EInstallMode::StageFiles installer.

  • Bug Fix: Fixed a possible shutdown crash when packaging chunks. When processor classes complete quickly, the IBuildManifestSet instance will no longer be deallocated before other systems that are using it.

  • New: Added EFeatureLevel::UsesBuildTimeGeneratedBuildId for storing a build-time generated ID.

  • New: When saving a manifest of EFeatureLevel::UsesBuildTimeGeneratedBuildId or higher, a buildid field is serialised as part of the manifest meta data block. This field is generated as part of the FManifestMeta constructor, and thus uniquely saved upon creation of a new manifest object.

  • New: When loading a manifest object, the buildid will be serialised or runtime generated based on the manifest object version.

  • New: When downloading an optimised delta, we verify for agreeable SHA1 and file list, rejecting with error if a problem is detected.

  • New: BuildPatchTool's ChunkDeltaOptimise mode now chooses the appropriate output FeatureLevel for the patch data, based on the provided source and destination manifest files.

  • New: Exposed the file verification error counter from verify statistics.

  • New: Added the meta folder to staging so that the Install staging folder will only ever contain install files. Moved the $resumeData file to a new location if it is found in the legacy location.

  • New: Refactored FBuildPatchFileConstructor error handling to catch serialisation errors as soon as they occur.

  • API Change: Renamed EFeatureLevel::StoresUniqueBuildId to EFeatureLevel::UsesRuntimeGeneratedBuildId.


  • Bug Fix: The hotfix manager now informs the HTTP module when any HTTP section is updated (for example, [HTTP.Curl]).

  • Bug Fix: [HttpServer] Request query parameters are now correctly parsed with the "&" delimiter.

  • New: Implemented the seek function in libcurl. Currently, this is only implemented for complete rewinds that happen when retrying connections.

Online Subsystem

  • Bug Fix: Fixed get user profile process returning failure on all paths. Fixed soting pointer to local user profile object leaving dangling pointers.

  • Bug Fix: Moved bShowBrowserPointer variable getter before ShowWebPageArg->SetPointerEnabled in order to set this using the boolean as expected.

  • Bug Fix: Fixed an inconsistency with the tests where we returned platform IDs instead of UE4 IDs, then passed them back in to the interface expecting UE4 IDs.

  • Bug Fix: Added propper state tracking for the Async task.

  • Bug Fix: Added error handling for individual achievement-setting tasks and fixed error reporting for batch achievement-writing tasks. Note that these tests are only valid for 2017/title-managed achievement format. 2013/event-based achievements will correctly fail the write tests. Read succeeds.

  • New: Modified the base voice engine implementation to store an instance name and not cache the online subsystem directly.

  • New: OnlineSubsystem's method GetFirstSignedInUser will now return the first fully logged in user it can find. Otherwise, it will fall back to its original behavior and return the first local user.

  • New: Added tests for Store and Purchase OSS interfaces usage: "online sub= test store " - eg. "online sub=live test store 9MWBK8Z14MXD" to get product details for ShooterGame store offer 9MWBK8Z14MXD "online sub= test purchase " - eg. "online sub=live test purchase UNUSED 9MWBK8Z14MXD" to initiate checkout for ShooterGame store offer 9MWBK8Z14MXD

  • New: First pass of changes relating to sessions. Users can host, search for, and then join sessions.

  • API Change: Updated FOnControllerPairingChanged (in OnlineIdentityInterface) to provide the number of controllers now assigned to the New and Previous user in the event. If New or Previous user is null, they will be considered to have 0 controllers. Updated the comment about LocalUserNum to be more clear that it describes a person, not a device. Anyone subscribing to FOnControllerPairingChanged will have to update the signature of their handler to take in the extra information.


  • New: Added OnWebSocket, created delegate. Added OnMessageSent delegate.


  • Crash Fix: Fixed a crash in FStropheWebsocketConnection::OnRawMessage when dealing with multiple XMPP connections.

  • Bug Fix: We now properly clean up closed XMPP connections by calling ProcessPendingRemovals through a new Tick function in XmppModule.

  • New: Added IXmppStanza abstract interface to expose stanza data getters independent of implementation; FStropheStanza now inherits and overrides from it. Added OnXmppConnection created delegate. Added OnStanzaSent and OnStanzaReceived delegates, only implemented in Strophe.


  • Crash Fix: Updated Paper2DEditorModule to check the validity of GEditor before registering for OnAssetReimport. This prevents a crash when running a commandlet with IsEditor=false.

  • Bug Fix: The Sprite List window in the Sprite Editor now correctly shows all Sprites that come from the same texture as the one being edited.

  • New: Added support for registration of tutorial assets from plugins. Also moved Paper2D tutorial assets into the Paper2D plugin.


  • Crash Fix: Generating a levelset from an empty triangle mesh no longer crashes the editor.

  • Bug Fix: Resolved a cloth binding issue that occurred when applying a cloth that has been created with the Remove-from-Mesh box checked.

  • Bug Fix: Resolved a debug issue by splitting symbols from PhysX/APEX for Linux Add PhysX/APEX and running the symbols as a DebugNonUFS runtime file for dependencies.

  • Deprecated: The Get Default Simulation Factory Class in Clothing Simulation Factory Class Provider is now deprecated. This is replaced by the Get Simulation Factory Class.


  • Bug Fix: - Fixed the platform extension config location checks in C# to match C++

  • Bug Fix: Platform - When calculating screen density, we no longer fallback to 0. We instead report unknown, but we use 96 dpi as our default when returning screen density if we don't know it. This is both the default Windows assumes, and what we use internally for fonts in Slate. This allows us to at least do something reasonable on platforms that can't know the physical size of their screen.

  • New: Add support for Apple Development and Apple Distribution certificates from Xcode 11.

  • New: Updated DDSPI with bSupportsGPUScene but also refactored the .inl platform ones to make it easier to add more settings

All Mobile

  • Bug Fix: Addressed a case in Mobile Patching Utilities where UMobilePendingContent object could be GCed while content download is in progress.

  • Bug Fix: Packaging will attempt to enforce the correct casing for project file paths to avoid problems when packaging/running builds from the editor to target platforms that are case sensitive (eg: Android & iOS).

  • New: Mobile device profiles have been overhauled. These will not work for all users but are much more appropriate for shipping high quality mobile games.

    • Removed device profiles for iOS and Android devices that are no longer supported.

    • Android devices from minimum spec (Adreno 4xx/Mali T6xx) and above are now mapped to to Android_Low, Android_Mid, Android_High and Scalablity Groups 0,1,2 respectively.

    • Vulkan now disabled by default, enabled only on Adreno 6xx Android 9+, Mali G72/G76/G77 and PowerVR 9xxx devices.

    • The range of iOS devices map their post process and shadow quality using scalability groups.

  • New: The safe zones specified in the PIE advanced options menu are now applied to mobile standalone PIE Mobile standalone PIE now defaults to the ES3_1 feature level.


  • Crash Fix: Fixed a crash that can occur when audio manager properties are missing.

  • Bug Fix: IsAllowedRemoteNotifications will now return false if GCM or Firebase plugin is not included for Android.

  • Bug Fix: Added a missing extension to HLSLcc to enable GL_EXT_texture_buffer for atomic imagebuffer operation.

  • Bug Fix: Added an option to force use of legacy ld instead of lld.

  • Bug Fix: Launch notification events will now be verified before registering them.

  • Bug Fix: Added an extra condition to check for 64-bit ABI support.

  • Bug Fix: Provided NDK20 fallback tool paths for some architectures.

  • Bug Fix: Disabled ld.gold for ARM64.

  • Bug Fix: Fixed an issue with Stratus XL triggers not appropriately firing input events on Android.

  • Bug Fix: Fixed bindings for DualShock controllers on Android devices running version 10 or greater.

  • Bug Fix: Empty AAR directories on Android will now be ignored.

  • Bug Fix: Fixed an issue with attempting to acquire WRITE_EXTERNAL_STORAGE when we already have it granted on non-shipping builds.

  • Bug Fix: Fixed a potential error in detection of needed install batch files for Android.

  • Bug Fix: Threshold trigger button pressed events are now optional by device type on Android. Some controllers do not need this functionality and will send double input events.

  • Bug Fix: Fixed issue with PLATFORM_USED_NDK_VERSION_INTEGER. It will now show the proper NDK level used to compile.

  • Bug Fix: Added AndroidRelativeToAbsolutePath to AndroidPlatformFile.

  • Bug Fix: Fixed an input issue that can occur with floating keyboards on Android due to improper Y offsets.

  • Bug Fix: Fixed an issue with the Android virtual keyboard interacting incorrectly with emoji when using backspace.

  • Bug Fix: Fixed linker warnings with libvrapi.so.

  • Bug Fix: Added bDisableFunctionDataSectionsoption for Android. Add this to DefaultEngine.ini under AndroidRuntimeSettings if you see an issue with R_AARCH64_JUMP26 being out of range with the linker.

  • Bug Fix: Fixed a compile error with bUseNEONForArmV7=true for Android where vqtbx1q_u8 is an A64 instruction. Now has a fallback to use FPU version for VectorContainsNanOrInfinite.

  • Bug Fix: Fixing readonly check for PlatformFile.

  • Bug Fix: Now using libc++_shared STL on Lumin to match rebuilt Android libraries.

  • Bug Fix: Deleted problematic copy constructors on named pipe.

  • New: May now select path and filename overrides for OBBs from Java on startup.

  • New: Added Engine/Extras/Android scripts to install needed components and set up environment variables for Android with new NDK 21

  • New: Enabled WEBM for Android media player.

  • New: Added bDisableFunctionDataSectionsoption for Android. Add this to DefaultEngine.ini under AndroidRuntimeSettingsif you see an issue with R_AARCH64_JUMP26 out of range with the linker.

  • New: Eliminated recursive file system search for cursor assets on platforms that don't support them.

  • New: Changed FQueuedThread so that it doesn't wake up every 10ms while waiting for work. This wakeup is a waste of cpu time from having to context switch for no reason.

  • New: Added more control over Gradle project. The following are available in UPL:

    • — Sets ANDROID_TOOLS_BUILD_GRADLE_VERSION in gradle.properties

    • — Adds settings.gradle

  • Improvement: Updated small OBB limit to 1 Gb.

  • Improvement: Improved the Network Changed Manager's ability to detect offline networks that are incorrectly identified as having a connection by the Android system.


  • Bug Fix: The iOSReplayKit plugin's Blueprint functions are now allowed to be used in the editor and on other platforms as stub functions.

  • Bug Fix: Prevents an error being displayed in the log before staging if the bundle is not already installed.

  • Bug Fix: GameCenter popup no longer appears on iOS even when GameCenter is deactivated.

  • Bug Fix: Fixed issue with iOS remote build ssh command failing for some Windows users.

  • Bug Fix: Made a change to prevent iOS provisioning parse failure when remote building on a Mac without internet access.

  • Bug Fix: Re-enabled iOS Metal GPUtime by removing any overlaps between commandlists, including overlaps across frames. GPUtime is counted as close to the expected end of pipe time as possible.

  • Bug Fix: Fixed FMetalShaderPipeline initresourcemask.

  • New: Added support for thumbstick buttons and special left on iOS.

  • New: Fixed an issue where packaging for tvOS would fail for Client targets.

  • New: Increased the number of Metal blend state bits in the PSO key from 5 to 7 because we now pre-initialize many more blend modes.

  • New: Added a project setting to allow files created by UE4 to appear in the iOS on-device Files app.

  • New: Removed manual command buffer internal resource tracking and debug group association.

    • All of the data this was tracking is available from the Xcode tools.

    • The manual resource tracking did not interoperate well with the Metal validation layer and could cause a crash on exit in development and/or debug configurations.


  • Bug Fix: Fixed issue that prevented editor windows from restoring when minimized.

  • Bug Fix: Added PLATFORM_LINUXAARCH64 to Platform.h

  • Bug Fix: Set UserTempDir for Linux to $TMPDIR or fallback to /var/tmp

  • Bug Fix: Added missing space to SanitizerInfo string.

  • Bug Fix: Implemented module path name for Unix to avoid hard coded default path.

  • Bug Fix: Disabled ispc for Linux AArch64 Currently using ispc v1.12 which has add "experimental AArch64" support.

  • Bug Fix: Addref Vulkan memory allocation so it's released when not used by framebuffer and surface FrameBuffer ctor was creating a view directly onto a texture surface, but was not holding the allocated memory. If the texture was freed before the framebuffer was destroyed, we could run into use after free type issues.

  • Bug Fix: Fixed Linux address sanitizer builds.

  • Bug Fix: Reduced NullRHI static buffer size by using dynamic buffer Reduces allocation size & fixes potential silent buffer overrun.

  • Bug Fix: Fixed issue with shell script not being able to handle quoted arguments.

  • Bug Fix: Default LinuxAArch64 platform in binary now builds to the same default as Linux platform.

  • Bug Fix: Don't add local launch device for Linux AArch64 platform Local device right now will never be an Arm64 device.

  • Bug Fix: Set PrecompileForTargets to None for AArch64 builds of SoundVisualizations and Kiss_FFT.

  • Bug Fix: Send by default for Linux/Mac as well for UnrealInsights. Since there's no Event to close dont need to check for this.

  • Bug Fix: Added win64 platform check for VisualStudioDTE.

  • Bug fix: Fixed Linux build break with case sensitive headers.

  • Bug Fix: FixedLinux build break (SEnumComboBox.h -> SEnumCombobox.h)

  • Bug Fix: Fixed race when two threads are trying to create a folder on Linux.

  • Bug Fix: Fixed command quoting in Linux chmod command.

  • Bug Fix: Override GetPortableCallstack to avoid 1MB allocations in crash signal handler.

  • Bug Fix:: Removed VulkanLinuxPlatform RenderOffScreen logging.

  • Bug Fix: Fixed Linux build break (includes paths with backslashes)

  • Bug Fix: Fixed UnrealBuildTool unused variable warnings.

  • Bug Fix: Fix for ISPCTexComp dll not loading on projects on a different directory. Fixes this warning on UE4Editor startup: LogCore: Warning: dlopen failed: /epic/UE4.git/Engine/ThirdParty/IntelISPCTexComp/Linux64-Release/libispc_texcomp.so: cannot open shared object file: No such file or directory LogTextureFormatIntelISPCTexComp: Warning: Unable to load ../../../Engine/ThirdParty/IntelISPCTexComp/Linux64-Release/libispc_texcomp.so

  • Bug Fix: Ensures start time for events is now greater than last end time for all nodes.

  • Bug Fix: GpuProfilerEvent times now clamp to valid values, SanitizeEventTree was not clamping start times to be >= to previous root start times, so we were hitting asserts in TraverseEventTree() for: lastStartTime >= GpuProfilerEvents[Root].GetStartResultMicroseconds(). Also removed unused variables.

  • Bug Fix: Now using secure_getenv() instead of getenv().

  • New: Missing toolchain warning now only appears on Linux + Win64.

  • New: Added linux sanitizer information to build details if set.

  • New: Build nvTriStrip and ForsythTriOptimizer with UE clang toolchain (link with libstdc++) Removed stdc++ dependency for MeshBuilderCommon.

  • New: Added LinuxAArch64Server and LinuxAArch64Client build targets.

  • New: Added VULKAN_ENABLE_DUMP_LAYER to VulkanLinuxPlatform.h.

  • New: System compiler is no longer the default fall-back on Linux. We now only check for and use the system compiler if "-ForceUseSystemCompiler" command line is passed Also, no longer default to epic compiler if -ForceUseSystemCompiler is specified and the system compiler can't be found.

  • New: Moved Linux architectures to Linux package project submenu. Added a PlatformSubMenu ini entry to DataDrivenPlatformInfo sections, and coalesced these in FPackageProjectMenu::MakeMenu().

  • New: Added a more descriptive error messages for Linux SDK Toolchain Not Found for three cases:

    • .$ LINUX_MULTIARCH_ROOT=/tmp/foobar make BlankProgram bash "/epic/UE4-23.git/Engine/Build/BatchFiles/Linux/Build.sh" BlankProgram Linux Development Fixing inconsistent case in filenames. Setting up Mono Building BlankProgram... Unable to locate Linux SDK toolchain at /tmp/foobar/x86_64-unknown-linux-gnu. ERROR: GetBuildPlatform: No BuildPlatform found for Linux make: *** [Makefile:183: BlankProgram] Error 5

    • make BlankProgram ARGS="-forceusesystemcompiler" bash "/epic/UE4-23.git/Engine/Build/BatchFiles/Linux/Build.sh" BlankProgram Linux Development -forceusesystemcompiler Fixing inconsistent case in filenames. Setting up Mono Building BlankProgram... Unable to locate system compiler (-ForceUseSystemCompiler specified). ERROR GetBuildPlatform: No BuildPlatform found for Linux make: *** [Makefile:183: BlankProgram] Error 5

    • LINUX_MULTIARCH_ROOT= make BlankProgram bash "/epic/UE4-23.git/Engine/Build/BatchFiles/Linux/Build.sh" BlankProgram Linux Development Fixing inconsistent case in filenames. Setting up Mono Building BlankProgram... Unable to locate Linux SDK toolchain. Please run Setup.sh. ERROR GetBuildPlatform: No BuildPlatform found for Linux make: *** [Makefile:183: BlankProgram] Error 5

  • New: Added Linux AArch64 FreeType2 libraries.

  • New: Added support for Linux offscreen Vulkan rendering, which is enabled with -RenderOffScreen flag. This fixes several Slate issues when rendering offscreen.

  • New: Enabled Neon instrinsics for Linux AArch64.

  • New: Moved to new llvm clang 9.0.1 v16 toolchain.

  • New: Added bGdbIndexSection bool to LinuxToolChain.

  • New: Added Linux AArch64 libs for FreeType2 v2.10.0, ICU 64.1, and HarfBuzz 2.4.0 Includes BuildForLinuxAArch64.sh cross compilation scripts Adds LinuxAArch64 back to installed engine builds.

  • New: Linux now always uses lld linker with clang v9 and above.

  • New: Can now generate .debug_pubnames and .debug_pubtypes sections in a format suitable for conversion into a GDB index. This option is only useful with a linker that can produce GDB index version 7.

  • New: Added protected to bGdbIndexSection bool.

  • New: New build of python2.7 for Linux now supports zlib, bz2, and ssl.

  • New: Use msbuild in mono for Linux when using an installed copy and mono >= 5.0.

  • New: Batch writing of ini files is now possible.


  • Bug Fix: Move GetTickableObjects() and GetPendingTickableObjects() definitions to cpp to ensure there's only a single instantiation. This fixes editor objects not ticking and updating sometimes.

  • Bug Fix: Fixed a path encoding issue when drag-dropping files containing non-ASCII characters on macOS

  • Bug Fix: Re-enable FMacPlatformProcess::IsSandboxedApplication.

  • Bug Fix: Moved a couple of Cocoa calls that hide the window on Mac before it's destroyed to the main thread. This should solve a rare game hang at exit.

  • Bug Fix: Fixed crash at exit on shutting down the PSO cache

  • New: Enabled Metal RHI runtime virtual texture support.

  • New: Implemented FPlatformMisc::GetCPUBrand() for Mac, based on Linux implementation. Also, switched FMacPlatformMisc to use __cpuid intrinsic.

  • New: Enable Metal RHI runtime virtual texture support for macOS.


  • Bug Fix: Reset Windows key mappings when input language changes

  • New: Added raw input simulation over remote desktop on windows since remote desktop uses absolute mouse position in mouse move events. This prevents the cursor from getting stuck over RDP.


  • Crash Fix: Wait for streaming Virtual Texture transcode to complete before deleting file handles. Fixes a rare race condition crash when destroying then recreating a streaming Virtual Texture.

  • Crash Fix: Fix import crash with low guide count for hair grooms.

  • Crash Fix: Disabled render to Virtual Texture on primitives with no Static Mesh, which fixes a crash when inadvertently adding a render to Virtual Texture on a scene primitive component that doesn't support it such as a Brush component.

  • Crash Fix: Fixed a crash due to giving a negative MipCount to "RHICalcTextureCubePlatformSize" from various engine Texture classes.

  • Crash Fix: Fixed a crash when trying to ray trace the sky light prior to generation of sky light importance sampling data.

  • Crash Fix: Fixed crash in Pixel Streaming Signaling Web Server when some users disconnected.

  • Crash Fix: Fixed Vulkan crash on shutdown in TEST/SHIPPING.

  • Crash Fix: Don't transition single mip individually. This is not needed, and also causes inconsistent layouts across the different mips, which fixes a crash when enabling edit layers on landscape.

  • Crash Fix: Fixed crashing that could occur in Vulkan on exit in certain circumstances.

  • Crash Fix: Fixed the handling of "FRHITextureReference" in Vulkan that could cause a crash when importing UDIM textures.

  • Crash Fix: Fixed crashes that could happen in D3D12 when indirect argos buffer can be a previously pending UAV, which becomes a PS\Non-PS read. ApplyState will flush pending transitions, so enqueue the indirect arg transition and flush afterwards.

  • Crash Fix: Fixed a crash that could happen when "OnWorldCleanup" is called with "NewWorld == this". This happens when loading levels through the Content Browser and modifying the "Levels". In this case, do not clean up the persistent uniformbuffers of the FScene, as it will not be deleted

  • Crash Fix: Applied a fix for editor crashes when pressing Build.

  • Crash Fix: Fixed a D3D12 crash where it initialized over garbage data in the StreamOut section of D3D12_GRAPHICS_PIPELINE_STATE_DESC. This also initialized D3D12_COMPUTE_PIPELINE_STATE_DESC and added missing validation code to PSO creation.

  • Bug Fix: Added fix for incorrect vertex indexing in canvas tile renderer.

  • Bug Fix: Fixed a missing barrier in "RenderUnderWaterFog." The pass was not calling "CopyToResolveTarget" and therefore the render target was left in a writable state.

  • Bug Fix: Fixed an issue with a nullptr vertex buffer being passed in with "FSkinWeightLookupVertexBuffer". The "GetNeedsCPUAccess" check was overriding the check for valid "VertexBufferRHI", when setting bSRV, in FSkinWeightLookupVertexBuffer's "InitRHI" function.

  • Bug Fix: Added debug names to Distance Field lighting resources to aid debugging.

  • Bug Fix: Fixed the creation of cube array resources in the reflection environment. The old code was clamping the minimum number of cubes in the reflection environment cube array to 2. This would force that the RHI resource was always an array, rather than a single cube. This is no longer necessary.

  • Bug Fix: Fixed incorrect barriers in Light Propagation Volumes. Auto-write was enabled on the LPV targets despite the LPV system handling the required barriers manually.

  • Bug Fix: Fixed missing resource barriers in "PrecomputedVolumetricLightmap.cpp."

  • Bug Fix: Resolved an issue that was causing negative draw call counts.

  • Bug Fix: Fixed a validation error in "FVulkanResourceMultiBuffer" to store the size explicitly when using BUF_Volatile when updating buffers larger than the default MaxSize.

  • Bug Fix: Moved Vulkan indirect draw barriers into Transition Resources making it impossible to transfer a resource used as a normal shader resource, which is rarely done in practice. A transition refactor will fix this.

  • Bug Fix: DX12 bulk data texture upload now works properly with mipmapped texture arrays and compressed textures.

  • Bug Fix: Fixed an issue with FRHIGPUFence by adding a thread safe counter to prevent "Poll" from returning wrong values while "Enqueue" hasn't yet been processed.

  • Bug Fix: Fixed an incorrect check for usage of scene depth by a material.

  • Bug Fix: Fixed a tangent space computation for Material Billboard component.

  • Bug Fix: Fixed "CopyToStagingBuffer" implementations on D3D12. Other platforms apply the Offset parameter to the source buffer address only.

  • Bug Fix: Applied a fix for case when "MAX_SRVS == 64" and "CurrentShaderSRVCounts == 64".

  • Bug Fix: Added a fix for textures accidentally not getting any inlined mips.

  • Bug Fix: Added vertex buffer debug names to DX11 RHI.

  • Bug Fix: Some 64-bit fixes for "FTextureSource" that fixes import of large UDIMs.

  • Bug Fix: Standardize "-novendordevice" on D3D11, D3D12, and Vulkan.

  • Bug Fix: Fixed compiler warnings in MCPP and made main arguments a dynamic array when "MAX_OPTIONS" is exceeded.

  • Bug Fix: Fixed incorrect calculation of tangent space in landscape vertex shader.

  • Bug Fix: Fixed incorrect calculation of Runtime Virtual Texture volume bounds when copying from a component with zero volume bounds.

  • Bug Fix: Fixed calculation of footprint offset for DX12 texture copy. The previous logic was only correct if copying a mip or slice range starting at zero.

  • Bug Fix: Fixed an issue computing wrong sizes for mips of non-power of two UDIM texture when computing Virtual Texture address wrapping.

  • Bug Fix: Fixed issues with the Virtual Texture Streaming property in the Texture Editor that would be hidden if the project has Virtual Texturing disabled. This also includes a fix for the Thumbnail/editor text that reflects the actual VT state of the texture, not just the property being set.

  • Bug Fix: Fixed lifetime issues with VulkanShaders deleting themselves while still needing to be used.

  • Bug Fix: Fixed DiaphragmDOF on data driven platforms.

  • Bug Fix: Added shader index to FD3D12RayTracingShaderTable's "FShaderRecordCacheKey." This fixes a problem where same resources may be bound at the high level to records that have potentially different local root parameter layouts.

  • Bug Fix: Making overlay menu button transition on click from + to x when menu is opened/closed.

  • Bug Fix: Fixed the wrong atmosphere being applied on opaque objects in front of it.

  • Bug Fix: Fixed rare validation error issues with transition textures that are not render targets or depth targets to GENERAL initially. This makes Vulkan work as D3D reading uninitialized textures used to create a validation error.

  • Bug Fix: Fixed unity test breakage caused by Vulkan global function by fixing a typo inside "DumpMemory".

  • Bug Fix: Added option to do a single renderpass for shadows which fixes flickering on some devices and improves performance.

  • Bug Fix: Fixed a sample out-of-bounds issue in single layer water pass.

  • Bug Fix: Fixed potential denormalized quaternion when manipulating atmospheric lights.

  • Bug Fix: Fixed hair strand bounding box when attached to Skeletal Mesh.

  • Bug Fix: Moved Abstract specifier out of "HideCategories" list in "SceneCaptureComponent".

  • Bug Fix: Removed hair from environment capture and Planar Reflection capture.

  • Bug Fix: Fixed HISM not updating scale and rotation in the game mode.

  • Bug Fix: Fixed the wrong hair width being displayed into the group option in the Details Panel.

  • Bug Fix: Applied fixes to DX12 for potential erroneous transition when using "ReadSurfaceData/GetStagingTexture:. Also, fixed "ReadSurfaceData" of DXGI_FORMAT_R8_UNORM render targets.

  • Bug Fix: Fixed non-determinism in cooked UMapBuildDataRegistry.

  • Bug Fix: Fixed dummy texture being overwritten in some cases.

  • Bug Fix: When computing instances dithering LODs, offset instances by the mesh pivot to match CPU LOD logic more closely.

  • Bug Fix: Wait for Streaming Virtual Texture transcode to complete before deleting file handles.

  • Bug Fix: Fixed responsive TAA on translucent materials.

  • Bug Fix: Applied fix for FConditionalScopeResourceBarrier-related assert to not trigger a resource transition for resources that don't have state tracking enabled when the source and destination state are identical (in the case of the landscape edit layers : CPU readback resource, whose state is always D3D12_RESOURCE_STATE_COPY_DEST) This could be handled on the client side by not using a FConditionalScopeResourceBarrier object in the first place but this would require the client to do pretty much what the scope object does internally.

  • Bug Fix: Added a workaround for corrupt instancedata.

  • Bug Fix: Applied fix for FXSystem being reused across level changes.

  • Bug Fix: Added Option to prevent multithreaded PSO creation. Temporarily disabled multithreaded PSO creation on some problematic devices.

  • Bug Fix: Fixed an issue where bHasInputAttachments was never initialized.

  • Bug Fix: Release uniformbuffers when the world is cleaned up. This releases a lot of render target references.

  • Bug Fix: Release FXSystem GPU resources "onworldcleanup." This frees some lingering render resources that are not free until the UWorld is released, which it might never be.

  • Bug Fix: Fixed two validation issues in Vulkan caused by the Track Editor Thumbnail.

  • Bug Fix: Fixed computation of miss shader table size.

  • Bug Fix: Added missing Vulkan pixel formats.

  • Bug Fix: Fixed an issue with "RHIReadSurfaceData" not allocating a large enough buffer. Fixes an issue with texture painting.

  • Bug Fix: Fixed Vulkan shutdown issue that could happen when refcount from pending state would hit 0. It would end up modifying the array being iterated on.

  • Bug Fix: Fixed Vulkan "RHIReadSurfaceData" when reading back mip levels other than 0. Added missing transition back to Readable in LandscapeEditLayers and added VULKAN_EXTERN_EXPORT for VULKAN_ENABLE_IMAGE_TRACKING_LAYER.

  • Bug Fix: Fixed an issue with Sky Light triggering a check when set to 0 ray traced samples per pixel.

  • Bug Fix: Fixed more incorrect NEE Pdf calculations due to not taking exact material determination and ordering into account.

  • Bug Fix: Fixed erroneous calculation of NEE Pdfs for environment contribution off of diracs.

  • Bug Fix: Fixed HitT not set on full payload. PackedPayload is overwritten at the end of the shader.

  • Bug Fix: Fixed incomplete tool tip for building static lighting, that was giving misleading information on the reasons building lighting could be disabled.

  • Bug Fix: Fixed mip sky light pdf texture and solid angle texture defines set in the incorrect location for sky light direction sampling.

  • Bug Fix: Fixed shader compile fails when 'GBUFFER_HAS_TANGENT' is enabled.

  • Bug Fix: Applied a fix for Background Blur in UMG being filled with black when UI.CompositeMode is used in HDR.

  • Bug Fix: Shader compile log messages now appear during shader compile instead of after all shaders compiled.

  • Bug Fix: Updated debug name of render targets when they are recycled.

  • Bug Fix: Disabled "r.Vulkan.UploadCmdBufferSemaphore" to fix a validation error on shutdown.

  • Bug Fix: Added a fix to prevent overwriting perv cloth xform since cloth xforms are written multiple times per frame.

  • Bug Fix: Fixed pixel depth offset invariance between depth pass and base pass that was causing z-fighting in some cases.

  • Bug Fix: Write out 0s instead of FLT_MAX when morph target LOD's bounds are absent (lower LOD isn't using full morth target buffer).

  • Bug Fix: Fixed a typo for initial layout transition wasn't actually using the intended layout type.

  • Bug Fix: Fixed inverted V component when using hair root UV.

  • Bug Fix: Do not perform project setting based validation on engine visualization materials during DDC warming.

  • Bug Fix: Make AO decals respect meshes that disable receiving decals.

  • Bug Fix: Refactor RT selection during base pass into a single function. Expose helpers to retrieve used RT for specific systems.

  • Bug Fix: Exposed pre-skinned vertex buffer to local vertex factory so that pre skin vertex position is available to material nodes that use it when derived vertex factories generate position buffers that are post skinned. This is particularly relevant for GPUSkinCache.

  • Bug Fix: Removed applying decal fade all the time in the shader. It is by design that the fade parameters are exposed to the material and it will decide how "fade" is applied to the material.

  • Bug Fix: Fixed decals reading GBufferA. It cannot be always indiscriminately set as a RT. Packing active RT together as we do with base pass shading.

  • Bug Fix: Handle RT bindings for decals that write or read to Gbuffer.normals.

  • New: UAV's in the PS stage are now bound as normal resources, and are no longer tied to "SetRenderTargets."

  • New: Added sparse voxelization for hair strands. This allows you to have thinner details on hair and fur when not using "Deep Shadowmap" enabled on lights.

  • New: Added "FrameIndex" override to "FSceneView."

  • New: Adjusted default streaming priorities for Virtual Textures so that they now match the standard texture streaming priorities.

  • New: Added support for export of Runtime Virtual Texture streaming mips to BMP image format.

  • New: Added source mesh slot (optional) into the Groom Component to project hair on a different meshes than the Skeletal Mesh to which a Groom Component is attached. The source and the target mesh need to share the same UV space.

  • New: Added support for Crunch compression of Runtime Virtual Texture streaming mips.

  • New: Added Groom Binding Asset that stores the binding information of a groom onto a Skeletal Mesh.

  • New: Added Matrices.ush which provides functions to build projection and look-at matrices identically from the CPU version.

  • New: Reduced size of "FFileCache" (the file cache used by Virtual Texture system) from 32MB to 16MB. You can make the size configurable with the console variable "fc.NumFileCacheBlocks."

  • New: Increased the SRV limit in DX12 from 48 to 64 so a shader with 50 SRV fits.

  • New: Added visibility pass for hair rendering that improves performance (enabled by default).

  • New: Added support for light channels when hair strands.

  • New: When registering a component, "CaptureOnMovement" is now considered. This prevents updating the render target in the editor when "CaptureOnMovement" is disabled. As a result, when it is disabled, the user is responsible for initializing the render target and update whenever they need.

  • New: Added guard for UPrimitiveComponent's "Set Custom Primitive Data Internal" from being sent an invalid index below zero (it already guarded the upper bounds).

  • New: Added hair group information onto groom instance and hair component, such as Hair width, and the root and tip can be overridden.

  • New: Created streaming Virtual Texture staging textures with flags dependent on whether we are running in multithreaded rendering mode. This fixes very slow performance for D3D11 non-multithreaded mode.

  • New: Changing image writing API from TArray to TArray64 data so images can be over 2 billion pixels.

  • New: Add new Runtime Virtual Texture format "BaseColor_Normal_Specular_Mask_YCoCg." This adds an additional 8 bit "mask" channel for generic use in RVT materials.

  • New: Added validation and time estimate when importing a Groom asset.

  • New: Added multi-shader variant of "ClearUnusedGraphResources."

  • New: Added "CanCreateNew" function to "UTexture2DArrayFactory."

  • New: Added "GRHIMinimumWaveSize" which can be used to query the smallest GPU SIMD width possible on current GPU. Value can be between 4 and 128, depending on the GPU architecture.

  • New: Added "bSupportsWaveOperations" to "FDataDrivenShaderPlatformInfo."

  • New: Added 64-bit support to jpeg and EXR file writing.

  • New: Implemented FD3D11DynamicRHI::RHIBlockUntilGPUIdle function.

  • New: Added DXC integration into Vulkan shader compiler. The DXC path for Vulkan can be enabled with console variable "r.Vulkan.ForceDXC." Currently, this is only supported on Windows platform.

  • New: Renamed "r.DumpSCWQueuedJobs" to "r.ShaderCompiler.DumpQueuedJobs."

  • New: Renamed "r.SkipShaderCompression" to "r.Shaders.SkipCompression."

  • New: Added optional per-instance custom data for Instance Static Meshes. This comes with a material node to sample the custom data by index. Also added a Blueprint setter for the data. This data will be serialized on the InstanceStaticMesh Component. By default the number of custom data floats is 0 and this will not allocate any additional data.

  • New: Added support for using "VkImageFormatListCreateInfoKHR: for sRGB textures.

  • New: SkyAtmosphere component is now accessible from the Actor instance.

  • New: Added support for creating structured and vertex buffers with initial CPU data through the render graph.

  • New: Converted FRHIAsyncComputeCommandList" to "FRHIComputeCommandList." Moved "FRHICommandList" to inherit from "FRHIComputeCommandList."

  • New: Added option to compute SkyAtmosphere transmittance per pixel. This is controlled with the console variable "r.SkyAtmosphere.TransmittanceLUT.LightPerPixelTransmittance."

  • New: Added support for the use of GPU assisted validation using the console command "r.Vulkan.GPUValidation."

  • New: Implemented AMD D3D12 vendor extension support (with custom UAV root signature binding).

  • New: Added Global Uniform Buffer Support in the RHI.

  • New: Implemented bSupportsUInt64ImageAtomics in "DataDrivenPlatformInfo," along with "COMPILER_SUPPORTS_ULONG_TYPES" and "COMPILER_SUPPORTS_UINT64_IMAGE_ATOMICS" compiler definitions, and a generic "ImageInterlockedMaxUInt64" abstraction.

  • New: RHI Viewports now take float parameters.

  • New: Added bSupportsRTIndexFromVS to \DataDrivenPlatformInfo.

  • New: Added generic hooks for primitive shader support.

  • New: Implemented GRHISupportsPrimitiveShaders capability flag.

  • New: The command line "-NumAFRGroups=" now implies AFR in addition to setting the number of AFR groups; if just "-AFR" is specified "NumAFRGroups" is set to "MaxGPUCount", as before.

  • New: Added support for temporal history upscaling on data driven platforms.

  • New: Upgraded AGS to 5.4. It enables 64-bit atomic support on AMD hardware, as well as custom UAV bind slots in D3D12 (among other features).

  • New: Added Vulkan support for exclusive fullscreen extension for Windows.

  • New: Added an option the SkyAtmosphere component for the atmosphere to follow the SkyAtmosphere's transform.

  • New: Added virtual planet shadow when sampling transmittance per pixel to the SkyAtmosphere. Transmittance lut does not contain planet shadow so shadow from one planet on another was incomplete in space view. This is achieved using a simple ray/sphere intersection for now. In the future, we'd like to integrate it in the transmittance lut (last texel data on mu).

  • New: Added console variable to control fine-grained RHI command profiling events. Use "r.RHICmdTraceEvents=1" to enable tracing events (off by default).

  • New: Make Buffer Visualization can config with Material Instances.

  • New: Support for shader categories, for shader cook statistics. Added "CompileTime" stat with some tool tips.

  • New: Added tracking code to help debug memory leaks from Vulkan objects. This is disabled by default. Use "r.vulkan.dumpmemory" to dump when enabled.

  • New: Added "MinBitrate" console variable, that makes PixelStreaming ignore video encoder bitrate recommended by WebRTC if it drops below MinBitrate value. This can be useful to sacrifice interactivity for better video quality on low-bitrate connections. It is disabled by default.

  • New: Added stats for shaders compiled by materials.

    • "CookByTheBook" now outputs a .csv file into Saved/MaterialStats.

    • Statistics View now lists all the csv files from that folder.

    • Load is done lazily

    • Added shortcut key in Content Browser

    • MaterialPath is now serialized into a shadermap (if debug info is allowed).

  • New: Vulkan Graphics PSO cache rewrite/cleanup.

    • Multithreaded creation of PSOs, which should reduce hitches and make optimizing shaders faster.

    • It only uses one map&lock and has one type.

    • It uses UE4 shaderkeys instead of bytecode shaderhash

    • It enables parallel PSO creation

    • We added the "VulkanPSO" stat group

    • LRU is now compiled in but disabled on all Vulkan platforms.

  • New: Added Support Virtual Texture Streaming for Vulkan Linux.

  • New: Added opaque shadow mask permutation for hair for evaluating the transmittance instead of the front depth. This helps to attenuate shadow cast by groom when the hair strands are small/thin.

  • New: Swapping Bcrypt node module to native js version Adding npm console commands to ease usage.

  • New: The Virtual Texture category is hidden on non-UMeshComponent.

  • New: Added a parameter for the lens effects principal point to not be in the center of the screen. Needed for overlapped rendering.

  • New: Added supersampling permutation for hair transmittance evaluation, which is used for cinematic quality.

  • New: Added an option to disable Z-ordering for world widgets (Slate.WorldWidgetZOrder = 0). Disabling Z-ordering may improve widget batching and rendering performance but could result in an incorrect rendering order of overlapping widgets. World widget Z-ordering is enabled by default.

  • New: Pre-exposure is now being forced to always be enabled shaders.

  • New: Added a RenderDoc "CapturePIE" command which starts a PIE session and captures the specified number of frames. Useful when debugging initialization problems, as it allows the first frame of a PIE session to be captured.

  • New: Added ability for selective Skin Cache on Skeletal Mesh Components. Skin Cache can be specified per LOD, and the USkinnedMeshComponent can override per LOD what the Skeletal Mesh Component specifies. There is also a project setting to use as Skin Cache as inclusive or exclusive.

  • New: Added optional per-instance custom data for Instance Static Meshes. This comes with a material node to sample the custom data by index. Also added a Blueprint setter for the data. This data will be serialized on the InstanceStaticMesh Component. By default the number of custom data floats is 0 and this will not allocate any additional data.

  • New: Updated the nvTextureTools libraries for Win64.

  • New: Added DX11 support for EnumAdapterByGPUPreferences. This allows OS assisted selection for the GPU. Use the command line "-gpupreference=[n]" to set the selection. 1 will set the preference to minimum power, and 2 (the default) will set the preference to highest power. Any other value causes it to fall back to the old code. Also, upgrade DXGI to the latest.

  • New: Enabled "SingleLayerWaterIndirectDraw" for Vulkan desktop.

  • New: Added a console variable to skip shader compression with "r.Shaders.SkiCompression." Enabling this can save a significant amount of time when using debug shaders.

  • New: Added limited forward rendering support for hair strands rendering.

  • New: Added ability for WPO and Tessellation to render into velocity pass even if the Actor has not moved. This behavior can be toggled with the console variable "r.BasePassOutputsVelocity." By default it is set to 0 and not enabled.

  • New: Downgraded missing "TexCreate_ShaderResource" error to be non-fatal.

  • New: Exposed "AllowShaderWorkers" to console variables so that it can be set from CansoleVariables.ini.

  • New: Shader compiler warnings can now be stored in the DDC and re-emitted during a cook. Logging is gated on "r.ShaderCompiler.EmitWarningsOnLoad" (off by default).

  • New: Renderer settings should not be hidden behind Defines. Moved ray tracing's texture LOD console variable out. This fixes all non-raytracing platforms.

  • New: Added updates for how we call the Metal compiler, version our DDC key, and find our toolchain. The following has changed:

    • Uses "xcrun" to invoke xCode tools.

    • Picks the SDK based on ShaderPlatform.

    • Fetches the correct version from Metal.

    • Command line "-v"determines the binary path and header paths through Metal.

    • Command line "-print-search-dirs" uses xcrun for Metal-ar and metallib. This should prevent us from mixing versions of metalfe, metal-ar, and metallib (and the headers.

  • Improvement: improved Vulkan LLM support to track render target and spare memory usage.

  • Improvement: Improved Clear Coat shading model to support directional sources.

  • Improvement: Added code for Vulkan to prevent overlap of upload and graphics buffers.

  • Improvement: RenderDoc plugin improvements:

    • In the plugin options, we can now set a delay before the capture takes place after hitting the button, either in seconds or in ticks. The default delay is still 0.

    • In the plugin options, we can choose the number of frames to capture. The default is still 1. This implies the capture turns into a "capture all activity" as we cannot selectively capture a single viewport across frames. As before, the options are accessible with the command line so that this also works in PIE mode.

    • Fixed the notification that stayed on screen forever in PIE mode. The notification shows when a delayed capture will start as well as which frame is currently being captured.

  • Deprecated: "BUF_UINT8" and "BUF_UAVCounter" have been deprecated.

  • Deprecated: Added "RHIClearUAVUint" and "RHIClearUAVFloat" functions and deprecated "UAV" global functions in ClearQuad.h:

    • The ClearUAV implementation for structured buffers was not correct and would lead to D3D debug layer validation errors. This is because it is not allowed to bind a structured buffer UAV to a type RWBuffer<> shader parameter, as found in the clear replacement CS.

    • Use of "NumBytes" was also not correct. The ClearUAV functions using this would assume the UAC format is R32_UINT and divide the NumBytes parameter by 4. For example, if the format was R8_UINT, the divide by 4 means only ¼ of the resource was cleared.

  • Deprecated: "ViewCustomData," "CustomLOD," and "StaticMeshBatchVisibility" are now deprecated and will be removed in the next engine release.

  • Removed: Deleted "SRGBO_ForceEnable" flag, and replaced the one usage of it with "SRGBO_ForceDisable".

  • Removed: Removed "Default Virtual Texture Material" as this was creating unnecessary shader compilation overhead from being a special engine material.

  • API Change: With the new functions, rendering code should call either the "Uint" for Float version depending on what the underlying format of the UAV is. Everything the UAV covers is cleared, so there is no need to pass "NumBytes" anymore.

    • Structured buffers are treated as "R32_UINT" in both the Uint and Float implementations. The X component of the value vector is copied directly into the buffer with no format conversion. This matches D3D11 semantics.

    • It is invalid to call "RHIClearUAVFloat" on an integer-format UAV, or "RHIClearUAVUint" on a float-format UAV. This leads to D3D debug layer validation errors due to mismatched RWBuffer type binding.

    • The caller is also responsible for handling appropriate resource transitions. The underlying resource must be writable when calling "RHIClearUAVFloat" or "RHIClearUAVUint."

Ray Tracing

  • Crash Fix Fixed potential crash when ray tracing Instanced Static Mesh with invalid render data.

  • Crash Fix: Fixed a driver crash when scrubbing in the Sequencer with ray tracing enabled with geometry cache. The index buffer was modified by the render thread while the RHI thread was reading it for building the ray tracing acceleration structure.

  • Crash Fix: Fixed a crash when creating ray tracing geometry if any section has a null vertex buffer.

  • Crash Fix: Fixed a crash when isolating materials in the Static Mesh editor with ray tracing enabled.

  • Crash Fix: Fixed a crash when in Path Tracing or Ray Tracing Debug view modes when "r.raytracing.forceraytracingeffects" is set to 0.

  • Bug Fix Clear Coat custom data channels are correctly populated in the ray tracing payload.

  • Bug Fix: Fixed light's "Affect Global Illumination" flag being ignored by ray traced global illumination.

  • Bug Fix: Ray Tracing Reflections bounces are clamped to a minimum of 1 to avoid artifacts if there were no bounces.

  • Bug Fix: Changed geometry tolerance of primary rays in translucency pass to avoid artifacts due to transparent objects contacting opaque objects.

  • Bug Fix: Applied a small fix in ray tracing reflections where "AccumulateResults" early return was missing.

  • Bug Fix: Fixed incorrect usage of Indirect Irradiance in packed ray tracing payload. Renamed members of FPackedMaterialClosestHitPayload to avoid accidental use of packed members instead of using accessors.

  • Bug Fix: Fixed missing GPUSkinCache barrier transitions when ray tracing is disabled. Basically we would queue up back-to-readable transitions after updating the cache, but only flush this list if ray tracing was enabled. This change reworks the logic to make skin cache barrier flushing independent of ray tracing.

  • Bug Fix: Fixed reflection captures were not working properly in ray tracing because material bindings were incorrect due incorrect views handling in WaitForRayTracingScene. Fixed ray tracing translucency alpha channel in Composure.

  • Bug Fix: Fixed resource state tracking and transitions for ray tracing resources.

  • Bug Fix: Fixed ray tracing was not taking into account layer visibility to add and exclude objects from the ray tracing world. This was affecting Composure layers with ray tracing.

  • Bug Fix: Forbid ray tracing shaders in the landscape thumbnail render.

  • Bug Fix: Fixed an uninitialized out parameter causing undefined behavior in the spot light estimator. Fix other similar instances through path and ray tracing shaders to prevent similar issues in the future.

  • Bug Fix: Fixed Sky Light Color not being set properly in ray tracing global illumination.

  • Bug Fix: Fixed Static mobility in Sky Lights not generating required information when ray tracing is enabled.

  • Bug Fix: FGenerateReflectionRaysCS is not compiled when ray tracing is disabled.

  • Bug Fix: Fixed incorrect throughput calculation path tracing specular reflection material sampling.

  • Bug Fix: Initialized the path tracer's previous material payload to fix validation errors.

  • Bug Fix: Fixed old path tracing regression where the payload was expected to carry previous material hit information upon a miss (for MIS with next-event estimation).

  • Bug Fix: Fix Path Tracer specular transmission material over and under contribution due to incorrect throughputs and pdfs.

  • Bug Fix: Fix checks for setting Sky Light related parameters to rely on what they require rather than if the sky light should be ray traced to allow proper functionality in path tracing and other passes.

  • New: Implemented native instancing for ray tracing geometry. Same shader bindings can now be used with many copies of the geometry that have unique transforms. This results in a significant CPU time savings for GatherRayTracingWorldInstances, BindRayTracingMaterialPipeline, and SetRayTracingHitGroup functions.

  • New: Implemented batched ray tracing material bindings. Materials are now bound to the ray tracing scene using async tasks, which saves approximately 1.6 milliseconds of render thread critical path in the "Infiltrator" scene.

  • New: Packed ray tracing payload is now used during the main ray traced reflection rendering. Same payload instance is used for main material ray trace and for shadow rays during direct lighting. This significantly improves performance for the regular code path when not using miss shaders to evaluate lighting.

  • New: Implemented lighting calculation using a miss shader that's invoked during shadow ray tracing in reflections and translucency. This removes a significant amount of code from ray generation shader and results in up to 2x speedup for reflection rendering in many scenes. The miss shader code path is enabled by default and can be controlled with "r.RayTracing.LightingMissShader." Also, moved some common lighting resource initialization from per-effect to per-view.

  • New: Added parallel GatherRayTracingWorldInstances which makes critical path time of this function approximately 2x faster in a typical large scene on a multi-core CPU.

  • New: Added support for GPU Niagara Meshes in ray tracing. Instances are copied directly from the Niagara GPU float buffer into the ray tracing instances descriptor GPU buffer through a compute shader.

  • New: Added support for disabled sections for dynamic meshes in ray tracing

  • New: Added "bEvaluateWorldPositionOffset" for ray tracing changed from BlueprintReadOnly to BlueprintReadWrite.

  • New: Ray tracing reflections now evaluates the bottom layer before the top one. This is because the top layer data needs to stay live until the bounce is computed, so allowing the bottom layer to execute first reduces overall live state.

  • New: Added option to render opaque objects only in ray tracing debug view modes (r.RayTracing.DebugVisualizationMode.OpaqueOnly - Enabled by default).

  • New: Implemented "SV_InstanceIndex" emulation for ray tracing shaders.

  • New: Added an option to allow for a ray traced Sky Light contribution in reflections. The existing Sky Light functionality has been refactored to allow for better code reuse when using ray traced sky lighting sampling.

  • New: Texture LOD for ray tracing shaders is now a per-project setting, disabled by default.

  • New: Implemented support for binding different vertex buffers per ray tracing geometry segment. Removed the skin cache vertex buffer merging step, improving GPU performance. Deprecated RHICopyBufferRegion/s, as it was exclusively required for skin cache VB merge. Unified bottom level acceleration structure build and update APIs.

  • New: Exposed "Force Opaque" in Ray Tracing Flag for Static Mesh Assets.

  • New: Added base instance index to ray tracing hit group system parameters. This can be used to emulate SV_InstanceID in hit shaders.

  • New: We now allow unique custom user data to be provided per instance when native ray tracing instancing is used. Previously only transforms could be unique.

  • New: Added support for binding multiple ray tracing miss shaders with custom local resources.

  • New: Ray Tracing shader bindings array size increases to match D3D12 RHI limits.

  • New: Deduplicated flag generation in ray tracing reflections and move ray tracing reflection related consol variables and additional flag generation into the proper file.

  • New: Added options to turn off compilation of ray tracing material closest or any-hit shaders. This may be useful for titles that use custom shaders or don't require full material evaluation (For example, only using ray tracing for shadows or AO). This adds new console variables "r.RayTracing.CompileMaterialCHS" (default 1) and "r.RayTracing.CompileMaterialAHS" (default 1) The value is read-only and must match between cook-time and run-time.

  • New: Added flags to improve ray tracing performance on visibility rays not requiring hit depth.

  • New: Implemented simplified ray tracing material hit shaders which forces everything to diffuse and no static lighting evaluation.

  • New: Improve generic TraceRay helper functions and replace existing common TraceRay calls which fit established material and visibility ray patterns.

  • New: Ray tracing reflection rays are not traced from pixels that have the "Unlit" shader model.

  • New: Added better messaging when ray tracing reaches the maximum number of sections supported per mesh.

  • New: Enabled multi-bounce refraction from interface tracking and model total internal reflection in ray tracing translucency.

  • New: Shadow rays in RTGI are shortened by default to avoid hitting the sky sphere making it possible to get desired sky reflections without affecting GI.

  • New: Added an option to disable hair ray tracing when the engine is in ray tracing mode.

  • New: Improve path tracing sky light sampling to use normal-based SH irradiance rather than a highest-mip cubemap guess.

  • New: Implemented basic tiled mGPU support for the path tracer.

  • New: Implemented wiper mode to compare the current image output with the path tracer. It can be enabled with the console variable "r.pathtracing.wipermode." Path Tracing view mode must be active.

  • New: Added DefaultLit material model to path tracer

  • New: Added ClearCoat material model to path tracer.

  • Improvement: Improved multi-sample ray tracing reflections.

    • Multi samples per pixel is now handled from a high level loop.

    • The reflections shader adds an extra stage that reads the current accumulated color/hit distance on anything beyond pass 0, and only applies the final weighting on the final pass.

FX - Cascade and Niagara

  • Crash Fix: Fixed crashes that were occurring when a user performed an Undo/Redo in the system and emitter editor.

  • Crash Fix You can now access the Niagara shader compilation manager through a static Get() function instead of through a globally initialized variable. This stops the compilation manager from crashing in monolithic builds, where it attempts to access FCommandLine during global construction where FCommandLine has not been initialized.

  • Crash Fix: Fixed a crash that occurred when the user duplicated an emitter through the context menu.

  • Crash Fix: Fixed crash that occurred when shutting the engine down if Niagara shader compiles were still in process.

  • Crash Fix: Fixed a difficult to reproduce shut down crash.

  • Crash Fix: Fixed a problem with random crashes that occurred when closing the Niagara system and emitter editor.

  • Crash Fix: Fixed crashes that occurred when the user loaded broken data.

  • Crash Fix: Fixed a crash that occurred when adding an Event Handler. This was caused by system instances being active, and the event handler modifying the cached data.

  • Crash Fix: NiagaraDataInterfaceVectorField was crashing when trying to bind a vector field texture with a null render thread representation (likely a timing or init order problem). This is now fixed.

  • Crash Fix: Fixed a bug that could lead to a crash when a variable default value was not initialized.

  • Crash Fix: Fixed a bug where changing the type of a static switch could result in a crash.

  • Crash Fix: Fixes system/emitter editor crashes when creating a circular reference in the Niagara Graph.

  • Bugfix: Fixed distortion of velocity-aligned particle sprites at low velocities.

  • Bugfix: Fixed issue where a Particle System Component would not tick with its owner's time dilation when using the Particle System Component Manager.

  • Bug Fix: Added support for uint32 vertex indices when using Niagara ribbons. Fixed a bug occurring with Niagara ribbons when requiring more than 16-bit indices.

  • Bug Fix: Fixed issues that were causing compile messages to show up inconsistently in the system and emitter editors.

  • Bug Fix: Fixed an issue with GPU fences so that Clear() will result in Polls failing until the fence has actually been hit.

  • Bug Fix: New user parameters now correctly enforce having a unique name. Fixed a bug occurring in the use of Undo/Redo that caused the preview system to stop running.

  • Bug Fix: StaticMesh interface is now more stable when no mesh is provided, or when CPU access is not enabled on the mesh provided.

  • Bug Fix: Fixed a bug that could prevent the SimulationTarget static switch to work for GPU emitters.

  • Bug Fix: Reset system simulation when setting fixed bounds, so the Preview panel shows the new bounds even when paused.

  • Bug Fix: Cleaned up the registering of Niagara emitter events to resolve multithreaded access.

  • Bug Fix: Made Niagara material loading correctly pass the "loaded from cooked material" parameter around, so that we can load cooked data.

  • Bug Fix: Removed the "Simulating" overlay from the Niagara System Overview Graph and the Script Editor Graphs since modifying Niagara graphs in real time is supported.

  • Bug Fix: Fixed an issue with the CPU async collision queries within Niagara.

  • Bug Fix: Updated the compile error for disconnected numeric pins in module scripts, so that the error tells the user how to fix the issue and provides links which navigate to the issue.

  • Bug Fix: Allocated space in Niagara ParameterStore for missing parameters, to fix potential memory overwrite.

  • Bug Fix: Fixed a problem where Niagara curves were not rendering in the Curve Editor if the curves are linear (all keys have the same value).

  • Bug Fix: Matrices now default to the identity matrix by default when they are added.

  • Bug Fix: Updated force and velocity solvers to ensure that Drag stays entirely framerate independent, even at extremely high values.

  • Bug Fix: The Scale Color and Scale Color by Speed modules now properly stack with each other and with duplicates in the stack.

  • Bug Fix: The Curl Noise Force module is now correctly deterministic when it is used in "Pan Curl Noise" mode.

  • Bug Fix: Fixed simulation inconsistency issues when enabling and disabling emitters.

  • Bug Fix: Fixed ownership of FNiagaraParameterStore when dealing with hierarchies of Blueprint.

  • Bug Fix: Fixed major performance problems in the system editor when editing systems with a large number of emitters (8 or more).

  • Bug Fix: Fixed an issue where dependencies were not refreshing correctly in emitter scripts.

  • Bug Fix: Added the "Library Only" option to the module and dynamic input reassignment menus, which are used when assigning new scripts to modules, and also for dynamic inputs with missing scripts.

  • Bug Fix: Fixed an issue where redundant Niagara GPUComputeShaders were being saved into cooked builds, resulting in non-deterministic cooked builds.

  • Bug Fix: Data Interface functions which need per-instance data can now be called from custom HLSL on CPU emitters.

  • Bug Fix: It is no longer possible to rename emitters to reserved names: [Emitter, Engine, User, Local, Module, NPC, Particles, System, Transient]. Doing so could cause a compiler failure in the system.

  • Bug Fix: You can now undo Niagara module deletions after using the Trashcan button.

  • Bug Fix: Fixed a barrier error in NiagaraEmitterInstanceBatcher::SortGPUParticles. Need to reissue a ComputeToCompute RW barrier after each simulation dispatch (at least until UAV overlap is implemented instead).

  • Bug Fix: Removed premature error logging from a step in the enum loading process. Real errors are handled after both methods are tried.

  • Bug Fix: When you focus the selected emitter in the Niagara Preview viewport, it no longer disables the orbit camera.

  • Bug Fix: When you delete an isolated emitter, it now clears the isolated status of the system itself.

  • Bug Fix: Fixed bool access to NiagaraParameterCollection.

  • Bug Fix: Fixed a "No mesh assigned error" being erroneously reported when using the Sample Skeletal Mesh Skeleton module.

  • Bug Fix: Fixed an issue around destroying a Niagara Component on the same frame as a tick group promotion has been requested. You can reproduce this issue if you have the instance change tick group during system sim ticking, to a tick group before the current one, and then removing the instance before post-actor tick (such as DestroyComponent being called on the owner).

  • Bug Fix: Fixed a deadlock that occurred if TickDataInterfaces destroys the system instance; it will still flag for async work and finalize even though it is complete.

  • Bug Fix: Mark Niagara Component parameter stored UObjects as dirty after reachability analysis; this fixes an issue where instances can reference stale UObjects. We may be able to refactor this later, but for the moment this fixes a pretty nasty GC related issue.

  • Bug Fix: Fixed a race condition where unbinding parameters could be modified while the instances are still ticking.

  • Bug Fix: Cleaned up ExecIndex and implemented Engine.ExecutionCount for GPU systems.

  • Bug Fix: Fixed an issue with races in Volume / Texture data interfaces; it was reading from data set by the RT when determining if the texture is valid.

  • Bug Fix: Fixed an issue with having a RenderTarget still bound that is going to be used as an SRV during Niagara's compute pass.

  • Bug Fix: Fixed an issue that occurred if a GPU emitter was disabled on the first frame and never ticked.

  • Bug Fix: Fixed mesh renderer stats so we do not increment each section.

  • Bug Fix: Fixed a bug where renaming a parameter lost the default value settings for that parameter.

  • Bug Fix: Static switches are now prevented from receiving drag and drop inputs, because it leaves them in a permanently broken state.

  • Bug Fix: Fixing memory problems with the shader compiler jobs being either leaked or prematurely deleted by using TShadredRefs instead of raw pointers.

  • Bug Fix: Fixed a bug with integer type static switches that had exactly two input values.

  • Bug Fix: Fixed a bug where particle attribute reads could be referenced from the wrong namespace.

  • Bug Fix: Fixed a bug where an actor with a Niagara components on autodestroy could be destroyed before the system was finished.

  • Bug Fix: Fixed a bug where modifying a static switch node could cause the loss of all its parameter metadata.

  • Bug Fix: Fixed the matrix access in the spline data interface.

  • Bug Fix: Fixed a bug where the Static Mesh DI did not return the correct transform for a mesh.

  • Bug Fix: Fixed concurrency problems of the export data DI by moving the callback to a separate task graph call.

  • Bug Fix Making it impossible to make attributes as numeric. Numeric is a generic conversion type, not a physical storage type.

  • Bug Fix Fixing issue where particle vector random instance parameters were incorrectly using VRand, causing unit vector sizing instead of a box for certain assets. A new unit vector sizing option was added to allow data created under the incorrect implementation to have the same behavior.

  • Bug Fix No longer using FNiagaraVariable names in UNiagaraScriptVariable names as periods can lead to bad behavior.

  • Bug Fix Fixes for Niagara vector field resources being accessed on the gamethread without it being necessarily initialized.

  • Bug Fix Fixed bug where killing particles on spawn wasn't being honored.

  • Bug Fix Making texture sampling DataInterface emit an error if used in CPU sims.

  • Bug Fix Fixed if multiple instances of a DI were used in a script, the HLSL translator produced all function combinations for each instance.

  • Bug Fix Fixed world time in level editor viewport. Niagara and Cascade culling behavior that works via the component's LastRenderTime will now function correctly in the Level Editor Viewport.

  • Bug Fix Fixed several issues with Particles.UniqueID.

  • Bug Fix UEdGraphPin BreakAllPinLinks and MakeLinkTo don't by default notify the owning node that changes have happened. In some cases, this means that we don't detect that the graph has changed out from underneath us and so we don't recompile.

  • New: Added missing debug names to some Niagara buffers (makes barrier tracking and debugging easier).

  • New: Disabled interpolation on dynamic parameters for sprites/mesh Cascade vertex factories because they are constant and do not require interpolation.

  • New: Moved GPU and CPU script compilation to the shadercompile worker process.

  • New: Niagara mesh particle rendering:

    • Added locked axis and camera offset to Niagara mesh renderers.

    • Fixed issues with the roll of velocity-facing and camera-facing mesh particles.

    • Niagara mesh particle rendering fixes may cause slight differences in existing velocity-facing or camera-facing Niagara mesh particle emitters.

  • New: The "Fix issue" and "Dismiss issue" buttons in the System Editor Selection panel now wrap to the following line when the error message is longer than the width of the panel.

  • Cut, Delete, Rename, and so on).

  • New: Replacing a deprecated module or dynamic input with the suggested replacement now also renames the module, and tries to retain any dynamic inputs or input values that were set on that module previously.

  • New: Niagara View Options combo button in the Selection panel is now highlighted with an orange background if any options are set to non-defaults.

  • New: Added an Experimental Message field to modules, to enable module creators to enter a reason for why a Niagara script was marked as experimental.

  • New: Added a flag to enable/disable motion blur per Niagara Renderer. Fixed local space motion blur for mesh/sprite particles. Disabled velocities on ribbons, because they were not accurate and making them accurate is a difficult problem due to tessellation.

  • New: Removed deferred deletion from Data Interfaces, as it is not required. Removed TSharedPtr from DI proxy as it is no longer required.

  • New: Added an ability to mark Niagara modules, dynamic input classes and functions as Experimental, which will display an Info icon next to their name in the Selection panel, System Overview node and Parameters panel.

  • New: Added a "Create Asset from This" context menu option to emitters; this will duplicate the selected emitter in a Niagara system and re-parent the emitter to the new asset.

  • New: Emitters now have an Edit section in their context menus. It is now possible to rename an emitter by pressing F2.

  • New: Added a console variable "fx.MaxNiagaraGPUParticlesSpawnPerFrame" to control per frame spawn capacity on the GPU.

  • New: Various fixes to matrix related functionality, some were transposed and some were not:

    • You can now generate a matrix inside Blueprints, pass in the vectors to a Niagara system and have it work as expected on both CPU and GPU.

    • Added MatrixToQuaternion. This uses the fast path library under the hood, but gives us a location to replace once we address matrix access issues inside the VM.

  • New: Added a Deprecation Message to Niagara scripts, to enable module creators to communicate why a module is deprecated and what users can do about it.

  • New: Cycling through issues with the issue button in the Niagara Selection panel now cycles through the specific emitter when multi-selecting emitters.

  • New: Added support for SubUVs on the Niagara Mesh Renderer. Added nointerpolation to various attributes that do not require interpolation.

  • New: Added "Create Duplicate Parent" for Niagara Emitters, which duplicates the selected emitter and reparents it to the newly-created emitter. This allows you to insert parents into the inheritance chain of emitters.

  • New: Moved the Isolate toggle to the Render section in the Niagara emitter node. Added a "Go to Parent" button to emitters that have parents.

  • New: Various memory savings for NiagaraScript - Saves ~33% in a simple test level (713.61kb -> 478.70kb).

  • New: Disabled sorting in Niagara by default on sprite and mesh renderers. The existing system will use the previous default to avoid undesirable behaviour.

  • New: Modules can now be renamed from the Niagara Selection panel. The module will still display its original name in parentheses when renamed. This does not affect compilation of the emitter/system scripts in any way.

  • New: Niagara dynamic inputs now display a tooltip in the Selection panel.

  • New: Added a button to isolate a selected Niagara emitter to the System Overview panel. Emitters that are not shown when the system is isolated are greyed out in the System Overview panel.

  • New: Added a context menu to Niagara emitter nodes in the System Overview panel.

  • New: Added an option to filter the Selection panel to only display modules that have issues. Clicking the issue icon in the Selection panel header now cycles through all the issues in the view.

  • New: Added VertexFactory array per View for Cascade particle systems. This fixes issues for split-screen, where particles are oriented to View 0's camera for example.

  • New: Niagara System Overview nodes now have their issue icon right-aligned. Clicking the icon cycles through modules in the selected emitter that contain issues.

  • New: We now use FriendlyName with Niagara Shader Compile Jobs.

  • New: Niagara now tracks GPU particle memory.

  • New: Niagara now calculates the max number of instances required across all sim passes. This reduces memory pressure when Sequencer is scrubbing the timeline and is forcing many simulation ticks at once, because now it will not progressively increase buffers but instead will do it once up front.

  • New: Niagara's "CPU - Ray Traced" and "GPU - Scene Depth" Collisions' stability has been increased by eliminating surface interpenetration correction using particle teleportation. The Pure Roll component has also been improved to handle arbitrary surface angles.

  • New: Niagara can now optionally show a "real time disabled" warning.

  • New: Niagara parameter Map Get and Map Set nodes now get a drop target highlight when they are hovered over.

  • New: Niagara "Set Variables" modules now display the name of the variable that they are setting, and the number of additional variables changed is in parentheses.

  • New: Added icons to the Emitter Properties row to indicate CPU or GPU sim target.

  • New: Now FNiagaraUpdateContext can split its Destroy and Reinit phase to help in cases such as PreEditChange/PostEditChange where systems are torn down before the change, and reinitialized after the change.

  • New: Added an occlusion query data interface that samples the depth buffer in a circular or rectangular pattern to estimate how much of the sample area is occluded. This can be used to find out how much of a sprite or mesh is visible on screen and either optimize performance or create effects such as lens flares. Since this data interface is using the depth buffer, it only works for GPU particles and not for CPU particles.

  • New: Added a Camera Query data interface that can be used to get common camera properties, such as position, for both CPU and GPU particles. On GPU, it can be used to get advanced properties such as the view transforms. There are some limitations to the camera data interface:

    • When used with splitscreen or stereo rendering, the data interface returns only the info for the first available view to the particle simulation.

    • When combined with a data interface that requires a depth buffer or distance field (such as for collision) then the camera information in the particle simulation will be a frame latent.

  • New:

    • Particle emitter memory allocation is now based on a runtime estimation of the max particle count.

    • Added an option to display current particle count estimation in the editor viewport.

  • New: Optimization of bool from {float,int} comparison dynamic inputs. Added "Less Than" operations for ease of use.

  • New: Update to Niagara SetBoolByFloatComparison module to include "Less Than/Less Than or Equal" choices for ease of use.

  • New: Static switch parameters in the stack view can now be reset to their default value.

  • New: Added an LOD highlight category to give a visual indication that these two nodes work together.

  • New: Swapped Niagara SetBoolByFloatComparison to use Static Switches.

  • New: Fixed derivative calc in PolarToCartestiaCoordinates.

  • New: Added SetBoolByIntComparison dynamic input.

  • New: Modules can now define custom upgrade paths when deprecating old modules. See the Emitter State module for an example.

  • New: Added an Audio Spectrum Niagara Data Interface for creating live audio particle effects.

  • New: Because it is impossible to set a reference to a world within the system editor, all the properties referencing AActors or UActorComponent derived classes are now disabled in the system editor.

  • New: Fixed custom HLSL node to support DataInterfaces. Once you name the Data Interface, you can invoke any supported Data Interface method with a period (.), followed by the function invocation. Niagara detects this behind the scenes and sets up all the necessary connections. Also, now users can rename a pin when creating it.

  • New: Logging for the SetEmitterEnable parameter is not implemented for Niagara components.

  • New: It is now a compile error to have multiple different event reads.

  • New: Added two new pairs of UNiagaraNodeOp nodes for generating integer and floating point random numbers. This is because integer and floating point random numbers are semantically different due to how they handle the upper range of an interval. The old "Random" and "Seeded Random" were inconsistent about this across CPU, GPU and determinism modes. Floating point random number ranges are typically half-open, meaning they do not include the upper limit. Integer random number ranges typically do include the upper limit. This adds the following ops that are consistent with the equivalent Blueprints functions:

    • Random Integer: Non-deterministic, produces numbers between 0 and Max-1.

    • Random Float: Non-deterministic, produces numbers between 0 and Max, but not including Max.

    • Seeded Random Integer: Deterministic, produces numbers between 0 and Max-1.

    • Seeded Random Float: Deterministic, produces numbers between 0 and Max, but not including Max.

    In addition, it includes two new helper functions, also consistent with the equivalent Blueprints functions:

    • Random Range Float: produces numbers between Min and Max, but not including Max.

    • Random Range Integer: produces numbers between Min and Max.

    The old Random Range function and the old Random and Seeded Random ops are not touched.

  • New: Adds a new default initialization mode to Niagara variables where you can bind to available compatible parameters using a dropdown menu in the Selected Details panel inside the Script Editor. By selecting a variable in the Parameters panel there is now a new DefaultMode widget that can be "Value", "Binding" or "Custom".

    • When "Value" is selected, it will display an appropriate widget below it to set the default value. A value can only be defined if that variable is referenced in the graph.

    • When "Binding" is selected, it will display a dropdown list of available names to bind. Only built-in names and names explicitly added to the graph or Parameters list will show up.

    • When "Custom'' is selected, it will display neither of the widgets, and indicates that the initialization is done using a sub-graph. This will be streamlined later when the default pins are removed in favor of a separate initialization node. The bindings should be functionally equivalent to the old version of setting the default with a sub-graph and the Begin Defaults node.

  • New: Niagara Parameter Map pins now look like BP exec pins. We will be expanding upon this in a future release where flow control support is added.

  • New: Added support for Materials being set in BP for Sprites and Ribbons that use UMaterial user variables.

  • New: Added the ability for renderers to provide warnings/cues to users.

  • New: Now a warning is displayed when fixed bounds are not set for GPU simulations.

  • New: Niagara script Graph node contents are now being hashed to more reliably identify DDC candidate data. Created Engine\Plugins\FX\Niagara\Shaders\Private\NiagaraShaderVersion.ush that currently works in tandem with FNiagaraCustomVersion::LatestScriptCompileVersion, but is needed for the desired in-editor workflow of making an edit to source files and having it update if a proper console command is set. Added console commands fx.InvalidateCachedScripts and fx.RebuildDirtyScripts, similar to r.InvalidateCachedShaders and recompileshaders changed.

  • New: Info, warning and error messages in the stack view now use different colors.

  • New: Updates Niagara modules, dynamic inputs and functions to use the new explicit RandomRangeFloat and RandomRangeInteger functions from CL # instead of the old RandomRange helper.

  • New: Added an optimization to the VectorVM pattern of acquiring indices and outputting a stream of attribute data.

  • New: Added the Collision Channel enum as a parameter type.

  • New: CPU and GPU Emitters are now differentiated by icon in the System Overview mode.

  • New: Optimized the calculation of the bounds of Niagara CPU particles; an emitter of 100 sprites now has a cost reduction of 40%.

  • New: Fixed up support for GPU mesh emitters that use a mesh with multiple sections.

  • New: Enabled per-particle material parameters for materials used with Niagara systems when targeting GLSL ES3.1.

  • New: Added a set of constant buffers to hold engine-driven Niagara variables, so that we can reduce the cost of managing the parameters through the script execution pipeline.

  • New: Added support for PrimitiveComponent's BoundsScale to NiagaraComponent.

  • New: Location modules now can be optionally masked by SpawnGroup (as defined in Spawn modules such as Spawn Rate or Spawn Burst Instantaneous). This allows a simple form of grouping, and it means that different buckets of particles that are all in one emitter can be easily placed and controlled.

  • New: When script compile errors occur in the system or emitter editor, it now shows the errors in the System Overview and Selection panel. These errors are shown on the module or dynamic input where they occurred, when that information is available. Navigation links are also displayed when that information is available.

  • New: Skeletal Mesh sampling has been rewritten completely to be more full-featured and performant. The old sampling/apply modules have been hidden (but not deprecated) and replaced with Skeletal Mesh Location. The new module is more consistent, easier to use, has more options for which attributes are sampled and written, and is much more lightweight from a performance perspective.

  • New: The Niagara Collision GPU/CPU enum has now been removed from the collision module, because now we can set the value automatically.

  • New: Uniform Ranged Linear Color has been enhanced to give more control over how the color channels are randomly chosen. This enables artists to connect the RGB channels together with a single random value (for example, a random value between black and white would give shades of grey) or to disconnect the channels to drive each channel with its own random value (for example, random values between black and white would give a whole rainbow of colors).

  • New: Changed the default usage bitmask for modules and function scripts to include the particle simulation stage flag.

  • New: Added comments to the Curl Noise Force module, to show how memory usage and performance changes based on the quality of the underlying vector field or function evaluation.

  • New: Spawn modules (Spawn Rate, Spawn Burst Instantaneous) now have an optional spawn probability, which is the chance that the module will generate particles at all during that frame. This allows for more erratic random behavior in spawning without the need for complex logic chains in the Spawn Count inputs.

  • New: Scale Sprite Size and Scale Sprite Size by Speed modules now accumulate a transient scale factor. This enables multiple scale modules to properly accumulate scale offsets, and also enables them to function with sprite size scaling at the LOD level.

  • New: Niagara Graph nodes now retain invalid (no longer exposed) pins which have non-default values or links to other nodes. These invalid pins turn red, and will generate compile warnings which are visible in the emitter and system editors. The warnings also provide navigation links to find and fix the invalid pins.

  • New: The Apply Initial Forces module can now apply forces placed in a Spawn module as if the time was less than 0. This enables users to break up initial spawn positions using forces such as curl noise, wind, or random vector offsets.

  • New: The emitter execution order takes into account events, so that emitters which consume events run after the emitters which produce those events. This makes it possible for events to be delivered in the same frame as they are generated, removing the need for extrapolation in most cases.

  • New: Niagara ribbons now preserve multi-ribbon ordering to prevent random flickering when the camera moves around. Disabled multi-ribbon ordering when using opaque materials. Fixed random flickering when using multi-ribbon in Niagara.

  • New: Added FGPUSortManager that handles different GPU sort tasks. The current clients for it are Cascade and Niagara.

  • Deprecated: Set volumetric scattering default for light renderer to 0 (same as Cascade).

  • Deprecated: Removed fast path implementation from Niagara. This feature was only visible by setting a cvar, so this deprecation should not affect any users.


  • Bug Fix: Applied a fix for rendering both Capsule Indirect Shadows and SSAO in the Foward renderer. Previously the SSAO would overwrite the results of the capsule shadows.

  • Bug Fix: Fixed Virtual Texture encoding of BC4 textures which fixes lightmap AO material mask when using VT lightmaps.

  • Bug Fix: Fixed the specular highlight in lighting-only mode that was accidentally introduced in the last release.

  • Improvement: Updated GTAO to improve spatial and temporal filters to bleed better across discontinuities. Added a Thickness Heuristic to bias AO around smaller objects that can be controlled using "r.GTAO.ThicknessBlend." Also added console variables to control the falloff so it is not hardwired which can be controlled using "r.GTAOFalloffEnd" and "r.GTAO.FalloffRatio."


  • Crash Fix: Removed various UMaterialExpression::NeedsLoadForClient impl, and instead it always returns true for UMaterialExpression::IsEditorOnly, as we no longer want any expressions in a non-editor build. MaterialCachedData now checks for nullptr expressions and avoids updating if any are encountered. This fixes a crash occurring with the editor loading cooked/non-editor data.

  • Bug Fix: Fixed an issue in shader complexity that prevented materials using depth pixel offset from rendering.

  • Bug Fix: Fixed an issue with SSS specular when checkerboard is off.

  • Bug Fix: Fixed an issue with the scene color node in translucent shaders.

  • Bug Fix: Scalar type now correctly propagates through a vertex interpolator material node.

  • Bug Fix: Fixed a race condition that resulted in duplicate shadermaps for material instances.

  • Bug Fix: Made "GDefaultMaterialParameterCollectionInstances" a TMultiMap instead of TMap. This makes it possible for the same MPC to be loaded multiple times. If this happens, it will get added to this map multiple times. If it's not a multimap, the first instance that's destroyed will remove the ID from the map, which will cause further lookups against the map to fail.

  • Bug Fix: Update the runtime Virtual Texture contents after any relevant Material Instance parameter change.

  • Bug Fix: Applied a fix for Deferred Decals after base pass not being rendered when GTAO is enabled. This was due to them not being registered in the render graph as a dependency when rendering the GTAO.

  • Bug Fix: Updated "CopyMaterialUniformParametersInternal" to work without requiring a FMaterialResource.

  • Bug Fix: World Position Offset can be affected by not only regularly connected nodes (Current WPO), but also using Previous Frame Switch nodes (Prev WPO). Take that into account when setting compilation output flags.

  • Bug Fix Prevent forcing low or medium quality usage for platforms that cannot lower the shader quality. This reduces the number of shaders to compile.

  • Bug Fix Fixed unnecessary recompilation of the material when simply clicking on its textual and numeric parameters.

  • Bug Fix Fixed the "Failed to find material attribute, PropertyType: 28" warnings happening during the cooking process.

  • New: Added Burley sample override for offline rendering.

  • New: Allowing modulate translucency to render into the post Depth of Field pass with Dual Blending.

  • New: Allow additional defines and include macros for custom nodes.

  • New: Added a framework to allow user to override the streamed mips of UTexture2D Assets. This allows custom implementations to fill in mip data (from other sources than the cooked mips). Users must derive a class from UTextureMipDataProviderFactory and add it to the UTexture's "AssetUserData." This one has to allocate a custom implementation of FTextureMipDataProvider to fill the streamed mips with its own strategy.

  • New: Default to World Space Normals when writing to Runtime Virtual Texture through standard material attributes.

  • New: Added optional World Position Offset input to Runtime Virtual Texture Sample node. This allows us to manipulate sample coordinates. One use case is to sample using the world position from before material World Position Offset is applied.

  • New: Added Blueprint API for setting layer parameters on Material Instance Dynamics.

  • New: Added texture group TEXTUREGROUP_Project11 to TEXTUREGROUP_Project15.

  • New: Added support for moving Translucency Pass to before water rendering depending on if the camera is above or below the water surface. This introduces a water depth state on the scene view making it now possible to, for example, call IsUnderwater() on a view.

  • New: Write output hash as part of the shader debug info.

  • New: Optimize getting the material parameters for the UI speeding up editing "master" materials with a large number of parameters.

  • New: Sharing material shader code is now the default.

  • New: Added support for the shader pipelines in the shader code library's stable map.

  • Improvement: Minor time savings during shader compilation by not including the preprocess defines.

Mobile Rendering

  • Crash Fix: Fixed an assert in PreparePrimitiveUniformBuffer with Skeletal Meshes when ES3.1 Preview mode is enabled.

  • Crash Fix: Fixed a crash related to Reflection Captures when running DirectX mobile emulation.

  • Bug Fix: Fixed HQreflection on mobile. The first empty spot in the ReflectionCubeMapTextures (if there is any) will be taken by the Sky.

  • Bug Fix: Updated Graphics Resources for Indirect Commands; this fixes Niagara for OpenGL.

  • Bug Fix: Fixed roughness clamp causing IBL mip0 never to be used.

  • Bug Fix: Try to update all PassUniformBuffers before start rendering to avoid GPU flush.

  • Bug Fix: Fixed a precision issue at mobile base pass pixel shader.

  • Bug Fix: Fixed an issue with Spot Lights not working in the mobile renderer when not enabling cast shadow.

  • Bug Fix: Fixed a problem that movable objects never get reflection captures updated in Forward renderer.

  • Bug Fix: Fixed a Software Occlusion issue that Landscape does not generate correct VB and IB data for multi-sections components.

  • Bug Fix: Added an option to promote 16bit index buffers to 32bit on load, which is needed for some Android devices (Mali T8X series). Activate it by setting "r.Android.MaliT8Bug" to 1.

  • Bug Fix: Fixed a mismatched depth/stencil buffer access type when adding a scenecapture2d in the scene on mobile preview.

  • Bug Fix: Niagara GpuSim fixed for Android. Disabled overlap compute on Android. Workaround for Mali Compiler bug that assumes a texture index is warp invariant.

  • Bug Fix: Moved mobileDepthPrepass Uniform buffer update to the start of the frame.

  • Bug Fix: Fixed an issue where the global shader is not recompiled after turning MobileHDR on or off.

  • Bug Fix: Fixed an issue with "Render in main pass" component option now works correctly on mobile.

  • Crash Fix: Resolved occasional crashes on iOS devices while using scene captures.

  • Crash Fix: Fixed a crash in Post Process Visualize Complexity when in ES3.1 preview mode.

  • Bug Fix: Disabled Vulkan support for Android devices with Mali-G72 GPUs that use Android 8 or older version. Those devices can't create a PSO with a compute shader that uses texel buffers.

  • Bug Fix: A8 textures are not writable in Metal. This change switches the backing to R8 and leverages Texture2DSample_A8 so we sample the correct channel.

  • Bug Fix: Fixed a small issue that local light's diffuse color was not correctly cosine-weighted.

  • New: The texture buffer is greater than the 2D texture for GPU Scene Mobile devices. This was done because of the MALI GPU limitation of 64kb texture buffer. The default precision of compute shaders to high precision was done because of the MALI GPU limitation of 64kb texture buffer. The GPUSceneUseTexture2D was changed requiring a recompile of all shaders.

  • New: Android projects will now use SensorLandscape as orientation and Immersive full-screen options by default. Previous engine versions were using Landscape and non-Immersive as defaults. If you would still prefer that setting, you can change it back from the project settings.

  • New: Added support for light shafts with MSAA on iOS. Makes all post process passes, including post process materials, work properly with MSAA on iOS.

  • New: Niagara GPUSim iOS/Android glGenVertexArrays, glBindVertexArray, glMapBufferRange, glCopyBufferSubData, glDrawArraysIndirect, glDrawElementsIndirect added One VAO bound per context now (different from Default VAO - indirect ES requirement).

  • New: Added an option on Materials for Forward shading (including mobile) to use EnvBRDF instead of EnvBRDFApprox to have a better IBL effect.

  • New: ImageBasedReflectionLighting now keeps coherence between mobile and PC.

  • New: LightMapPolicyType now keeps selection coherence between mobile and PC.

  • New: Added particle related material properties for Position, Time, Direction so that they can now be used on Mobile.

  • New: Emulated uniform buffers will now be used by default on OpenGL ES3.1. These buffers significantly reduce shader memory usage and often improve rendering performance slightly. You can revert to old behavior by adding "OpenGL.UseEmulatedUBs=0" into project DefaultEngine.ini file.

  • New: Corrected the Stationary Sky Light contribution for two sided primitives.

  • New: Fixed an issue of incorrect indirect lighting on movable objects because of the mismatch of SHCoefficients.

  • New: Added support for Post Process Material stencil test on mobile platform based on the new mobile custom depth implementation.

  • New: Changed mobile custom stencil format from B8G8R8A8 to G8. This saves depth to the R16F color target and uses less memory for the depth target to reduce memory cost on mobile platforms. Added a console variable for using half-res custom depth.

  • New: Hardware occlusion queries will now be enabled by default on Mobile platforms. Occlusion queries can be disabled on a specific mobile device by adding "r.AllowOcclusionQueries=0" to a corresponding platform's device profile.

  • New: Refactored GpuScene & UniformBuffer to unify mobile and console code paths.

  • New: Added ClearCoat shading model for mobile renderer.

  • New: Refactored the MobileBasepassPixelShader to make further shading model extension to be more easy and maintainable.

  • New: Saved some bandwidth for mobile post-processing by splitting RT from R16FG16FB16FA16F into R11G11B10 and R16F.

  • New: Implemented Eye Adaptation for mobile.

  • New: Added support for Eye Adaptation Lookup from material graph for mobile.

  • New: Added Android Desktop Forward Rendering (Experimental).

  • New: Fixed RandomSeed difference seen on different devices Function argument order evaluation is undefined.

  • New: Added 3x3 PCF shadows for mobile and support for texGather on ES 3.1

  • New: Added experimental support for Virtual Textures on mobile platforms. It requires IPhone8 or newer iOS devices, and preferably Vulkan on Android devices. Runtime Virtual Texture compression is not implemented yet. VT on mobile is disabled by default and should be enabled in the project settings.

  • Improvements: Improvements to Mobile Custom Depth:

    • Added a console variable "r.Mobile.CustomDepthDownSample" which if set to 1, will use a half-resolution custom depth texture.

    • Changed stencil format to G8, and depth format to R16F, both memoryless color targets to reduce memory cost on mobile platforms.

  • Deprecated: Removed ES2 support. See blog post on www.UnrealEngine.com for more information.

  • Deprecated: Removed ATC/ETC1 and Android PVR texture formats.


  • New: Replaced flipping "gl_Position.y" coordinate in HLSLcc by flipping viewports in Vulkan RHI (uses VK_KHR_maintenance1 extension). Primarily used to simplify the consumption of SPIR-V modules generated by DXC.

  • New: Added support for UAV overlap on Intel and renamed the console variable "r.D3D11.NVAutoFlushUAV" to "r.D3D11.AutoFlushUAV."

  • New: Fixed possible CPU stalls when using the GPU readback framework.

  • New: Use "TSherwoodMap/Set" instead of "TMap/TSet" for resource residency tracking and descriptor table deduplication in DXR implementation.

  • New: Added low quality setting for Distance Field shadow (uses 20 steps, no SSS).

  • New: Added runtime Distance Field GPU downsampling.

Post Processing

  • Crash Fix: Fixed a crash in shader complexity pass when visualizing complexity in a cooked build.

  • Bug Fix: Added a fix for bloom application in split screen. The "PostProcessTonemap.usf" now properly accounts for a restricted ViewRect on the Bloom input texture.

  • Bug Fix: Applied a fix for debug draw pass using MSAA depth instead of resolved depth.

  • Bug Fix: Fixed an issue with bloom being sampled incorrectly in tonemap pass.

  • Bug Fix: Fixed the visualizer for motion blur to accept the last pass override.

  • New: Changing default Exposure Bias for Auto Exposure to 1.0.

  • New: Locking eye adaptation exposure to 1.0 when auto-exposure is disabled.

  • New: Added ShaderComplexity support in cooked content. This requires the console variable "r.ShaderComplexity.CacheShaders=true" to be set in your .ini files.


  • Bug Fix: Passed through the DepthPriority parameter in PrimitiveDrawingUtils instead of hardcoded value.


  • Crash Fix: Fixed a crash in CrashReporterClientEditor occurring if the user closed the windows before the call stack was resolved, preventing the crash reporter from sending the crash report.

  • Bug Fix: Fixed FArchive not properly writing when byte swapping is enabled. The written value was swapped after being written and the swapped value was returned to the user.

  • Bug Fix: Fixed FString not swapping the bytes when the archive was written byte swapped.

  • Bug Fix: Fixed an issue where the HLOD Outliner would stop updating while Play-in-Editor was running.

  • Bug Fix: Fixed the HLOD MergeSetting for "LOD Selection Type" that was being overridden on load when saved to level instead of Blueprint Asset.

  • Bug Fix: Fixed DMX Gobo Rotation effect and added a texture mask.

  • Bug Fix: Actions are no longer posted to the context menu for the Curve Editor if the curve/key's parent curve is set to "read-only."

  • Bug Fix: Fixed an issue when importing a Skeletal Mesh that would sometimes cause the material slots to not be properly assigned.

  • Bug Fix: Renamed "UnrealDisasterRecoveryService" as "UnrealRecoverySvc" to shorten several build/install paths on Windows.

  • Bug Fix: Fixed an issue with SN-DBS compilation with precompiled headers. This change restores generation of the dummy include file of PCHs.

  • Bug Fix: Applied fixes for various custom debugger object views (from natvis).

  • New: VTune 2019 ITT Notify library update.

  • New: Enabled verbose output for SN-DBS code builds. This has been enabled by default to catch issues as they arise so that supported platforms can compile cleanly.

  • New: Changed the default minimum scope time for framepro captures from 25us to 50us. This is the default for framepro windows client live captures. It significantly reduces hitching from scope "FramePro Start Frame" when recording captures.

  • New: Added new DMX Fixture Content and removing old DMX Fixture content.

  • New: Added a new UDP Messaging option to change the message format used to encode UDP messages. The choices are "CBOR (Standard Endianness)" and "CBOR (Platform Endianness)".

  • New: Added a "Quit" menu along with the "CMD + Q" shortcut to close the Multi-User server window on Mac.

  • New: Added a choice to the HLOD Outliner for "No HLOD" in the HLOD level dropdown menu.

  • New: Added "Do not resave _BuildData.assets" in the HLOD rebuild commandlet as they aren't dirty.

  • API Change: This change list added a minor feature along with 2 bug fixes discovered while adding the feature.


  • New: UAT: Change the default "DeployFolder" name to be "ShortProjectName-RootFolderName-UserName" truncated to 50 characters. This will deploy the same project from different streams, or users, to different workspaces. And, use the "DeployFolder" instead of the "ShortProjectName" for all platforms. The existing "-deploy=DeployFolder" argument can be used to specify any custom workspace name.

  • API Change: Make sure to use the new "DeployFolder" location in any command line parameters or debugger options when launching a deployed game.


  • New: Added "TArray<*,FMemoryImageAllocator>" and "TMemoryImagePtr<>" visualizers.

  • Bug Fix: Fixed the project file generator to put the proper Engine PlatformExtension directory in the solution.

Virtual Production


  • New:

    • Switched to UStaticMesh-based components.

    • Characters are now instanced meshes, allowing faster text generation and transformation-based animations.

    • Characters are now cached at runtime for reuse.

    • Added text animation tools using Text3DCharacterTransform, which allows position, scale and rotation-based character animations.

    • Optimized speed of Kerning, Line Space, and Word Space.

    • Removed third-party libraries (FTGL, GLU-Tessellate).

  • New: Added a plugin that can create 3D charts based on data tables. The plugin currently provides 3 types of charts: Bar, Pie, and Line. All charts are fully customizable and support showing and hiding animations that can be triggered through an event. The plugin is still in beta.


  • New: Added the two-pass Color Difference Keyer to Composure, replacing the RGBtoHSV Material function and updated all references to it.

  • New: Added a new keyer based on color channel difference that provides the user with better results, especially when keying hair or transparent objects. Materials include additional functions, such as Alpha Erosion and Despill. Materials are structured to support a single-pass setup for Composite Planes and a two-pass setup for Composure.

  • Bug Fix: Fixed a bug when interpolating SceneTime from LiveLink frames to now use linear interpolation.

  • Bug Fix: Fixed incorrect background color of LiveLinkClientPanel when docked.

  • Bug Fix: Fixed default LiveLink preset to load when depending on other modules. Moved to PostEngineInit instead.

  • Bug Fix: Initialized the LiveLink source setting when connecting via Blueprint.

  • Bug Fix: Changed the name of LiveLinkMessageBusDiscoveryManager thread.

  • New: Changed how MobuLiveLinkPlugin reads reference time, so that it reads value set by reference time provider without adjusting for system time difference.

  • New: In Create LiveLink Timecode provider, added GetLiveLinkTime to LiveLinkBaseFrameData. Renamed FOnLiveLinkSubjectFrameDataReceived to FOnLiveLinkSubjectFrameDataAdded.

  • New: [LiveLinkComponent]

    • Subject Role was split into a hierarchy, in which each role class is assigned a controller.

    • Users can now select a specific controller for a role.

    • For each role class, Project settings were added to set a default controller.

  • New: Added a picker for LiveLinkSubjectKey.

  • New: Added support for multiple virtual subject sources to provide better extension flexibility.

  • New: Added a new LiveLink Axis Switch option to switch the translation unit.

  • New: A LiveLink Preset can now be loaded from a command.


  • New: Added a plugin that allows a cine camera to project textures and videos on selected objects. An alpha can be used with textures as a cut-out. An alpha can be generated using the new color channel difference keyer. The plugin is still in beta.


  • Crash Fix: Fixed cluster event packing from a slave node that could lead the engine to crash during a second Play in Editor session. JSON data was being generated in a wrong way.

  • Crash Fix: Fixed a crash when a non-nDisplay StereoRendering device is used with nDisplay active.

  • Crash Fix: Fixed a bug when nDisplay is used with instanced stereo enabled that could crash the engine.

  • Crash Fix: nDisplay sync components now unsubscribe from the replication process on EndPlay. This fixed some unexpected issues and crashes.

  • Bug Fix: Fixed the 32K limit in networking. The networking buffer size for nDisplay internal communication and cluster events is now a UINT (32 bits).

  • Bug Fix: Fixed a bug where DisplayClusterRootActor could not be found when located in a sublevel.

  • Bug Fix: Fixed synchronization issue. All replication data on a master node is now acquired on game thread.

  • Bug Fix: Fixed several issues with receiving/emitting nDisplay cluster events during Play In Editor.

  • New: The nDisplay Master node will now send its MessageBus interceptor settings to the cluster so all nodes use the same setup and avoid multi-user synchronization bugs.

  • New: Added the LiveLinkOverNDisplay plugin, which provides synchronized live link data across an nDisplay cluster.

  • New: Added mesh-based warp rendering. Added Chroma Key markers, allowing continuity rendering over multiple cluster nodes.

  • New: Created a new Actor type, DisplayClusterTestPatternsActor. It enables us to use both console and cluster events to control calibration patterns appearance. Supports custom patterns.

  • New: Integrated NVIDIA hardware-based Frame Lock and Swap Sync for Quadro and RTX Pro cards.

  • New: Added the option to assign an nDisplay instance to an available GPU from the configuration file.

  • New: Added a temporary warning display if a config path has spaces. nDisplay config files that have spaces in the path are temporarily disabled.

  • New: RootNode is now used as the default if a parent Component is not found for simple projection policy. If a screen for simple projection policy has a non-existent parent node, the nDisplay origin will be used.

  • New: Added Three-Layer Composition changes for In-Camera VFX, including the ability to ignore Actors for In-Camera VFX rendering.

*ake Recorder

  • Bug Fix: Recorded data in Take Recorder is now smoother.


  • Bug Fix: Updated code to directly access FApp::GetTimecode instead of using the engine's timecode provider.

  • Bug Fix: Updated TimecodeSynchronizer to use the FApp flags instead of the GEngine flag.

  • New: TimedDataMonitor plugin was added. This adds a new way to configure and monitor different Timed Data Inputs such as LiveLink and MediaIO data. This adds interfaces a user can extend from so its data is automatically picked up by the monitor. It gives the user one central place to visualize different data sources alignment compared to the engine's evaluation point. This tool is meant to be used first before considering using TimecodeSynchronizer.

  • New: System timecode can now generate subframes.

  • New: A SystemTimecodeProvider can now be created when requested. Let the user change the CustomTimeStep and TimecodeProvider in the Project settings.

  • New: Added SubFrame delay for TC Provider and LiveLink.

  • New:

    • Replaced FTimecode with FQualifiedFrameTime in FApp.

    • If there is no TCProvider, you can now use TOptional in Fapp to invalidate the frame time.

    • Remove FTimecode for maths in LiveLink and nDisplay, only use timecode for display.

    • You can now use FTimecode::IsDropFormatTimecodeSupported to convert from FrameTime to Timecode.

    • You can now generate a default timecode value when no timecode is set. By default it's enabled and the framerate is 24 fps.

    • Added a CVar that sets the engine in DropFrame or NonDropFrame when the timecode is 29.97 or 59.94. Removed the Sequencer option to select between the two.

  • New: You can now set a frame delay in the Timecode panel.

  • New: Added the option to report dropped frames with Blackmagic Custom Time Step.

  • New: Added support for fractional timecode to the ARKit face protocol.


  • Crash Fix: Fixed a bug when reading normals that were not varying per vertex on a USD geometry Actor.

  • Bug Fix: USD instances are now processed correctly when using the Import Into Level command.

  • New: The USD primitive Details panel now lists all attributes of the selected primitive and their values.

  • New: Added support for USD MetersPerUnit metadata when loading a USD Stage through the USD Stage Actor.

  • New: Universal Scene Description (USD)

    • Added auto-collapsing of all Geometry Actors under a Component type to achieve better performance.

    • Reloading a USD Stage will be faster as derived data generated from USD assets are now stored in the derived data cache.

    • Static meshes generated from USD primitives now have a physics body and VR scouting can be used to interact with them.

  • New: Added USD support for the Linux editor. The editor must be compiled with run-time type information (RTTI) enabled.

  • New: Extended the USD schemas translation framework to allow overriding a schema translator and adding support for custom USD schemas.

  • New: Added support for USD Point Instancers through the USD Stage actor. A point instancer is converted as a HISM component.

  • New: Multi-threaded the creation of the Static Meshes when loading a USD Stage, drastically reducing loading time.

  • New: Materials added to Actors spawned by the USD Stage will now be saved as custom Assets in the current USD edit target. When USD Stage reload, any custom UE4 Materials found in the USD data will supersede other USD materials. This behavior allows the user to set up the look in the engine using Unreal Material assets.

Video IO

  • Crash Fix: Fixed a bug the could cause the engine to crash when trying to use the HAP video codec with DX12

  • Crash Fix: A bug was fixed so that inputting a negative size in the Media Capture panel could no longer cause the engine to crash.

  • Bug Fix: Fixed incorrect category name for Avid DNxHD encoding.

  • Bug Fix: - Fixed AJA output timecode overriding timecodes of other channels.

  • Bug Fix: When outputting with AJA, a ready frame is no longer used when no frame is available. Frame capture is skipped when the gameplay thread is not executing.

  • Bug Fix: When outputting with AJA, the correct number of drop frames are now reported.

  • Bug Fix: The AJA Timecode provider frame rate is now capped to 30 when read from the reference pin.

  • Bug Fix: Fixed how the engine detects if an AJA card is already used, to better handle when Unreal Engine 4 crashes and leaves the card in an unpredictable state.

  • Bug Fix: Fixed InlineEditCondition for FileMediaOutput.

  • New: Added the AJA plugin.

  • New: Updated the AJA SDK to

  • New: Added the AJA Auto-Detect button.

  • New: Added the Blackmagic Media plugin.

  • New:

    • Updated MediaIO to work with Timed Data Monitor.

    • Disabled LiveLink' ValidEngineTime and ValidTimecodeFrame setting by default.

    • Added the option to set the LiveLink MessageBusSource to Timecode by default.

  • New: When using an AJA media card, the name of the device app type being used can now be printed.

Virtual Camera

  • Bug Fix: Fixed log spam when using a custom tracker in VirtualCamera.

  • Bug Fix: Fixed incorrect string comparison that stops RemoteSession from finding the correct channel.

VirtualProduction Utilities

  • Bug Fix: Teleport to bookmark now takes the headset offset into account.

  • Bug Fix: Fixed flying feature in VR scouting. Replaced action type string TrackpadPositionX and TrackpadPositionY with TrackpadPosition_X and TrackpadPosition_Y in related Blueprints.

  • Bug Fix: Fixed camera grabbing when snapping is on.

  • Bug Fix: Fixed crashing when in VR and Multi-User, where other machines may crash when one starts VR Mode.

  • New: You can now create an Actor that controls how to display Unreal Motion Graphics in fullscreen in different game modes.

  • New: Added Color Correction Volumes/Regions to the VirtualProductionUtilities plugin. These are used to blend real sets with LED wall extensions. Three-dimensional shapes, such as spheres, cylinders, and cones, can color correct pixels located inside of them, with an editable fade-out region.


  • New: Reorganized XR rendering options. Single-pass stereo options are now consolidated.

    • Multi-View Direct is now automatically used for supported plugins when targeting Mobile.

    • Multi-View is now automatically used when Instanced Stereo is enabled.

    • Mobile HDR has been migrated to an XR rendering option and has to be disabled for Mobile Multi-View.

  • Improvement: Improved logging for remote connection failures.

  • Improvement: Scene capture and reflection capture in VR Mode use Grow rather than Resize in select cases to improve performance.

  • Removed: Leap Motion plugin removed from engine as it is no longer supported.


  • Crash Fix: The camera can be explicitly turned on or off at runtime, and defaults to off. This fixes a crash that only shows in newer HoloLens flashes and generally reduces power consumption for all HoloLens apps.

  • Bug Fix: HoloLens now uses its device profile rather than creating a default device profile.

  • Bug Fix: Fixed a crash while changing the IP address of the remote device.

  • Bug Fix: Added a warning if developers run with the wrong XRSystem active and trying to remote to HoloLens.

  • Bug Fix: Updated default minimum Windows 10 SDK for HoloLens packaging to version 10.0.17763.0.

  • Bug Fix: Fixed issues that would cause packaging plugins on HoloLens to fail due to incorrect architecture string.

  • Bug Fix: Interop projects now handle spaces in the path for custom build step.

  • New: Added support for mobile multi-view on Hololens

  • New: Exposed HandMesh for HoloLens.

  • New: Updated to latest HoloLens QR tracker plugin.

  • New: Exposed controller and hand-tracking status to WMRFunctionLibrary.

  • New: Implemented remoting from game.

  • New: Displays remoting connection status (connecting, connected, disconnected) in remoting settings window

  • New: Added webcam support for HoloLens.

  • New: Exposed hand state to C++.

  • New: Exposed hand joint radius so that a pointer can appear on the tip of the finger instead of the middle.

  • New: Returns a boolean whether hand tracking is supported.

  • New: Enabled HoloLens support for Microsoft Spatial Audio

  • New: Added HoloLens third camera MRC support.

  • New: Moved HoloLens input sim injection for controller tracking status to the HMD class.

    • The SpatialInput class only implements the IMotionController interface, but does not provide input sim data through the WMR function library. The function library directly calls the HMD function, so implementing it on that level covers both code paths.

  • Improvement: Changed failure reason on HoloLens Remoting connect logs from a numerical int to the enum value name.


  • Bug Fix: Fixed a typo in a log message for attempting to start an AR session without a session config object.

  • Bug Fix: Fixed issue with converting UnrealTargetPlatform to string when parsing command line options Added a TypeConverter for UnrealTargetPlatform.

  • New: Added check if a typeconverter exists when parsing command line arguments


  • Bug Fix: Changed ARKit to use the material-based method for camera image color space conversion and rendering.

    • The material based code path is enabled by MATERIAL_CAMERAIMAGE_CONVERSION=1 in the Build.cs file.

    • The CIContext based method can still be enabled with MATERIAL_CAMERAIMAGE_CONVERSION=0 but is reserved for testing purposes

Magic Leap

  • Crash Fix: Fixed vertex normal calculation for Magic Leap hand meshing, as using incorrect normals was crashing on low poly meshes.

  • Crash Fix: UpdateTrackedGeometry is called in FLuminARTrackedPointResource::UpdateGeometryData even if we couldn't get a valid position and orientation to update to. This addresses a crash that occurs within certain Blueprint functions (GetLocalToWorldTransform, for example) if Point does not have a valid ARSystem pointer during scene transitions.

  • Bug Fix: Added hooks into input focus callbacks for Lumin

  • Bug Fix: Fixed an error where legacy button code would send home button taps twice, resulting in behavior tied to home tap toggling on and off immediately.

  • Bug Fix: Fixed hand mesh winding order.

  • Bug Fix: Exposed mic mute state getter and setter.

  • Bug Fix: Fixed bugs with flushing audio buffer when device goes in standby.

  • Bug Fix: Updated deprecated functions in MLAudio and MagicLeapAudioCapture

  • Bug Fix: Fixed multiple input tracker creation and disabling mouse / keyboard input during VRPreview.

  • Bug Fix: Export Vulkan Command Wrappers FWrapLayer methods imported for Magic Leap and OpenXR plugins to avoid build breaks when VULKAN_ENABLE_IMAGE_TRACKING_LAYER is enabled.

  • Bug Fix: Fixed AndroidRelativeToAbsolutePath() for Lumin.

  • Bug Fix: Depth target is no longer rendered to MLGraphics in Zero Iteration.

    • Only reallocate the depth target if the requested size matches the expected size. This workaround is required because this depth allocation function can receive requests for targets other than the one for eye stereo render, such as when using a SceneCaptureComponent.

  • Bug Fix: Fixed ImageTracking not working on consecutive VRPreview launches.

  • Bigfix: Fixed an issue preventing light estimation from working when ARSession is restarted on the device.

  • Bug Fix: Fixed a Vulkan validation layer error for missed layout transition.

  • Bug Fix: Fixed planes not working on consecutive VRPreview runs when using the AugmentedReality interface.

  • Bug Fix: Added a workaround fix MRMesh flickering on Vk desktop renderer. Enable mesh occlusion when the MRMesh is connected to the MagicLeapTrackerComponent. Since this happens after the MRMeshProxy is created, modify SetEnableMeshOcclusion so that it updates the proxy's value as well.

  • Bug Fix: Fixed flickering caused by garbage data being used for the bounds in a frustum/bounds visibility check.

  • Bug Fix: During tangent generation, normals are now generated by adding the normal of each triangle that a vertex is part of and then normalizing the result. This removes the need to add a separate iteration over the mesh just to do normalization.

  • Bug Fix: Hands now support one-sided materials.

  • Bug Fix: Reset worker thread setup for image tracking so it restarts on consecutive VRPreviews.

  • Bug Fix: Fixed file permissions on Mac binary builds to replace existing artifacts for lumin.

  • Bug Fix: Added a missing config property to allow developers to manually call the lifecycle set ready notification function.

  • Bug Fix: Re-install app on device if it is uninstalled outside of Unreal context during consecutive LaunchOn iterative deployments.

  • New: Defined a PLATFORM_SUPPORTS_VULKAN preprocessor flag for Magic Leap.

  • New: Exposed function to indicate if the user is holding a controller in hand.

  • New: Added some helper methods to convert between motion sources and hand keypoint enums.

  • New: Added events in MagicLeapImageTracker to notify when a target has been added in the backend, exposing all functionality via direct C++ calls in the module.

  • New: Added PLATFORM_SUPPORTS_VULKAN in MagicLeapOpenGL module.

  • New: Updated Magic Leap SDK to .23 - includes changes to support new externally-owned Vulkan semaphores.

  • New: Implement setting Lumin thread affinities via a config file.

  • New: Added MagicLeapConnections plugin.

  • New: Updated the MagicLeapContacts plugin.

  • New: Update privileges for the 0.23 Magic Leap SDK.

  • New: Moved MagicLeapARPin interface into its own plugin called MagicLeapPassableWorld. This is re-implemented as a ModularFeature and will be used in the Magicverse plugins as well on iOS and Android. The MagicLeapPassableWorld also contains MagicLeapSharedWorld helpers.

  • New: Pass depth buffer to MLGraphics Improve frame synchronization in MagicLeapMetalCustomPresent.

  • New: Implement LocationServicesBPLibrary interface for MagicLeapLocation plugin.

  • New: Update privilege management in AppEventHandler, update available privileges in the 0.23 SDK, and some cosmetic updates to the MagicLeapMedia plugin.

  • New: Refactored MagicLeapAR module - fold FLuminARFrame, FLuminARSession and FLuminARDevice into FLuminARImplementation.

  • New: Implemented LightEstiamtion, ImageTracking in MagicLeapAR. This requires small updates to the AugmentedReality interface itself.

  • New: Added the new MagicLeapMovement plugin, and updated deprecated function usage in MagicLeapMusicService plugin.

  • New: Added Support for localized app names and icons.

  • New: Magic Leap: Implement persistent planes queries to MagicLeapPlanes. Force request LocalAreaNetwork privilege on Lumin if a map travel is requested via the command line

  • New: Magic Leap: Add MagicLeapCVCamera module

  • New: Add support for debugging Blueprint-only projects on Lumin via Visual Studio.

  • New: Updated default device profiles and runtime settings config for Lumin

  • New: Exposed input focus events in the LuminApplicationLifecycleComponent.

  • New: Expose raw perf numbers given by the MLGraphics api.

  • New: Added functions for querying platform API level.

  • New: Add 'MagicLeap' prefix to MeshTrackerComponent.

  • New: Added Blueprint callable function to set whether to use triangle weights when calculating the vertex normals. False by default, as this is slightly more expensive and doesn't have a huge impact.

  • New: RemoveHandleIf now takes in a higher-order function that is applied to every stored handle if the geometry type matches. When the applied function returns true, the tracked handle stops tracking and is removed internally. Users of the tracking system can perform additional removal behavior as they see fit via the input function.

  • Improvement: Supplied a box based on the HMD position and orientation.

  • Removed: Deleted unused TextureReader class.

  • Removed: Removed GetTrackableHandleMap from the ARTrackingSystem interface. Instead, a new function RemoveHandleIf is used to set the StoppedTracking state and remove the handle.

  • Removed: Removed FLuminFileMapper, as it was returning the same names without case changes.

  • Removed: Removed deprecated fixation comfort api from MagicLeapEyeTracker.

  • Removed: Removed explicit caching and re-sending of the current mesh data. This is not required because MRMesh keeps a local cache of the current data to be rendered. We only need to send new data when we want to update the mesh.


  • Crash Fix: Fixed resource transition with SteamVR on Vulkan to avoid an assert on SteamVR startup.

  • Crash Fix: Addressed a crash that occurs during Ovr Avatar shutdown due to delay load helper throwing an exception when the module has been unloaded.

  • Crash Fix: Fixed a crash that occurs during Oculus room invites

  • Crash Fix: Fixed an assert on ending PIE or closing an app using D3D12 and SteamVR. This also fixes other potential issues around lifetime with D3D12 and Vulkan textures with the XrSwapChain class and resource aliasing.

  • Crash Fix: Fixed out-of-order shutdown crashes with Oculus Avatar plugin.

  • Bug Fix: Fixed a bug preventing developers from mapping actions to the Oculus Touch's menu button.

  • Bug Fix: Switched XrSwapchain and SteamVR to use the new RHICreateAliasedTexture API. This prevents a redundant/dummy texture creation during initialization.

  • Bug Fix: Added D3D12 renderbridge implementation, including a SteamVR bUseExplicitTimingMode flag to ensure thread-safety in DX12.

  • Bug Fix: Fixed Vulkan timer query buffer overflow.

  • Bug Fix: Removed redundant swapchain re-creation when switching modes (Example: VRMode/PIE and back).

  • Bug Fix: Addressed an issue where fragment density map in Vulkan (when using Vulkan foveation) is added in the renderpass, but not in the renderpass attached to the graphics pipeline.

  • Bug Fix: Fixed a bug where default bindings weren't correctly generated for SteamVR if the manifest file didn't exist, causing packaged games to have no bindings and motion controllers not to be tracked.

  • Bug Fix: Fixed hitching that occurs on Oculus when a level contains uninitialized or hidden stereo layers when entering VR preview.

  • New: Implemented SteamVR high-quality stereo layers by implementing a plugin-specific stereo layer shape.

  • New: Updated OVRPlugin to version 1.45.

  • New: Implemented Oculus Audio update, adding support for Arm64 on Quest.

Windows Mixed Reality

  • Bug Fix: Changed status text delegate binding from BindRaw to BindSP to fix an occasional AV on ExecuteIfBound.

  • Bug Fix: Updated status text to use a non-deprecated SetText override.

  • Bug Fix: Disabled rendering when headpose is lost. In these cases the system dialog takes over.

  • Bug Fix: Fixed audio cutting out when VRPreview window is not in focus.

  • Bug Fix: Fixed use of finger transform buffer that will be freed rather than the local copy we make for one hand.

  • Bug Fix: Fixed a bug in SpatialStageFrameOfReference that would cause camera height to decrease when tracking is lost.

  • New: Implemented simulation for button press state in the Windows Mixed Reality HMD.

  • New: Implemented new input simulation module for the WindowsMixedReality plugin. This module provides an engine subsystem that stores generated data for replacing device input in case no HMD is connected.


  • Deprecated: The MeshDescriptionOperation module has been deprecated. It's utility functions are being moved over to the StaticMeshDescription module.

  • Bug Fix: Removed the duplicated object name from output paths when performing an Advanced Copy operation.

  • Bug Fix: FXmlFile now supports the ">" character within attribute strings. It doesn't need to be escaped in a valid xml file.

  • New: Static Meshes and cached Mesh Draw Commands are now generated in parallel. Watch out for any race conditions that might arise in code that is called downstream.

Upgrade Notes


Animation Blueprints
  • Changed AnimNode Layer Blend Curve Options to:

    • Override

    • DoNotOverride

    • NormalizeByWeight

    • BlendByWeight

    • UseBasePose

    • UseMaxValue

    • UseMinValue

  • "MaxWeight" is now called "Override".


  • Merged UK2Node_LatentOnlineCall into UK2Node_AsyncAction, and moved it from the Kismet module into BlueprintGraph. If you have a custom K2 node derived from either you may need to update your module dependencies or remove your subclass and add a redirector to your DefaultEngine.ini.



This is an API breaking change.

  • Converted UProperties to FProperties. This means that internal Engine objects that represent member variables of UClasses will no longer be UObjects themselves. This results in memory overhead reduction (123 bytes per property on average) and improved performance when constructing, destroying property objects, when collecting garbage and iterating over all objects. Property casts and property iteration is now faster too.

    • U*Property classes have been renamed to F*Property classes so all references to UProperties in your project code should be updated

    • FProperties use different Cast functions (CastField / CastFieldChecked) so all property casts should be updated in your project game code.

    • UPROPERTY() UProperty* MemberVariable; declarations should be replaced with UPROPERTY() TFieldPath<FProperty> MemberVariable;. It still is a Garbage Collector exposed hard reference with PendingKill support (becomes null if the owner UStruct is PendingKill) and automatically serialized with SerializeTaggedProperties with automatic conversion on load for all existing saved references to UProperties in packages.

    • TFieldIterator<UField> no longer iterates properties, use TFieldIterator<FProperty> instead

    • FindField has been split into two functions: FindUField and FindFProperty. The former should be used to find member Functions or Enums, the latter should be used to find member variables.

    • FProperties are no longer constructed with NewObject, use C++ new instead

    • UStruct::Children linked list no longer contains properties. Use UStruct::ChildProperties instead.

    • FArchive derived classes that collect UObject references now need to override virtual FArchive& operator << (FField*&) to catch FProperty references. All existing cases that needed it should already support it.

    • There's no FProperty::GetOuter(). Use FProperty::GetOwner() instead. The reason is that Outers are an UObject thing. FProperties are now owned by their parents in a more explicit way.

    • There's a helper structure called FFieldVariant that acts as a container that can be either UObject or FProperty. It's used in a few places across the codebase to ease the conversion to FProperties where otherwise a separate, almost identical version of the existing function would have to be created. However, the goal is to remove it eventually as the affected system owners will be upgrading their code.

    • In editor builds, there's a helper UPropertyWrapper class that's used by Details Panels to pass FProperty references around. Again, this was to prevent doing very extensive changes to systems that only actually deal with FProperties as editable objects in a handful of places.


  • New: Added BuildCMakeLib UAT automation script for building third-party libraries that use CMake.Use this to support platform extension and to rebuild some of the third party libraries that the engine provides.

    For example, if the binary library output is located in Engine/Source/ThirdParty/ExampleLib/examplelib-0.1/lib/PlatformName/Release/ExampleLib.a

    • You could run the following command to build that lib:

      RunUAT.bat BuildCMakeLib -TargetLib=ExampleLib -TargetLibVersion=examplelib-0.1 -TargetConfigs=relase+debug -TargetPlatform=PlatformName -LibOutputPath=lib -CMakeGenerator=Makefile -CMakeAdditionalArguments="-DEXAMPLE_CMAKE_DEFINE=1" -MakeTarget=all -SkipSubmit
    • The -LibOutputPath command line is to override the directory that libraries are stored in, the default is to not place the output inside an additional directory.

    The script is currently intended to be run once for each platform, as the expected CMakeGenerator may differ per platform.

    The script will attempt to find the CMakeLists.txt in a number of locations, first in the root of the library directory for example, Engine/Source/ThirdParty/ExampleLib/examplelib-0.1/then in BuildForUEinside that root and then a per platform BuildForUE,which may either be inside the platform extension's source e.g. Engine/Platforms/PlatformName/Source/ThirdParty/ExampleLib/examplelib-0.1/BuildForUE or inside the third party root's directorye.g. Engine/Source/ThirdParty/ExampleLib/examplelib-0.1/BuildForUE/PlatformName.

    -TargetLibSourcePath= can be used if the source for the library is external to the engine and only the binaries are stored with the engine. In that case the path should be to the root where the CMakeLists.txt is stored.

  • Changes to child plugins and platform extensions:

    • Added support for white-listing additional plugins in the child plugin.

    • Added support for adding additional modules to child plugin extensions.

    • Child plugins can now override SupportedTargetPlatforms if it is not defined in the parent.

    • Monolithic programs inside platform extensions can now output to the Binaries directory in the extension instead of the main Engine binaries directory. Previously, if SupportedTargetPlatforms was not defined in the parent plugin but was defined in the child plugin, it would have been ignored, meaning all platforms would be supported. Child plugins can now override SupportedTargetPlatforms, which means that if SupportedTargetPlatforms is not defined in the parent plugin, it will start from a base list of no platforms being supported for that plugin. Child plugins cannot remove SupportedTargetPlatforms from other child plugins. If you have child plugins where the parent plugin does not use SupportedTargetPlatforms, you will need to make sure to remove the SupportedTargetPlatforms from the child to return to the original functionality.


  • The IMovieScenePlayer interface's UpdateCameraCut method was changed: it now takes the new camera object, and a parameter structure. The parameter structure contains what was previously passed as loose arguments, plus some new blending information.

Gameplay Framework

  • Replicated properties in AActor, UActorComponent, and USceneComponent are no longer marked deprecated, but are now private. Replace direct usage of these variables with calls to accessor functions.

  • AActor::bAutoDestroyWhenFinished is now private. Replace direct references to this variable with calls to AActor::GetAutoDestroyWhenFinished and AActor::SetAutoDestroyWhenFinished.


  • Moved ResizableCircularQueue.h from Engine/Net to Core/Net. Anywhere that you have included this file, change "Engine/Net/ResizableCircularQueue.h" to "Core/Net/ResizableCircularQueue.h".

Socket Subsystem
  • The commandline flag "-PRIMARYNET" has been dropped due to its obsolescence; GetLocalHostAddr will perform the same operation without the flag specified.


  • The Steamworks build script now supports updating or changing the SteamSDK to specific versions. In Steamworks.build.cs, the variable SteamVersionNumber now controls all the versioning for the SteamSDK.

  • Changes to IVoiceChat interface:

    • VoiceChat.h has moved from Engine/Source/Runtime/Online/Voice/Public/Interfaces to a new VoiceChat header-only plugin in Engine/Plugins/Online/VoiceChat/VoiceChat/Source/Public. This header can be included by adding "VoiceChat" to the PublicIncludePathModuleNames/PrivateIncludePathModuleNames in Build.cs files as necessary.

    • The variable FVoiceChatResult::bSuccess has been replaced with the function FVoiceChatResult::IsSuccess.

    • Added an enum called FVoiceChatResult::ResultCode, providing a success value and a variety of error values.

    • FVoiceChatResult::ErrorCode changed from an int to an FString. This avoids collisions, and allows for both shared error codes (such as errors.com.epicgames.voicechat.not_initialized), and implementation-specific ones (such as errors.com.epicgames.voicechat.vivox.missing_config). The intent is that errors will be mapped to one of the common error categories in EVoiceChatResult if possible (or EVoiceChatResult::ImplementationError if none apply), and to one of the common error codes in VoiceChatErrors.h. If no common error codes apply, then the implementation can provide its own error codes (see VivoxVoiceChatErrors.h for reference).

    • FVoiceChatResult::Error has been renamed to ErrorDesc. The intent is for this to provide additional information for logging.

  • Changes to VivoxVoiceChat plugin:

    • Errors originating from the plugin (not the SDK) which were previously reported with a small negative integer and FString (for example, -2 and "Not Connected"), have been changed to provide error categories and string codes (for example, EVoiceChatResult::NotConnected and errors.com.epicgames.voicechat.not_connected).

    • Numeric errors originating from the Vivox SDK itself were previously reported directly in the ErrorCode. These are now mapped in the following ways:

      • Where possible, some errors, e.g. VX_E_NOT_INITIALIZED are mapped to common error categories and codes, in this case EVoiceChatResult::NotInitialized and "errors.com.epicgames.voicechat.not_initialized".

      • Some errors are not mappable to common error codes and are therefore mapped to vivox specific error codes, with the error category EVoiceChatResult::ImplementationError. For example, VX_E_CALL_TERMINATED_KICK is mapped to the error code "errors.com.epicgames.voicechat.vivox.kicked_from_channel".

      • Any errors that are not mapped to specific error codes are reported as EVoiceChatResult::ImplementationError and "errors.com.epicgames.voicechat.vivox.".

      • The actual numeric error code and status string sent by the SDK are provided in FVoiceChatResult::ErrorDesc in the format "StatusCode=%d StatusString=[%s]" \ Please look in VivoxVoiceChat.cpp and especially FVivoxVoiceChat::ResultFromVivoxStatus to see the current mapping.

  • USocialManager::bLeavePartyOnDisconnect has moved to USocialSettings. Config files referencing the old location will need updating.


All Mobile
  • Renamed the mobile "Support Distance Field Shadows" setting to "Support Pre-baked Distance Field Shadow Maps" and improved the tooltip to reduce confusion with the desktop Distance Field Shadows feature.

  • Updated Android toolchain to NDK 21 (20 is also supported for x86_64). See the new Android setup documentation using Android Studio and Engine/Extras/Android/SetupAndroid scripts.

  • Refactored com.epicgames.ue4.network.NetworkChangedListener to com.epicgames.ue4.network.NetworkConnectivityClient.Listener. The NetworkChangedManager now conforms to the com.epicgames.ue4.network.NetworkConnectivityClient interface. Existing calls to NetworkChangedManager.addListener(Listener listener) and NetworkChangedManager.removeListener(Listener listener) will supply the above updated Listener class instead of the old NetworkChangedListener.

  • The NetworkChangedManager now determines the connectivity through a combination of Android system network callbacks to determine connectivity, then verifies connectivity by performing an empty HEAD request to "https://example.com/ ". Should this request fail, the manager will indefinitely continue to retry against this URL with an exponential back-off up to the NetworkChangedManager.MAX_RETRY_SEC. This constant defaults to 13 seconds.

  • OpenGL on Android will now use a separate thread (RHIT) for graphics commands submission. Older engine versions had RHIT disabled by default. To disable RHIT in 4.25, add r.OpenGL.AllowRHIThread=0 into your project DefaultEngine.ini.


  • HLOD proxy meshes can now cast dynamic shadows.If you want to keep the old behavior without adjusting your data, you can set the r.HLOD.ForceDisableCastDynamicShadow cvar to 1

FX - Niagara
  • Niagara now features the Niagara Platform Set, a new feature for controlling which platforms use certain aspects of Niagara. Current users include:

    • Emitter Enabled/Disabled switch

    • System-level scalability settings in EffectType, and overrides in System

    • Emitter-level scalability settings in EffectType, and overrides in Emitter This entirely replaces the previous Detail Level feature. Users now select from Quality levels as a basic use case for scaling across platforms. Further fine grained control can be achieved by setting per device profile overrides to this. For example, all Quality levels could be enabled but Android, iOS, or some subset of mobile devices could be specifically disabled. Quality Level is controlled by fx.Niagara.QualityLevel. Emitters are optionally pruned from cook when disabled by fx.Niagara.PruneEmittersOnCook. Old projects that had custom setup for Niagara Detail Level will have to update their systems to the new setup. Projects using default detail levels will automatically update.

  • Updated module graph UI to better support parameter default modes. Changes:

    • "Value" mode variables do not allow connections to their input pins

    • "Binding" mode variables are hidden completely

    • Changing the default value in the details panel automatically updates all the graph nodes

    • Existing graphs are validated and updated on PostLoad Old assets should automatically be updated to the new schema. If the default value pins are connected to a subgraph to initialize the value, then the default mode is automatically set to "Custom", otherwise it is set to "Value" and the pins are marked as read-only.

  • Data Interface functions which need per-instance data can now be called from custom HLSL on CPU emitters. This required changing the order in which parameters are passed to DI functions on the CPU. Specifically, the instance data pointer is now the first input parameter, instead of the last. If you have custom data interfaces which use per-instance data, you need to update the code to read the user pointer first instead of last, for example: ``` VectorVM::FExternalFuncInputHandler FirstInput(Context); VectorVM::FExternalFuncInputHandler SecondInput(Context); VectorVM::FUserPtrHandler InstData(Context); // last input VectorVM::FExternalFuncRegisterHandler Output(Context); ``` becomes: ``` VectorVM::FUserPtrHandler InstData(Context); // first input VectorVM::FExternalFuncInputHandler FirstInput(Context); VectorVM::FExternalFuncInputHandler SecondInput(Context); VectorVM::FExternalFuncRegisterHandler Output(Context); ```

  • Updated Niagara modules, dynamic inputs and functions to use the new explicit RandomRangeFloat and RandomRangeInteger functions from CL # instead of the old RandomRange helper. This might have breaking changes for non-deterministic CPU-side random numbers, as the upper bounds will be off by one compared to earlier for integer based types (booleans, enums, regular integers).

  • Added FGPUSortManager that handles different GPU sort tasks. The current clients for it are Cascade and Niagara. Added a framework to allow any system to send GPU sort tasks (like sorting particles).

  • The emitter execution order takes into account events, so that emitters which consume events run after the emitters which produce those events. This makes it possible for events to be delivered in the same frame as they are generated, removing the need for extrapolation in most cases. Set "Gap Correction Amount" to 0 on any "Generate Location Event" modules you are using. If you are performing manual position extrapolation on received events, disable it and verify that the values are correct. Manual extrapolation may still be necessary for spawn events if the source emitter is using interpolated spawning, since there's no equivalent for interpolated spawning on event scripts.

  • Niagara ribbons are now preserving multi-ribbon ordering, in order to prevent random flickering when the camera moves around. Disabled multi-ribbon ordering when using opaque materials. Fixed random flickering when using multi-ribbon in Niagara.

  • Added support for uint32 vertex indices when using Niagara ribbons. Fixed a bug with Niagara ribbons when requiring more than 16-bit indices.

Known Issues

For a complete listing of known issues affecting Unreal Engine 4.25, please see the Unreal Engine Public Issue Tracker.

Help shape the future of Unreal Engine documentation! Tell us how we're doing so we can serve you better.
Take our survey