Unreal Engine 4.22 Release Notes

Release Notes for Unreal Engine 4.22

Choose your operating system:




On this page

image alt text

What's New

Unreal Engine 4.22 continues to push the boundaries of photorealism in real-time environments whether you are making immersive and engaging games, broadcasting live television, visualizing groundbreaking products, or creating the next blockbuster film. We don't believe significant advances in technology should result in increases in development time for you to take advantage of them, so we have once again set our sights on making workflows for users from all disciplines even faster and more accessible.

Unreal Engine delivers unbridled power to build realistic worlds with the most accurate real-time lighting and shadowing effects - including dynamic global illumination, pixel perfect reflections and physically accurate refraction - thanks to real-time ray tracing on Nvidia RTX graphics cards. Soft area shadows and ambient occlusion provide the finishing touches to ground your scenes firmly in reality.

Our vast suite of virtual production features enables you to speed up your workflow on set with the ability to capture and record complex live performances and composite them in real-time. Entire teams can work in concert to orchestrate and direct scenes live using the new multi-user editing feature.

Every second spent waiting to see your latest creation come to life has a cost - a cost to you, a cost to your users, a cost to your vision - so we strive to make Unreal Engine easier and faster to go from iteration to iteration with each release so you can spend more time tweaking and polishing the experience for consumers. Live Coding brings Live++ support to Unreal Engine so you can go from idea to reality in seconds while you are running your project. Build times have been optimized across the board making iteration times for incremental builds up to 3x faster and freeing up valuable resources in your pipeline.

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

0xmono, Adam Moss (adamnv), Ahsan Muzaheed (muzaheed57), Alessio Sgarro (cmp-), Alexander Stevens (MilkyEngineer), AlexTimeFire, AlSafty, Andrzej K. Haczewski (ahaczewski), Anton Rassadin (Antonrr), Ben Peck (bpeck), BinaryRK, Branislav Grujic (grujicbr), Cameron Angus (kamrann), Cengiz Terzibas (yaakuro), Chris Conway (Koderz), Chris Gallegos (Chrispykins), Clinton Freeman (freemancw), Cristiano Carvalheiro (ccarvalheiro), Dan Ogles (dogles), Daniele Benegiamo (kafumanto), David Aylaian (davidaylaian), David Nadaski (GlassBeaver), David Sauve (notanumber), Deep Silver Dambuster Studios (DSDambuster), Dmitriy Donskoy (sentik), doodoori2, Dorgon Chang (dorgonman), Doug Moscrop (dougmoscrop), Doug Richardson (drichardson), Dzuelu, Erik Dubbelboer (erikdubbelboer), H1X4Dev, Hargreawe, hkozachkov2, Ilyin Aleksey (IlinAleksey), improbable-valentyn, Ivan Popelyshev (ivanpopelyshev), IvanKuzavkov, James Cahill (Prouser123), Jan Kaniewski (getnamo), Jin Hyung Ahn (zenoengine), jkinz3, Joe Best-Rotheray (cajoebestrotheray), joemmett, Josef Gluyas (Josef-CL), Kalle Hämäläinen (kallehamalainen), Kartik Saranathan (Kartiku), korkuveren, Kory Postma (korypostma), Leon Rosengarten (lion03), locus84, lotodore, Marat Radchenko (slonopotamus), Marcel (Zaratusa), Mark Whitty (Mosel3y), mastercoms, Mathias Hübscher (user37337), Michael Kösel (TheCodez), Michael Samiec (m-samiec), Mike Bell (MichaelBell), Mike Slegeir (tehpola), Mimus1, Mitsuhiro Koga (shiena), momboco, Morva Kristóf (KristofMorva), Muhammad A. Moniem (mamoniem), Nick (eezstreet), Nick Edwards (nedwardsnae), Nick Pruehs (npruehs), Ondrej Hrusovsky (skylonxe), Paul Hampson (TBBle), Philippe Chaintreuil (Philippe23), Phillip Baxter (PhilBax), projectgheist, RDIL, Riley Labrecque (rlabrecque), Roman K. (CrispMind), Robin Zoň (ZonRobin), roidanton, ruzickajason, ryugibo, Sam Hocevar (samhocevar), Satheesh (ryanjon2040), Scott Fries (ScottFries), Sébastien Rombauts (SRombauts), ShalokShalom, spoiltos, stanley1108, Stephen A. Imhoff (Clockwork-Muse), stkrwork, sturcotte06, Takashi Suzuki (wankotank), tgroll, Thang To (thangt), Tim Lincoln (Ratherbflyin), TommyTesla, Vladimir Ziablitskii (rainlabs), whoisfpc, YanaPIIDXer, Yannick Comte (demonixis), yhase7, Zeblote

Major Features

New: Real-Time Ray Tracing and Path Tracing (Beta)

With this release, we're excited to announce Beta support for Ray Tracing and Path Tracing using Windows 10 RS5 update that takes full advantage of the DirectX 12 and DirectX Raytracing (DXR) with NVIDIA RTX series cards.

image alt text

Real-Time Ray Tracer

The Ray Tracing features are composed of a series of ray tracing shaders and ray tracing effects. With each of these, we're able to achieve natural realistic looking lighting effects in real-time which are comparable to modern offline renderers for shadowing, ambient occlusion, reflections, and more.

image alt text

We introduced a number of ray tracing features and will continue to expand the feature set in upcoming versions of the Unreal Engine. Some of the features in this release include:

  • Soft area shadowing for Directional, Point, Spot, and Rect light types.

  • Accurate reflections for objects in and outside of the camera frustum.

  • Soft ambient occlusion to ground objects in the scene.

  • Physically correct refraction and reflection results for translucent surfaces.

  • Indirect lighting from dynamic global illumination from light sources.

  • And more!

For additional details, see Real Time Ray Tracing for a full breakdown of currently supported features for this release.

Path Tracer

In addition to the Ray Tracer, we've included an unbiased Path Tracer with a full global illumination path for indirect lighting that creates ground truth reference renders right inside of the engine. This can improve workflow content in your scene in Unreal without needing to export to a third-party offline path tracer for comparison.

For additional details, see Path Tracer.

New: High-Level Rendering Refactor

In this release, we have completely rewritten mesh drawing in Unreal Engine to have better drawing performance and support for Real-Time Ray Tracing. In the future, we'll continue to move additional rendering work to the GPU.

Mesh Drawing Pipeline Refactor:

With the new mesh drawing pipeline, drawing information for static scene elements are cached more aggressively than before, and automatic instancing merges draw calls where possible. This enables new implementations of mesh passes to be four to six times fewer lines of code!

This refactor mostly affects mesh drawing inside the Renderer with custom scene proxies and the interface to the Renderer being marginally affected. Any Custom Drawing Policies will need to be rewritten as FMeshPassProcessors in the new architecture, meaning that backwards compatibility for Drawing Policies was not possible with a change as big as this one.

New: C++ Iteration Time Improvements

Live Coding (Experimental)

We've licensed Molecular Matters' Live++ for all developers to use on their Unreal Engine projects, and we've integrated it as the new Live Coding feature. With Live coding, you can make C++ code changes in your development environment and compile and patch it into a running editor or standalone game within seconds. Unlike the legacy hot reload mechanism, Live Coding will patch individual functions without requiring any special consideration for object re-instancing, making it much more reliable and scalable for large projects.

To use it, check the Live Coding (Experimental) option from the drop down next to the compile button in the editor, and hit Ctrl+Alt+F11 to compile and apply your changes. To enable from a cooked game, type "LiveCoding" into a console window.


  • Modifying class layouts while the engine is running is not supported. We intend to address this in a future release.

  • Only Windows is currently supported.

Build Times

We optimized UnrealBuildTool and UnrealHeaderTool to make C++ iteration times up to 3x faster!

Full build (UE4Editor Win64 Development):

Unreal Engine 4.21

Unreal Engine 4.22


Total Build Time:



30% faster

Compiling UnrealHeaderTool:



Generating headers



60% faster

Compiling UE4Editor



25% faster

UnrealBuildTool overhead



600% faster

Incremental build (UE4Editor Win64 Development):

Unreal Engine 4.21

Unreal Engine 4.22


Total Build Time:



340% faster

Compiling UE4Editor



UnrealBuildTool overhead



590% faster

No code changes (UE4Editor Win64 Development)

Unreal Engine 4.21

Unreal Engine 4.22


UnrealBuildTool overhead



520% faster

Additionally, we significantly improved the accuracy of dependency checking for incremental builds, including detecting files being added and removed from a project and using compiler-driven include dependency checking.

New: Virtual Production Pipeline Improvements

Unreal Engine continues to lead the way for real-time virtual production with significant improvements to all aspects of the pipeline.

Real-Time Compositing with Composure(Beta)

The Composure compositing system has been significantly improved to make it easier than ever to composite images, video feeds, and CG elements directly within the Unreal Engine.

With built-in compositing, you can easily visualize the results of combining green-screened scenes with your Unreal Engine Level content in real time. This can be helpful for pre-visualization, giving directors on set a good sense of what the final scene will look like after the captured film has been enhanced by digital content from Unreal Engine and the green backgrounds replaced. These in-engine results can also be a valuable reference for compositors working offline in other third-party software.

Improvements include:

  • Use Materials to drive layer blending.

  • Leverage the post-processing pipeline for effects like "Light Wrap".

  • Use the Media Framework and Professional Video I/O systems to capture video input and render output.

  • Use built-in render passes for chroma-keying, despill, tonemapping, and more. Or, or build your own custom passes.

The Composure system also offers support for a more traditional offline compositing workflow enabling you to export renders of selected Unreal Engine objects in order to composite them with other sources in external applications.

OpenColorIO (OCIO) Color Profiles (Experimental)

You can now use OpenColorIO (OCIO) color profiles to transform the color space of any Texture or Composure Element directly within the Unreal Engine. This can help you keep the colors of your video and computer generated elements consistent from initial capture, through compositing, to final output.

Hardware-Accelerated Video Decoding (Experimental)

On Windows platforms, you can now use your GPU to speed up the processing of H.264 video streams. This reduces the strain on the CPU when playing back video streams, which may result in smoother video and may allow you to use higher resolution movie files and more simultaneous input feeds.

To use hardware decoding, enable the Hardware Accelerated Video Decoding (Experimental) setting in the Plugins - WMF Media section of the Project Settings window.

New Media I/O Formats

We added even more Professional Video I/O input formats and devices:

  • 4K UHD inputs for both AJA and Blackmagic.

    • Supports both 8bit and 10bit inputs.

    • Supports single-link, dual-link, and quad-link.

  • Supports AJA Kona 5 devices.

    • HDMI 2.0 input.

    • UHD at high frame rates (up to 60fps).

nDisplay Improvements

This release adds several new features that make the nDisplay multi-display rendering system more flexible, handling new kinds of hardware configurations and inputs.

  • Each cluster node's application window can now contain multiple viewports at defined screen-space coordinates. This allows a single Unreal Engine instance, running on a single computer, to handle multiple offset displays.

  • In previous releases, the only way to provide input to the nodes in an nDisplay system was through VRPN. This release adds a new communication mechanism called cluster events, which you can use to trigger synchronized responses on all connected computers.

  • More of the possibilities of the input subsystem have been exposed in the nDisplay configuration file, allowing you to change attributes and mappings without repackaging your Project.

  • If you're already using nDisplay, your configuration file may need some adjustments to match the new schema. However, the nDisplay Launcher can now upgrade your configuration file automatically.

For details, see the nDisplay documentation.

New: Hololens Remote Streaming Support

Unreal Engine 4 now supports Holographic Remoting through the Windows Mixed Reality plugin! This allows Unreal applications to run on a Windows desktop PC and stream the rendered result wirelessly to a Hololens over a Wi-Fi connection in real time.

image alt text

New: Audio System Improvements

TimeSynth (Beta)

TimeSynth is a new audio component focused on providing sound designers with sample accurate starting, stopping, and concatenation of audio clips. TimeSynth enables precise and synchronous event audio event queuing, which is essential for interactive music applications.

image alt text

Layered Sound Concurrency

The Sound Concurrency System now observes multiple settings or groups. Now, if a sound object (AudioComponent, SoundBase, or SynthComponent) does not satisfy all of the requirements specified in their ConcurrencySet property, the new sound will not play. In addition, if the new sound satisfies all concurrency set resolution rules and begins playback, one or more sounds may be stopped.

Spectral Analyzer for Submixes (new Engine)

Designers can now analyze the spectral energy of a Submix during gameplay to drive modulations in gameplay, material, or any number of possible destinations based on the frequency content of the currently playing audio.

image alt text

Baked Spectral Analysis Curves and Envelopes on Sound Waves

Sound waves can now be pre-analyzed for envelope and spectral energy to drive Blueprints during playback. This allows sound designers to create compelling audio-driven systems, while offloading the spectral analysis work to improve runtime performance. In addition, analysis data from a proxy sound wave can be substituted for a sound wave's analysis data, allowing designers to spoof isolated sound events when trying to drive gameplay.

Improvements to Sound Asset Importingc

We have made significant improvements to sound asset importing. In addition to our current support for multi-channel WAV files, the Unreal Audio Engine now supports importing a wide variety of sound file formats, including AIFF, FLAC, and Ogg Vorbis.

Improvements to MIDI Device Plugin

The MIDI Device Plugin now allows users to send MIDI messages to external MIDI devices in addition to processing MIDI Device input. In addition, improvements to the Plugin's Blueprint API simplify parsing MIDI messages. These changes allow sound designers to more effectively integrate MIDI I/O into their project.

New: Sequencer Improvements

The industry-leading Sequencer linear animation toolset once again received significant updates with new tools and enhancements that benefit virtual production projects along with a host of quality of life improvements.

Sequencer Take Recorder

Take Recorder enables fast iteration of recording performances and quickly reviewing previous takes for virtual production workflows! Building upon the foundations of Sequence Recorder, we improved what you can record and how the data is handled as well as made the system extendable to fit the needs of different use cases. You can easily record animations from motion capture linked to characters in the scene as well as actual Live Link data for future playback. By recording Actors into subsequences and organizing them by Take metadata, productions of all sizes and any number of takes can easily be accommodated.

For more information, see the Take Recorder documentation

Composure Sequencer Track

The new Composure track enables you to easily export a Sequence as layers defined in Composure. Multiple tracks can be added to export more than one layer at a time. You can drag layers straight from Composure into Sequencer to generate tracks for those layers.

Layered Animation Workflows in Sequencer

You can now create layered animations using multiple weighted sections in a single track. Layered animations are supported in Transform tracks as well as several other property tracks.

Live Link Sequencer Track

You can now record incoming live link data onto sequencer tracks and play them back. Live link data that comes with timecode and multiple samples per engine tick can be saved at a resolution higher than the sequencer playback rate.

Object Binding Sequencer Track

You can now change the Object - Static Mesh, Skeletal Mesh, Material, etc - assigned to a property on an Actor in Sequencer. Once the Actor is added to Sequencer, these Object reference properties are available like other properties in the Track menu for that Actor.

Network Replication in Sequencer

Level sequence actors that are set to replicate using the Replicate Playback property on Level Sequence Actors now synchronize their playback time between server and client.

Enhanced Python Support for Sequencer

Python support for Sequencer has been improved for movie scene functionality:

  • Movie scene section and key data manipulation

  • Movie scene capture

Misc Sequencer Improvements

  • You can now assign multiple objects to a single track.

  • You can now copy/paste sections from multiple tracks at once.

  • You can now mark frames with a label and quickly jump to that mark to play the sequence. A color can be set for each mark to make them easily identifiable.

  • Expose Track/Section to Blueprints - Todo, ie. Runtime toggling of subsections/takes

New: Animation Budgeting System (Beta)

The new Anim Budgeter tool enables you to set a fixed budget per platform (ms of work to perform on the gamethread), and it works out if it can do it all, or if it needs to cut down on the work done. IT works by measuring the total cost of animation updates, and calculating the cost of a single work unit. If work needs to be cut down to meet the budget, it does it based on significance and targets several areas: stop ticking and use Master Pose Component, update a lower rate, interpolate (or not) between updates, etc. The goal is to dynamically adjust load to fit within fixed (gamethread) budget.

New: Animation Sharing Plugin

Added a new Animation Sharing plugin that reduces the overall amount of animation work required for a crowd of actors. It is based upon the Master-Pose Component system, while adding blending and additive Animation States. The Animation states are buckets for which animation instances are evaluated. The resulting poses are then transferred to all child components part of the bucket. See the diagram below for a breakdown of the system.

image alt text

The video below shows Skeletal Mesh components representing the individual states and additionally instances used for blending between states. It also shows the crowd, which are all individual actors for which an Animation State is determined. According to the Animation State the Skeletal Mesh Components are connected to the Master Components for driving their Animation. In the video only the Poses for the Animation States are evaluated, the Crowd Actors only copy the resulting bone transforms.

New: Support for long filenames (Experimental)

We added support for long file paths for users with Windows 10 Anniversary Update! Historically, paths in windows have been limited to 260 characters, which can cause problems for projects with complex naming conventions and deep hierarchies of assets. The Windows 10 Anniversary Update adds support for much longer filenames, on the condition that the user and each application opt-in to it. To enable long file paths in Windows 10:

Note: Support for long paths is not universal, and third party tools - even parts of the operating system, like Windows Explorer - may not support them correctly.

New: Blueprint Indexing Optimizations

Changes to how we index Blueprint search data have significantly improved Editor and Play-In-Editor startup times. We now defer search data updates until a Find-in-Blueprint tab is opened, perform updates asynchronously, and separate Blueprint re-indexing from the Asset loading process.

New: Improved Steamworks support

Using UE4 with Steam has never been easier! We've made several improvements to usability and quality of life for developers of multiplayer games on Steam.

  • Dedicated Servers on Steam can now receive custom names (up to 63 characters) with the new "-SteamServerName" launch argument.

  • Projects can now override the Steam network layer by deactivating the "bUseSteamNetworking" configuration value and setting their NetDriver configurations to the preferred underlying network layer.

  • We have greatly improved the usability of Steam NetDrivers with UE4 Beacons in addition to standard game networking.

  • You can now set certain required Steam values, such as dedicated server names, or the application ID, in your project's Target.cs file. Making changes to these values will no longer require recompiling the engine.

New: Preview Scene Settings Improvements

We added functionality to Preview Scene Settings that enables you to hide Environment Cubemap (Show Environment) without disabling lighting. See the Use Sky Lighting property in the Preview Scene Settings panel.

New: Skeletal Mesh LOD Reduction

Use the Skeletal Mesh Reduction Tool to generate versions of a Skeletal Mesh with reduced complexity for use as levels of detail (LODs) all within Unreal Editor! You no longer need to rely on external Digital Content Creation (DCC) programs or third party tools that can be very time consuming and error prone. Create accurate, high-quality levels of detail and see the results immediately in the viewport.

For additional information, see Skeletal Mesh Reduction Tool.

New: Per Platform Properties Improvements

Per Platform Properties have been extended to allow for setting values based on Target Platform in addition to the Platform Groups.

image alt text

New: Gauntlet Automation Framework Improvements

The Gauntlet automation framework received several improvements focusing on usability, documentation, and examples to learn from.

Expanded documentation & samples

  • Documentation about Gauntlet architecture and getting started

  • Additional ActionRPG and Profile Guided Optimization examples

  • Example of tracking editor load and PIE times

iOS Support

Gauntlet now supports installing and running IPA files on iOS. (requires Mac host). This takes our device support to PC, Mac, PS4, XB1, Switch, Android, and iOS.

Profile Guided Optimization

An example script for automation of Profile Guided Optimization (PGO) file generation on PS4, XboxOne, and Switch for your project.

Report Creation

Added HTML and Markdown builders for creating custom reports as part of automation scripts.

New: Visual Studio 2019 Support

image alt text

Support for Visual Studio 2019 has been added. To use Visual Studio 2019 by default, select "Visual Studio 2019" as the IDE from the editor's source control settings.

We've also added support for switching to newer C++ standard versions. To change the version of the C++ standard that your project supports, set the CppStandard property to one of the following values from your .target.cs file.









At the same time, we've deprecated support for Visual Studio 2015. If you want to force your project to compile with the Visual Studio 2015 compiler, you can set WindowsPlatform.Compiler = WindowsCompiler.VisualStudio2015 from your project's .target.cs file. Note that the version of the engine downloaded from the Epic Games Launcher does not support Visual Studio 2015, and we no longer test it internally.

New: Subsystems

Subsystems are automatically instanced classes with managed lifetimes that provide easy to use extension points without the complexity of modifying or overriding engine classes, while simultaneously getting Blueprint and Python exposure out of the box.

Currently Supported Subsystem Lifetimes


class UMyEngineSubsystem : public UEngineSubsystem { ... };

When the Engine Subsystem's module loads, the subsystem will Initialize() after the module's Startup() function has returned. The subsystem will Deinitialize() after the module's Shutdown() function has returned.

These subsystems are accessed through GEngine:

UMyEngineSubsystem MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>();


class UMyEditorSubsystem : public UEditorSubsystem { ... };

When the Editor Subsystem's module loads, the subsystem will Initialize() after the module's Startup() function has returned. The subsystem will Deinitialize() after the module's Shutdown() function has returned.

These subsystems are accessed through GEditor:

UMyEditorSubsystem MySubsystem = GEditor->GetEditorSubsystem<UMyEditorSubsystem>();

Note: These Editor Only subsystems are not accessible to regular Blueprints, they are only accessible to Editor Utility Widgets and Blutility Classes.


class UMyGameSubsystem : public UGameInstanceSubsystem { ... };

This can be accessed through UGameInstance:

UGameInstance* GameInstance = ...;
UMyGameSubsystem* MySubsystem = GameInstance->GetSubsystem<UMyGameSubsystem>();


class UMyPlayerSubsystem : public ULocalPlayerSubsystem { ... };

This can be accessed through ULocalPlayer:

ULocalPlayer* LocalPlayer = ...;
UMyPlayerSubsystem * MySubsystem = LocalPlayer->GetSubsystem<UMyPlayerSubsystem>();

Accessing Subsystems from Blueprints

Subsystems are automatically exposed to Blueprints, with smart nodes that understand context and don't require casting.

You're in control of what API is available to Blueprints with the standard UFUNCTION() markup and rules.

image alt text

image alt text

Subsystems from Python

If you are using Python to script the editor, you can use built-in accessors to get at subsystems:

my_engine_subsystem = unreal.get_engine_subsystem(unreal.MyEngineSubsystem)
my_editor_subsystem = unreal.get_editor_subsystem(unreal.MyEditorSubsystem)

Note: Python is currently an experimental feature.

New: Editor Utility Widgets

Editor Utility Widgets enable you to extend the functionality of Unreal Editor with new user interfaces created entirely using the UMG UI Editor and Blueprint Visual Scripting logic! These are Editor-only UI panels that can be selected from the Windows menu like other Unreal Editor panels.

To create an Editor Utility Widget, right-click in the Content Browser and select Editor Utilities > Editor Widget.

To edit the Blueprint, double-click on the Editor Widget Asset. Once you've edited the Blueprint for your Editor Widget Asset, right-click the Editor Widget and select Run Editor Utility Widget to open the UI in a tab. The tab is only dockable with Level Editor tabs. It appears in the Level Editor's Windows dropdown, under the Editor Utility Widgets category. This is an experimental feature.

New: Material Analyzer

The Material Analyzer enables you to get a holistic view of parameter usage in Materials and Material Instances so you can quickly find opportunities to consolidate and optimize your Material Instances to minimize switching render state and save memory. The Material Analyzer can be found under Window > Developer Tools.

image alt text

Materials are listed in a tree with a list of suggestions which show groups of material instances with the same set of static overrides so you can make optimizations. You can also place all the related instances into a local collection, so you can easily find and update them.

New: Select Child and Descendant Actors

You can now extend your selection to all the immediate children or all the descendants of your selected Actor using the context menu in the World Outliner and the Level Viewport, making it easier to work with large, complex scene hierarchies.

New: Scaled Camera Zoom and Pan

When you have one or more objects selected in the Level Viewport, the sensitivity of camera zoom and pan operations now scales automatically with the distance between the objects and the camera. This makes your camera movements feel more natural, especially when you're working with objects at extreme sizes, such as tiny mechanical parts or large landscapes.

You can return to the previous behavior by disabling the new Use distance-scaled camera speed setting in the Level Editor > Viewports section of the Editor Preferences window.

New: Orbit Around Selection

You can now make the camera orbit around the pivot of the selected objects - as opposed to orbiting around the center of the screen - when one or more objects are selected in the Level Viewport.

To activate this mode, enable the new Orbit camera around selection setting in the Level Editor > Viewports section of the Editor Preferences window.

New: Toggle Multiple Layer Visibility

You can now toggle the visibility of multiple Layers at the same time. Hold CTRL and click each Layer to build your selection. Then click the eye icon next to any of those selected Layers to toggle visibility of all selected Layers.

image alt text

New: Multi-User Editing (Beta)

Multiple level designers and artists can now connect multiple instances of Unreal Editor together to work collaboratively in a shared editing session, building the same virtual world together in real time.

  • A dedicated server keeps track of all the modifications made by all users, and synchronizes the state of the Editor between all connected computers.

  • When you make changes in your Levels and Sequences on one computer, the changes are automatically mirrored, live, to all other computers that are part of the same session.

  • When you make changes to other types of Assets, like Materials, the changes are replicated to all other computers when you save those Assets.

  • Before leaving an editing session, each user can choose whether they want to apply the changes made during that session to their local copy of the Project.

New: Preview Rendering Level Improvements

The workflow for the Mobile Previewer has improved when working with different devices and platform's shading models in order to consistently use the same shading model across all Editor viewports and to enable you to instantly switch between the default Shader Model 5 (SM5) and a selected Preview Rendering Level.

Start by selecting a Preview Rendering Level from the main toolbar Settings drop-down to compile shaders for a platform. Once compiled, use the added Preview Mode button in the main toolbar to toggle the view mode.

For additional details, see Mobile Previewer.

New: Dynamic Spotlight Support on Mobile

We now support non-shadow casting Dynamic Spot Lights on high-end mobile devices.

You can enable dynamic Spot Lights from the Project Settings > Rendering > Mobile Shader Permutations by setting Support Movable Spotlights to true.

For additional information, see Lighting for Mobile Platforms.

New: SaveGame System iCloud Support

UE4 now supports saving games to iCloud using the ISaveGameSystem interface, on both iOS and tvOS. You can enable saving games to iCloud by going to Project Settings > Platforms > iOS > Online and enabling the Enable Cloud Kit Support option.Then from the iCloud save files sync strategy option, you can select the sync strategy that works best for your project. The currently available iCloud sync options are as follows:

  • Never (Do not use iCloud for Load/Save Game)

  • At game start only (iOS)

  • Always (Whenever LoadGame is called)

New: Device Output Window Improvements

Major improvements have been made to the Device Output Log window, bringing it out of the Experimental state. You can use the Device Output Log window to send console commands to iOS devices from the PC. To access the Device Output Log, from the main menu click Window > Developer Tools > Device Output Log.

New: HTML5 Platform Improvements (Experimental)

We have added experimental multithreaded support for HTML 5 projects. Please note you need access to the Unreal Engine 4 source code to enable this functionality.

Some browsers will need special flags enabled in order to run in multithreaded mode. See https://github.com/emscripten-core/emscripten/wiki/Pthreads-with-WebAssembly for more information.

  • For Chrome: run chrome with the following flags:

    --js-flags=--experimental-wasm-threads --enable-features=WebAssembly,SharedArrayBuffer

    These can alternatively be enabled/disabled in chrome://flags/#enable-webassembly-threads as "WebAssembly threads support"

  • In Firefox nightly, SharedArrayBuffer can be enabled in about:config by setting the javascript.options.shared_memory preference to true.

New: iOS Preferred Orientation

You can now set the preferred orientation to be used as the initial orientation at launch for iOS devices when both Landscape Left and Landscape Right orientations are supported.

New: Niagara Vector Field Data Interface

The Vector Field Data Interface now works the same for both CPU and GPU particles! You can use the Sample Vector Field module to sample vector fields. It exposes three primary inputs:

  • VectorField: This is the Vector Field Data Interface instance, containing the static vector field object itself, and per-axis tiling flags.

  • SamplePoint: This is the point where the vector field is sampled. This defaults to Particles.Position, but this can be customized.

  • Intensity: This scales the sampled vector.

There are also multiple optional inputs:

  • ApplyFalloff: Check this to apply a falloff function to the sampled vector, so the influence of the vector field approaches zero towards the edges of the vector field's bounding box.

  • UseExponentialFalloff: Check this to make the falloff function be exponential instead of linear.

  • FalloffDistance: When applying a falloff function, this parameter determines how far from the bounding box edges the falloff applies.

  • FieldCoordinates: This makes it possible to override the Emitter's Localspace parameter. It has three options:

    • Simulation: Uses the Emitter.Localspace parameter.

    • World: This overrides the position and transform of the vector field so that it is always relative to the world origin, regardless of the Emitter.Localspace parameter.

    • Local: This overrides the position and transform of the vector field so that it is always relative to the System itself, regardless of the Emitter.Localspace parameter.

  • FieldTranslate: This offsets the vector field relative to the origin as defined by FieldCoordinates.

  • FieldRotate: This reorients the vector field relative to the origin as defined by FieldCoordinates.

  • FieldScale: This rescales the vector field.

The SampleVectorField module provides a lot of utility functionality, and therefore it might include some overhead. You can use specialized vector field sampling, by including the SampleField node on a Vector Field Data Interface object in the script editor.

The input expected here will be relative to the volume of the vector field itself, as no transformations are applied for you.

An example for easily visualizing and using a vector field is included, called VectorFieldVisualizationSystem.

New: Niagara Curl Noise Data Interface

The Curl Noise Data Interface now generates procedural curl noise based on an underlying simplex noise function and the results are identical for both CPU and GPU emitters. It is recommended to use the SampleCurlNoiseField module to generate curl noise for your particles. This module has two primary inputs exposed:

  • Strength: This scales the output vector generated by the module.

  • Length Scale: This describes the approximate size of the vortices generated by the curl noise.

and three optional inputs:

  • Offset: This is used to pan the noise field.

  • Noise Field: This is the Data Interface object itself, primarily used for adjusting seeds.

  • Sample Point: This specifies where to sample from. Defaults to Particles.Position, but other values can also be used.

The curl noise field does not inherently tile, and does not suddenly end due to its procedural nature. To get a tiling curl noise field, consider using the Vector Field Data Interface instead, with a periodic volume texture curl noise as a vector field.

New: Deterministic Random Number Generation in Niagara

We added support for deterministic random number generation for both CPU and GPU Niagara emitters. The behavior of the random number generated can be controlled globally from the Emitter Properties module, with the following options:

  • Determinism: A flag to toggle between deterministic or non-deterministic random numbers for the entire emitter.

  • Random Seed: A global seed used by the deterministic random number generator.

The RandomRange Niagara function is the recommended way to generate random numbers inside scripts. It now accepts the following:

  • Min: This defines the lower bound of the random numbers generated. It can be any integer or float type.

  • Max: This defines the upper bound of the random numbers generated. It can be any integer or float type.

  • RandomnessMode: This is an enum controlling the determinism mode of the random number generator, and it can be:

    • Simulation Defaults: This is the default behavior; it inherits the value of Emitter.Determinism.

    • Deterministic: Uses the deterministic random number generator.

    • Non-deterministic: Uses the non-deterministic random number generator.

  • OverrideSeed: This determines whether or not to override the seed specified by Emitter.GlobalSeed.

  • Seed: This value is used to override Emitter.GlobalSeed if OverrideSeed is enabled.

The last three, RandomnessMode, OverrideSeed and Seed are initially hidden, but they can be revealed by clicking the arrow at the bottom of the node.

image alt text

An alternative way to generate deterministic random numbers is by explicitly passing seeds to the Seeded Random node. For example, a specialization of the Random Range functionality could look something like the following:

image alt text

The deterministic random numbers are slightly more expensive than the non-deterministic counterparts: somewhere between 1.5 and 2.0 times, depending on the type generated. In general, if you need more than one random number in a script, we recommend that you generate them with a single call, and split the result if you need to handle them separately.

image alt text

New: Additional Inputs for Niagara Math Operations

Many of the script math operations now support an arbitrary number of input pins which can be added by clicking the Add (+) button or by connecting to the pin next to the Add button.

image alt text

New: Support for Deprecating Niagara Scripts

Scripts for modules, dynamic inputs, and functions can now be marked as deprecated in the script editor. Emitters and systems using deprecated scripts will now display errors in the UI, and deprecated scripts will not show up in the menus used to add them.

image alt text

image alt text

New: Niagara Initialization Modules

New modules have been added which expose the most common attributes used when initializing particles.

image alt text

New: Select by Simulation Target Node for Niagara

The new Select by Simulation Target node enables you to execute different logic depending on whether an emitter is running in the CPU vector machine or in a GPU compute script. In general, most scripts should run identically on both simulation targets. However, this is not always possible, especially when making data interface calls. In cases where exact parity isn't available, this new node gives the module author more tools to build consistent behavior. For an example of how this is used, see the new collision response module.

New: Collision System for Niagara

Niagara collisions have been completely rewritten to support ray-trace-based CPU collisions, CPU+GPU analytical plane collisions, GPU scene depth, and distance field collisions.

Additional features include:

  • Stability has been vastly improved across the board, in comparison to previous Niagara and Cascade implementations.

  • CPU collisions support the incorporation of the scene's physical material characteristics, such as restitution and friction coefficients, and offers several integration schemes.

  • The system has been written as a single module to improve usability.

  • Collisions now work in combination with all renderers.

  • A configurable "rest" state allows particles to remain stable in particularly challenging situations.

  • The equations are physically based/inspired, and work with mass and other system properties.

  • A number of advanced options have been exposed, including static, sliding and rolling friction.

  • Collision radii are automatically calculated for sprites and meshes. Optionally, you can specify this parameter directly.

New: Platform SDK Upgrades

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

image alt text

  • IDE Version the Build farm compiles against

    • Visual Studio - Visual Studio 2017 v15.6.3 toolchain (14.13.26128) and Windows 10 SDK (10.0.16299.0)

      • Minimum Supported versions

        • Visual Studio 2017 v15.6

      • Requires NET 4.6.2 Targeting Pack

    • Xcode - Xcode 10.1

  • Android

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

    • Note: Permission requests are now required on a per feature basis. (for example: RECORD_AUDIO, CAMERA). For more information, see Android Upgrade Notes.

  • HTML5

    • Emscripten 1.37.19

  • Linux "SDK" (cross-toolchain)

  • Lumin

    • 0.19.0

  • Steam

    • 1.39

  • SteamVR

    • 1.0.16

  • Oculus Runtime

    • 1.32

  • Switch

    • SDK 7.3.0 + optional NEX 4.4.2 (Firmware 7.x.x-x.x)

    • SDK 6.4.0 + optional NEX 4.6.2 (Firmware 6.x.x-x.x)

      • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • PS4

    • 6.008.061

    • Firmware Version 6.008.021

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • XboxOne

    • XDK: July 2018 QFE-4

    • Firmware Version: December 2018 (version 10.0.17763.3066)

    • Supported IDE: Visual Studio 2017

  • macOS

    • SDK 10.14

  • iOS

    • SDK 12

  • tvOS

    • SDK 12

Release Notes


  • Crash Fix: Fixed FEnvQueryInstance::FItemIterator::StoreTestResult crashes occurring when NumPassedForItem was 0

  • New: Added a concept of "AISubsystem" that acts as a tickable object but can be used to batch-tick all subsystems by another piece of code (for example the AISystem instance). AISubsystems live as part AISystem which controls their life cycle. EQS manager and AIPerceptionSystem are now AISubsystems.

Behavior Tree

  • Bug Fix: Fixed FEQSParametrizedQueryExecutionRequest::InitForOwnerAndBlackboard sometimes erroneously complaining about not being able to resolve a blackboard key when no BB key was being used.

  • Crash Fix: Switched nav octree element ID over from uint64 to uint32 and changed how we assign it - it's now set to Object.GetObjectID(). This is aimed at addressing occasional nav octree crashes when streaming out levels.

  • Bug Fix: UPathFollowingComponent::Cleanup now clears out the MovementComponent it points to, to ensure it is full hands-off when AIController::Unpossess is called.

  • Bug Fix: Changed the way we store UNavigationSystemV1.CrowdManagerClass so that it works with game-specific crowd manager class implementations.

  • Bug Fix: Changed how we initialize FNavigationSystem::CoordTypeTransformsTo. The old initialization order resulted in bad initialization on some platforms.

  • Bug Fix: Fixed the nav bounds calculation bug for InstancedStaticMeshComponents and HierarchicalInstancedStaticMeshComponents.

  • Bug Fix: Fixed RecastNavMesh not recreating default nav query when loaded instance has a different querying properties than the CDO.

  • Bug Fix: Made sure we clear out the EInternalObjectFlags::Async flag for UBodySetup instances that have been created off-game thread via UShapeComponent::CreateShapeBodySetupIfNeeded. This fixes a memory leak resulting from UShapeComponent::CreateShapeBodySetupIfNeeded sometimes being called as part of async navigation collision gathering.

  • Bug Fix: Fixed a bug forcing RecastNavMesh's default query recreation when query-related properties get changed in the editor.

  • Bug Fix: Fixed recast navigation queries' capabilities to limit the the available node pool size. The bug was noticeable when using shared queries.

  • Bug Fix: Fixed a navmesh generation bug that resulted in removing and not rebuilding parts of navmesh when a new navmesh bounds volume had been added.

  • Bug Fix: Fixed a bug in how/when FRecastNavMeshGenerator::RcNavMeshOrigin is being set. It sometimes ended up uninitialized.

  • Bug Fix: Fixed backtracking pathfinding issues resulting from reversing the path too late - it needed to be reversed before the string pulling to gather all the area information properly.

  • Bug Fix: Added special handling (including logging) when there are no walkable areas while generating recast navmesh tiles. We used to report those as errors while those are pretty normal circumstances.

  • New: Added a way to configure Recast pathfinding to restrict A from reopening nodes that have already been placed on closed list. Can be used to optimize A cost at the price of not-optimal paths.

  • New: Let NavigationSystem instances override "NavigationAutoUpdateEnabled" behavior.

  • New: Added an 'invert' function to FNavMeshPath

  • Improvement: Made it easier to extend navmesh generators (override ARecastNavMesh::CreateGeneratorInstance).

  • Improvement: Extended NavigationTestingActor with a way to do 'backtracking' pathfinding.

  • Deprecated: WorldSettings.bEnableNavigationSystem has been deprecated. Use WorldSettings.NavigationSystemConfig instead.


  • Bug Fix: Fixed physical animation automation test.

  • Bug Fix: Fixed UAnimSequence::CopyNotifies & exposed it to Animation Blueprint Library.

  • Bug Fix: Fixed custom Stencil/Depth not working on GeometryCache actors.

  • Bug Fix: Updated Header's signature to match body for AnimationEditorUtils::CreateNewAnimBlueprint

  • New: Added ability for Skeletal Mesh Component to propagate morph and or curve values to its slave components.

  • New: Added Per Subject delays to Live Link with Time Synchronization (Timecode Synchronizer).

  • New: Exposed FAnimMontageInstance to ENGINE_API.

  • New: Added Animation Budget library to allow for testing.

  • New: ControlRig: Added more options for GetJointTransform, Distance, and Clamp

  • Improvement: Optimized deferred kinematic updates

Animation Assets

  • Crash Fix: Fixed crash in BlendSpace editor when sample data being used is deleted

  • Bug Fix: Changing types of an Anim Notify will now try to copy over as many properties as possible from the old type to the new one.

Animation Blueprints

  • Crash Fix: Fixed crash on blend multi node due to invalid link node id.

  • Crash Fix: Fixed issue with crashing when switching to different a mesh while using copy pose node.

  • Crash Fix: Fixed crash when a curve hasn't been updated before updating the animation. Ensures to update curves prior to update animation, not just before evaluate.

  • Crash Fix: Fixed a crash with curves of the skeleton when joint has been removed.

  • Crash Fix: Fixed a crash with LiveLink nodes

  • Bug Fix: Fixed properties copied into sub anim instances being one frame out of date.

  • Bug Fix: Fixed setting name by pin in PoseByName node not being correctly updated.

  • Bug Fix: Improved anim node data packing and audited properties.

  • Bug Fix: Fixed incorrect spawn location for dragged assets in Anim Blueprints.

  • Bug Fix: Fixed assets being dragged over animation node pins displaying an incorrect error message.

  • Bug Fix: CopyPoseFromMesh node is now thread-safe

  • Bug Fix: Fixed to support correct Source for CurveSource node

  • New: Added an Experimental hook to UAnimInstance called ApplyAnimOverridesToCDO, which allows subclasses to do their own animation modifications as part of the Anim BP compilation process.

  • New: Added stricter range checks to AnimNode_CopyPoseFromMesh::Evaluate_AnyThread

  • New: RigidBody.ClampLinearTranslationLimitToRefPose - If rigid body node is set to lock a linear limit, this option clamps to the default translation. Only works if you set all axes to lock.

  • New: Support clamping input DeltaTime in AnimNode Trail

Animation Tools

  • Crash Fix: Fixed a crash converting a sequencer possessed actor to spawnable when it uses the rigid body anim node

  • Crash Fix: Fixed crash undoing the renaming of a deleted animation curve

  • Crash Fix: Fixed a crash reordering a preview mesh collection from inside an animation editor

  • Crash Fix: Fixed crash when editing notifies in a montage when one of its child montages is also open for editing

  • Bug Fix: Implemented a fix for Live Link disconnecting when the Editor is busy. The root cause was that FHeartbeatManager would send the heartbeat on a separate thread however we were only receiving the response on the Game Thread causing replies to be dropped during a slow task. This was resolved by calling the ReceivingOnAnyThread function in the Builder function in FMessageEndpoint and updating the relevant handlers to be Threadsafe.

  • Bug Fix: Fixed anim timeline scrub ticks extending outside of their track when zoomed.

  • Bug Fix: Animation Recorder now checks for curve validity before blending. Checking the element count wasn't enough, since the UIDToArrayIndexLUT could be null.

  • Bug Fix: Fixed anim viewport pinned command widgets being added incorrectly (when not holding shift).

  • Bug Fix: LiveLink: Modified FHeartbeatManager so that its thread is correctly killed during the manager's destructor.

  • Bug Fix: Bone selection is now cleared when entering section selection mode in skeletal mesh editor.

  • Bug Fix: Fixed pinned viewport commands being searchable in animation editors.

  • Bug Fix: Fixed incorrect displayed LOD level when editing skeletal mesh LOD counts in external sub-editors

  • Bug Fix: Animation Editor: Fixed when Reset to Default doesn't clear additional meshes

  • Bug Fix: Animation Editor: The mesh editor doesn't show any additional meshes

  • Bug Fix: Animation Editor: Fixed a bug with Apply to Asset where it doesn't show sometimes

  • New: Added Asset details panel to Skeleton Editor.

  • New: Added restriction to the value of Base LOD (to always be lower than the current LOD index) when generating a Skeletal Mesh LOD.

  • New: Animations and Pose Assets can now be created from Skeletal Mesh, Skeleton and Animation Blueprint Editors.

  • New: Bone drawing code now uses mesh bound to scale the thickness of the line.

  • New: Experimental: Live Link Curve Debug plugin

    • This provides a tool to quickly see what the output is of various LiveLink curves in an easy to debug manner.

    • Editor : Go to Window > Developer Tools > Live Link Curve Debugger once you enable the plugin

    • Type LiveLinkDebugger Show in the command-line

    • This may only work in editor or PIE.

  • Improvement: Displaying Vertex Colors in the Skeletal Mesh Editor has moved from 'Character / Mesh' to 'Show/Advanced' in line with other viewports.


  • Bug Fix: Fixed a potential crash when opening the master sequence due to UMovieSceneGeometryCacheSection::PostLoad() not properly calling the base function Super::PostLoad().

  • New: Added top-level checkbox to include/exclude all tracks when importing an Alembic File.

Skeletal Mesh

  • Crash Fix: Fixed a crash when setting skeletal meshes while tasks are in flight

  • Bug Fix: Fixed an issue when render bound doesn't get an update on Slave Component while Master Component is moving.

  • Bug Fix: Fixed motion vector issue (for motion blur/temporal AA) on PoseableMeshComponent

  • Bug Fix: Fixed one-off bone visibility changes causing flicker

  • Bug Fix: Moved ClearMorphTarget to SetSkeletalMesh from Initialize Animation, which gets called unnecessarily often.

  • New: Added OnBoneTransformsFinalized delegate to USkeletalMeshComponent.

  • New: You can modify Skeletal Mesh reference pose in the Editor with this change. Use normal bone manipulators to modify and call Update Reference Pose option in the Edit menu in Mesh Editor.

  • New: Support BakePose on LODSetting asset

    • This only works if the bakepose shares the same skeleton with the applied mesh

    • You can override per mesh using BakePoseOverride


  • Crash Fix: Fixed crashes with Flexiverb DSP initialization.

  • Crash Fix: Fixed a crash in FVorbisAudioInfo when attempting to get compressed info if the library was not loaded/found.

  • Crash Fix: A rare crash on cook was fixed for streaming USoundWaves.

  • Crash Fix: Fixed a crash when releasing reverb.

  • Crash Fix: Fixed a crash when playing TimeSynth that hasn't been activated.

  • Bug Fix: Releasing reverb no longer causes an indefinite hang when baking.

  • Bug Fix: Fixed an issue where Media Sound Component would play at level origin instead of the actor's location.

  • Bug Fix: Fixed the delay ratio for stereo delays source effects.

  • Bug Fix: Fixed the clamp min and ui min values on the DelayRatio property.

  • Bug Fix: Some minor issues were fixed with panning logic for the Granulator Synth Component.

  • Bug Fix: Fixed AttachTo and SnapTo enums for SpawnSoundAttached.

  • Bug Fix: Fixed a bug with duplicate speaker entries in SoundFactory for the left surround speaker.

  • Bug Fix: Several issues with the modular synth were fixed.

  • Bug Fix: Removed an invalid assert on the submix weak reference pointer.

  • Bug Fix: Fixed the optimization flag on synthesis plugin.

  • Bug Fix: Reverb dry-level channel pan was fixed.

  • Bug Fix: Fixed an issue with re-importing over an existing audio file.

  • Bug Fix: An issue was fixed where streaming USoundWave would not play if play was called right after it was loaded.

  • Bug Fix: Fixed log output for duration with Audio Recording.

  • Bug Fix: SpawnSoundAttached now treats location input as relative when EAttachLocation is KeepRelativeOffset.

  • Bug Fix: Hash collisions no longer causing unintended audio playback behavior.

  • Bug Fix: Fixed an issue in Pitch Bend MIDI-parsing where MSB/LSB was flipped.

  • New: Spectrum analysis for submixes is now available using the following Blueprint functions:

    • Start Analyzing Output

    • Get Magnitude For Frequencies

    • Get Phase For Frequencies

    • Stop Analyzing Output

  • New: An easy to use, cross-platform FFT implementation has been added to the AudioMixer module. DSP/PassiveFilter.h has been added as a simple example of using it for spectral signal processing.

  • New: An ITD Spatialization plugin has been added to the engine.

  • New: Support for reading/decoding of audio files to arbitrary paths has been added to the AudioMixer module as FAudioFileReader.

  • New: Generic encoding of audio signals to Ogg Vorbis, Opus, and WAV has been added to the Audio Mixer module for all platforms (except HTML5) using the DSP/Encoders folder.

  • New: Audio Importer now uses LibSoundFile to support importing AIF, FLAC, and Ogg Vorbis file formats. Re-import now supports multiple source file format extensions, and warns if source files of different formats (ex. Folder/Sound.wav & Folder/Sound.aif) are attempting to overwrite one another.

  • New: Add an opt-in smooth interpolation feature to the Doppler SoundCue node.

  • Improvement: Moved priority settings on USoundBase (and inheriting children) to its own category outside of concurrency.

  • Improvement: Added the option to automatically stream all USoundWaves above a set duration on mobile platforms. This option can be found in Project Settings, in the Audio category for each platform.

  • Improvement: Added the ability to adjust sound cue/wave trim volume by command line/ini file. This allows hotfixing volumes without cooked content or code changes.

  • Improvement: Added edit conditions for bDelayBasedOnDistance and SpeedOfSound.

  • Improvement: Added the ability for AudioMixer to render out audio when no audio output device exists on Windows.

  • Improvement: Added comments on stereo delay source effect.

  • Improvement: Renamed the synthesis plugin for clarity.

  • Removed: Removed unneeded whitelisting from the AudioCapture plugin.


  • Bug Fix: Addressed image comparison using the wrong image with EStructuralSimilarity::Color. #4806

  • New: PS4 now defaults to running from host. Previous deploy behavior is still available through "-deploy".

    • Cleaned up TargetDevicePS4, commented a number of things, and moved some code to a PS4Utils module.

    • Added utilities for marking/cleaning up old directories.

  • Improvement: Increased the speed and removed code bloat from automation tests.

    • Smoke tests now run about eight times faster in an internal project.


  • Crash Fix: Fixed a crash when dragging from the Blueprint Editor components list if there is no corresponding property.

  • Crash Fix: Fixed a crash in UpdateAnimation after compiling a Blueprint.

  • Crash Fix: Fixed crashes happening after reloading a Blueprint asset that had native default sub-objects.

  • Crash Fix: Nativized UMG widgets that include a custom button no longer crash.

  • Crash Fix: Fixed a crash when reparenting a Blueprint.

  • Crash Fix: DataAssets made out of Blueprint classes now properly reference their source.

  • Crash Fix: Fixed a crash when a Blueprint graph is in the process of being closed due to deletion.

  • Crash Fix: No longer crashing when diffing Blueprints with missing properties.

  • Crash Fix: Fixed a crash when compiling Blueprints with sub-objects created in C++.

  • Crash Fix: Fixed crashes when reloading a Blueprint that has children types also loaded.

  • Crash Fix: Fixed a crash in SGraphNode related to tooltips.

  • Crash Fix: Fixed a crash when loading a child Blueprint class after previously swapping component names in the parent Blueprint class.

  • Crash Fix: Fixed an editor crash on load of a Blueprint asset after switching a child component node's type to be a non-scene component type in C++ code.

  • Crash Fix: Fixed a crash when promoting an output pin on a "Get Class Defaults" node.

  • Crash Fix: Fixed a crash after force deleting a User Defined Struct that was being used in a Blueprint.

  • Crash Fix: Fixed a crash after loading a user defined structure with circular references to Blueprint classes.

  • Crash Fix: Fixed a crash when the Blueprint Editor Utilities (blutilties) window is open and a Blueprint is compiled.

  • Bug Fix: GetQueryResultsAsActors and GetQueryResultsAsLocations now clear their output arrays. This means these functions will no longer append data to a non-empty array, which would likely be undesired behavior.

  • Bug Fix: Because literal Soft Object/Class Reference pins are now properly tracked, some packages may be getting pulled into a cooked build that were not before.

  • Bug Fix: Improved all tooltips for Blueprint callable functions with single line documentation strings

  • Bug Fix: Fixed potential data loss in components when only part of a Blueprint class hierarchy is nativized.

  • Bug Fix: Fixed UnrealBuildTool warnings about the PCH when building or packaging with Blueprint Nativization enabled.

  • Bug Fix: We now properly construct any native 'noexport' struct-typed literal term in a nativized Blueprint class.

  • Bug Fix: Compilation manager now correctly remaps old DefaultSubobjects to new instances of those DefaultSubobjects.

  • Bug Fix: An empty UFunction is no longer generated for empty User Construction Scripts.

  • Bug Fix: Adding an output to a collapsed node graph by dragging a pin to it now updates properly.

  • Bug Fix: Graph Editor alignment shortcuts now conform to the de-facto standard by default.

  • Bug Fix: Fixed UInheritableComponentHandler::PostLoad() to avoid some unnecessary loop iterations on load in a cooked build.

  • Bug Fix: A typo was fixed in the tooltip of "Pass-by-Reference."

  • Bug Fix: Fixed a Blueprint Nativization compile failure due to one or more unconnected "soft" class reference input pins on an event or function call node.

  • Bug Fix: Fixed uninitialized user defined struct fields in nativized, cooked builds.

  • Bug Fix: Warning spam fixed from an abstract or deprecated Blueprint trying to render a thumbnail.

  • Bug Fix: Fixed a circular dependency issue between converted Blueprint class/struct types and non-nativized Blueprint class assets.

  • Bug Fix: Only Blueprint-generated classes are allowed to be excluded from nativization by folder path.

  • Bug Fix: The display name of variable accesses now update correctly when changing the type of the variable to or from boolean.

  • Bug Fix: Categories no longer appear if they don't contain any visible properties.

  • Bug Fix: Fixed compilation error when delegate properties reference function signatures on out of date classes.

  • Bug Fix: Fixed loss of references to instances of Blueprints that are simultaneously compiled.

  • Bug Fix: Fixed an issue where dragging assets to Blueprint nodes incorrectly displayed - as if it was not the correct type.

  • Bug Fix: Break Link, Jump, and Straighten Connection menu options are now consistent in their display. Also, no longer shows empty parentheses if connected to a pin with no name.

  • Bug Fix: Opening GameplayAbilityBlueprints that have no GeneratedClass is allowed but warns if it's missing ParentClass.

  • Bug Fix: References to the old CDO referenced in other Blueprints now get updated by the Blueprint Compilation Manager.

  • Bug Fix: GameplayTags are now properly filtered in Blueprint SET nodes.

  • Bug Fix: Added code to keep orphan pins around for any links lost during backwards compatible node conversion.

  • Bug Fix: ActorComponent-derived visualisers now receive a HandleInputDelta() call in the Blueprint Editor's viewport.

  • Bug Fix: Multiple undo transactions for renaming no longer generated when setting the comment text on a comment box.

  • Bug Fix: Adding output pins to a Sequence node no longer removes the Then 0 pin.

  • Bug Fix: Fixed an invalid cast of a nativized enum term to its underlying pointer type in generated Blueprint C++ code.

  • Bug Fix: Levels that are unloaded (or if they failed to load) can now be removed from the Levels tab.

  • Bug Fix: Fixed Keys variables getting into an inconsistent state when set using a variable Set node in Blueprints.

  • Bug Fix: Fixed the graph displaying incorrectly after shift-dragging to select nodes and releasing the mouse button over a connection spline.

  • Bug Fix: Copy and Paste of components in MyBlueprints now correctly maintain relative hierarchy, duplicate of components, and per instance component window.

    • The per instance component window now maintains the name of the source component where possible and a modified version of the name when already taken instead of using the component class as name.

  • Bug Fix: EDL at cook time is now required when Blueprint component data for runtime spawning is enabled in the project settings.

  • Bug Fix: Fixed an ensure when compiling a Blueprint interface after changing a function signature.

  • Bug Fix: Fixed Alt+RMB zooming in UMG Designer and Blueprint Graph.

  • Bug Fix: Arrays of text properties no longer fail to propagate new default values to component instances

  • Bug Fix: Fixed UKismetMathLibrary::Hypotenuse returning NaN for a 0x0 triangle.

  • Bug Fix: Closing the "Blutility Details" panel is no longer possible as it cannot be re-summoned if lost.

  • Bug Fix: Fixed invalid pins not being removed when refreshing a 'select' node after an Enum option is removed.

  • Bug Fix: Fixed a compilation error describing undetermined type when calling an interface function with Set or Map properties.

  • Bug Fix: Conversion of a TWeakObjectPtr property value when referencing an instanced subobject in a nativized Blueprint class now works properly.

  • Bug Fix: Blueprint functions with a single output parameter now use full function descriptions for their tooltip if there is no explicit return value documentation.

  • Bug Fix: Changing a User Struct's defaults correctly propagates those changes to open Blueprints using that struct.

  • New: Added an equality operator for arrays in Blueprints.

  • New: Now enforcing rules about editor-only functions being called in runtime Blueprints.

  • New: Included Blueprint int64 support.

  • New: Can now call GetOuterObject from Blueprints to query the outer of a given object.

  • New: Created an asset picker for selecting external timeline curves.

  • New: Can now use home, end, page up, and page down in a filtered Blueprint action menu.

  • New: Get Console Variable Bool Value can be used to query the boolean state of a console variable from Blueprints.

  • New: Editor only functions can't be added to runtime Blueprints, only Blutilities and Editor Widgets.

  • New: Dragging from a class pin to a string will now automatically create a GetClassDisplayName node.

  • New: "Create" and "New" added as keywords to Construct Object node.

  • New: Added Hide Unconnected Pins button to Class Defaults.

  • New: Nativized Blueprint types can now instance other nativized Blueprint types as subobjects when there are one or more non-Blueprint asset preload dependencies.

  • New: Added scrolling to CreateEvent node method list.

  • New: Added Blueprint graph action name to the error message for "by ref" pin.

  • Improvement: Improved editor startup/load times by deferring Blueprint search data re-indexing work until a global Find-in-Blueprint tab is opened.

  • Improvement: ExpandEnumsAsExecs metadata for Blueprint exposed UFUNCTION can now be used for multiple pins. Limited to a single input pin, but can handle multiple output pins.

  • Improvement: Improved backward compatibility Blueprint node fix-up logic when using reroute nodes.

  • Improvement: Reduced overhead of calling Blueprint functions with return values.

  • Removed: Removed overzealous ensure from UBlueprintGeneratedClass::FindArchetype

  • Improvement: Reduced overhead related to function 'callspaces' when calling script functions.

  • Removed: Removed legacy Blueprint code that triggered a copy of the skeleton CDO to the generated CDO based on a serialized flag.

  • Improvement: Game projects that rely on legacy include paths are now compatible with Blueprint Nativization.

  • Improvement: Added code to ensure that sequence assets are fully loaded before they are compiled.

  • Improvement: Now ensuring UserWidget bindings are created in packaged builds for child Blueprints.

  • Deprecated: GetCategoriesMetaFromStruct has been deprecated in favor of GetCategoriesMetaFromField.

  • Improvement: Call macro node titles now display with the same format that call function nodes, variable accesses, and others use.

  • Improvement: Renamed bSpawnPawn to bSpawnPlayerController for UGameplayStatics::CreatePlayer.

    • Also clarified the parameter name for UGameInstance::CreateLocalPlayer.

  • Improvement: Nativized replication of a child actor component's internal actor template in a cooked client/server build.

  • Deprecated: To avoid build/cook warnings, deprecated UEnvQueryInstanceBlueprintWrapper::GetResultsAsActors and replaced it with GetQueryResultsAsActors.

  • Deprecated: To avoid build/cook warnings, deprecated UEnvQueryInstanceBlueprintWrapper::GetResultsAsLocations and replaced it with GetQueryResultsAsLocations.

  • Deprecated:Deprecated pure Blueprint functions on UEnvQueryInstanceBlueprintWrapper: GetResultsAsActors(), GetResultsAsLocations() and replaced them with new impure functions GetQueryResultsAsActors(), GetQueryResultsAsLocations(). Deprecated pure Blueprint functions on UEnvQueryInstanceBlueprintWrapper: GetResultsAsActors(), GetResultsAsLocations() and replaced them with new impure functions GetQueryResultsAsActors(), GetQueryResultsAsLocations().

  • The new functions will prevent accidentally doing the work of building the array more than once since they aren't pure. Also, they return false if the Query status was not a success to prevent possible bugs caused by trying to return results from unsuccessful queries. Returning the success state (having found at least one result) as well as outputting the array will also improve UX.


  • Crash Fix: Fixed a crashing issue due to the invocation list getting cleared while delegates were being invoked.

  • Crash Fix: Fixed a crash that occurs when loading a UObject that has a missing outer.

  • Crash Fix: Fixed a crash when GFastPathUniqueNameGeneration was true (when enabled, saves ~50 MB on Win64 and faster execution time for MakeUniqueObjectName). It can be enabled in non-editor build by setting FAST_PATH_UNIQUE_NAME_GENERATION define to 1.

  • Crash Fix: Allowed MallocBinned2 to allocate up to 2^36-1 bytes without crashing.

  • Crash Fix: Fixed an underrun mode in mallocstomp not properly aligning FAllocationData for use by the Free function, causing a crash.

  • Crash Fix: Disabled GC clustering support for SoundCues, SoundNodes, and SoundWaves. This resolves a crash that was being experienced.

  • Crash Fix: Fixed EDL crash when terminating the Engine while initializing.

  • Crash Fix: Stopped a crash when saving a package with duplicate asset registry tag names.

  • Crash Fix: Fixed cooked skeletal meshes crashing when opened in the editor.

  • Crash Fix: Fixed a crash when loading cooked asset in the Editor that was caused by seeking past the header before uexp file was loaded.

  • Crash Fix: Fixed a potential crash when saving packages and fixing up Soft Object Paths.

  • Crash Fix: We now Create/Destroy pak platform file on startup and shutdown of pak module, rather than on first access and at some random time during global destruction. This fixes a shutdown crash on linux where threads were being destroyed during global destruction which is too late.

  • Crash Fix: Fixed a potential crash in FStructuredArchive when loading thumbnail data.

  • Crash Fix: Addressed a potential crash when verifying imports while async loading and resolving deferred exports.

  • Crash Fix: Fixed a crash in structured archive when using enum resolver archives.

  • Crash Fix: Fixed a potential crash when flushing linker cache when async loading.

  • Crash Fix: Resolved a crash when data encryption options are enabled but no key is set.

  • Crash Fix: IsValidLowLevelFast can fail during initial load so skip it when getting an archetype of an object early in Engine init. This fixes a crash when enabling default subobject checks in cooked builds.

  • Crash Fix: Stopped UBT and UAT from crashing when DefaultCrypto.ini was missing.

  • Crash Fix: Fixed TNonRelocatableInlineAllocator not switching to heap allocator correctly, due to the CalculateSlackGrow function not increasing to contain the requested number of elements. This was causing crashes in FStructuredArchive serializers with deeply nested objects.

  • Bug Fix: Corrected misleading or incorrect header comments in CoreUObject classes.

  • Bug Fix: Fixed Ctrl-C handling on Windows so that it always ends execution when there is a valid terminal.

  • Bug Fix: Corrected a typo in TaggedBinaryArchiveOutputFormatter: uint16->uint32

  • Bug Fix: Fixed a type mismatch issue in StringToArray function.

  • Bug Fix: The actual TargetPlatform name will now be printed instead of the module.

  • Bug Fix: Fixed some instances of string literals being passed as bool instead of FString as expected.

  • Bug Fix: Fixed Config file parsing to properly handle things like \' in quoted strings.

  • Bug Fix: Corrected a TAtomic compiler error caused by changes to VS2017's template parsing.

  • Bug Fix: Fixed a bug with alignment padding in compressed and encrypted pak files.

  • Bug Fix: CrashReportClient will no longer be started to report an ensure() in a non-Editor build.

  • Bug Fix: Fixed LITERAL macro so that it works with 16-bit TCHARs.

  • Bug Fix: Corrected race condition in Async testcase (FAsyncCompletionCallbackTest).

  • Bug Fix: Fixed a bug with spaces in filenames for stable shader cache generation during cook.

  • Bug Fix: It is now possible to load dependent modules located in platform subdirectories.

  • Bug Fix: MallocProfiler now uses a less complicated TArray instead of FCompressedBuffer to prevent deadlocks in stats.

  • Bug Fix: Fixed gc.LowMemory.TimeBetweenPurgingPendingKillObjects. This was pointing to the wrong global, causing us to always GC at this rate if the cvar was specified.

  • Bug Fix: Fixed a bug in Low Level Memory tracker (LLM) when using asset tags, which caused incorrect results.

  • Bug Fix: Changed it so a missing import class package does not crash the Engine. It will now report an error instead.

  • Bug Fix: Changed the CancelHandle function in FStreamableHandle to correctly stop the callback from happening if the handle has already completed loading but is in the delayed callback queue.

  • Bug Fix: Fixed an assert which fired for classes with no properties but was larger than its superclass.

  • Bug Fix: Disabled inter-property delta serialization in TSet and TMap when duplicating UObjects to force all elements through the object redirection process.

  • Bug Fix: Fixed the FindAndSetLastZeroBit and FindLast functions in TBitArray for containers of a multiple of 64 elements.

  • Bug Fix: Corrected a signed/unsigned mismatch in the GetVarArgs function.

  • Bug Fix: Fixed Visual Studio debugger visualization of FWeakObjectPtr and TWeakObjectPtr.

  • Bug Fix: Corrected TMap element replication in PIE which was caused by bad property comparisons.

  • Bug Fix: Fixed inconsistent behavior in the GetVarArgs functions in FGenericWidePlatformString and FStandardWidePlatformString where they don't completely fill the buffer before returning -1 when the buffer is too short.

  • Bug Fix: Fixed the GetVarArgs function in FPlatformString to make it return -1 correctly in ANSI mode.

  • Bug Fix: The CLion source code accessor will now wrap the path in quotes when opening a solution, and made it open the CMakeLists.txt file instead of the project file.

  • Bug Fix: Fixed a buffer overrun in the operator< overload in TBitArray.

  • Bug Fix: Added a potential thread-safety fix in the ClearFunctionMapsCaches function in UClass.

  • Bug Fix: Fixed Unreal Header Tool's code generation of const return types of interface functions.

  • Bug Fix: BulkData now supports data larger than 2GB - this allows very large meshes to be imported without problems.

  • Bug Fix: Const-corrected the TArrayView constructor from a std::initializer_list.

  • Bug Fix: Fixed TEnumAsByte to generate an error when a const instance is left uninitialized.

  • Bug Fix: Corrected a race condition in an Async testcase (FAsyncCompletionCallbackTest).

  • Bug Fix: Fixed an obscure bug in map list parsing in DDC commandlet.

  • Bug Fix: Addressed some timers being removed too early when removing all timers associated with a given object.

  • Bug Fix: Fixed aligned load of unaligned memory.

  • Bug Fix: Fixed C vararg usage which didn't call the va_end function to close the va_list.

  • Bug Fix: Corrected the ReallocExternal function in FMallocBinned2 that was storing the unaligned size of an OS allocation.

  • Bug Fix: Cleaned up some memory leaks in the stats system.

  • Bug Fix: Fixed some skipped security checks in FString caused by negated integer overflow.

  • Bug Fix: Fixed the wrong delegate being used to broadcast an OOM condition.

  • Bug Fix: Corrected the propagation of instanced property flags from TMap keys to the outer.

  • Bug Fix: Added missing support for the TimerManager and compactability in the weak lambda delegates.

  • Bug Fix: Fixed LoadPackageInternal returning the wrong package in the EDL case if an Outer package was supplied.

  • Bug Fix: Corrected an issue where new line character wasn't being inserted after PCH when generating new C++ classes.

  • Bug Fix: Cleaned up a stats memory leak.

  • Bug Fix: Made GetCleanFilename return an empty string if a directory is passed in.

  • Bug Fix: Fixed an issue where failure to load a plugin was a silent failure with unattended. It now results in a fatal error.

  • Bug Fix: Fixed incorrect path to Engine DDC when running an executable built with a unique build environment that's more than one path deep.

  • Bug Fix: We now only force all pending unreachable objects to have ConditionalBeginDestroy called on them when async loading when we're actually loading something.

  • Bug Fix: Enforced 2 worker threads as the minimum spawn count on Windows which resolves a potential initialization deadlock on low-end CPUs.

  • Bug Fix: Made sure the Editor custom version is serialized with package file summary in cases where the package doesn't have UMetaData object. Otherwise the package may get corrupted because the localization gather code already forces the Editor custom version on the linker after the file summary has been serialized. This fixes package redirects not being able to save.

  • Bug Fix: Avoided calling the strlen function when appending a single char in the ToString and AppendString functions in FName.

  • Bug Fix: Fixed bad string formatting when detecting issues with package dependencies.

  • Bug Fix: MaterialInstanceDynamic created by WidgetComponent will now be properly added to the component's GC cluster.

  • Bug Fix: Made sure that GC's incremental ConditionBeginDestroy is not running when async loading in editor builds as this may result in the async loading code getting unreachable imports from linkers that haven't been detached yet.

  • Bug Fix: Fixed Garbage Collector potentially destroying objects that were added to the "disregard for GC" pool after the Engine has been initialized.

  • Bug Fix: Fixed a hang when entering PIE when Background Streaming is disabled.

  • Bug Fix: Added a missing mutex lock to RemoveLoaderFromObjectLoadersAndLoadersWithNewImports.

  • Bug Fix: Fixed the HasProperty function in UClass returning false positives for properties that belong to a child class of the one being tested.

  • Bug Fix: Made sure that cooked materials work in the Editor.

  • Bug Fix: Fixed 'Missing DDC Key' log spam when interacting with a cooked texture in the Editor.

  • Bug Fix: When attempting to load an animation to make sure it doesn't exist on disk, the Engine will no longer log warnings as it's expected the animation may not exist.

  • Bug Fix: Fixed some cases of Garbage Collector hitches on some platforms.

  • Bug Fix: The archive created by FOutputDeviceFile will no longer try to log errors as in case of an error it would redirect logging back to itself or, in some cases, cause threading deadlocks.

  • Bug Fix: Target platforms now report secure package formats for windows/linux/mac dedicated servers, and for all other consoles. This works around the fact that some platforms don't return correct data for the IsClientOnly and IsServerOnly functions.

  • Bug Fix: Fixed unexpected custom version errors when re-saving Niagara particles.

  • Bug Fix: Changed the UObjectArray chunk size to 64K (down from 65K which was a mistake).

  • Bug Fix: Made sure MediaPlayer and MediaPlaylist don't get added to GC clusters as they violate GC assumptions.

  • Bug Fix: Fixed soft object paths not resolving the package name properly in some cases when loading.

  • Bug Fix: Made sure any files that are assigned to an encrypted pak file are duplicated into all other encrypted paks that reference them.

  • New: Added GetParentNativeClass util function to UObjectBaseUtility.

  • New: Added support for generating mapping file with UnrealPak by using GeneratePixMappingFile, which can be imported into PIX IO Trace capture to view loose file name directly in PIX.

  • New: Made TWeakObjectPtr's assignment operators return a reference to themselves.

  • New: Modernized unaligned reads so that sanitizers work and any potential optimization hazards are avoided.

  • New: Added support for JSON serialization of maps of FString keys with int64 values.

  • New: Added Reserve function to FLargeMemoryData.

  • New: Implemented USE_BOOT_PROFILING, which is used to profile the very early boot process.

  • New: Added a new define (AGGRESSIVE_MEMORY_SAVING) for some aggressive memory savings techniques. This is not enabled by default since there is some performance cost.

  • New: Added the ability to have "DisallowedClasses" metadata to prevent certain assets from being assigned to references. A current use case of this is that SlateBrush no longer allows UMediaTextures.

  • New: Added SQLiteCore:

    • SQLiteCore provides a UE4 friendly C++ wrapper around an embedded version of SQLite (currently 3.26.0) that is compiled using a custom "OS" that uses the UE4 HAL to provide consistent support on all of our platforms.

    • The UE4 HAL has some limitations (see below) compared to the native OS implementations of SQLite, however the native OS implementations don't compile on every platform supported by UE4. If SQLite compiles natively on every platform you want to target, then you can set bCompileCustomSQLitePlatform to false in your .Target.cs file. Note that this requires a source build of UE4 as the SQLiteCore plug-in must be recompiled.

    • The primary limitation of using the UE4 HAL with SQLite is concurrent database access, as the UE4 HAL doesn't provide an implementation of shared memory (as not all platforms implement it), nor does it provide an implementation of granular file locks. These two things mean that only one FSQLiteDatabase can have the same database file open at the same time.

    • The embedded version of SQLite is compiled with FTS4 and FTS5 enabled, and with extension loading support disabled. It is also compiled with ICU support enabled when bCompileICU is set to true for your target.

    • SQLiteCore provides lower-level access to the SQLite API than SQLiteSupport does, which allows you to take full advantage of things like prepared statements and data binding. SQLiteSupport is now internally implemented using SQLiteCore.

  • New: Added IsStale function to TWeakInterfacePtr in order to match IsValid.

  • New: Added support for garbage collection at a higher frequency if we're low on physical memory using the cvars gc.LowMemory.TimeBetweenPurgingPendingKillObjects and gc.LowMemory.MemoryThresholdMB.

    • gc.LowMemory.TimeBetweenPurgingPendingKillObjects is time in seconds we should wait between purging object references to objects that are pending kill when we're low on memory.

    • gc.LowMemory.MemoryThresholdMB is the threshold in MB for low memory mode GCs to kick in (this defaults to 0, which is disabled).

  • New: Enabled string pooling in optimized builds.

  • New: Exposed working directory in FMonitoredProcess.

  • New: Alignas() parsing in UnrealHeaderTool is now supported.

  • New: Added new experimental MallocBinned3 for 64bit platforms.

  • New: Added RemoveIf and StableRemoveIf algorithm functions to the Algo class.

  • New: Changed compile time PLATFORM_CACHE_LINE_SIZE to 64 on all platforms.

  • New: Added move support for the Add function in the TSparseArray class.

  • New: Added support for Default/BasePakFileRules.ini.

    • Allows specifying rules for overriding pak/chunk behavior.

    • Moved mobile bloom content stripping to BasePakFileRules.ini so it can be overridden by games.

  • New: Changed pak code to allow placing the same file into multiple paks if requested by the cooker. This can be disabled with bForceOneChunkPerFile.

  • New: Added StaticClass() and StaticStruct() non-member functions as an alternative to T::StaticClass() and T::StaticStruct(). Also added StaticEnum() for enumerated types.

  • New: Added CountBytes method to FString to match other Core and Container types.

  • New: Made ensure()s fire with a configurable chance.

  • New: Added an experimental option to use a compact version of the runtime asset registry. This saves about 3-13MB depending on the config.

  • New: Added CONDITIONAL_SCOPE_LOG_TIME*() macros, which only log when the condition is true.

  • New: Exposed LTCG and PGO settings to Core module (for logs and analytics).

  • New: Added support for priority for UObject loading to help tune streaming performance in scenarios where texture and audio requests are starving level streaming. This is controlled with s.AsyncLoadingPrecachePriority. Note: AIOP_MIN is still the default, but this can be adjusted per platform or project as required.

  • New: Added a conversion path for deserializing interface properties as object properties.

  • New: Added a simple TBasicArray RAII dynamic array type for low level code that can't use TArray because of its dependencies.

  • New: Updated Linux to now use C locale like all other UE platforms.

  • New: We now provide the file path of the ICU DLL that failed to load.

  • New: Added support for SetThreadDescription thread naming API. This API is better than the old SEH style thread naming since the names also show up in crash dumps and ETW traces.

  • New: Enabled std::aligned_storage to build under VS 2017 15.8.

  • New: Added asserts to the Reserve functions in TArray and FString in order to ensure the requested sizes are legal.

  • New: Added UE_STATIC_DEPRECATE() macros which conditionally display a deprecation warning.

  • New: Added UE_DEPRECATED() which uses C++14's [[deprecated]] attribute syntax and deprecated the old DEPRECATED() macro.

  • New: Implemented FGuardValue_Bitfield variant to make guarding bitfield values more convenient as TGuardValue cannot take them by reference.

  • New: Added comments to the reflection mirror of FPolyglotTextData so they show up when using it in the editor. Also added the note "(it should be the same as the originally authored text you are trying to replace)" to the NativeString description in both places.

  • New: The warning 'Calling StaticLoadObject during PostLoad of ...' will now also include the parameters passed to StaticLoadObject for easier debugging.

  • New: Added some Serialize function parsing tests to UHT's internal test cases.

  • New: Added optimization to stat UObjects to prevent excessive rendering off of the screen. This gave us at least a 10x improvement.

  • New: Allowed overriding the thread pool to use when starting the background task with FAutoDeleteAsyncTask.

  • New: Added TargetRules option bAllowNonUFSIniWhenCooked which, when true, will disable non-UFS ini files from loading in cooked builds, except for GameUserSettings.ini.

  • New: Implemented utility for creating JSON DOMs manually.

  • New: Added gc.DumpRefsToCluster Name=ClusterRootObjectName command to dump references to all objects within a cluster. This is useful for determining if clusters are indeed 'stale.'

  • New: Implemented a new override for LoadPackageLinker that takes a lambda that can be used to process the linker before EndLoad is being called.

  • New: Added code that now dumps the callstack (including the specific function) from Engine or game code that unexpectedly added a new custom version in serialization code in a non-deterministic way.

  • New: It's now possible to enable support for cooked data in the editor in project settings. The ini setting moved from [Core.System] AllowCookedDataInEditorBuilds=True to [/Script/UnrealEd.CookerSettings] cook.AllowCookedDataInEditorBuilds=True.

  • New: Added an %\ENGINEDIR% variable that can be expanded from config files.

  • New: Implemented the != operator to FJsonValue and made both == and != symmetrical.

  • New: Added Unit Test for Timecode.

  • Improvement: Improved the performance of MallocBinned3 slightly and fixed some static analysis warnings.

  • Improvement: Improved memory of UObject hash tables

  • Improvement: Removed the redundant re-opening of .module files when calling the FindModulePaths function of FModuleManager.

  • Improvement: Optimized TSet assignment operator and copy constructor.

  • Improvement: Optimized Str[n]icmp function and ToLower/ToUpper functions in TChar. Replaced expensive CRT to[w]lower() / to[w]upper function calls with locale-independent implementations. The semantics match standard C locale that all UE platforms use - only ASCII characters are considered.

  • Improvement: CSV profiler improvements:

    • Added CSV_TIMING_STATS_EMIT_NAMED_EVENTS and CSV_EXCLUSIVE_TIMING_STATS_EMIT_NAMED_EVENTS defines so we can analyze Csv stats in PIX/Razor (disabled by default).

    • Further optimized the CSV processing thread by getting rid of the exclusive stat temp array copy by processing the stats inline.

  • Improvement: Changed implementation of check, verify, and ensure macros to generate much less code on the hot path. Assert sites can now be as little as four instructions. This improves instruction cache utilization, gives the optimizer more opportunity to inline, and improves debugging as more non-volatile registers are preserved. The cold path instructions were also moved to a separate section in the binary to further separate hot from cold.

  • Improvement: Implemented better packing for FNameEntry on 64-bit platforms to reduce memory usage.

  • Improvement: Updated Framepro captures taken using the framepro.startrec and framepro.stoprec console commands to now have the process ID added to the filename.

  • Improvement: Reduced the time locks are held during allocation and reallocation in MallocBinned2.

  • Improvement: Implemented several improvements to Asset Registry memory and load times in cooked builds.

  • Improvement: Allowed platform specific math test function implementations as well as the generic implementations.

  • Improvement: Refactored UnrealHeaderTool-generated structs to reduce executable space.

  • Improvement: Improved CSV profiler exclusive stats (better instrumentation for effects time, broke down WorldTickMisc further).

  • Improvement: Added a few drive-by optimizations to game startup times that yielded ~15% speedup in an internal project.

  • Improvement: Optimized size and and performance of TFunctions.

  • Improvement: Reduced CPU usage for Cook-on-the-fly server by not busy-waiting for assets to cook. Also added an event which is signaled when a network request has been received. The main COTF loop blocks on this event when the cook request queue is empty. This reduces CPU usage while keeping the request latency low.

  • Improvement: Optimized TSet's copy assignment operator to copy the existing hash rather than rehash all the elements.

  • Improvement: MD5 and SHA1 Update functions now handle input lengths of up to 61 bits.

  • Improvement: Improved MallocBinned2 reporting.

  • Improvement: Allow console variable changed callbacks to be defined inline in their declaration.

  • Improvement: Improved reporting of bad TimerManager internal state.

  • Improvement: Moved UObject serialization state out of FUObjectThreadContext to a local-only (to the current FAsyncPackage/LoadPackage call) FUObjectSerializeContext. This will allow more advanced changes to the old serialization paths and prevent objects from being added to random FAsyncPackages when async loading (and that will allow package prioritization).

  • Improvement: Moved TWeakInterfacePtr into CoreUObject, and added a lot more functionality to it and made it work more closely with TScriptInterface so that they're easier to compare and interchange.

  • Improvement: Added default Engine textures to root set in cooked builds (even though they are referenced by a root set Engine object) to prevent them from being added to clusters which would result in these clusters always staying in memory.

  • Improvement: Disabled the checks against adding or removing objects from the UObject hash tables when iterating over them in shipping builds to reduce their memory overhead.

  • Improvement: During asset registry generation in the cooker, we now pass the list of cooked files to the AssetManager when calling the PreSaveAssetRegistry function.

  • Improvement: Changed TEncryptedAssetSet to be a map of group-name to a set of package names, rather than primary asset ids.

  • Improvement: The cooker will now attempt to collect garbage when the Engine is getting close to running out of available UObject indices.

  • Improvement: Allowed JSON_SERIALIZE_OBJECT_SERIALIZABLE object to be an expression.

  • Improvement: Added various updates to the WIP dynamic content encryption system.

  • Improvement: Editor only data is not excluded from totals gathered from GetResourceSizeEx.

  • Improvement: When reporting ensures, ThreadHeartBeat will now be suspended for all threads to prevent detecting hangs on threads that are waiting for the thread that triggered and is now processing the ensure.

  • Improvement: Avoided a strlen function call in the AppendInt function in FString since we already know the length of the string we built. This was used frequently when converting FName to FString.

  • Improvement: Made sure there are no dependencies that are pending load when trying to create GC clusters when async loading.

  • Improvement: Cooker settings will now automatically update console variables associated with them so that they take immediate effect instead of after restarting the editor.

  • Deprecated: Deprecated TIndirectArray's placement new syntax, which can cause new/free or malloc/delete mismatches.

  • Removed: Removed ArchiveAsync.h since it didn't contain anything useful anymore.

  • Removed: Removed unnecessary startup scan in cooked games/server.

  • Removed: Removed invalid postcondition check in the Trim function in TLockFreeFixedSizeAllocator.

  • Removed: Removed a redundant buffer length argument from the GetVarArgs functions in FPlatformString and TCString, and deprecated old overloads.

  • Removed: Removed the SecureCRT mode from our string functions as it makes the implementation inconsistent with other platforms.

  • Removed: Removed redundant checks when allocating a small block in the ResizeExternal function in FMallocBinned2.

  • Removed: Removed NTSC 23.976 from the timecode drop frame list.

  • Removed: Removed the functionality to merge GC clusters as it was never used and generally could lead to keeping all assets in memory forever.


  • Crash Fix: Added a fix for a rare crash that occurred when the mouse entered or left a game viewport while it didn't have an underlying SceneViewport.

  • Crash Fix: We now check asset validity to avoid rare crashes when reopening a level.

  • Crash Fix: Fixed a crash related to registering an editor mode after startup.

  • Crash Fix: Fix for rare crash when world settings weren't available during thumbnail rendering.

  • Crash Fix: Fixed a crash when importing a static mesh and the parent package is null.

  • Crash Fix: Fixed a Hot Reload crash related to maps containing streaming levels.

  • Crash Fix: Input action/axis mapping details customization will no longer display the remove from array icon if the input action or axis mapping is not in an array as pressing it could cause the editor to crash.

  • Crash Fix: Fixed a crash caused by re-importing assets in unattended mode.

  • Crash Fix: Fixed OOM issue when rendering SplineMeshComponent with a huge tangent vector.

  • Crash Fix: Fixed a bug that could make the editor crash when previewing LODs in the Skeletal Mesh Editor after importing a new LOD from the Content Browser.

  • Crash Fix: Fixed a crash that could happen when selecting instances.

  • Crash Fix: Fixed a crash when running with Instancing in some levels on a dedicated server.

  • Crash Fix: Fixed a crash where material was not valid when computing adjacency information.

  • Crash Fix: Fixed a crash when having a material with tessellation enabled but no layer painted.

  • Crash Fix: Fixed a crash that happened when using Change Component Settings on a setup where landscape is split between streaming level.

  • Crash Fix: Fixed a crash that could happen when force deleting a level with a landscape actor in it and using world composition.

  • Crash Fix: Fixed a possible crash that could happen if you tried editing a landscape streaming proxy when the landscape actor was not loaded.

  • Crash Fix: Fixed a crash that would happen when using a material with tessellation.

  • Crash Fix: Added another conditional to guard against crash with comment pasting.

  • Crash Fix: Fixed a crash in the Blueprint debugger watch window.

  • Crash Fix: Fixed a crash in the case of the FrameRate being invalid. GetFirstFrameRate() could sometimes return a nullptr.

  • Crash Fix: Fixed a Crash when Cast to UStructProperty failed.

  • Crash Fix: Added AudioTrack::CreateNewSection() to fix crashes when adding an audio track through Python.

  • Crash Fix: Opening the static mesh editor while the socket manager has not been initialized no longer causes a crash.

  • Crash Fix: Fixed VR editor crash when spamming trigger press.

  • Bug Fix: Fixed a small memory leak in the CryptoKeys editor module.

  • Bug Fix: Fixed issues where "Use Mouse For Touch" was generating incorrect sets of event with incorrect positions. It is now a much better simulation of touch events.

  • Bug Fix: Fixed it so that Data Tables can be reimported from csv/json again if they were originally created in the editor.

  • Bug Fix: Updated tab key functionality in the output log's console box to not leave behind unwanted tab characters.

  • Bug Fix: When replacing an actor, we now make sure that its Owner and Instigator are correctly maintained.

  • Bug Fix: Added a fix for an issue where instanced EditInlineNew properties were being improperly linked after copying.

  • Bug Fix: Updated ResetToDefault widget to only mark properties as having a custom reset handler if one is passed in.

  • Bug Fix: A fix was added for a rare race condition in startup movies due to invalidating a texture while getting its size.

  • Bug Fix: The Static Mesh thumbnail will now always display LOD 0.

  • Bug Fix: Adding the same collision primitive more than once when importing them from an FBX is no longer allowed.

  • Bug Fix: Texture Editor: Fixed HSV controls to work correctly with HDR textures.

  • Bug Fix: Fixed an infinite loop that was caused when selecting an actor that has a component parented to the actor's parent.

  • Bug Fix: In the Details Panel for objects, the Collision Presets Object Type now immediately updates when toggling Simulate Physics.

  • Bug Fix: World Outliner: Search results now update properly after pressing ESC to clear search filter.

  • Bug Fix: Mask is now applied to fill color when filling LOD color data.

  • Bug Fix: Fixed issues with array handling in details panel when multiple actors are selected.

  • Bug Fix: Fixed new asset not being able to create objects if another window had focus.

  • Bug Fix: Disabled skeletal mesh sections are now restored when re-importing.

  • Bug Fix: Fixed an issue with 'Ambiguous search' warnings appearing that were unrelated to actual warnings or errors during cooking.

  • Bug Fix: Animation curves created within the editor can now be exported to an FBX.

  • Bug Fix: Fixed an issue with exporting to FBX with a skeletal mesh using cloth.

  • Bug Fix: Fixed a vertex painting migration issue with old skeletal mesh assets (from before 4.18).

  • Bug Fix: Details view is now properly refreshed when a locked actor is deleted.

  • Bug Fix: Fbx Importer: PostEditChange is now called on extra Static Meshes when importing without the combine flag. PostEditChange was previously called only on the first imported mesh.

  • Bug Fix: The Fbx importer now supports animation layers when computing the time span, the merge layer operation is done before the conversion.

  • Bug Fix: Targeted RHI ordering is now preserved when changing values.

  • Bug Fix: World Outliner: Fixed a bug causing deleted folders to reappear when a map is reopened.

  • Bug Fix: Skeletal Mesh LODs section data is now restored after when re-importing.

  • Bug Fix: Popup menus are now prevented from unexpectedly overlapping mouse position.

  • Bug Fix: Fixed an issue with visibility when Copy-Pasting actors from hidden layers.

  • Bug Fix: Fixed an issue with the naming of Materials generated by the Merge Actor tool to have a single 'M_' prefix.

  • Bug Fix: Fixed the material ID when auto-generating LODs from a mesh where the materials were re-ordered to the FBX order.

  • Bug Fix: Git Plugin: Fixed an issue where the directory was not being found using the git worktree.

  • Bug Fix: World Outliner: Fixed the Select All Descendants menu option to select all children rather than just the immediate children.

  • Bug Fix: The FBX re-import skeleton comparison now compares the incoming FBX skeleton bones with the bones used by the re-import asset. Before it was comparing the incoming with the full skeleton asset.

  • Bug Fix: Skeletal Mesh Editor: Fixed an issue where the Preview Asset was becoming detached when socket was renamed.

  • Bug Fix: Editor: Moved overridden public EditorViewportClient functions to public.

  • Bug Fix: Fixed an issue with connecting reroute nodes for enum types in Niagara graphs.

  • Bug Fix: Fixed DataTableRowHandle display name in Details panel when copy/pasting property.

  • Bug Fix: Fixed-size array properties will now copy/paste all array values.

  • Bug Fix: Level text in viewport will now correctly display names with trailing numbers.

  • Bug Fix: Fixed unit parsing bugs that would always choose first matching unit type instead of a complete match ("1.3cd" would match Celsius rather than Candela). White space between number and unit (like "10 cm") is also now correctly parsed.

  • Bug Fix: We no longer use the legacy localized fallback fonts in the font editor preview.

  • Bug Fix: The default vertex color is now white and not red.

  • Bug Fix: Fixed the FBX Static Mesh socket import to remove the extra conversion.

  • Bug Fix: Made a fix for Setting focus not working in Fast Path for WidgetComponents in world space. Also added a fix for a rare assert caused by widget components creating MID's in async tasks (alongside screen proxy creation) moved it out.

  • Bug Fix: Fixed an issue where editor utility widgets would stay in the windows menu after being closed.

  • Bug Fix: Fixed an issue with array builders used in details customizations not allowing copying/pasting of the property.

  • Bug Fix: Never hide the filter bar if there is a filter active.

  • Bug Fix: Feature level switching is now disabled when a lighting build is in progress.

  • Bug Fix: Fixed command line arguments passed through the project launcher not being escaped properly.

  • Bug Fix: Fixed Replace Selected Actors action when replacing Brushes. This now correctly rebuilds geometry instead of leaving a copy of the brush behind in the world.

  • Bug Fix: RHIs need frames in order to handle all their book-keeping - even when debugging a Blueprint - without this they will leak memory into their internal pools.

  • Bug Fix: The sub-level view now shows the correct locked state instead of random locked states.

  • Bug Fix: Changed the texture details panel to allow maximum texture size to go up to the maximum supported size of the selected texture type.

  • Bug Fix: Fixed the Message Bus Source timing out when connecting with a large number of characters. Resolved by correctly initializing ConnectionLastActive variable when the Message Bus Source receives a Client.

  • New: World Outliner: Added Duplicate Folder Hierarchy menu option and Edit menu/hotkey functionality for folders (Cut/Copy/Paste/Duplicate/Delete/Rename).

  • New: Added viewport setting to invert right mouse dolly.

  • New: Selecting multiple keys of the same time now displays the time instead of "multiple values".

  • New: Supplying factory to asset import task is now supported.

  • New: Added exportPreviewMesh in the animation category of the fbx export options dialog. This allows the user to control if the preview mesh should be exported with animations or not. It replaces a dialog that was showing before the fbx export options dialog.

  • New: The Global Open Asset Window (Alt+Shift+O) now has filter support.

  • New: DeviceManager: platforms can now specify a custom widget for the Device Info panel.

  • New: Added "Enable cook on the fly" option to cooker settings and launch menu.

  • New: Skipped the text highlighting search when there isn't any highlighted text in a Slate text block.

  • New: Updated USD SDK to v19.01.

  • New: A message prompt is now shown when packaging with an empty game default map.

  • New: The display of the current level now is a button that allows you to change between filtered levels. Also, the level of the currently selected actor is displayed above.

  • New: FBX importer: Added warning for when there are too many UV channels.

  • New: Added more precision in the editor for float fields.

  • New: Fbx exporter can now export skeletal mesh LODs.

  • New: FSkinWeightVertexBuffer::AllocateData and FSkeletalMeshRenderData::RequiresCPUSkinning are now exported to be used by other modules.

  • New: Dropping of non-placeable UObjects in the editor viewport is now prevented.

  • New: Camera preview viewports can now also preview the game world if you are currently simulating.

  • New: Skeletal reduction is now allowed on LOD 0.

  • New: Search filters can be cleared with the Escape button in the settings windows.

  • New: Scene outline synchronization now makes sure that the tree view selector is within the selection set.

  • New: FFilePath: Added metadata "RelativeToGameDir" to support relative path to project directory.

  • New: The Accessible Platform list no longer includes platforms which have no Configuration directory present.

  • New: Added import vertex color options to the Skeletal Mesh FBX importer.

  • New: Source Control: Added a "Diff Against Depot" context action to the Submit window.

  • New: Added the ability to customize an existing property on a class in a details panel without moving it from its location on the details panel. See IDetailLayoutBuilder::EditDefaultProperty.

  • New: Excluded abstract classes in the ClassPin of CreateWidget.

  • New: Added FAsyncTaskNotification as a non-blocking alternative to FSlowTask.

    • FAsyncTaskNotification allows you to create Slate notifications for asynchronous tasks without having to directly depend on Slate (you only need a dependency on Core), which is useful for code that wants to report progress but doesn't want to be directly concerned about UI details.

    • It does this using an extensible factory that allows Slate to register its own implementation when available; this also allows the notifications to be customized by anything that wants to implement IAsyncTaskNotificationImpl and register a factory with FAsyncTaskNotificationFactory.

    • Note: FAsyncTaskNotification must be created on the game thread, but may be passed to other threads after being created.

  • New: Added the bindable command AlignBrushVerticesToGrid.

  • New: Added the possibility to reduce static mesh LOD from any lower LOD instead of reducing from LOD 0 only.

  • New: Added functionality to Preview Scene Settings that allows the user to hide Environment Cubemap without disabling lighting, see bUseSkyLighting in the Preview Scene details panel.

  • New: Git Plugin: Added an option to create a README.md file at the time of the git repository creation.

  • New: Added control over the collection paths being included in the asset tooltips. Also added wrapping for cases where an asset is in many collections.

  • New: Hiding the material conflict dialog during scripted FBX import is now allowed.

  • New: Selecting a child actor component (at any level of nesting) will select the parent actor.

  • New: DockTabs now supports a suffix string; it takes precedence in layout when space is tight, currently used by asset editors to show the dirty asterisk.

  • New: Added Support Simplygon reduction API for MeshDescription.

  • New: The Device Output Log is no longer an experimental feature and is enabled by default.

  • New: Import and export FBX metadata on SkeletalMesh and Skeleton assets.

  • New: Allow toggling visibility of all selected layers through the Visibility (Eye) icon in the Layers panel.

  • New: Added level editor actions to select immediate children or all descendants of the current selection.

  • New: PrimaryAssetId properties in the editor now have a thumbnail representing the asset they reference in details panels, similar to a normal asset reference.

  • New: Viewport setting to scale the camera speed based on its view distance. This helps to adjust the camera speed when zooming in on small objects and zooming out of big objects.

  • New: Added an -OnlyUnversioned option to the ResavePackages commandlet which will resave any unversioned packages.

  • New: Added support for type A files in the IES importer.

  • New: Editor Perforce connections do not set the program name of "UE4" for the session.

  • New: Viewport setting to allow the camera to orbit around the current selection.

  • New: Fixed "Loading Visual Studio" popup not closing when a specific Visual Studio version is selected in the editor preferences window.

  • New: VisualStudioSourceCodeAccessor now uses the Visual Studio Setup API to query installed VS2017 and VS2019 versions.

  • New: Disable fallback in the font preview viewport in the font editor so that you can see the real set of glyphs that will be rendered.

  • New: Added better warning messages for when users try to rename rows with invalid names in the row editor. Updated the editable text layout to prevent it from calling OnTextCommitted delegates when the text has not been changed.

  • Improvement: Optimized vertex paint performance in editor.

  • Improvement: Curve editor now allows changing the time on multiple keys if they're on different curves.

  • Improvement: Optimized editor load times by reducing the frequency of status updates about package loading.

  • Improvement: Changed the asset viewer profile customization to have proper sub-categories for easier reading.

  • Improvement: USD sequence export has been simplified to query world state instead of attempting to inspect curves on tracks.

  • Improvement: The currently opened tab is now preserved when closing another one.

  • Improvement: Increased the maximum amount of favorited levels from 10 to 20.

  • Improvement: Autosave no longer saves map build data, which saves time and hard disk space.

  • Improvement: Improved the tree view representation of collection inclusion.

  • Improvement: USD integration updated to support multiple layers.

  • Improvement: Improved consistency between in-game and output log console inputs, and various other QoL improvements.

  • Improvement: Deleting an Editor Utility asset now closes the tab associated with it.

  • Improvement: Made editor utility edit/run behavior more consistent.

  • Removed: Removed duplicate vertex paint undo events.


  • Bug Fix: Particle emitter properties are now copied when Duplicate Emitter or Export Emitter is invoked.

  • Bug Fix: Fixed a number of DPI issues in Cascade.

Content Browser

  • Bug Fix: Toggling off the Gameplay Filter Tag no longer causes assets to be shown in the Content Browser.

  • Bug Fix: Fixed an issue with the recently opened filter triggering the modified filter.

  • Bug Fix: Fixed an issue with filters not applying when the Editor is opened.

  • Bug Fix: Drag and drop file import no longer blocks external file explorer for the duration of the import.

  • Bug Fix: Fixed an issue where the Content Browser cook path length estimation was not accounting for engine content and plugins properly, leading to overestimation of cook path length.

  • New: New content browser filter to show files that are not under source control.

  • New: Added an extension point for extra state indicator icons and tooltip on the top left corner of the Content Browser tiles.

  • See FContentBrowserModule::GetAllAssetViewExtraStateIconsGenerators and FContentBrowserModule::GetAllAssetViewExtraStateTooltipGenerators.

  • New: Asset Registry and Content Browser now also update on directory changes (in addition to file changes).

  • New: Advanced copy now updates references correctly for all Blueprint types. Levels are currently not supported.


  • Bug Fix: Invalidate lighting when removing instance in editor.

  • Fixed a case where "lighting needs to be rebuilt" would appear if you had instances and it would remove all of them and build the lighting again.

  • Bug Fix: Fixed memory display of "stat foliage" to correctly track memory usage.

  • Bug Fix: Fixed an issue where loading order of a lighting scenario would affect lightmap application on Instanced Static Mesh.

  • Bug Fix: Correctly reapply lightmaps in editor when a lighting scenario change occurs.

  • Bug Fix: Fixed ProceduralFoliageVolume Foliage Type removal not taken into account at next Resimulate.

  • Bug Fix: Fixed instancing not taking into account instances scale while calculating LODs.

  • Bug Fix: Fixed an issue that would occur with foliage; if the user performed undo/redo very fast, it would end up in a buggy state.

  • New: If "in-place" foliage updates are desired, KeepInstanceBufferCPUAccess should be set to true. This comes at the cost of memory, as we would otherwise only keep the instance data on the GPU side in most cases.


  • Bug Fix: Fixed a Page Allocator memory leak from custom data caused by a memory realloc, it was happening when using landscape with parallel init views.

  • Bug Fix: Fixed cases where it was possible to have your landscape become invisible if there were some errors in your landscape material.

  • Bug Fix: Cleanup nonrequired data for Adjacency information. Fixed a Memory leak where Adjacency index buffer would not be freed, when the owner was freed (Shared Buffer).

  • Bug Fix: Fixed a calculation error when importing a weightmap using the .r8 format.

  • New: Landscape Flatten Tool - terrace flatten mode added, allowing user to flatten landscape at specific intervals in world space.

  • New: All actors are now selectable in landscape mode, and their information will appear in the details panel.

  • New: Added support for keybindings for adjusting brush size, falloff, and strength while moving the mouse cursor while the key is pressed.

  • New: Improve the speed of Change Component Size tool.

  • New: When using World composition, if you go past the last LOD range, we will now always assume this one.

Material Editor

  • Bug Fix: Added a custom reset to default for refraction depth bias.

  • Bug Fix: Fixed missing conversions to/from texture object param, hiding convert to param on texture sample param.

  • Bug Fix: Fixed an issue with texture coord and property nodes not showing up in search.

  • Bug Fix: Fixed an issue with SetMaterialAttributes Input serialization by giving input pins names.

  • Bug Fix: Added a fix so that you can now undo the creation of comments.

  • New: Moved sort priority down in the material parameters panel.

  • New: Moved the node alignment tools to a more generic implementation and added menu options for them to the material editor.

  • New: Added some guards against nullptr and out of array bounds access when getting node titles.

  • New: Function inputs and outputs now rename correctly on duplication.

  • New: A fix was added for material functions' input types being labeled incorrectly.

  • New: Material graph nodes can now have duplicate names in all cases except when creating a new parameter from a constant.

  • New: Fixed an issue with post process materials not previewing correctly. Nodes no longer blink on parameter refresh.

  • New: Scalar/Vector parameters and subclasses with different behavior can no longer have name conflicts. Renaming parameters to an existing name in the same class will also change the value to the existing value.

  • New: Lightmass settings now display in the same override style as the rest of the material instance properties. Base properties are read from parent on load if they are not overwritten.

  • New: Show Modified Properties is now hidden and added custom Show Overridden Parameters in Material Instance editor. This works for all parameters and needs additional work for general properties (Physical Material, and so on).

  • Improvement: Cleaned up the thumbnail / preview properties.

Media Framework

  • Bug Fix: Changed "WhitelistTargets" to be an array instead of a string.

  • Bug Fix: Media capture is now stopped when PIE is started and we are using the current editor viewport. Since it's 2 different worlds, it caused conflict by not capturing the proper viewport.

  • Bug Fix: Added support for MediaBundle in timecode synchronizer.

  • Bug Fix: MediaCapturePanel: Fixed an issue with the camera output not working for actors in the PIE world.

  • Bug Fix: Fixed an issue with the Timecode synchronizer which never resolved with SDI input.

  • Bug Fix: Blackmagic: Fixed problem when closing and reopening a device too quickly causing a failure during opening.

  • Bug Fix: Blackmagic: Fixed input/output usage on Decklink 8k pro.

  • Bug Fix: Corrected the FPS for Dual Link. Fixed an issue where it would try to select the item from the next column even if the previous didn't match.

  • Bug Fix: MediaTexture now returns last rendered guid to avoid having material expressions using a guid that will get registered the next frame.

  • Bug Fix: Prevented a case where MediaTextureResource could use a sample of the future but not remove it from the queue.

  • Bug Fix: MediaCapture capture Slate in standalone and in packaged build.

  • New: Added the option to output in 3G level B if the video format is 3G level A.

  • New: Added support for Kona5 12G.

  • New: Changed the MediaProfile and TimecodeSynchronizer UI to remove the long name from the toolbar.

  • New: HDMI enabled device is now supported as an input source.

  • New: Added support for YUV as input.

  • New: Added a cropping option to media capture. Also added FileMediaOutput which allows for output through the requested buffer using the ImageWriter.

  • New: Added Blackmagic 10bits conversion GPU support.

  • New: We now support 10bit YUV for Aja.

  • New: Implemented WMF hardware accelerated video decoding support.

  • New: Added AJA psf support. This includes input and output.

  • New: Added Blackmagic YUV conversion output GPU support.

  • New: Added option to invert key output in media capture.

  • New: Added bDisplayWarningIfDropFrames as an option. Use the already existing flag from MediaOutput and copy it to the AJA output options.

  • New: Log the device version when we open a connection.

  • New: Added stats to MediaCapture as "STAT MEDIA".

  • Improvement: Improved media player & timecodesynchronizer toolbar UX. Separated the main button from the combo box.


  • Bug Fix: Fixed soft object properties not loading when accessed in Python, and fixed soft class properties not validating their meta-class correctly.

  • Bug Fix: Fixed the Python stub file missing code when running the editor with Python developer mode enabled.

  • Bug Fix: ExecuteConsoleCommand is now allowed to route to the engine as a fallback if there are no player controllers active.

  • Bug Fix: Custom collision channel names are now exposed to Python.

  • Bug Fix: Fixed GetNumLODs being exposed to Python as get_num_lo_ds rather than get_num_lods.

  • Bug Fix: Fixed type validation of objects within Python containers.

  • Bug Fix: Fixed Python commandlet -Script parameter failing to parse nested escaped quoted strings.

  • Bug Fix: Fixed a bug in the Blueprint debugger where duplicated watches could show up.

  • New: Exposed GetWorldSettings to scripting.

  • New: Exposed FPaths to Blueprints and Python through a wrapper library. Functions can be found under Utilities/Paths in Blueprints and unreal.Paths in Python.

  • New: Exposed PoseAssetFactory to Python and Blueprints.

  • New: Added Python negated unary prefix operator (-obj) which also enables adding ScriptOperator = "neg" as metadata to a scripting reflected UFUNCTION.

  • New: - Hoisted static math functions and constants from KismetMathLibrary onto related script classes as methods (Python) - added additional math functions to KismetMathLibrary and exposed them to scripting (BP, Python, and so on) - grouped related math functions in KismetMathLibrary (all FVector commands together, all FRotator commands together, and so on) - removed hand-written Python Unreal math routines and replaced with hoised versions using "ScriptMethod" meta data in KismetMathLibrary.

  • New: Added an automatic material layouting function in UMaterialEditingLibrary to place the material expressions in a grid pattern.

  • New: Added a ScriptMethod tag to EditorSkeletalMeshLibrary::RegenerateLOD to allow it to be called directly on a SkeletalMesh object in Python.

  • New: Python find_object, load_object, find_asset, and load_asset functions will now automatically follow redirectors unless the 'follow_redirectors' parameter is set to False.

  • New: Exposed ULevelStreaming::GetLoadedLevel to scripting.

  • New: Exposed UEditorLevelUtils::SetLevelVisibility to scripting.

  • New: Added Python support on Mac.

  • Improvement: Data table improvements: Added a search for references on both the row handle as well as the row in the data table editor.


  • Bug Fix: Disabled the +Track and +Section buttons when the sequence is read only, rather than hiding them completely. Also, this allows the camera button to be visible and toggled for a read only sequence.

  • Bug Fix: We now get relative transform when caching data for converting possessable to spawnable.

  • Bug Fix: Moved section to paste destination rather than setting start/end frames individually.

  • Bug Fix: Step to next/prev key no longer uses ExclusiveEndFrame. This fixes cases where you want to step to the last key of a section and add another animation clip that doesn't overlap.

  • Bug Fix: Fixed an issue where CineCameraComponent settings would always revert to defaults.

  • Bug Fix: Pasting a track now clears flags on subobjects.

  • Bug Fix: Custom float channel serialize.

  • Bug Fix: The Render Movie Handle Frames feature no longer generates the incorrect number of frames under certain conditions.

  • Bug Fix: Autoscroll now works properly when in a subsequence.

  • Bug Fix: Fix for Debug exception due to TArray::Reserve(-1).

  • Bug Fix: Fixed an issue if the object being baked is attached through the map (and not through a track).

  • Bug Fix: When rendering shots with handle frames, only shots that are initially active will be rendered.

  • Bug Fix: Disabled the context menu when in read only.

  • Bug Fix: Removed restrictions on perspective viewports when updating camera cuts.

  • Bug Fix: Clear locked cameras for transform track if the viewport allows cinematic control. Fixes an issue where you are looking through a camera and start recording through Take Recorder, and the camera pops out of the viewport.

  • Bug Fix: Editing disallowed if level edits only is set.

  • Bug Fix: Forcing animation playback to be Custom when playing back Sequencer Animation Assets even if the character is trying to force itself back to BP.

  • Bug Fix: Fixed evaluating subsequences in isolation that were using the wrong time.

  • Bug Fix: Fixed some cases where the director class could become detached from its Blueprint.

  • Bug Fix: Master event tracks no longer have an object pin by default. Level Blueprints are now only accessible through interfaces.

  • Bug Fix: Fixed an issue where child possessable bindings would not be invalidated when their parent was invalidated.

  • New: A callback can be provided when invoking a Movie Render via Python. This callback will notify you when the Movie Render finishes so that you know you can invoke another one. To use this feature, provide an FOnRenderMovieStopped callback when calling the RenderMovie function. See \Engine\Plugins\MovieScene\SequencerScripting\Content\Python\sequencer_examples.py for more information.

  • New: Exposed Set/GetNumChannelsUsed for MovieSceneVectorTrack.

  • New: Sequencer's Track Color picker now uses the standard color picker dialog.

  • New: Added more Python extensions - set parent, set property name and path, set start/end frame bounded.

  • New: Exposed metadata from level sequence.

  • New: Added active shot to snapshot along with Slate and TakeNumber.

  • New: Added additional marked frame functionality.

    • Marks now have a label and color.

    • Movie scene sequence player can play from a named mark.

    • Sequencer scripting supports adding/removing/editing marked frames.

  • New: Added function to get the active camera cut camera. We also now allow camera cut evaluation, but disable binding to the player when CanUpdateCameraCut is false.

  • New: Extended UMovieSceneSequence::Stop to accept the time to reset the cursor to.

    • This ensures that at the point we trigger explicit network Stop events, the time cursor will not change unless the user has explicitly done so, which resolves an issue where a passive net update with a slightly different time can come in after the explicit stop RPC event has been handled by a client.

    • It also means we are no longer resetting the time twice when stopping.

  • New: Exposed GetSound/SetSound and GetStartOffset/SetStartOffset on MovieScene Audio Sections for manipulation from Python.

  • New: Added the option to show vertical frames/bounds per track.

  • New: Made FMovieSceneSectionParameters BlueprintReadWrite so they can be manipulated directly from Python without editor_get_property.

  • New: Take Recorder: We now autotrack actors that aren't being recorded in the world source.

  • New: Added GetReferencedBindings() to MovieSceneSection to get guides that the section references.

  • New: Added MovieSceneTrack and MovieSceneSection as BlueprintType.

  • New: Added playback and section range setters and getters.

  • New: Enabled autoscroll for playing state.

  • New: Added an ability to export generic/master float tracks (such as live link tracks).

  • New: Added start offset to media section/track.

  • New: MovieSceneSequence has been set as BlueprintType so that it's accessible in Blueprints.

  • New: Propagated setting display rate and locking state to child sequences.

  • New: Changed StartOffset to FFrameNumber for Audio, Skeletal, GeometryCache sections.

  • New: Changed SlipSection from double to FFrameNumber.

  • New: Added SupportsType to MovieSceneTrack to indicate whether a particular MovieSceneSection class is compatible.

  • New: Added the ability to copy/paste sections.

  • New: Added transactions for renaming track nodes.

  • New: Added a new track type for swapping materials on primitive components.

  • New: Added new property track for any base UObject property type. Includes weak and soft object pointers.

  • New: Level sequences that exist in instanced levels will not resolve possessable bindings within that same level correctly.

  • Improvement: Changed Template::SourceSection to a weak pointer.

  • Improvement: Optimized camera cut thumbnail rendering by removing reliance on level viewport client.

Static Mesh Editor

  • Bug Fix: Preview socket mesh scales correctly when Editor is reopened.

  • Bug Fix: LOD radio button now updates the static mesh editor viewport.

  • New: Added support for reducing static mesh LODs by vertex percentage. There is now a dropdown to pick between triangle percentage or vertex percentage.

  • VR-Editor

  • Bug Fix: Integrated VR editing modification to Dev-Enterprise.

  • New: Added actor 'carrying' to VR Editor. Certain actors (cameras) are now "carried" by default with a one-hand drag in VR Editor.

    • This allows the objects to be freely rotated and translated, without having to grab them with two hands, and without scaling them accidentally.

    • This is useful for cameras or other objects that need to be "aimed" interactively.

    • This can be turned off with "VI.AllowCarryingCertainObjects 0".

  • New: Added extra parameter to allow custom UI size in VR editor.

  • New: Adds preview camera that is shared across multi-user VR

  • New: Rework VR Interactor

World Browser

  • New: In Levels tab, use the New Level Dialogs when creating a new level.

Editor and Tools

  • Crashfix: Fixed crash when duplicating a UMG animation but not renaming it.

  • Bugfix: UMG: Fixed deletion of rotation/angle track.

  • Bugfix: Fixed TC_HDR_Compressed texture visualization.

  • Bugfix: Fixed issue where foliage meshes were not being moved or deleted when with the geometry they are placed on is moved or deleted.

  • Bugfix: Fixed bug where UMG animation could not be renamed from [Name]_1 to [Name].

  • Bugfix: Fixed crash when renaming a duplicated UMG Animation.

  • Bugfix: UMG: Fix replace crash when source binding doesn't exist - add the source binding.

  • Bugfix: Movie Scene Capture: Removed unused codec.

  • New: Added option to Editor Settings to opt out from sending unattended crash reports / bugs / ensures.


  • Crashfix: Fixed crash when converting matinee assets to sequences due to changes in events. Event keys will now have Blueprint event endpoints created in the level sequence Blueprint when converting.

  • Crashfix: Refresh sequencer on map changed. This fixes a crash bug when unloading a map with actors attached to sublevels.

  • Crashfix: Fixed an issue with rare crash during sequencer playback when changing levels.

  • Bugfix: Force refreshed the Details Panel when sequencer is opened so that the keyframe buttons appear.

  • Bugfix: Fixed skeletal mesh getting ticked twice when the animation Blueprint is set.

  • Bugfix: Fixed copy/pasting UMovieSceneTrack so that master tracks are only pasted to the root.

  • Bugfix: Added RF_Transactional to PrimitiveMaterialTrack::CreateNewSection and ObjectPropertyTrack::CreateNewSection.

  • Bugfix: Fixed issue where sequencer would not reset if simulating client viewport after a sequence stopped playing.

  • Bugfix: When auto set track defaults is off, make sure a key is always added when adding a track so that the value is saved.

  • Bugfix: Handled legacy conversions where DisplayRate is 0.

  • Bugfix: Fixed selection in/out undo.

  • Bugfix: Disabled can collapse to track for multi channel tracks.

  • Bugfix: Check for property type in evaluation. This fixes an issue where the property type is changed after the track has been created.

  • Bugfix: Forced refresh when sequencer is opened so that keyframe buttons appear.

  • Bugfix: Fixed issue where highlighting multiple keys would not select all keys for editing.

  • Bugfix: Restored drawing paths for selected nodes and channels.

  • Bugfix: All sounds stop on tear down.

  • Bugfix: Fixed fbx transform import so that if there are no keys in the fbx channel, the existing destination channel is not cleared.

  • Bugfix: Fixed media timing - seek to media time before blocking.

  • Bugfix: Fixed components for spawnables so that they also display in gray when despawned.

  • Bugfix: Gets animation skeleton from CDO if the actor hasn't been spawned.

  • Bugfix: Fixed animations continuing to play - make sure montage play state is set to sequencer play state.

  • Bugfix: Fixed key reduction not working on imported fbx channel. Implement channel Optimize() so that it follows the curve editor's SimplifySelection by evaluating whether a key is needed (rather than removing the key and checking whether the value has changed). The main fix is that the tangents need to be calculated as non-normalized (such as with the DisplayRate).

  • Bugfix: Inserting a section into a particular row moves existing sections down by one row.

  • Bugfix: Sequencer now accounts for frame rate when copying key tangents when converting from matinee to level sequence.

  • Bugfix: Pasting a spawnable doesn't set up defaults, since tracks will be included in the copy.

  • Bugfix: Fixed issue where vector 4 parameters could not have their fourth value edited in the sequencer UI.

  • Bugfix: Converting bound objects in sequencer preserves sorting order and folder hierarchy.

  • Bugfix: Closed Set Asset menu and rename MPC track when changing assets.

  • Bugfix: In PostEditImport, reconstruct sections that have variable channel proxies based on property data. This fixes an issue where pasting a track/sections doesn't result in valid channel proxies.

  • Bugfix: Defer construction for CreateLevelSequencePlayer() so that BeginPlay is called for autoplay. There used to be an explicit call to autoplay, but this is now all handled in BeginPlay().

  • Bugfix: Fixed switching takes so that the swapped in shot is swapped onto the original shot's track.

  • Bugfix: Calling GetMovieScene() now checks for Sequence validity.

  • Bugfix: Fixed field of view not getting imported through fbx.

  • Bugfix: Added a binding so that default tracks are added. For example, if you add a camera cut for a camera that is not yet in Sequencer, default tracks should be added for that camera.

  • Bugfix: Reset loop count on stop so that it doesn't persist to the next call to play.

  • Bugfix: Skip updating camera cuts if camera to set is null and the last active camera and the current active camera is the same.

  • Bugfix: Float channels are now natively serialized, which dramatically reduces load/save times.

  • Bugfix: Fixed handle frame issues when exporting XML during movie rendering.

  • Bug Fix: Linear keys in Sequencer now blend correctly with surrounding cubic keys.

  • New: Moved autoplay to playback settings so that CreateLevelSequencePlayer can be set in autoplay mode.

  • New: Autoscrub to the desired time when holding down shift and clicking in the sequencer timeline. Autoscrub is also enabled when stepping to the next/previous mark.

  • New: You can copy object bindings and tracks together.

  • New: FBX Export now exports selected objects if there are tracks selected (not just when there are object bindings selected).

  • New: Inverted row index for XML import/export. This should fix issues with overlapping shots having the wrong priority.

  • New: Added error checking for invalid labels with spaces.

  • New: Added transaction to track renaming.

  • New: Use automated level sequence to capture UI name when exporting from shot track so that user config is loaded

  • New: Added MovieExtension config to allow the extension of the shot names to be changed from the default .avi.

  • New: Sequencer Scripting: Added setters for playback range, frame rate, and tick resolution.

  • New: Allow setting/scrubbing the playback range beyond the view range. When out of range, also extend the view range by 10 percent.

  • New: Actor Sequence: Move actor sequence editor to actor sequence plugin.

  • New: Added support for converting material tracks from matinee to sequencer.

  • New: Adding support to create subclasses of ACameraActor with the Create Camera Here viewport action.

  • New: Added support for UCineCameraComponent to set Focal length from FOV when calling SetFieldOfView.

  • Improvement: Better error reporting for pasting tracks.

  • New: Add toast when the tick resolution of the subsequence doesn't match the parent.

  • New: Exposed GetAnimSectionsAtTime.

  • New: You can now import/export focus distance.

  • New: More descriptive comments for PlayToFrame, JumpToFrame and ScrubToFrame.

  • New: Undo/redo support for label browser.

  • New: Added support for filtering child labels from the parent.

  • Improvement: Removed restriction on hidden mobility. It's too wide to restrict transform tracks.

  • Improvement: Sequencer EDL: Moved export inactive shots to before InitializeShots (which can mutate active states)

  • Improvement: Import fbx now always tries to match by name first. Otherwise, if the binding isn't found and not matching by name, default to first and output a warning.

  • Improvement: Used cached object bindings when drawing motion trails. FindObjectId can be slow because it clears the cached bindings. Added FindCachedObjectId which retrieves the binding without clearing the cache.

  • Removed: Child labels are removed.

  • Removed: Removed "Keep Playback Range in Section Bounds" from level sequencer UI.

Gameplay Framework

  • Crash Fix: Fixed a crash when compiling Blueprints subclassed from AWorldSettings.

  • Crash Fix: Fixed a crash recompiling Blueprints that have multiple child actor components with the same child actor class.

  • Crash Fix: Fixed a crash with WebMMovieStreamer where it was missing a string parameter in the log line.

  • Crash Fix: Fixed a crash when trying to add an existing .ini file that doesn't have restricted tags as a restricted tag source.

  • Crash Fix: Fixed crashes in ToggleDebugCamera if actors were destroyed while selected.

  • Bug Fix: Fixed a crash that could occur on dedicated servers when using the SetControllerLightColor or ResetControllerLightColor functions of APlayerController.

  • Bug Fix: Fixed replication errors with DetachFromComponent, which involves the server setting AttachParent to null, by adding explicit replication of whether the component should be attached or not.

  • Bug Fix: AttachmentReplication.AttachComponent is now cleared out with AttachmentReplication.AttachParent to make sure that it stays in sync on the server and client.

  • Bug Fix: Re-registering an object in the Significance Manager now triggers an ensure instead of a check.

  • Bug Fix: Fixed an issue that caused stalling when cleaning up tick groups.

  • Bug Fix: Dynamic streaming levels set to be initially loaded, but not visible, now load properly.

  • Bug Fix: Fixed a discrepancy in SpringArmComponent location lag when substepping is enabled.

  • Bug Fix: Blocking removals of a streaming level will no longer fail if there is already a pending visibility level being processed.

  • Bug Fix: Objects created via duplication in PIE now correctly execute their construction scripts.

  • Bug Fix: Fixed an attachment issue for actors using a replicated root component where they could sometimes get invalid offset values on clients.

  • Bug Fix: Fixed an issue where the position of a replicated StaticMeshActor with bRepMovement set to false would be moved to the default location on clients after being detached.

  • Bug Fix: The World Settings object can no longer be destroyed by Blueprint scripts run in the Editor world.

  • Bug Fix: Fixed the debug string displayed for NoTagMatch inside gameplay tag queries.

  • Bug Fix: Composite data tables now rebuild in Loading instead of PostLoad. This fixes bugs where things that depended on data tables were sometimes trying to use composite tables that weren't ready in their PostLoad.

  • Bug Fix: When ending play, the RF_Standalone flags will no longer clear before level streaming has been flushed (with TeardownPlaySession).

  • Bug Fix: Fixed a bug that caused scope locks in data tables to have inaccurate counts.

  • Bug Fix: Added a missing scope lock in the ability system component.

  • Bug Fix: Fixed GetDisplayName (in FKey) returning an improper value when using a Blueprint setter node for an FKey variable without modifying the input pin.

  • Bug Fix: Created player controllers are now destroyed if initializing a new player fails during login.

  • Bug Fix: Rotated skeletal mesh component with non-uniform scales no longer get extremely large bounding boxes assigned to them.

  • Bug Fix: Added tunable control over the time sub-step used in Character movement velocity braking, rather than using a hard-coded value.

  • Bug Fix: In UCharacterMovementComponent, CalcVelocity no longer enforces player acceleration limit on the result of ApplyRequestedMove acceleration.

  • Bug Fix: Fixed cached rotator/quaternion conversion getting out of sync in rare cases where FScopedPreventAttachedComponentMove was used and the component rotation changed within the scope. This could happen for simulated characters running RootMotion.

  • Bug Fix: OnDataTableChanged or OnCurveTableChanged callbacks are now called when tables are reimported from .csv files.

  • Bug Fix: CharacterMovementComponent no longer delays sending saved character moves that set bForceNoCombine, since those are generally important to send immediately to avoid latency and misprediction.

  • Bug Fix: Fixed Controller.GetOnNewPawnNotifier to return a reference to Controller.OnNewPawn, instead of a copy of it.

  • Bug Fix: Controller.OnNewPawn is now properly broadcast when PlayerController is switching possessed pawns.

  • Bug Fix: The FMath function, Fmod, now returns the same value with or without optimization when using a constant modulus.

  • Bug Fix: Fixed conversions from FRotator to FQuat returning NaN when the input range is very high.

  • Bug Fix: Fixed a focus issue that prevented the Blueprint function override menu from being filterable.

  • New: AIController's OnPossess and OnUnPossess Blueprint implementable events are now available for all Controllers.

  • New: ForceFeedback effects can now be flagged to play while the game is paused.

  • New: Improved GameplayTag load times and error reporting, and added warnings about invalid tags.

  • New: Where possible, controllers will no longer have their force feedback values updated per frame if the value has not changed. This allows other plugins to manage force feedback intensity.

  • New: Publicly exposed ReferenceViewer graph schema in the AssetManagerEditor module.

  • New: Added GetAllActorsFromTargetData function to get all Actors in TargetData without having to specify an index. Blueprints can use this function in order to avoid needing a macro or loops.

  • New: Splitscreen now includes support for 3 or 4 player horizontal splits.

  • New: Added Add/Remove to the "Gameplay Tags > More Actions" menu for adding and removing exact tags without affecting child tags.

  • New: Added the "Open Source Latent" Blueprint function to Media Player.

  • New: Added CustomPrimaryAssetRules to the AssetManagerSettings. This allows applying rules to subsets of assets easily. The base implementation covers directories, as well as a game-specific filter string. Several related changes were made to asset manager rule scanning.

  • New: An actor instance or Blueprint can now be marked as not being relevant to level bounds.

  • New: UWindDirectionalSourceComponent can now be fully utilized or extended in external modules.

  • New: RowUpdate hotfixes can now add entries that do not use existing keys to rows for curve tables.

  • New: Boolean values in data tables can now be hotfixed.

  • New: ULevelStreaming now supports a priority setting that dictates which level is considered first when determining what to load, unload, or make visible or invisible. A higher priority streaming level is not guaranteed to be loaded before a lower priority one and will not preempt any operation that is in progress, but will be prioritized over others at the next opportunity to choose which streaming level to consider operating on.

  • New: Exposed GetDisableSplitscreenOverride on UGameViewportClient.

  • New: Multiple movie streamer plugins can now register themselves with DefaultGameMoviePlayer, which will pick the right one for startup movie playback based on file format.

  • New: Added HandleWalkingOffLedge to UCharacterMovementComponent. This wraps calls to the character's BP native event, making it easier to override.

  • New: Added HasAnyRootMotion to ACharacter and exposed it to Blueprints.

  • New: Changed display name of IsPlayingRootMotion to "Is Playing Anim Root Motion".

  • New: Added UCharacterMovementComponent support for separate max speeds for input acceleration versus requested speed in the ApplyRequestedMove function. Input can now obey one limit while the custom acceleration/speeds can be applied separately at a different limit.

  • New: Added new constructor for FScopedConditionalWorldSwitcher that enables explicitly swapping the global world state when ticking/handling events while Playing In Editor.

  • New: SetTimerForNextTick now returns the handle of the timer it creates so that you can cancel it.

  • New: FIndexedCurve now has a Duplicate function to allocate a copy of the curve using a pointer to the base class.

  • Improvement: Additional logging was put in to help track down problems when debugging player controllers.

  • Improvement: Improved Blueprint access to vector variables inside GameplayCueParameters structures.

  • Improvement: Improved header comments for Actor, ActorComponent, SceneComponent, PrimitiveComponent, and EngineTypes. We removed some old deprecated fields as well.

  • Improvement: Changed Engine default of tick.AllowAsyncTickCleanup to false. This costs about 200ns / tick on a phone, but prevents really big stalls in the case where level collections cause multiple ticks per frame.

  • Deprecated: Deprecated ConvertTransformToRelative() and replaced it with MakeRelativeTransform().

  • Deprecated: Introduced a new signature version of InputKey on ViewportClients. GameViewportClient overrides the old one as final, so GameViewportClient subclasses will need to upgrade, and it's marked deprecated there.

  • Removed: Removed the experimental StructBox plugin.


  • Bug Fix: Reworked String Table asset loading to better handle asynchronous loading:

    • Note: This change removes the need to fully-load string tables most of the time, and the FindOrFullyLoad option is no longer the default (FindOrLoad is). FindOrFullyLoad can still be specified, but be aware that it will do a blocking synchronous load, so only use it when it is definitely safe to perform a blocking load (ie, only in the editor).

  • Bug Fix: Avoid gathering default text instances from bytecode.

  • Bug Fix: Ensured the package localization ID is correctly migrated when renaming an asset.

  • New: Made string table dropdown searchable when selecting localization string.

  • New: Renamed the "Localise" UAT command to "Localize" (with an alias for the old name).

  • New: Exposed functions to query the available and most suitable languages from Blueprints:

    • GetNativeCulture, wraps FTextLocalizationManager::GetNativeCultureName.

    • GetLocalizedCultures, wraps FTextLocalizationManager::GetLocalizedCultureNames.

    • GetSuitableCulture, uses FInternationalization::GetPrioritizedCultureNames to find the best match from an array of cultures.

  • New: JsonStructSerializerBackend and CborStructSerializerBackend now have an option to write FText properties as their complex exported form (for example, NSLOCTEXT(...)) to correctly support localization.

    • This option is disabled by default for the existing constructor (which is now deprecated), however should be enabled for any new code that doesn't require backwards compatibility.

  • New: Made FTextChronoFormatter and FTextTransformer available to do localized string manipulation without an FText instance.

  • New: Allowed polyglot data to fallback to the LocRes data if it only provides a minimal patch:

  • This can be enabled by setting bIsMinimalPatch to true (default false) on your FPolyglotTextData to avoid the polyglot data from falling back to its native string for any missing translations, thus allowing missing translations to use their LocRes version instead.

  • New: Exposed GetCultureDisplayName to Blueprints.

  • Improvement: Translation Picker improvements:

    • Fixed the wrong culture being used when editing translations.

    • Fixed being unable to edit translations that contained package localization IDs.

    • Fixed crash when the UTranslationUnit being picked was GC'd.

    • Fixed places performing case-insensitive comparisons.

    • Improved the layout and made all fields copyable.


  • Crash Fix: Fixed a crash in OnlineBeaconClient when a socket error occurs during the initial connection handshake.

  • Crash Fix: BasicReplicationGraph no longer causes a shutdown crash when replicating actors with bOnlyRelevantToOwner set to true.

  • Bug Fix: Increased the max bunch header size from 64 bits to 256 bits to handle cases where a high channel index could cause the old limit to be exceeded.

  • Bug Fix: Fixed MessageBus unicast endpoint settings where specifying a network interface other than the default one would prevent receiving multicast traffic on some platforms.

  • Bug Fix: Fixed an issue where the net mode of an actor could be incorrect during the shutdown of a Play In Editor world.

  • Bug Fix: Prevented GetAddressInfo queries on HTML5 from failing when querying address information using the OnlyUsableAddresses operation flag.

  • Bug Fix: Properties that are updated while not Active or while they don't meet Replication Conditions will now be sent to clients when they become Active again, or when their conditions are met.

  • Bug Fix: Role and RemoteRole now stay in sync on Server and Clients when changing Possession.

  • Bug Fix: Fixed Android GetLocalHostAddr from stomping on address information when determining the best address. Additionally, invalid query flags can no longer be added to requests when using non-default GetAddressInfo flags.

  • Bug Fix: Fixed socket multicast membership functionality failing on iOS devices.

  • Bug Fix: FObjectReplicator's UpdateUnmappedObjects function now calls CallRepNotifies after PostNetReceived to be consistent with the order in ProcessBunch.

  • Bug Fix: PostRepNotifies is now called from all code paths that issue rep-notifies.

  • Bug Fix: Cleared out ObjectReplicator instances without active objects from actor channels to prevent memory growth and performance degradation. This is done for channels still receiving data.

  • Bug Fix: Added a check to prevent the destruction of replicated level script actors when the associated actor channel is closed on a client.

  • Bug Fix: Fixed the handling of custom data channel definitions when set to open from server or client.

  • Bug Fix: Fixed GetAddressInfo queries failing on PS4 due to invalid address storage sizes.

  • Bug Fix: Fixed a crash that could occur when using the replication graph's "fast shared" functionality.

  • Bug Fix: Fixed an issue where some elements of a previous struct value passed to a repnotify function would be incorrect.

  • Bug Fix: Fixed address storage issues when using the messagebus module functionality on a strictly IPv6 platform.

  • Bug Fix: Steam authentication messages no longer underflow the serialization buffer when requesting resends.

  • Bug Fix: WritePackedVector no longer causes unexpected values to be written if any of the source values were very large.

  • Bug Fix: Socket Multicast TTL and Loopback functionality now perform the right socket operations based off the socket's construction data.

  • Bug Fix: Fixed Reliable multicast dropping for Actors that are still alive on the server, but not currently relevant.

  • Bug Fix: Stale actor pointers will no longer be left in the replication graph after seamless travel.

  • Bug Fix: Fixed default scale when serializing new actors.

  • Bug Fix: Attached Actors are now properly updated on clients when moved on the server.

  • Bugfix: Fixed a rare case where in an IPv6 environment, storing an IPv4 address would be improperly handled due to a missing bit operation.

  • Bugfix: Fixed replication for TSoftObjectPtr/Soft Object Reference properties (and class versions), they will now replicate properly if the referenced object is not in memory

  • Bugfix: Increased the max bunch header size to 256 bits from 64 bits to handle cases where a high channel index could cause the old limit to be exceeded.

  • Bugfix: Bunches created in ReplicateActorListsForConnection_FastShared (in UReplicationGraph) now set their channel type correctly.

  • Bugfix: Fixed internal data issues with tracking Steam network communications between players when projects made use of multiple online beacons.

  • New: Steam network connections can now specify an cleanup timeout value in their engine configs (P2PCleanupTimeout in the [OnlineSubsystemSteam] section). This creates a window between a disconnection and when the connection data gets fully cleaned up to protect against lingering messages attempting to reopen the connection. By default, this value is 1.5 seconds. If set to 0, all disconnected connections will be cleaned up immediately.

  • New: Added a new configuration flag for disabling SteamNetworking from being the default socket subsystem when using the Steam OSS. This enables projects to use alternative netdrivers (like the IpNetDriver) and network subsystems instead of Steam. To do this, set bUseSteamNetworking to false in the platform's engine configuration.

  • New: PacketHandlers can now be configured on a per NetDriver basis, enabling targeted application of packet handler functionality. To use this feature, update the platform Engine configuration files to target the desired NetDriver like this:

    • [ExampleNetDriverName PacketHandlerProfileConfig]

    • +Components=ExamplePacketHandlerModuleInterface

  • Where ExampleNetDriverName can be any valid NetDriver name (for example, GameNetDriver). When a profile exists for a NetDriver, that NetDriver will ONLY load the components listed for that profile. The order of the PacketHandler components still matters, so make sure it is the same for all platforms. If a NetDriver does not have a profile configuration, it will fall back to loading the components as listed by the PacketHandlerComponents section in your configuration files.

  • New: IP address network serialization now supports additional network protocols.

  • New: Added a network driver definition name for online beacons to use rather than always using the game net driver.

  • New: Network sockets now keep track of the protocol information that was used to create it during construction.

  • New: The NetworkProfiler has been updated to support and display all supported address types, regardless of protocol. This allows for full support for SteamNet, IPv6/IPv4 Address, Oculus IDs, etc. Older profiles will still be readable by the tool interface.

  • New: The ReplicationGraph DebugActor can now be overridden.

  • New: Modified online beacon connections from a dedicated server to use the server unique network identifier.

  • New: Added an optional multihome parameter when initializing a hosting IpNetDriver to indicate a specific bind address.

  • New: Added a call to allow network drivers to modify the default behavior of destroying an actor when a channel is closed.

  • New: Made changes to better support multiple active network drivers running in a world context.

  • New: Replication Graph: Dynamic Spatial Frequency Node. -This node recalculates replication frequency per connection, based on the connections view angle and position. -This node is different in that it replicates actors directly in place, rather than returning a replication list for the generic prioritization/replication functions. -Actors replicated by this node use their own bandwidth limits. -Supports normal replication and fast/shared replication.

  • New: Added a new ping calculation method which only uses the fastest packets received over a given time period. This allows us to use the packets which were processed by the server and client more quickly after reaching them which produces more accurate calculations. This is currently experimental and not being actively used.

  • New: Added some missing tick categories on servers for CSV profiles.

  • New: Changed an ensure in the Fast TArray Serializer and an ensure in the Ability System Component to warnings because they are rare and not critical issues.

  • New: When simulating packet loss using the Pktloss setting, PktLossMinSize and PktLossMaxSize have been added to also be able to set the minimum and maximum packet sizes to drop

  • New: The net driver and net connections now track how many RPCs and packs have been sent

  • Improvement: Optimized SerializeIntPacked in FBitReader and FBitWriter.

  • Improvement: Networking related types (UNetConnection, UNetDriver, UPackageMap, and supporting structs, etc.) have better reporting in Obj List.

  • Improvement: Reduced number of cache misses when processing received acknowledgements in NetConnection by tracking written channels per packet and using this information to only touch relevant channels.

  • Improvement: Overrode SerializeIntPacked in FBitReader and FBitWriter. This is a minor performance optimization.


  • Crashfix: Fixed a crash that could occur during replay playback when streaming in sub levels.

  • Crashfix: Fixed a crash in replay checkpoint recording if the streamer destroyed the checkpoint archive during a flush.

  • Bugfix: Added missing function implementation to the replay net connection.

  • Bugfix: Fixed rep notify functions not being called for dormant actors in replays when queued bunches are disabled.

  • Bugfix: Fixed a crash that could occur while recording a replay on a client.

  • Bugfix: Fixed a replay bug where previously destroyed Net Startup Actors in sublevels may be respawned multiple times.

  • Bugfix: Properly timeslice actor prioritization for replays, and send destruction info first. This fixes "well of despair" issues that can arise from having too many replicated replay actors.

  • Bugfix: Fixed issue with net field exports in replays not being marked acknowledged immediately, causing them to replicate multiple times.

  • Bugfix: Fixed a crash in the replication graph during seamless travel due to world settings not being cleaned up.

  • New: Added additional replay error codes and logging for playback failures.

  • New: Removed unused cpp type data from serialized net field exports in replays.


  • Crash Fix: Fixed a crash in the XMPP library libstrophe on client disconnection, when there were multiple clients.

  • Crash Fix: Fixed crashes in the PushSample function in FVoiceDelayBuffer when FVoiceCaptureWindows is initialized with an empty device name.

  • Crash Fix: Steam Dedicated Servers no longer crash on LAN due to invalid account information. Servers now send out the correct Steam LAN account identifier.

  • Crash Fix: Trying to matchmake as a Steam Dedicated Server no longer causes a crash.

  • Bugfix: Changed Steam server matchmaking data filters such that pushing server information doesn't overflow the buffers by default, printing out erroneous warning messages.

  • Bug Fix: Warnings about Steam being disabled no longer appear in Editor mode.

  • Bug Fix: Steam matchmaking queries will no longer stall out when attempting to search for new lobbies while the player is already in a lobby.

  • New: Added the "-SteamServerName" command-line option to enable developers or server hosting providers to set Steam dedicated server names/titles of up to 63 characters at application launch. The name will appear on the external server browser UI (and in some cases, in game). This also fixes an issue where servers running on a headless Steam instance (not logged into an account) would show up in server browsers as the dedicated server's numeric ID.

    • Example usage: -SteamServerName="My Test Server"

  • Bug Fix: Fixed a bug with Google REST login where OAUTH scopes were reset during logout, but the default scope was not being retained.

  • Bug Fix: Added detection for several error cases when sending a friend request. These are enumerated in ESendFriendInviteFailureReason.

  • New: Some error responses inside FOnlineError may have changed as we are working toward a more common expression of errors. Please review any error constants that your code compares against directly, and change them to use the new error-checking functionality in FOnlineError where appropriate.

  • New: Added support for disabling Facebook analytics on iOS. IOSRuntimeSettings now has two new variables for controlling Facebook analytics, bEnableAutomaticLogging and bEnableAdvertisingId. Refer to the Facebook documentation on their webpage for details.

  • New: Facebook SDK has been upgraded to 4.38.1 for iOS and 4.39 for Android. Some modules that are not required for login functionality are disabled by default.

  • New: Added file streaming uploads to the HTTP module.

  • New: Updated OpenSSL to version 1.1.1 on Windows platforms.

  • New: Updated included WebRTC library on Windows Platforms to WebRTC release 70.

  • New: Added the VivoxVoiceChat plugin.

  • Deprecated: Google+ scope used for Google login has been updated to use the basic userinfo scope.

  • Removed: Removed usage of libjingle as an XMPP provider on Windows targets, in favour of the libstrophe XMPP provider.

Online Subsystem

  • Bug Fix: PS4 User presence is filled out correctly now in all cases.

  • Bug Fix: The IsChatDisabled function on Playstation 4 no longer leaks NP requests.

  • New: Implemented StoreV2 and Purchase interfaces for OnlineSubsystemNull.

  • New: We now handle push notifications for changes to friend presence and friend add/remove events on Playstation 4.

  • New: All session and friend tasks on Playstation 4 that were done with the WebAPI now use the NpToolkit equivalents instead.

  • New: The Presence Interface on Playstation 4 now stores the game status string in the StatusStr field, as opposed to keeping it as a key-value property.


  • Bug Fix: Added PruneEmittersOnCookByDetailMode as a cvar to prevent any warnings in the log.

  • New: Added tracking for PhysX tasks for CSV profiles.

  • New: Merged LLM profiling category tags for PhysX.


  • New: Remap clothing parameters on asset re-import.

  • New: Added feature to copy clothing assets from an existing skeletal mesh.

  • New: Added a feature that allows you to copy clothing assets from an existing Skeletal Mesh.

  • New: Added Remap Clothing Parameters on asset re-import.

  • Removed: Engine/Source/ThirdParty/PhysX was removed. Engine/Source/ThirdParty/PhysX3 should be used instead.

Physics Asset Editor

  • Bug Fix: Fixed the mirroring operation to rotate/translate.

Rigid Bodies

  • New: Exposed some properties for AnimDynamics (ComponentLinearAccScale, ComponentLinearVelScale) and RigidBody (ComponentLinearAccScale, ComponentLinearVelScale, OverrideWorldGravity) anim nodes as pins.


  • Bug Fix: We now allow files opened by OpenWrite with bAllowRead set to true to also be read (opened in read/write mode) on Microsoft platforms. This makes them consistent with the behavior of other platforms.

  • Bug Fix: Microsoft platform file handles are now allowed to seek beyond the end of the file. This makes them consistent with the other platform file handles, which aren't asserting in this case as it is valid to seek beyond the end of a file, but reads and writes to that point may fail.

  • Bug Fix: Fixed incorrect VectorShuffle implementation on ARM Neon.

  • Bug Fix: Fixed error caused by building DotNETUtilities and then failing to package for IOS using the Unreal Automation Tool BuildGraph on PC.

  • Bug Fix: Fixed issue where the log would show iOS provisioning warnings when packaging for other platforms.

  • Bug Fix: We now make sure to check if GEngine and GameUserSettings are initialized at the time HDR settings are set.

  • New: Added RT write mask support to the UI composition shader. This is a good speedup on platforms that support the write mask when running in HDR mode and there is no/little UI drawn.

  • New: Implemented IFileHandle::Flush and IFileHandle::Truncate for all platforms.

  • New: Added iOS support for the Device Output Log window for both viewing log output and issuing console commands

  • New: Bitcode support is now available for tvOS projects (required for submission).

All Mobile

  • Crash Fix: Fixed an issue that caused mobile projects to crash with Event Driven Loader disabled.

  • Bug Fix: Fixed an issue where the splash screen was closed too quickly when not using startup movie or early preload screen, leaving several seconds of black before the level loaded.

  • New: Added a command line option to allow overriding of platform when loading scalability config files. This is useful for testing with PIE. '-ScalabilityIniPlatformOverride=Android'.


  • Bug Fix: Fixed an issue where movie player materials drawn as UMG widgets would appear darker when running in ES2 Mobile Preview than either SM5 or on device.

  • Bug Fix: Fixed incorrect logging of Unicode strings on Android.

  • Bug Fix: Fixed issue where a Cook on the Fly process does not finish after closing the app on Android.

  • Bug Fix: Added a missing import for Android advertising module.

  • Bug Fix: Android NDK is now validated before before compiling.

  • Bug Fix: Exceptions from MediaExtractor are now handled when trying to stream movies.

  • Bug Fix: Added GetMaxPathLength for Android as it was missing.

  • Bug Fix: Fixed misconfigured MallocBinned2 which saves a modest amount of memory on Android.

  • Bug Fix: Memory report logging is now suspended on backgrounding.

  • Bug Fix: Fixed issue with compiler executable paths with spaces on Android.

  • Bug Fix: Fixed the TextureFormats variable in configrules.

  • Bug Fix: Fixed Mali debugger paths to work on Mac and Linux.

  • Bug Fix: Notification body details now set as second line of notification on Android 5.0+ instead of the ticker.

  • Bug Fix: Track info extraction for startup movies is now skipped on Android since it is not needed.

  • Bug Fix: The SlateUI.MaterialExpressionTextureBase for the WebTexture materials is now linked to the WebTexture Renamed the transparent material as WebTexture_TM to correctly identify the material in the Content Browser.

  • New: The engine version is now available in Unreal Plugin Language (UPL)

    • $I(EngineMajorVersion) = major version of engine (ex. 4)

    • $I(EngineMinorVersion) = minor version of engine (ex. 22)

    • $I(EnginePatchVersion) = patch version of engine (ex. 0)

    • $S(EngineVersion) = engine version string (ex. "4.22.0")

  • New: Currently selected build options are now shown in the log during packaging for Android.

  • New: Added support for using display cutout region on Android.

  • New: Added new project setting bUseDisplayCutout - Temporary restriction to HUAWEI devices for this release.

  • New:Android now supports playing media files from PAK files (encrypted PAK files require Android 6.0+ for this to work)

    • Supports both streamer (startup movies) and MediaPlayer.

    • Uses direct file sourcing if uncompressed and unencrypted in PAK file.

    • mp4 files in PAK files are now marked as uncompressed in response file to support this.

  • New: Added GetGamepadControllerName to get the name of the attached controller. This is the identifier used for mapping, not necessarily from the device itself.

  • New: Upgraded to Google Play Games 3.0.1 native C++ SDK.

  • New: Added checkbox to request EnableSnapshot during login to Google Play Games.

  • New: Features requiring depth buffer access such as soft particles, decals, and modulated shadows now work on most ES 3.1 devices even when MobileHDR is disabled, provided they have the framebuffer_fetch_depth_stencil extension.

  • New: We now check for errors when opening URL-based Android movie playback.

  • New: Added support for glap gamepad for Android.

  • New: Added some protection to controller polling for Java exceptions.

  • New: UWebBrowserAssetManager has been put under WITH_EDITOR || PLATFORM_ANDROID || PLATFORM_IOS.

  • New: Added support for Razer controllers in Android input and made the trigger threshold in line with other platforms.

  • New: r.Vulkan.DelayAcquireBackBuffer is now used by default on Android Vulkan. This helps stabilize the frametime by reducing the stalling effects of GameThread + RenderThread + RHI Thread, but only 3 backbuffers. This costs 1 extra blit, but is worth it to reduce periodic hitching.

  • New: Enabled support for PF_R8G8B8A8_SNORM on Android devices supporting GLES3.0 and above.

  • Improvement: Improved handling of AKEYCODE_BACK with gamepads.

  • Removed: Removed SDK API level missing error if Gradle is enabled since it can download it if necessary.


  • Bug Fix: Only latest headers are stored when HTTP is detected.

  • New: WASM multi-threaded support has been added. (EXPERIMENTAL: note offscreen framebuffer only -- offscreen canvas coming soon)

  • New: Emscripten toolchain upgraded to 1.38.24.


  • Crash Fix: Fixed a crash caused by both MSAA 8X and depth of field being enabled.

  • Bug Fix: Fixed windows BinnedAllocationGranularity, saving quite a lot of memory.

  • Bug Fix: Fixed issue where a project with Preferred Landscape Orientation set to Left Home Button still launched on iOS devices oriented with the home button to the right.

  • Bug Fix: We don't zero-init threadgroup variables in Metal shaders anymore - it isn't necessary and causes shader compilation problems.

  • Bug Fix: Fixed issue where locking an iOS device before or during startup movie playback could cause the app to hang or display a black screen upon resuming the app.

  • Bug Fix: Added support for saving games to iCloud using the ISaveGameSystem interface, on both iOS and tvOS. Enable it in Project Settings, iOS with the iCloud Save File Sync Strategy setting.

  • Bug Fix: Fixed issue where iOS Media Player would pause when unplugging headphones from device.

  • Bug Fix: Export all the caps bits for more recent tvOS versions.

  • Bug Fix: Updated the expired Apple Worldwide Developer Relations CA certificate, replacing it with the one from https://developer.apple.com/support/certificates/expiration

  • Bug Fix: Fixed device profile support for iPhone XS, iPhone XS Max, and iPhone XR.

  • Bug Fix: Added a workaround for Apple A11 & A12 GPUs not clamping F32->F16 conversions to F16_MIN/F16_MAX like the A10 and earlier which meant reflection brightness of 0 would generate INF.

  • Bug Fix: Advertising Identified (IDFA) code for iOS is now optional in the Engine.

    • This can be changed by the new setting "Enable Advertising Identified (IDFA)" in Settings >> iOS >> Build.

    • This setting is enabled by default.

  • Bug Fix: For iOS distribution builds, the entitlements have a modified syntax comparing to the entitlements section from the mobileprovisioning file. When signing the ipa, the iPhonePackager uses the values from the mobileprovisioning file. Added filters to validate the entitlements before sending them as parameter for the codesign tool.

  • Bug Fix: We no longer throw a warning about text shaders on iOS when cooking from Windows - as XGE shader compilation is on by default and disables remote shader compilation all Windows-based builds of iOS projects will always use text shaders unless you first disable XGE shader compilation.

  • Bug Fix: Added a fix for iOS reflection captures when using the Metal desktop renderer.

  • New: Adding IOS Cursor to better support UI navigation on IOS.

  • New: Added an option for "Force 32bit Floating Point Precision" to the iOS project settings to have the shader compiler promote all half-float operations to FP32 as some projects on iOS encounter rendering issues when fragment shader calculations run into half-float precision limits.

  • New: Memoryless render-targets for MSAA textures are now used when using the mobile renderer on iOS where we never sample from the MSAA texture itself. When a texture does not ask for SRV or UAV support we can also use memoryless.

  • New: Added support for separate MSAA and resolve targets on Metal MRT for iOS devices - this means the Forward renderer can support MSAA the same way as on macOS. This isn't the optimal solution but is necessary to get it to work.

  • New: Added a new CVar "rhi.Metal.CacheShaderPipelines" which controls whether we cache Metal graphics pipeline states for the lifetime of the program.

    • This defaults to 1 (on) which preserves the existing behavior and improves performance at the expense of memory.

    • This can also be set to 0 in the project configuration to release PSO memory back to the OS once all RHI references are released.

    • This will save memory but at the expense of performance as PSOs will have to be recreated on-demand.

    • Even when this is disabled, RHI objects will still share references to a single Metal instance of each PSO.

  • New: Added the ability to push individual files to iOS using DeploymentServer.exe. Eg: DeploymentServer.exe copyfile -bundle com.myco.myapp -file "C:\Temp\UE4CommandLine.txt" -file /Documents/ue4commandline.txt

  • New: Added the ability to easily download the Documents and Library folders from an iOS device for a single app using DeploymentServer. The backupdoc command requires a -bundle and an identifier, and the first -file argument specifies the destination directory, defaulting to the current folder. Eg: DeploymentServer.exe backupdocs -bundle com.myco.myapp -file D:\temp

  • New: As Metal now supports layered rendering on the A12 GPU, we can support most of the features that require it on the Metal Desktop Renderer for iOS when using this GPU. These features are disabled on earlier GPUs.

  • Removed: XGE shader compilation has been disabled for IOS temporarily while we track down an issue related to it.


  • Crash Fix: Fixed crash in WebMMovieStreamer that was caused by playing more than one startup movie.

  • Bug Fix: Fixed UBT makefile generator not handling .target.cs with all lowercase.

  • Bug Fix: Updated default starting program for uprojects to UE4Editor.

  • Bug Fix: Fixed UnrealVersionSelectors slate window and defaults for running a uproject shortcut.

  • Bug Fix: A fix was added to avoid forcefully raising windows and stealing focus.

  • Bug Fix: Fixed iterative deployment when launching on to a Linux device.

  • Bug Fix: Fixed touch events handling.

  • Bug Fix: -fstandalone-debug is now avoided in monolithic builds.

  • Bug Fix: Fixed some focus issues for context menus.

  • Bug Fix: Fixed pointer barriers on resize/move and multi-monitor.

  • Bug Fix: NumStackFramesToIgnore is now respected when triggering Asserts.

  • Bug Fix: Fixed streaming issues on Linux headless clients due to viewport being zero-sized.

  • Bug Fix: Failure to init inotify will no longer result in a cooking error.

  • Bug Fix: The best clock is now always selected, avoid using CLOCK_REALTIME which might be unreliable.

  • Bug Fix: Reverted popup menus back to being set as a popup window versus a borderless window.

  • Bug Fix: Removed extra resize on window creation that was being caused by an off by one error.

  • New: Updated editor version of libvpx to match versions.

  • New: WebM movie streamer: SDL audio support added.

  • New: You can now preload the main module symbol file for more reliably faster runtime crash handling at the cost of loading the symbol file into memory at start with this command line: -preloadmodulesymbols

  • New: .NET framework is no longer forced, as the bundled Mono supports the latest version now.

  • New: Symbols are now hidden by default in monolithic builds.

  • New: Updated LLVM version to 7.0.1.

  • New: Added compiler-rt libraries.

  • New: Updated the toolchain to v13 toolchain (clang 7.0.1).

  • New: WebM: added media streamer implementation.

  • New: Updated Mono to the same version as Mac's:

  • New: Recognize misaligned access error and print message accordingly

  • New: WebM: added support for additional codecs: VP8 and Vorbis to fully support webm specification. Changed file extension from mkv to webm.

  • New: MediaShaders: Added the ability to crop images during YUY conversion.

  • New: Added Python scripting support.

  • New: Added support to generate binaries with profile-guided optimization (requires toolchain v13).

  • New: Added a new command line option to specify a signal to use a default signal handler rather then setting it to ignore -sigdfl=.

  • New: EGL device for offscreen rendering can now be chosen with -egldevice=N commandline argument.

  • Improvement: Optimized runtime crash time symbolication.

  • Improvement: Optimized dump_syms while linking by 30-50%.

  • Improvement: Reduced the size of the Linux binaries.

  • Deprecated: Only clang 6.x and 7.x are supported for 4.22.

  • Deprecated: Debug CEF3 library has been removed (it was 1 GB in size, while it wasn't used that much).

  • Removed: Removed all setlocale() calls so lowercasing/uppercasing logic matches other platforms.


  • Crash Fix: Fixed a crash in MacToolChain caused by an attempt to access null bundle path when linking a plugin during hot reload

  • Crash Fix: Fixed crash at exit on Mac that could happen if quit action was initiated during windowed to fullscreen transition.

  • Crash Fix: Fixed a race condition in the Mac startup movie player that could cause a crash due to checking movie status before it was loaded.

  • Bug Fix: Fixed an issue with Git LFS to allow it to work in the Git plugin.

  • Bug Fix: Fixed issue where the Material Editor was unable to execute the Mali Offline Compiler on Mac when using the Platform Stats feature.

  • Bug Fix: Fixed creation of texture 2d arrays and handling of texture2darray.gather in Metal.

  • Bug Fix: Re-enabled managed buffer sub-allocation as it works now - this reduces the cost of allocating buffers on macOS Metal.

  • Bug Fix: Fixed Metal error reporting when a vertex stream doesn't have enough data to work.

  • Bug Fix: Disabled Window->Enable Fullscreen menu item in Mac editor until we are able to properly support editor's fullscreen mode on Mac.

  • Bug Fix: Fixed the swizzle on Metal for reads from a RWTexture as the Metal function always returns as a vector-4.

  • Bug Fix: Fixed debug formatter for TArrays with inline-data allocators.

  • Bug Fix: Fixed the problem with Mac native window buttons not hiding in the editor viewport's immersive mode.

  • Bug Fix: Fixed issues with Content Browser on Mac showing duplicate folders for folders created using Finder with names containing certain unicode characters.

  • Bug Fix: Better handling of mixed atomic/non-atomic operations in Metal shaders.

  • Bug Fix: Fixed a problem with paths to third-party frameworks in Mac toolchain that was preventing these frameworks from being visible to the compiler.

  • Bug Fix: A fix was added to resolve heap-use-after-free bugs in Metal timer queries.

  • Bug Fix: For macOS games we can now use the present convenience functions, which helps profiling & capture tools understand the frame. The Editor still uses the lower-level API in order to correctly handle multiple and/or hidden windows.

  • Bug Fix: For Metal shaders, we now only zero-initialize non-const, non-struct, statics in hlslcc to match fxc and no longer generate incorrect initializers that fail to compile.

  • Bug Fix: Added more fixes for ByteAddressBuffers on Metal, allowing usage of the 2 parameter Interlocked functions and fixing swizzling on Store operations.

  • Bug Fix: We now make sure that we enforce the minimum Metal version to match the shader compiler.

  • Bug Fix: Fixed the validation of Metal parallel encoder validation in the mtlpp library.

  • Bug Fix: Fixed the handling of float3 Buffer/RWBuffer in Metal which was accidentally broken.

  • Bug Fix: Disabled the intermediate back-buffer in MetalRHI and instead we now render directly into the drawable texture which is much faster. We now make this texture available for read-back via the various mechanisms used for screenshots and movie capture using the mtlpp auto-released handles so that we don't need to worry about retain/release order.

  • Bug Fix: We no longer force MetalRHI to reallocate render-targets or depth-stencil surfaces that were marked as ShaderResource by disabling the PixelFormatView usage flag, as it makes no sense to do so.

  • Bug Fix: Metal pre-compiled header compilation is now tied to the specific Xcode build, not just the metal compiler version, to ensure that it is recompiled when appropriate.

  • Bug Fix: Separated Metal buffer tracking stats from LLM.

  • Bug Fix: We no longer allow Metal blit/compute work to overlap with previous render passes, as it causes a lot of problems.

  • Bug Fix: Fixed the handling of Metal shader versions so that warnings are shown when a user runs on the wrong OS and so that text shaders are compiled with the correct version.

  • Bug Fix: Fixed a memory leak in Metal's RHIReadSurfaceData.

  • Bug Fix: Fixed a pixel artifact showing in curve editors on Mac.

  • Bug Fix: Fixed issues with removing degenerate polygons when importing FBX meshes on Mac.

  • Bug Fix: Expanded a previous Metal workaround to more places to help the Nvidia driver compile tessellation shaders.

  • Bug Fix: Fixed an issue in Mac output log window that could cause the editor process to freeze on exit.

  • Bug Fix: We now use the custom-header parsing API for the Metal side-table index and centralize the printing of Metal types to make it easier to comprehend.

  • Bug Fix: Simplify the way tessellation shaders are compiled on Metal to reduce the time they take to instantiate at runtime by removing the use of function constants.

  • Bug Fix: A pool of render pass descriptors is now used and more scoped timers have been added for inspecting where time goes in MetalRHI.

  • Bug Fix: Fixed issues with menu and tooltips placement in some configurations that mix low and high DPI monitors.

  • Bug Fix: Disabled parallel Android texture compression on Mac due to thread safety issues with Qualcomm's Mac TextureConverter.

  • Bug Fix: The initial dispatch in a render pass is now allowed to be committed to the prologue encoder for Metal. This ensures ordering of tessellation dispatches versus the GPU scene update dispatch, but can punt any dispatch without prior dependencies which can help performance.

  • Bug Fix: Fixed MetalRHI to allow beginning, ending and accessing render queries without submitting frames as used by the new GPU startup profiling code.

  • Bug Fix: Solved an issue on Mac with child window contents not updating properly if its parent was minimized.

  • New: 10.13.6 is now the minimum version of macOS required by UE4 for games and the editor.

  • New: Non-monolithic targets on Mac now store their dylibs directly in Binaries/Mac folder instead of inside the app bundle.

  • New: Modified the Mac message box asking users to update to latest macOS to show once for every engine release.

  • New: Changed the default keyboard shortcuts for editor viewport's immersive mode and Blueprint debugger's step into command to use Cmd+F11 instead of F11 on Mac to avoid conflict with default macOS Expose shortcut.

  • New: Changed the default setting for Mac scroll gesture direction from "Standard" to "Use System Settings".

  • New: Changed Mac Build.sh script to simply pass arguments to UBT so that it behaves the same as Windows and Linux equivalents. This should make it easier to use for people invoking it directly from the terminal or other scripts. Also, it can now be run from any directory. The old form of this script that translates Xcode params to UBT params still exists, renamed to XcodeBuild.sh and Xcode uses that now.

  • New: Updated text in the notifications about old or missing Xcode to be more helpful and let users know how to make sure correct Xcode version is used.

  • New: Added a compile-time asserts to Mac and iOS PlatformCompilerSetup.h header files to display an error message when attempting to build with Xcode version older than 9.4.

  • New: Configured the Metal pipeline state buffer descriptor table on macOS and iOS versions that support the feature to tell the driver which resources are likely to be modified or not.

  • New: Rewrote the MetalRHI fencing code so that MTLFence can be enabled by default on macOS and iOS versions that support the feature. This allows us to use MTLHeap to allocate MTLBuffer resources which can significantly reduce driver overhead on the CPU.

  • New: Added headers which can be included before and after Apple system headers (PreAppleSystemHeaders.h and PostAppleSystemHeaders.h), to avoid errors due to mach-o/loader.h redefining PLATFORM_IOS and PLATFORM_TVOS.

  • New: Added command-line arguments:

    • "nometalparallelencoder" to disable parallel encoders.

    • "nometalfence" and "nometalheap" to disable MTLFence and MTLHeap respectively.

  • New: The ability has been added to emulate atomic operations on Texture2D for Metal by creating textures marked as TexCreate_UAV|TexCreate_NoTiling from MTLBuffers as Linear Textures, which means we can bind the buffer for the atomic operations and the texture for normal operations. There may be a performance penalty and unexpected cache interactions with this approach and it is not used anywhere in the engine yet.

  • New: Added search paths for git.

  • New: Added support for the new MTLDispatchType control for compute command encoders to mtlpp and then use that to enable Concurrent dispatch for the async compute context for macOS 10.14 & iOS 12 and later.

  • New: Index buffer SRVs & UAVs now work on Metal.

  • New: Added support for Nintendo Switch Pro Controller and newer versions of PS4 and Xbox One controllers for Mac.

  • New: Added support packed vector types (e.g. 12-byte float3) in RW/StructureBuffer types in Metal shaders.

  • Improvement: We now keep sampler names in Metal shaders - makes it easier to debug compilation.

  • Improvement: There is no advantage in Metal to making visibility buffers use Managed memory, so just use Shared on both macOS and iOS.

  • Improvement: Improved the code for detecting Xcode install. The editor will no longer try to compile Metal shaders using offline compiler if it's missing (for example if only the command line tools are installed or they are set as default).

  • Removed: Removed bHasRegularUniformBuffers from the MetalShaderFormat because it is no longer required - Metal always uses real uniform buffers.


  • Crash Fix: Fixed a crash that occurred when text was selected in the Windows console for more than 25 seconds.

  • Bug Fix: The Editor on Windows now correctly detects attached iOS devices and allows you to target specific devices for Launch.

  • Bug Fix: Fixed startup movies on Windows not playing when no audio devices are enabled and hanging when audio devices are disabled during playback.

  • Bug Fix: Windows media can now be paused using 'Native Audio Out'.

  • Bug Fix: Fixed startup movie audio continuing to play on Windows platform after application has been closed.

  • New: Startup movies on Windows platform can now be 1920x1080 (resolution is no longer required to be a multiple of 16).

  • New: Windows startup movies now can handle more situations that cause playback to be interrupted.

  • New: WebMMediaPlayer: added Windows as supported platform.


  • Crash Fix: Fixed a crash in the RepaintCanvas function in UCanvasRenderTarget2D.

  • Crash Fix: Fixed a final-delete while in flight crash on DX12.

  • Crash Fix: Fixed a crash using Pixel Inspector on Mac Editor.

  • Bug Fix: Fixed an issue where duplicated instanced static meshes would not render until their transform was updated.

  • Bug Fix: Fixed an issue where FColor::MakeRandomColor would return white.

  • Bug Fix: Applied change for RenderDoc settings object so that settings are now properly saved.

  • Bug Fix: Fixed an issue with AMD drivers where users were not able to run UE4 in Windows Vulkan Editor when using drivers ranging from 18.2.2 to 19.2.1 due to incompatibility. These drivers are now blacklisted.

  • Bug Fix: Fixed an issue where imported PNG files were flood-filling 0-alpha white pixels.

  • Bug Fix: Fixed an issue in morph targets causing render resource destruction to run on the game thread during a garbage collect. This was caused by an additional vertex buffer and SRV being added to the morph target vertex buffer info struct, which was not explicitly cleaned up in ReleaseRHI.

  • Bug Fix: Fixed an assert that could happen with CreateCanvasRenderTarget2D when running from commandlet. For example, this could happening during packaging.

  • Bug Fix: Resolved an issue where Decals were rendering in the main pass when bRenderInMainPass is false.

  • Bug Fix: When UAV is bound in D3D11 RHI, it will now explicitly unbind any VB/IB that reference the same resource.

  • Bug Fix: Fixed an invalid shader generation when repeatedly toggling Forward Rendering on and off in Project Settings.

  • Bug Fix: Made DX12 stencilref behavior consistent with other RHIs.

  • Bug Fix: Disabled Dual Lobe in Forward Rendering due to graphical artifacts since Subsurface Profile is not supported.

  • Bug Fix: Added missing UAV and SRV for texture arrays on Vulkan.

  • Bug Fix: Fixed and issue where batched sprites were sometimes redrawing multiple times during the same frame which could cause flickering.

  • Bug Fix: DrawDebugLine now respects bPersistentLines rather than using default lifetime.

  • Bug Fix: Stopped mysterious cooker asserts caused by a missing "&=" when processing whether batches of shader compiles were successful.

  • Bug Fix: Fixed post opaque extension running before lights.

  • Bug Fix: Removed Float16 values from BC6H which aren't correctly handled by the ISPCTextureCompressor.

  • Bug Fix: Fixed an issue where CopyTexture would return after copying the first mip when using Bypass Mode.

  • Bug Fix: Made the RenderDocPlugin module init be wrapped inside of WITH_EDITOR since it's not expected to work in a standalone build.

  • Bug Fix: Fixed an issue with Particle Cutouts where an alpha threshold of 0 would disable the feature. An alpha threshold of 0 now culls regions with exactly zero alpha.

  • Bug Fix: Fixed occlusion queries in Vulkan being read from the wrong frame when the CPU outruns GPU.

  • Bug Fix: Fixed the eyedropper not working in the Editor Color Picker panel on Mac.

  • Bug Fix: On Vulkan, we corrected the buffer to use the size of our "In Rect" rather than the size of the Texture, which is not always the same size as the buffer.

  • Bug Fix: Fixed an issue where updating a preview window would cause a "Compiling Missing ViewMode Shaders" dialog to always appear.

  • Bug Fix: Fixed Pixel Streaming Matchmaker web server for the parameters "matchmakerPort" and "httpPort", which were mistakenly set as const.

  • Bug Fix: Fixed a static initialization ordering issue with the "GetIdentityPrimitiveParameters" function sometimes being called before FMatrix::Identity was actually initialized.

  • Bug Fix: Fixed static analysis warning in Win64 (PVS-Studio).

  • Bug Fix: Fixed errors compiling shaders when the editor executable is not in Engine/Binaries/Win64.

  • Bug Fix: Support the LOD argument on SRV .Load operations when compiling shaders with hlslcc.

  • Bug Fix: Fixed crashes when painting meshes with textures.

  • Bug Fix: Fixed issue where a actor's desired draw distance would sometimes fail to update.

  • Bug Fix: Improve video media playback quality by selecting correct H.264 decode pixel formats, color transform matrix and point sampling for the Luma texture during conversion.

  • Bug Fix: Fixed crashes caused when creation of a particle system component fails and returns a null pointer.

  • Bug Fix: Fixed quantization issue on coat material for low and high base color.

  • Bug Fix: D3D12 RHI - GPU idle time between commandlists is deducted from ProfileGPU results.

  • New: Added the CVar, r.ShaderPipelineCache.StartupMode to control what mode the PipelineCache starts in so we can control whether it starts paused (0), in 'fast' mode (1 - default), or in 'background' mode (2).

  • New: Added Ray tracing support for Alembic geometry cache

  • New: Fixed a material update problem with the particle component.

  • New: Easily opt out of all ray tracing features using the "-noraytracing" command line argument. Disables all ray tracing features even if they are enabled for the project.

  • New: Track down GPU hangs on NVIDIA cards with the help of "VK_NV_device_diagnostic_checkpoints", which can be enabled using the command r.GPUCrashDebugging=1.

  • New: Support for socket location is now available in Blueprint with the "Find Socket" node for Static Meshes.

  • New: Added debug console variables to disable back-face culling and any-hit shaders for all ray tracing geometry instances.

  • New: Added "SF_NumStandardFrequencies" that covers standard SM5 shader frequencies (excluding new ray tracing frequencies).

    • Some of the usage of "SF_NumFrequencies" is replaced with "SF_NumStandardFrequencies" to avoid memory and run-time overhead from new shader frequencies on platforms that don't support them.

  • New: Added support for OpenColorIO color space transformation on GPU using library v1.1. It's accessible from Composure or Blueprint nodes.

  • New: Changed the name of the "Metal Desktop Forward Renderer" to "Metal Desktop Renderer" for the iOS platform since you can choose between the Forward and Deferred Renderer.

  • New: Pipeline State Object (PSO) caching now records game-side custom usage masks when collecting PSO's at game run time.

    • These can be based on render quality settings or any other desired feature defined by the game enabling a smaller subset of PSOs to be recompiled on load rather than the whole cache.

  • New: Foreground DPG now works for SimpleElementCollector which is used by many engine debug utilities like DrawDebugSphere.

  • New: REnder Command scopes have been added to buffer up lambdas and executes on the render thread. It switches FCanvas to using this so it no longer races with other threads enqueuing rendering commands.

  • New: In Niagara, we've added the new dynamic input option with "Calculate Radius from Size.

  • New: Changed building of WebRTC Proxy to use Unreal Build Tool.

  • New: Added a scale option to upsample or downsample the texture when using the ConvertToJPEG/PNG/TIFF/HEIF nodes in Blueprint.

  • New: Added sphere light sampling support for ray tracing. Sampling currently selects a uniform random position on a sphere as a connection point for a shadow ray. Sphere light sampling is enabled by adjust the source radius on a point light.

  • New: Adding profiling stats for ray traced reflections.

  • New: Added support for switching Vulkan present mode with -vulkanpresentmode=N where N is a VkPresentModeKHR.

  • New: Added support for Vulkan color conversion sampler extension.

  • New: Added r.Vulkan.DebugBarrier console variable to help debug resource issues.

  • New: Added a line thickness setting for UBoxComponent for when being used as a selector in game to make it more visible.

  • New: Added visualization of the AR system's point cloud to the ARObjectDetection sample.

  • New: Implemented support for wave operation intrinsics (Shader Model 6.0) as an extension of SP_PCD3D_SM5 and is available when running on compatible hardware and D3D12 is enabled.

    • Wave intrinsics can be enabled for a shader by providing CFLAG_WaveOperations to the compiler flags in ModifyCompilationEnvironment().

    • Run-time availability must be queried by checking GRHISupportsWaveOperations before trying to use a shader that was compiled with wave intrinsics.

  • New: Renamed D3D11ShaderCompiler.cpp to D3DShaderCompiler.cpp since it is now used for both FXC/DXBC and DXC/DXIL shader compilation.

  • New: Implemented ray tracing shader compile batch script generation and shader worker direct compile support.

  • New: All ray tracing shaders now use ShouldCompileRayTracingShadersForProject() to decide if they should be compiled.

  • New: Depth buffers can now be switched to 32 bit on D3D11 and D3D12 using r.d3d11.Depth24Bit=0 and r.d3d12.Depth24Bit=0, respectively.

  • New: Added Vulkan GPU crash debugging support with the command line argument "-gpucrashdebugging".

  • New: Added the ability to specify a rotation to an image during the JPEG/TIFF/HEIF/PNG conversion.

  • Improvement: Reduced excessive memory usage at the end of a cook when bShareMaterialShaderCode is enabled. Savings vary by the total number of shaders, but a shader library with 1.3 million shaders will use approximately 6GB less memory.

  • Removed: Removed CMD_CONTEXT and COMPUTE_CONTEXT macros since they are no longer useful and only disrupt intellisense.

  • Removed: Removed OpenGL3 RHI option from the nDisplay Launcher.

  • Deprecate: Deprecated ABGR16 and Float RGB from EDefaultBackBufferPixelFormat since they are not supported by D3DX SwapChain.

  • Deprecated: FGetHSV has been replaced with MakeFromHSV8 which wraps the existing method HSVToLinearRGB. This was because FGetHSV behavior is confusing or wrong and the behavior of HSVToLinearRGB is what we want because it matches with LinearRGBToHSV.


  • Deprecated: As part of the mesh drawing refactor, legacy drawing policies and Static Mesh draw lists have been removed. These have been replaced by FMeshDrawCommand and FMeshPassProcessor everywhere in the renderer. See major release notes and documentation for more information.

  • Deprecated: SetRenderTarget RHI, API, and its variants have been removed. Instead, use BeginRenderPass and EndRenderPass.


  • Crash Fix: Improved safety against possible crash in the PSC Pool.

  • Crash Fix: Resolved a possible debug message crash with ribbons.

  • Crash Fix: Fixed a random crash with particles when trying to trim memory data.

  • Crash Fix: Fixed a crash in Niagara data interface initialization where data interfaces with per-instance data (mesh data interfaces and others) would cause a crash when they were used in system or emitter scripts.

  • Crash Fix: Fixed crash when trying to compile Niagara scripts when running on PC with SM2 emulation.

  • Bug Fix: In the Niagara Emitter and System Editors, we addressed an issue where time was not resetting properly on a playing system when modifying data interfaces, renderers, or emitter properties.

  • Bug Fix: Fixed an issue in the Niagara stack view where renaming an input on a Set Variables module wouldn't work correctly with undo.

  • Bug Fix: Fixed an issue with Niagara Events not being generated correctly in cooked builds.

  • Crash Fix: Improved messaging and resolved some crashes that could occur in Niagara when encountering invalid type definitions, type definitions for malformed types.

  • Bug Fix: Ribbon rendering in Niagara had an issue which would result in invalid UVs when using "Ribbon ID" to render more than 256 ribbons from a single emitter.

  • Bug Fix: Fixed an issue in Niagara with Events where the event payload data could be corrupted when generating events from particle update script with interpolated spawn enabled.

  • Bug Fix: Updated ribbon rendering in Niagara to have more predictable behavior when a camera facing ribbon segment direction is close to parallel to the look vector.

  • Bug Fix: Fixed an issue with Niagara runtime script generation where emitter property constants weren't always generated correctly in system scripts resulting in incorrect runtime behavior for values like "Local Space".

  • Bug Fix: Fixed an issue in Niagara runtime script compiling where Select by Usage nodes wouldn't be handled correctly in emitter scripts.

  • Bug Fix: Fixed an issue in Niagara scripts where having disconnected pins in the graph would cause the runtime script compile to fail unnecessarily.

  • Bug Fix: Making Cascade's skelvertsurface module more robust to missing data in the mesh.

  • Bug Fix: Fixes for perf regressions managing particle systems. Apply visibility culling correctly when calling from the manager.

  • Bug Fix: Added a null check for GetScene() and added Skeletal Mesh for a SkeletalMeshComponent which was using both, causing access violation.

  • Bug Fix: Fixed an issue with task scheduling in PSC Manager.

  • Bug Fix: Made Niagara's Skeletal Mesh triangle sampling functions more robust to bad input.

  • Bug Fix: Rewrote the section of the EmitterLifeCycle Niagara module calculating Emitter.LoopAge to avoid floating point rounding errors depending on NextLoopDuration. SpawnInstantaneousBurst used to fail for some common values of NextLoopDuration due to rounding issues resulting in negative signed zeros such that no particles was spawned.

  • Bug Fix: Fixed an issue where the beam target was not correctly re-initialized after being destroyed. The beam emitter still referenced the deleted target object.

  • Bug Fix: Fixed an issue with GridLocation module where precision loss could result in incorrect grid layout on non-Windows platforms.

  • Bug Fix: Now properly handling enum names in multiple spots in the Niagara graph display.

  • Bug Fix: Now the Output namespace is allowed in Niagara HLSL expressions.

  • Bug Fix: Fixed a bug where background loading a Niagara asset would trigger an assert.

  • Bug Fix: Fixed an issue if Realtime is off in the viewport, SystemInstance would be found and a crash could occur when editing user variables on a Niagara Component.

  • Bug Fix: Fixed an issue where quaternion comparisons were not 16-byte aligned when flushing values.

  • Bug Fix: Fixed an issue where velocity could be Nan on first frame since the data isn't initialized on a Niagara component.

  • Bug Fix: Fixed an issue where exposed variables wouldn't update when clearing out a Niagara System in a Niagara Component.

  • Bug Fix: Fixed a bug with HoudiniNiagaraCSV datainterface where effects that burst spawned all particles at time 0 would never loop.

  • Bug Fix: Fixed Function and Dynamic-Input Scripts failing to compile with Parameter Map or Data Interface inputs.

  • Bug Fix: Fixed a bug with Converted nodes not properly adding structs they use into compiled HLSL.

  • Bug Fix: Fixed an issue where changing function scripts inside dynamic input scripts were not recompiling systems that use the modified dynamic input script.

  • Bug Fix: Fixed missing shadermap for Niagara assets after a cook where shader needed to be recompiled.

  • Bug Fix: Fixed an issue that prevented creating parameters inside the Event Handler section of the Stack.

  • Bug Fix: Prevented making or linking Niagara Parameter Maps where they can not be used.

  • Bug Fix: Fixed issue that prevented setting user parameters of Systems in cooked builds.

  • Bug Fix: Fixed velocity vector on mesh particles.

  • Bug Fix: Fixed invalid memory access with particle trails.

  • Bug Fix: Fixed issues with Niagara on Vulkan and OpenGL ES3_1.

  • Bug Fix: Fixed missing Niagara shaders when running uncooked builds.

  • New: Added the ability to undo parameters being dragged into the stack from the Parameters panel in Niagara.

  • New: Added a new "Select by Simulation Target" editor node that allows you to select different values for cpu and gpu execution.

  • New: Added velocity inheritance to Static Mesh queries within Niagara, which is useful when spawning particles from player controlled meshes.

  • New: Niagara components now show up under the name "Niagara Particle Systems" in the component assignment menu.

  • New: Added native Niagara VM ops for integer divide, left and right shifts.

  • New: Enabled the details panel for the selected node in the Niagara script editor UI.

  • New: NiagaraComponent's OnSystemFinished are now assignable via Blueprint like Cascade

  • New: Added the console variable "fx.ExecVMScripts" to disable Niagara VM script execution. It is useful when a script is crashing to examine all the data in the Editor.

  • New: Simulation delta time can now be clamped for Niagara Emitters.

  • New: Added the ability to deprecate modules within the Niagara Script Editor. Any users of a deprecated module will get an inline warning in the stack.

  • New: Allowing SourceMovementComponent to run asynchronously. Also adding debug text to show systems that can't run async.

  • New: Reverted the default emitter height in the Niagara editor from 100 back to 0 as this was confusing for users and made it harder to reason about world space vs local space transformation of systems.

  • New: Added the ability to refresh a node inline.

  • New: Added preliminary support for GPU emitters in the Niagara Attributes Spreadsheet.

  • New: Added a precise version of Module and Reciprocal that is used by default. It improves precision as the existing opcodes for this only had 12-bits.

  • New: Added a ModuloFast and ReciprocalFast to still use the 12 bit faster version.

  • New: Niagara system's world-space rotation transform are now exposed directly as Engine.Owner.Rotation.

  • New: Added new overview stats for Niagara and Cascade.

  • New: Added "plus" pin to Math nodes like "add", making it possible to add a dynamic number of inputs per node.

  • New: Added Editor shortcuts for subtract (S), lerp (L) and make bool (B).

  • New: Added OpenGL implementation of Fence and CopyToStagingBuffer.

  • New: Updates readback to not create/destroy stuff per emitter every frame. Updated RHI API to support this.

  • New: Added a new Implementation of FRHIStagingBuffer and EnqueueStagedRead. Async copies the contents of a buffer to a shadow. Optional fence to indicate completion. Multiple FRHIStagingBuffers can be created off the same Vertex Buffer to get snapshots at different points in the command stream.

  • New: Added a new module that aligns a sprite to the mesh orientation variable or a quaternion.

  • New: Adds a console variable to allow Niagara VM shader compilation to skip some of HLSLCC's backend optimization passes.

  • New: Added an additional option to Niagara module dependencies which specifies whether the module providing the dependency should be in the same script, or if it can be in any script.

  • New: In the Niagara stack view, added stack issues to report and fix button for missing function scripts for modules and dynamic inputs.

  • New: Created a "Wind Force" module in which particles attempt to match a goal wind speed with a simple air resistance model which controls how quickly they reach their target speed.

  • New: Added an "Add Velocity in Cone" module with controls for axis alignment and cone angle.

  • New: Added a module to sample Distance Field's SDF and Gradient PseudoVolume texture in Niagara extras.

  • New: Gradient PseudoVolume texture has now been included in Niagara Extras.

  • New: Included an option for infinite particle lifetime on the update age module in Niagara.

  • New: Spawn Burst Instantaneous now supports spawn groups to allow independent spawning on discrete elements such as Skeletal Mesh bones.

  • New: Added the "Initialize Particle" and "Initialize Ribbon" Modules to simplify the editing and creation of new effects by setting common attributes in one location.

  • New: Added the Particle System Manager that when enabled will gather all valid particle system components for ticking in larger batches to reduce overhead. It provides minor performance improvements along but could enable greater savings in the future. It can be enabled/disabled with the console command fx.PSCMan.Enable.

  • Improvement: Improved Niagara light rendering by adding the following options:

    • Select between Inverse Square Falloff or Linear Falloff (defaults to inverse square falloff)

    • Light exponent for Linear Falloff

    • Affect translucency toggle

    • Allow to spawn lights on a per-particle basis

    • Volumetric scattering intensity

  • Deprecated: The old "SampleCurlNoiseField" and "CurlNoiseDimensions" modules from the Niagara Extras plugin are removed due to the new procedural nature of the curl noise.

  • Removed: Removed the "User." prefix for Niagara variable names in the Sequencer.

  • Removed: Removed the need to start Niagara component parameter names with "User." in Blueprints.


  • Bug Fix: Fixed an issues with translucent masked shadows from dynamic meshes.

  • Bug Fix: Fixed Sky Light hiding/showing.

  • Bug Fix: Don't render preshadow projections for objects that don't render in the main pass.

  • Bug Fix: Fixed issues with Rect Lights and Clear Coat.

  • Bug Fix: Excluded lights with non-zero source length from tiled deferred pass. These don't work due to light tangent not being passed to tiled deferred shaders.

  • Bug Fix: Fixed an error when encoding shadowmaps with allocations that are not multiple of 4.

  • Bug Fix: Fixed a possible memory leak in FLightComponentDetails.

  • Bug Fix: Fixed an issue where the Global Distance Field wouldn't be cleared when switching between levels.

  • Bug Fix: Clamping r.TranslucencyLightingVolumeDim in order to fix crash when it's set to 0.

  • Bug Fix: Fixed various Rect Light issues in Lightmass.

  • Bug Fix: SourceTexture now affects Lightmass and uses bounces color.

  • Bug Fix: Fixed uninitialized lightmaps on some objects inside cooked builds.

  • Bug Fix: Fixed missing shadows when Far Shadow Cascade was used with Distance Field Shadows.

  • Bug Fix: Fixed errors in landscape Lightmass material UV calculations. Swarm Agent cache needs to be cleared for the fix to be effective.

  • New: Added a second set of parameters on the ExponentialHeightFogComponent to drive a light-weight second height fog. It includes a second fog density, a second height falloff, and a height offset relative to the first height fog setting.


  • Crash Fix: Fixed a crash when compiling material that uses multiple mask expressions with the same input expression.

  • Crash Fix: Added newly created Material Parameter Instance assets to the world. This fixes a crash in creating a Material Parameter Collection and adding a track for it immediately in Sequencer.

  • Crash Fix: Fixed a crash with Translucent Materials using the SceneDepth node.

  • Bug Fix: Fixed an issue accessing texture objects through Static Switch node and other forms of indirection. Previously, TextureSample expression would only look at nodes directly connected to the "Tex" input to determine which texture to use.

  • Bug Fix: Fixed access to Custom Stencil (and other scene textures) from slate materials.

  • Bug Fix: Fixed an issue where Material Instances would sometimes try to compile expressions connected to Material attribute Tessellation inputs, even if tessellation was not enabled.

  • Bug Fix: Fixed an issue where adding a new parameter to a Material Parameter Collection would break gameplay calls to SetVectorParameterValue until referencing materials were recompiled.

  • Bug Fix: Fixed an issue with the CopyMaterialInstanceParameters fast path where parameters exposed by static permutations were not copied.

  • Bug Fix: Fixed default filtering mode for volume texture to be wrap instead of clamp.

  • New: Added new Material Expressions "DeltaTime" and "ShadowPassSwitchDeltaTime".

    • DeltaTime allows for custom motion blur effects by using Preview Frame Switch along with World Position Offset.

    • ShadowPassSwitch allows the material to behave differently when rendering into shadowmap.

  • Improvement: Improved warning messages in a cooked application when an invalid Material is used on a Skeletal Mesh.

Mobile Rendering

  • Bug Fix: Fixed case where enabling Depth of Field and having a primitives with a refraction effect in the scene was causing a black screen to render.

  • Bug Fix: Fixed a case where Android devices with PowerVR GPUs could have "black spot" rendering artifacts depending on the main light and camera view angle.

  • Bug Fix: Fixed Custom Stencil support with the Mobile Renderer.

  • Bug Fix: Fixed a case where meshes with AlphaComposite blending will incorrectly write to alpha channel.

  • Bug Fix: Fixed case where Mobile Separate Translucency is missing when High Quality Depth of Field option is enabled.

  • Bug Fix: Fixed iOS Custom Depth Only vertex shader functionality by removing out of date forced iOS Z-Bias.

  • Bug Fix: Fixed incorrect SceneTextureLookup size calculation when used with mobile Post Process Materials.

  • Bug Fix: Fixed a case where nearest filtering was not working properly on some Android Vulkan devices.

  • Bug Fix: Fixed a case where 'Indirect Ligthing Color' setting from Post Process Volume GI section was not working with mobile rendering.

  • New: Enabled cube scene captures for ES3.1 feature level devices.

  • New: Added Movable Spot Light support to mobile renderer.

  • New: Added a new spotlight mobile shader permutation option. It defaults to off to ensure this is enabled if Spot Lights are required for your project.

  • New: Added a Point Light fallback for Rect Lights.

  • New: RenderDoc captures from Android devices running OpenGL will now properly show mesh and material names.

  • New: Android OpenGL application will now use 16-bit depth for dynamic shadowmap rendering to be consistent with Android Vulkan and iOS Metal. This also reduces memory usage for dynamic shadows.

  • New: Improved Vulkan frame buffers handling on Android devices. This will remove periodic micro hitches during rendering.

  • Improvement: Improved creation of Vulkan vertex and index buffers on Android devices. This removes occasional micro hitches during rendering.

  • Deprecated: Disabled Vulkan support for Adreno 5xx based devices running on Android 6 due to driver issues.

  • Deprecated: Disabled OpenGL ES3.1 support for PowerVR Rogue G6xxx devices due to driver issues.


  • Crash Fix: Fixed DX12 texture upload crash by deferring upload to RHI thread. This also avoids stalling RHI thread.

  • Bug Fix: Disabled depth bounds optimization if RenderDoc is enabled as neither NvAPI nor Ags is handled by RenderDoc.

  • Bug Fix: GPU Profiler in DX12 now correctly reports GPU frame time excluding GPU idle time.

  • New: Implemented adaptive ray shortening based on roughness for ray traced reflections.

  • New: Integrated a GitHub change to optimize shadow occlusion evaluation.

  • New: Integrated a GitHub pull request to optimize vertex fog.

  • New: Allow depth textures without SRV on DX11. Unifies DX11/DX12 behavior.

  • New: Added Parallel object distance field atlas update. It can be enabled by setting r.DistanceFields.ParallelAtlasUpdate to 1. This is off by Default .

  • New: Added an explicit GPU stat for Volumetric Fog.

  • New: Disabled GRHINeedsExtraDeletionLatency for DX11, which was hiding issues on platforms that did not use it.

  • Improvement: Optimized the storage of Material Shader Map IDs, saving memory.

  • Improvement: Transient data for Scalar and Vector uniform expressions is now stripped in cooked builds, saving memory.

  • Improvement: Scene Captures will no longer use "Capture On Movement" if "Capture Every Frame" is enabled. This prevents the capture from happening twice in a single frame.

  • Improvement: Optimized shader preprocessing by re-routing memory allocations to Unreal allocators (Windows only). It speeds up ShaderCompilerWorker by almost three times in test cases using Fortnite shaders and all local compilation. For example, in basic benchmarking, the Preprocess step went from 65% of wall time to less than 10%. For XGE, the difference is likely smaller in practice since XGE seems to introduce massive stalls during process startup for the first few jobs starting on a remote worker.n

  • Deprecated: PrimitiveType is now deprecated on all RHI calls to RHIDraw*Primitive*, as the PSO controls the type. Those methods no longer take the parameter in.


  • Bug Fix: Allowed Separate Translucency with alpha channel support in post processing.

  • Bug Fix: Fixed an issue with FFT Bloom causing apparent clipping of bloom shape when the screen has a high aspect ratio. The issue was only visible when a very small (few pixels) but very bright light source would produce a large convolution bloom that covered much of the screen.

  • New: Added an "Exposure Compensation Curve" to the Post Process settings that adds a bias based on the scene luminance in EV100.

  • New: Enabled the extended exposure range settings by default for newly created projects. See our auto-exposure documentation for further details.

  • Improvement: Removed Intensity units for Sky Lights when using a Scene Capture Cubemap. The property has also been renamed to "Intensity Scale."



  • Bug Fix: Fixed ue4commandline.txt being written to engine directory during staging.

  • Bug Fix: Fixed the ability to package projects using an editor that is not under the Engine/Binaries directory.

  • Bug Fix: Used the GetHostName function in Dns rather than MachineName property in Environment to determine the hostname for matching P4 clients. MachineName is the short NETBIOS name, and may not include the ".local" suffix typical on Mac.

  • New: UAT will now always create a directory before saving encryption parameters.

  • New: UnrealPak commands are now executed in parallel, so that each pak file produces its own output log.

  • New: UE4 games will now be packaged with a copy of dbghelp.dll by default, to work around corrupt minidumps originating from Windows 10 v1709. Set WindowsPlatform.bUseBundledDbgHelp = false; from a target.cs file to disable.

  • New: Targets can now be built with parallel executor and XGE in a single UE4Build instance. Some platforms don't support XGE (but do support parallel executor), so we need to allow them to build in parallel if possible.

  • New: AutomationTool and UnrealBuildTool now require .NET 4.6.2, and have been manifested to support for file names longer than 260 characters on Windows.

  • New: The Submit method in P4Utils will always force a changelist to be submitted, even if it contains unchanged files.

  • New: Updated version of the UCRT bundled in the AppLocalPrerequisites directory to the version included with the 10.0.17763.0 Windows SDK. Newer versions of Visual Studio require functionality that is not in older versions of the CRT.


  • Bug Fix: Fixed a crash if CrashReportClient is closed before the background thread has finished symbolicating the callstack.


  • Bug Fix: Fixed missing Visual Studio version indicator on generated solution files.

  • Bug Fix: The "-NoUBTMakefiles" argument will now be respected when building UnrealHeaderTool.

  • Bug Fix: Fixed generating CMake project files on Windows.

  • Bug Fix: Fixed packaging of framework resource bundles when doing a remote build for iOS.

  • Bug Fix: Fixed target not being rebuilt when a plugin that is not required for this platform is disabled. Added log output showing why a temp target was required during packaging.

  • Bug Fix: Fixed shared precompiled headers disabling shadow variable and undefined identifier warnings, which would not be re-enabled for modules using them.

  • Bug Fix: Addressed problems with custom icons not being set correctly for projects packaged with an installed engine build. The PCLaunch.rc file was one of the precompiled object files, and was not being rebuilt with the correct icon. Additionally, any projects specifying a custom resource file would not be able to use any of the dialogs in the default PCLaunch.rc file.

  • Bug Fix: Makefile will now be invalidated if the command line arguments to UBT change.

  • Bug Fix: Fixed the user's selected Visual Studio version in the editor not being respected when generating project files.

  • New: Mac applications no longer copy third party dynamic libraries from Engine/Source/ThirdParty subfolders inside the app bundle. The required dylibs were moved to Engine/Binaries/ThirdParty subfolders or changed to be copied to Engine/Binaries/Mac via RuntimeDependencies, like their Windows counterparts do.

  • New: Added a "hybrid" executor, which uses the XGE executor for large numbers of parallel actions, and the Parallel executor for any leaf actions that will not saturate the local machine. For platforms that take a long time to link, this frees up XGE to be used for compiling other branches. To enable, set true in the BuildConfiguration.xml file.

  • New: Enabled pre-build steps to do things that may invalidate the makefile. After loading a makefile, we validate anything that can affect the pre-build scripts and execute them, then check whether the makefile is still valid for the working set of source files. If not, we discard the makefile and rebuild it (without executing the pre-build steps).

  • New: Added -ftime-trace profiler support for Clang, which outputs a JSON file containing a timeline for the compile (set WindowsPlatform.bClangTimeTrace = true from a target file).

  • New: The registry is now checked for the installation location of Incredibuild, rather than just searching the system path.

  • New: Compiler-generated dependency information and is now used for determining whether translation units are up-to-date. This ensures that the dependency list is accurate, and makes incremental builds more reliable.

  • New: Added support for building multiple targets in parallel. ShaderCompileWorker is now built in parallel with the editor by default.

  • New: Provided a better error message when trying to use a module that is not included in an installed build.

  • New: Build targets can now specify additional build products produced by post-build steps, which will be included in the manifest and target receipt. Add paths to files in the AdditionalBuildProducts list from the target constructor.

  • Improvement: The bAdaptiveUnityDisablesPCH option is now disabled by default, which improves compile times when working on a small set of files. To validate a target builds correctly with PCHs disabled, set b

  • Improvement: Modules can now disable precompiled headers entirely by setting PCHUsage = PCHUsageMode.NoPCHs.

  • Deprecated: The ModuleRules.PublicAdditionalShadowFiles list has been deprecated. Additional files may be transferred for remote building using the filter lists in Engine/Build/Rsync.

  • Deprecated: The bCompileLeanAndMeanUE flag has been deprecated. Anything explicitly using bCompileLeanAndMeanUE now uses bBuildDeveloperTools instead, and the UE_BUILD_MINIMAL macro at runtime has been removed.

  • Deprecated: Visual Studio 2015 has been deprecated, and will not be used by default. To force a target to be compiled with Visual Studio 2015, set WindowsPlatform.Compiler = WindowCompiler.VisualStudio2015 from the .target.cs file.

  • Deprecated: The UEBuildFramework class instantiated from ModuleRules classes has been renamed to Framework to decouple it from the internal representation used inside UBT. A deprecated ModuleRules.UEBuildFramework class has been added to help migration.

  • Deprecated: The UEBuildBundleResource class has been renamed to BundleResource, in order to distinguish the public API from the internal UBT representation.


  • Improvement: Refactored the device adder widget to support overriding by platforms.


  • Crash Fix: Fixed a crash when creating a new workspace if logging into the server fails.

  • Bug Fix: Fixed an issue where the main window could be created without a taskbar button.

  • Bug Fix: Fixed tiny hand cursor when hovering over a hyperlink on a high DPI monitor.

  • Bug Fix: The server address is no longer read from the p4 info command. It invalidates if a proxy is being used or if the DNS endpoint changes.

  • Bug Fix: Fixed missing Perforce login prompt if an existing ticket has expired.

  • Bug Fix: Corrected the status panel not repainting when tint color changes.

  • Bug Fix: Files open for add are no longer shown in the "Clean Workspace" list.

  • New: Settings for auto-update are now stored on a separate "Application Settings" dialog under the Options menu.

  • New: The location, size, and state of the main window will now be preserved between runs.

  • New: Added a "Filter" menu to allow customizing which changes should be displayed in the main window.

  • New: Implemented an option in the Sync Filter dialog, controlling whether to generate a solution containing all projects or just the one being synced.

  • New: We now require that the user manually clicks on a link to fetch more changes from the server. Doing so is not an automatically bounded operation, since not all changes may match the chosen filter. Searching for a previously synced change with older tabs can cause massive slowdowns and take a large amount of memory.

  • New: When browsing for the project to sync in a new workspace, we now hide *.uprojectdirs files by default.

  • Improvement: Changes are now grouped by local time zone.

  • Improvement: Detection of project settings at startup now happens in parallel to improve startup time on remote connections.

  • Improvement: Switched the order of ‘Ok' and ‘Cancel'buttons to follow Windows conventions.


  • Improvement: Various optimizations resulting in a 2-3x wall-clock time improvement for internal projects


  • Crash Fix: Clamped Volumetric Lightmap grid size so that it will not overflow int32 and crash.


  • Bug Fix: Fixed custom compressor not working in unrealpak for the -extract -list functions.


  • Bug Fix: Fixed corrupted textures on DX12.

  • Bug Fix: Fixed visual issues caused by code treating kerning values as unsigned values.

  • Bug Fix: The top/front/side options for the viewport now match the axis displayed. (X is treated as forward)

  • Bug Fix: Fixed multiple PIE windows not moving to their last-used position when opening.

  • Bug Fix: Fixed UFontFace not reporting memory correctly. It was always reporting max memory size even if the fonts were lazy loaded.

  • New: Avoiding stencil clipping on widgets that are just barely not axis aligned.

  • Deprecated:Legacy localized fallback fonts are now officially deprecated.


  • Crash Fix: Fixed a crash caused by mouse capture being instigated by a keyboard event.

  • Crash Fix: Prevent touch-dragging a widget while already dragging another one.

  • Bug Fix: Fixed Slider widget not restoring cursor after dragging when a custom cursor is set.

  • Bug Fix: Fixed issue where AnalogCursor update events did not have the proper pointer index.

  • Bug Fix: MouseLeave no longer triggers when focus changes to a widget within the game viewport while Mouse For Touch is enabled.

  • Bug Fix: Fixed race condition with Slates usage of time for materials. Time was previously accessed directly on the render thread. It is now passed from the game thread to the render thread like scene rendering.

  • Bug Fix: Combo box now correctly scrolls selected element into view when opening for the first time.

  • Bug Fix: Only include SlateDebug content when packaging with debug files included.

  • Bug Fix: Fixed Slate Widget's support in UWidgetComponent.

  • Bug Fix: Fixed TouchStarted acquiring capture with a local position, not an absolute position. This caused mouse position restoration (when Mouse as touch) to be the wrong position.

  • Bug Fix: Fixed stencil buffer based clipping not working on some platforms.

  • Bug Fix: Reduced font cache thrashing by ensuring only vital properties that invalidate atlas data are used as comparison during hashing of the font data.

  • Bug Fix: Fixed a number of font perf issues

    • Cached the desired size of a simple text block unless it invalidates

    • Removed overhead of constantly checking threads when caching fonts

    • Simplified whitespace checking

    • Added stats for font cache misses

    • Removed stray pragma disable optimization

  • Bug Fix: Made temporary copies of state brush details to draw elements to allow the memory to go away without affecting the frame being rendered.

  • Bug Fix: Tweaked when SNullContentWidget is used in the threaded loading screen. Need to avoid any time that would increment the non-thread safe shared SNullWidget across threads.

  • New: The STableRow as a new slate argument. The SignalSelectionMode affect when the OwnerTable gets notified that selection changed with a left mouse button.

  • New: The SStructureDetailsView now use the DetailsViewArgs::ColumnWidth.

  • New: Added const-correctness for UGameViewportClient::GetGameViewportWidget().

    • Modified FSlateApplication::GetPressedMouseButtons() to return a reference instead of a copy.

    • Added FInputEvent::GetModifierKeys() to allow access to the full set of modifier keys at once.

    • Added FPointerEvent::GetPressedButtons() to allow access to the full set of pressed buttons at once.

  • New: SInlineEditableTextBlocks no longer incorrectly enter edit mode when being dragged.

  • New: Optimized memory and performance rendering very long text strings by culling glyphs outside the clipping area.

  • New: Added API to update consume mouse wheel for ScrollBox.

  • New: Added MouseWheel and Gesture API to the Input Preprocessor.

  • New: Made layout changes to SWidgetDetailsView.

  • New: Previous and Next now support Wrap and Stop navigation rules.

  • New: Exposed color deficiency settings to Blueprint.

  • New: Scrollbox keyboard navigation will now recursively search each element for a focusable widget instead of checking the top-level widget and moving on.

  • New: Changed default font size for SlateFontInfo from 0 to 24.

  • New: Added an option to SCheckBox to have the checkbox content not AutoWidth.

  • New: No longer load LastResort.ttf in cooked builds.

  • New: Moved input debugging over to SlateDebugging to make it possible to log input, this replaces the defunct LOG_EVENT system in SlateApplication.

  • New: Added the first version of the console slate debugger. It hooks into the available systems in the FSlateDebugger to print information about the internal goings on of Slate, as focus changes, or as it attempts to, key presses, who is handling them...etc. Console commands to get started, SlateDebugger.Start, SlateDebugger.Stop.


  • Crash Fix: Fixed a rare crash in UMG Editor during serialization.

  • Crash Fix: Tentative fix for double-rename crash.

  • Bug Fix: Exposed named slots in child widgets can now have their contents wrapped properly.

  • Bug Fix: Fixed circular dependencies in widget BPs.

  • Bug Fix: Fixed issue where setting "draw at desired size" for a widget component to true, the "Draw size" will no longer respond to input.

  • Bug Fix: Prevented deep copy full widget tree when copy/pasting user widgets.

  • Bug Fix: Fixed replace updating the animation binding that matches the name of the widget, rather than using the animation guid.

  • Bug Fix: Hid UMG widget extensions if the widget is hidden.

  • Bug Fix: Adding a new animation to a UMG widget now prompts for compile and shows the animation in the MyBlueprint panel before recompile.

  • Bug Fix: Reset to default now handles base properties and lightmass properties correctly.

  • Bug Fix: Fixed Widget Interaction Component's trace returning the wrong widget when stacked.

  • Bug Fix: Centered the notch unsafe zone in Blueprint widget templates for iPhone XS, XS Max, and XR.

  • Bug Fix: Fixed logic for displaying matching resolutions to the selected resolution in UMG.

  • Bug Fix: Fixed Designer view showing all android screen resolutions as checked if they shared a device profile but were not the same final resolution.

  • Bug Fix: Prevent unrelated undo entries when dragging UMG widgets.

  • Bug Fix: Fixed copy and paste causing multiple transactions.

  • Bug Fix: Fixed bug where multi-touch could interrupt drag and drop without cleanly canceling the drag operation.

  • Bug Fix: Fix for widget Blueprint variable duplication when dragging and dropping to the hierarchy.

  • Bug Fix: Widgets hidden using the designer eyeball, now make it so the widgets or child widgets that are hidden don't appear selectable outside the hierarchy view.

  • Bug Fix: Fixed a bug where a copy/paste of a Widget that contains a NamedSlot in UMG Editor was incorrectly creating second copy of the widget at the NamedSlot root.

  • Bug Fix: Undo/Redo now works again on properties of UserWidget instances in a UMG hierarchy (including the root widget) - Added a couple WidgetTree static helpers for determining the child index of a PanelWidget that a given widget ultimately occupies (even if nested within other panels)

  • New: Added GetAllChildren() API to Panels.

  • New: Added setters for widget component layer properties.

  • New: Added UMG_API to FRichTextDecorator.

  • New: Added missing key handling for zoom level control.

  • New: Added more getters and setters for widget component properties.

  • New: Added clearer messaging when custom DIP scaling rules aren't set up correctly.

  • New: Fixed UMG ListView not propagating OnItemSelectionChanged events to its items.

  • New: Improved the consistency of the GetAllWidgetsWithInterface API.

  • New: Added an option to always show scrollbar track.

  • New: Added GetSelectedIndex to ComboBox.

  • New: Disabled mipmaps by default on UI texture group

  • New: Added some additional utility functions to Blueprints to make transforming things from local to absolute and abs to local easier. TransformScalarAbsoluteToLocal, TransformScalarLocalToAbsolute, TransformVectorAbsoluteToLocal, TransformVectorLocalToAbsolute.

  • New: The navigation customization no longer provides just a free textblock for widget names for explicit. Now we provide a dropdown list for widgets. When you use Custom or CustomBounds we now provide a dropdown list with all possible functions matching the signature for navigation, as well as an option to create that function for you. You can now rename functions and widgets and we now update the corresponding navigation option.

  • New: Added a new console command, Widget.DumpTemplateSizes, it gets all widget templates in memory and dumps their sizes.


  • Crash Fix: Vulkan no longer causes a crash when the SteamVR plugin is enabled.

  • Crash Fix: Fixed crash with haptic values beyond the supported range for Windows Mixed Reality.

  • Crash Fix: Fixed Stereo Layers crash when exiting a game through SteamVR's overlay menu.

  • Crash Fix: Using the Google Daydream streaming preview no longer causes a crash.

  • Crash Fix: Fixed a crash when enabling the Oculus Avatar plugin while the SDK is not installed.

  • Crash Fix: Fixed a potential crash in the experimental Mixed Reality Capture Plugin - guarded against a scenario where the world is not valid.

  • Bug Fix: Fixed outdated AMD drivers causing frame buffer corruption when using an Oculus Rift.

  • Bug Fix: Removed some code from the remote session client that was overriding the receive buffer size set by the config files.

  • Bug Fix: Fixed MRMesh normals problems - Normals should not be world scaled.

  • Bug Fix: Fixed the aspect ratio for landscape images being determined incorrectly for ARCandidateImages.

  • Bug Fix: Fixed runtime material switching on MRMesh.

  • Bug Fix: Fixed OculusHMD plugin linking to the Windows Vulkan libraries on Android platforms.

  • Bug Fix: Updated MagicLeap 4.21 redirects. Made redirectors more specific, and found a way to do the updates without the MatchSubstring package update flag warning.

  • Bug Fix: Fixed emissive decals rendering in right eye.

  • Bug Fix: Fixed an assert when having too many VR devices attached to SteamVR.

  • Bug Fix: Enabling GLES occlusion queries with mobile HDR disabled no longer causes meshes in view to disappear.

  • Bug Fix: Fixed a threading bug with the async GPU compression on iOS. Added support for a synchronous path to augment the async path.

  • Bug Fix: Fixed a bug where the menu button on the left Oculus Touch controller was mapped to Special Right instead of Special Left.

  • Bug Fix: Fixed log spam if Move Motion Controller is turned off during launch on PS4.

  • Bug Fix: Fixed log spam coming from AllocateDepthTexture in OculusHMD.

  • Bug Fix: Fixed a race condition in late update handling on AR and VR platforms.

  • Bug Fix: Removed the face mirroring setting from the ARKit settings class since it had a setting in the session config object. Changed the code to use the session config setting.

  • Bug Fix: Fixed console visibility in HMD with Vive on Mac. IStereoLayer now has an accessor to tell the DebugCanvas if it should copy the Debug layer, and the FDefaultStereoLayers version returns false.

  • Bug Fix: Fixed a bug preventing the user from reactivating a game after dismissing the "Place phone into daydream headset" dialog.

  • Bug Fix: SteamVR will now be restarted if it was shutdown while UE4 is running and a play-in-editor session is started.

  • Bug Fix: RemoteSession / VirtualCamera fixes.

    • Mapped OnTouchFirstMove / OnTouchForceChanged handlers.

    • Removed AR input from VCam.

  • New: Spatial anchor support, planes support for Lumin/MagicLeap.

    • Refactoring so Lumin implements the generic AR API, rather than only its own custom implementations (previous implementation will still work).

    • Added planes detection. Inner planes are not yet supported.

    • ARLineCheck works with extents or bounds. There is no 'ground plane' check now.

    • Added Pins/Anchors.

    • Added a new 3d line check (where you specify start and end point for the test) and is supported on Lumin and ARCore.

  • New: Instanced stereo rendering now supports rendering instanced meshes and distortions in a single pass.

  • New: Updated the GoogleARCore plugin and the GoogleARCoreServices plugin to the ARCore 1.6 release.

  • New: Updated Oculus plugins to the 1.32 release.

  • New: ARKit plugins are no longer experimental.

  • New: Added a stat to track the amount of CPU usage that ARKit and supporting threads use in total. ("stat arkit" to see it)

  • New: Added native Android systrace support.

  • New: Enabled ICU on Lumin.

  • New: Created MockDataMeshTrackerComponent to generate mesh data for MRMesh so it can be tested without an AR device.

  • New: Collision clearing on MRmesh.

    • Added support for generic runtime collision modification of MRMesh collision.

    • Generic Blueprint collision settings now work on MRMesh.

  • New: Added support for 6DOF motion controller tracking on Daydream.

  • New: First pass at Face AR networking support.

  • New: Added code to expose the Apple ARKit settings object to the project settings.

  • New: Added methods to get points from the point cloud inside or outside of a box in order to draw included and excluded points. Updated the movement controls, moved to the corresponding objects, and functionalized things.

  • New: Implemented vr.PixelDensity for Magic Leap.

  • New: Added support for trigger axis values for Windows Mixed Reality.

  • New: Added a stub API call to return the passthrough camera UVs to C++ code. Currently only implemented by GoogleARCore and not fully tested.

  • Improvement: Gave Install/Uninstall MPK batch files execute permissions on Mac by default.

  • Improvement: Added options to the file writer support to log face curve data as it is tracked.

  • Improvement: Improved the detected image debug drawing code.

  • Improvement: Added thread priority overrides when running an ARKit session so that ARKit has more CPU time available for better tracking.

  • Improvement: Added PostEditChange to UARCandidateImage to enforce proper aspect ratios of physical size with the image data.

  • Improvement: Added a device id in addition to subject name so that we can detect when a device changes its subject name.

  • Improvement: Changed how face AR curves use timestamps when receiving cross platform so that there isn't a local mismatch that causes dropped frames.

  • Improvement: Decoupled AR object timestamps and frame numbers from the game thread update rate.

  • Improvement: Changed how UAppleARKitTextureCameraImage is used when wrapping the underlying AR image. (reuse the object)

  • Improvement: Fixed some autorelease pool problems in the Apple image utils exposed by fixing lifetimes.

  • Improvement: Added a check for a missing ARSessionConfig object when starting an AR session. An error message is displayed if the ARSessionConfig is not found.

  • Improvement: Added checks for device support before enabling certain remote session channels.

  • Improvement: Simplified the shader setup for remote AR image rendering.

  • Improvement: Added a check to see if an AR session is running before automatically starting a session for the AR remote channels.

  • Deprecated: Marked the temp ARKit code from the 4.18 release as deprecated. It will be deleted in 4.23

  • Deprecated: Oculus-specific Stereo Layers (aka "splash screen") functions have been deprecated in the Oculus Function Library to bring them more in line with how they work on all XR platforms. You should update any code/Blueprints using the deprecated functions, as support in the SDK has been removed - they no longer function and instead throw errors when used in Play in Editor/Play in VR modes. The generic UStereoLayerFunctionLibrary functions should be used instead.

  • Deprecated: Google cardboard support is no longer available on iOS, and is no longer enabled by default on Android.

  • Removed: OSVR is no longer in development and has been removed.


  • Crash Fix: Fixed crash when there are too many pending tasks in ImageWriteQueue.

  • Bug Fix: Fixed Visual Studio 2017 compile errors with bStrictConformanceMode (/permissive-).

  • Bug Fix: FGenericPlatformMemory::DumpStats now properly reports free virtual memory.

  • Bug Fix: Added a slow scope to the "obj list" command to prevent the hang detector crashing the game while "obj list" is running.

  • Bug Fix: Fixed a bug in the hang detector which was causing it to fire even when it should have been disabled by a slow scope.

  • Bug Fix: Fixed a stack stomp / broken reference crash in FEngineLoop::Tick.

  • Bug Fix: Added a fix for CMake errors when using CMake on Windows with the Steam SDK installed.

  • Bug Fix: Added support to default an Xcode 10 workspace to the Original (legacy) build system type, since the new system doesn't work well with UE4.

  • Bug Fix: Fixed an issue with serialized case-insensitive hashes of wide character strings containing accent characters (128-255) which caused Blueprints to not be able to be opened after conversion from an old version.

  • Bug Fix: Fixed function ComputeProjectedSphereShaft to return false when bound range is less than or equal to 0.

  • Bug Fix: Fixed ability to build lighting using Swarm from an editor built with a unique build environment.

  • Bug Fix: Disabled the Windows application error dialog when running with -unattended.

  • Bug Fix: Webm: Fixed some issues with audio synchronization.

  • Bug Fix: Fixed an issue with PlatformProcess::GenerateApplicationPath() always assuming the engine is in ../../Engine. This is not necessarily true for builds with a unique build environment.

  • New: Modified FSocket API to expose setting the multicast outgoing interface with SetMulticastInterface, and provided overloads to specify the network interface when joining and leaving multicast groups (JoinMulticastGroup / LeaveMulticastGroup).

  • New: Image Sequence Media Player no longer creates threads while the Plugin is being loaded.

  • New: Added an error message when building on versions of UE4 known to be affected by code generation bugs (see https://developercommunity.visualstudio.com/content/problem/345511/bad-code-generation-in-vs-2017-v1585.html).

  • New: SetMouseSensitivity console command now takes one argument again.

  • New: Timespan value is now clamped inside the wait function of the Event class.

  • New: Modified FPngImageWrapper to allow for multiple threads to compress PNGs at the same time on all platforms except Android.

  • New: Warnings for class member initializers being reordered (C5038) are now treated as errors on Windows.

  • New: FARFilter will now exclude classes when no classes are listed.

  • New: TRUE and FALSE macros are now undefined by default to prevent non-portable code. Use Windows::TRUE and Windows::FALSE instead, or include "Windows/AllowWindowsPlatformTypes.h".

  • New: The editor now builds cleanly with Clang 7.0.1 on Windows.

  • Improvement: Optimized DoesPackageExist to check the most likely file extension first.

  • Improvement: Large compile speed improvement due to large number of global begin()/end() overloads. These methods are now implemented as member functions on UE4 containers. Measured to save 20-40% compile time on files in the engine that use range-based for.

  • Improvement: The new MeshDescription API has been slightly simplified. When creating polygons with CreatePolygon[WithID], any extra edges required are generated automatically.

  • Removed: Code to filter out files for other platforms has been removed in GitDependencies.exe. This behavior can be useful to reduce download size, but is very non-intuitive to troubleshoot when remote IOS builds or cross-compiling Linux builds. The -exclude=(DirectoryName) argument can still be used to explicitly exclude folders.

Upgrade Notes


  • New: Removed signing key generation functionality from unrealpak. Keys should be generated with the CryptoKeys plugin in the editor now. Any legacy processes that relied on generating an RSA key using the brute force functionality in unrealpak should be modified to use the functionality exposed by the cryptokeys plugin.

  • Removed: Removed deprecated "DebugBreak-" functions. Previous code using the deprecated functions should be updated to use the UE_DEBUG_BREAK macro.


Media Framework

  • New: Upgraded AJA SDK to ntv2sdkwin_15.0.1.1. Make sure you update the device firmware.


  • New: The new Steam advertising filters for each Steam API function is as follows:

  • SetGameTags: ViaOnlineService (just this alone). It contains session flags and the build id as specialized cases.

  • SetGameData: ViaOnlineService + ViaOnlineServiceAndPing (No change)

  • SetKeyValue: ViaOnlineService + ViaPing + ViaOnlineServiceAndPing (No change)


  • New: Refactored the CSV Profiler to allow continuous streaming of CSV data to disk, reducing the in-memory overhead to almost nothing. Also added support for GZip compression of the output file.

  • In order to support streaming of the file to disk, we use a format where new stats are appended to the end of subsequent CSV rows after they are encountered. A complete header row with all the column names is written at the end of the file, immediately before the metadata. Tools that are processing CSV files must be aware of reading the complete header row from the end of the file in this case. An extra metadata field "[HasHeaderRowAtEnd]" indicates if the header row should be taken from the end of the file.



  • Bug Fix: We have removed all support for Metal prior to Metal 1.2 on iOS/tvOS and Metal 2.0 on macOS. This permits some fairly radical simplifications and removal of a number of workarounds.

    • All Buffer<>/RWBuffer<> objects are now bound as texture2d or texture_buffer, unless they are 3-component, in which case they are bound as raw T* buffer pointers.

      • 3-component Buffer/RWBuffer objects now work as expected.

      • Metal needed to use packed_* types internally as normal 3-component types in Metal are the same size as 4-component types, which is different from HLSL.

    • Texture Gather/GatherCompare operations have been fixed.

    • Removed all the TypedBufferFormat function-constant specialisation infrastructure and metadata as it is no longer necessary.

    • Removed all the raw-conversion for 1, 2 and 4 component vector types as it is no longer required.

    • Fixed input qualifiers (centroid, linear, etc.) for Fragment shader inputs.

    • Removed Metal-specific shader changes due to buffer type casting and swizzling, as they are no longer needed.

    • We now use the BGRA vertex format for FColor on Metal when available (everywhere but iOS/tvOS 10 using Metal 1.2).

    • ShouldCompilePermutation and similar functions are simplified now that there are fewer versions to support.

  • New: The "Sample Field" Niagara Data Interface function for the Vector Field Data Interface now assumes the sample position is in world space instead of being normalized to the bounding box of the vector field.

  • New: There is a change to the user interface of the SampleCurlNoiseField module. There are now three main parameters to this module:

    • Strength: A global multiplier on the sampled vectors

    • Offset: An offset used to pan the input

    • Length Scale: A scale describing the typical distance between coils/vortices

  • New: Any Niagara modules relying on exact comparison of Particles.Age and Particles.Lifetime should be converted to fuzzy compares.

  • New: We now limit building of WebRTC Proxy to just Win64.

  • New: Mac projects now require macOS 10.13.6 & Metal 2.0. iOS/tvOS projects now require iOS/tvOS 10 & Metal 1.2. These are the defaults for new projects. For existing projects, open the Project Settings and ensure that:

    • Metal 1.2 is selected for 'Metal Shader Standard' for iOS.

    • iOS 10 is selected for 'iOS Version' for iOS.

    • Metal 2.0 is selected for 'Metal Shader Standard' for Mac.


  • New: Added more accurate error messages to Unreal Front End.


  • Bug Fix: Lightmass can now utilize more than 64 logical cores on Windows. If you have previously distributed Swarm Agent to your worker machines, you will also need to reinstall them


  • New: Programs need to build with support for developer tools in order to get all SlateEditorStyle code. Make sure bBuildDeveloperTools is set to true in your program's Target.cs file if you need all styles.


  • New: Projects can now specify the default root panel widget type of new widgets. By default, all new Widget Blueprints have a Canvas Panel at the root. (We recommend that users familiar with UMG set it to "None".)


  • New: Changed the current implementation of FindWidgetWindow as it is generally unsafe to call when arranging slate widgets would be illegal, such as during modal dialogs or from other threads. GeneratePathToWidget still gets the parent window and the full path. FindWidgetWindow no longer returns a path, and uses parent pointers to find the parent window safely and more efficiently.

  • Deprecated: Deprecated SEditableLabel and removed all instances of it. It is functionally identical to SInlineEditableTextBlock.


  • New: The Leap Motion plugin, which has been upgraded to version 3, breaks compatibility with previous versions of the plugin. Please visit https://github.com/leapmotion/LeapUnreal/releases for more information.

  • New: Updated minimum SDK support for Magic Leap to 0.19.

  • Removed: Removed StereoPair in favor of merging visibility maps into the instanced view. Any function that previously required a StereoPair now needs the Instanced View.


  • Bug Fix: Serialize functions called from inside arbitrary preprocessor block now throw an error. If you encounter this new error, move the Serialize() function from your class outside of any custom preprocessor blocks. If no custom serialization is required, guard the internal contents of your function.

  • New: Moved SQLite database support into its own plugin.

  • New: Added UE_NONCOPYABLE macro to easily disable copy and move operations for a type

  • Deprecated: Renamed FSQLiteDatabase to FSQLiteDatabaseConnection to be consistent with other implementations.

  • Deprecated: Moved ADO database support into its own plugin.

  • Deprecated: Moved remote database support into its own plugin

  • Removed: Removed UObject::NotifyObjectReferenceEliminated and the HadReferenceKilled internal object flag. (This code was never enabled by default.)


  • New: Added a new serializable TStructOnScope which is a Type restricted FStructOnScope.

  • New: Modified FActorComponentInstanceData to be serializable so it can persist or be sent over the wire. Not all ComponentInstanceData properties has been properly converted to UPROPERTY yet.

  • New: Made EditorEngine::AllViewportClients and EditorEngine::LevelViewportClients private. Added an event when the list changes.

Gameplay Framework

  • New: UWorld's memory footprint has been reduced.

  • New: FKeyHandleMap now stores a parallel TArray of KeyHandles in index order. This allows in-order iteration of key handles and optimized lookups of key handles by index.

  • New: FIndexedCurve now exposes Get/SetKeyTime and Shift/ScaleCurve at the base class, removing duplicate code in the process. FKeyHandleMap::Add/Remove now manages KeyHandlesToIndices in a consistent place rather than the Add/Delete key of each curve type implementing it.

  • Deprecated: Moved SceneCapture's visual components (mesh and frustum) to SceneCaptureComponent and subclasses


  • New: Extended FTextStringHelper support for lossless conversion of an FText instance into an FString (and back again).

    • In addition to the text literals and invariant data that it previously supported, it now has support for generated texts too, which are handled via the LOCGEN_X family of macros.

    • They should now covert almost any value that an FText can be generated from, and allows things like fully formatted messages to be sent as an FString before being re-generated in a culture correct way by the receiver.


  • Bug Fix: Improved robustness of network packet acks to avoid false reports of lost packets due to dropping packets containing acks. Each outgoing packet now includes a history of received packets.

  • Bug Fix: Fixed IPv6 scope interfaces leaking into the raw address byte arrays.

  • New: Optimized Replication Shadow State data. Previously, we would create copies of an entire UObject's memory, even though we only cared about the replicated properties. This change allows us to only pack and store replicated properties, reducing memory needs on clients and servers.

  • New: The GetTypeHash method on FInternetAddr is now const.


  • New: XMPP supports non-anonymous rooms by storing the room member's full JID as FXmppChatMember::UserJid.



  • With this engine release the Target SDK now defaults to 26 which requires asking for permissions at runtime before using certain features, like the microphone or camera. You may change this back to previous behavior by changing Target SDK in Android project settings to 22.

  • Since 26 is now the minimum requirement for submitting to the Google Play Store you should consider adding code to use the Android Permission plugin (enabled by default) to check for and request permissions before using certain features. You may either do this in C++ or in Blueprints.


  • Bug Fix: Fixed an invalid pointer lock error in SDL2 wayland when no pointer device was found


  • Bug Fix: The Windows hardware survey no longer relies on information from DxDiag, which could stall the process. The Mac hardware survey now correctly reports Metal as the active RHI.

  • New: Created of a framework to write the high level rendering code into passes organized in a direct acyclic graph. Also unified the uniform buffer, shader parameters, and pass parameters to the same single API structures with runtime metadata to have it interpreted by different components.

  • New: Projects should no longer use SetRenderTargets and similar functions. All rendering should go through the renderpass API.

  • New: The overview and guide to use the new FShaderPipelineCache system can be found here: https://docs.unrealengine.com/en-us/RenderingAndGraphics/PSO-Caching

  • Removed: Removed obsolete FShaderCache - use FShaderPipelineCache instead.


  • New: Projects targeting Steam releases no longer require source code edits to properly register their dedicated servers on Steam. This change also enables setting the application ID for shipping projects without further modifications to source as well. The following macros have been added and should be defined in the project's Target.cs file:

    • For projects that use dedicated servers, these must be defined for your servers:




    • Clients for dedicated server projects must have the following defined:


    • All Steam-based projects must have the following defined:


Please refer to the Steam project documentation regarding setting these flags and their appropriate values.

Known Issues

For a complete listing of known issues affecting Unreal Engine 4.22, 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