Unreal Engine 4.21 Released!


What’s New
Unreal Engine 4.21 continues our relentless pursuit of greater efficiency, performance, and stability for every project on any platform. We made it easier to work smarter and create faster because we want your imagination to be the only limit when using our tools. And we battle-tested the engine on every platform until it met our developers’ high standards so your project will shine once it is ready for the masses.

We are always looking for ways to streamline everyday tasks so developers can focus on creating meaningful, exciting, and engaging experiences. Our industry-leading Niagara effects toolset is now even more powerful and easier to use, enabling you to dream up the next generation of real-time visual effects. You can build multiplayer experiences on a scale not previously possible using the now production-ready Replication Graph functionality. Iterate faster thanks to optimizations with up to a 60% speed increase when cooking content, run automated tests to find issues using the new Gauntlet automation framework, and speed up your day-to-day workflows with usability improvements to the Animation system, Blueprint Visual Scripting, Sequencer, and more.

We strive to make it possible for your creations to be enjoyed as you intended by everyone, everywhere regardless of the form factor they choose. Building on the previous release, we have added even more optimizations developed for Fortnite on Android and iOS to further improve the process for developing for mobile devices. Now in Beta, Pixel Streaming opens a whole new avenue to deploy apps in a web browser with no barrier to entry and no compromise on rendering quality. We have also improved support for Linux as well as augmented, virtual, and mixed reality devices.

In addition to all of the updates from Epic, this release includes 121 improvements submitted by the incredible community of Unreal Engine developers on GitHub! Thanks to each of these contributors to Unreal Engine 4.21:

aaronfranke, adamrehn, acourreges, yaakuro, Koderz, cmp-, dorgonman, DSCriErr, Dzuelu, BillEliot, erikdubbelboer, fieldsJacksonG, francoap, nonlin, haowang1013, homerhsing, IlinAleksey, erebuswolf, Josef-CL, thejhnz, kallehamalainen, KelbyG, aylaylay, LizardThief, lucaswall, maiself, malavon, slonopotamus, moadib, surakin, marshal-it, user37337, TheCodez, KristofMorva, mamoniem, phoenxin, projectgheist, grafikrobot, rlabrecque, Vatyx, Acren, scahp, SRombauts, tomix1024, ttavis, Truthkey, wlawski, zenoengine

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

Major Features
Niagara Platform Support and Usability Improvements
In our continuing effort to provide industry-leading effects tools, Niagara has received an expanded feature set, substantial quality of life improvements, and Niagara effects are now supported on Nintendo Switch!


GPU-Only Texture Sampling in Niagara
You can now sample a 2D texture or a pseudo-volume 2D texture in your particle scripts! Create amazing effects such as rendering the scene’s depth, color and normal information using a Scene Capture Actor and use that to reconstruct the environment within a Niagara particle system with the particles’ potential and kinetic energy visualized as emissive light.

Check out the Niagara level in the Content Examples project to see how this feature works!

Niagara Skeletal Mesh Data Interface Improvements
There are new functions you can use in the Skeletal Mesh Data Interface enabling direct sampling of a Skeletal Mesh’s vertex data as well as access to specific Bones or Sockets on the Skeletal Mesh.

Ribbon Particle Performance Improvements
Ribbons now generate the ribbon geometry on the GPU instead of the CPU, improving overall performance.

GPU Simulation Support in Niagara
GPU simulation of Niagara effects is now supported on all non-mobile platforms.

Simplified System and Emitter Creation
Niagara now includes friendly dialogs that make creating systems and emitters easier than ever! You can create new emitters and systems from a curated set of templates to speed up development and ensure best practices. [TABLE]



Pendulum Constraint
This constraint solves with physics forces, optional spring drivers, and includes potential energy calculation. You can now create exciting, dynamic effects such as spawning particles with inherited velocity if the energy exceeds a specified threshold:

Module Additions and Improvements

  • Generate and receive death events

  • Now factoring mass into multiple modules

  • New SampleSkeletalMeshSkeleton, SampleSkeletalMeshSurface, SkeletalMeshSkeletonLocation and SkeletalMeshSurfaceLocation modules to complement enhancements to the Skeletal Mesh Data Interface

  • New AddVelocityInCone module

  • New Force modules: FindKineticAndPotentialEnergy, GravityForce, SpringForce and multiple usability tweaks to other forces

  • New KillParticlesInVolume module

  • New SpriteRotatationRate module

  • New RecreateCameraProjection module for using render targets and camera transforms to turn scene captures into deformable particle systems

  • New modules for sampling textures: SamplePseudoVolumeTexture, SampleTexture, SubUV_TextureSample, and WorldAlignedTextureSample

  • New utility modules for temporal interpolation and frame counters

  • Many new dynamic inputs and functions

New: Replication Graph
The Replication Graph Plugin makes it possible to customize network replication in order to build large-scale multiplayer games that would not be viable with traditional replication strategies. For example, Epic’s own Fortnite Battle Royale starts each match with 100 players and roughly 50,000 replicated actors. If each replicated actor were to determine whether or not it should update across each client connection, the impact on the server’s CPU performance would be prohibitive.

The Replication Graph Plugin solves this problem by offering an alternate strategy geared specifically for high-volume multiplayer games. This works by assigning actors to Replication Nodes, which store precalculated information that clients can use to retrieve lists of actors that need to be updated, saving the CPU of recalculating the same data for many clients on every frame. In addition to the standard nodes that ship with the Engine, developers can write their own nodes to fit the specific needs of actors within their games.

New: Optimizations for Shipping on Mobile Platforms
The mobile development process gets even better thanks to all of the mobile optimizations that were developed for Fortnite’s initial release on Android, in addition to all of the iOS improvements from our ongoing updates!


Improved Vulkan Support on Android
With the help of Samsung, Unreal Engine 4.21 includes all of the Vulkan engineering and optimization work that was done to help ship Fortnite on the Samsung Galaxy Note 9 and is 100% feature compatible with OpenGL ES 3.1. Projects that utilize Vulkan can run up to 20% faster than the same project that uses OpenGL ES.

Config Rules System for Android
The Android Config Rules system can now be used to help catch issues very early in a project start up process. This tool allows for quickly checking for device support and providing either a warning or error dialog to the user if there are issues discovered, such as an out of date driver or unsupported GPU. Any variables set may be queried later in C++ with FAndroidMisc::GetConfigRulesVariable(TEXT(“variablename”)).

To use this system, a configrules.txt rules file is optionally placed in your project’s Build/Android directory and UPL is used to add a Gradle task to use the ConfigRulesTool to compress and optionally encrypt it during packaging the APK. More details can be found in the engine documentation.

Program Binary Cache for Android

The Program Binary cache can be used to help improve Shader loading performance and also reduce hitching due to Shader loading on Android devices. The Program Binary cache works by generating optimized binary representations of Shader programs on the device which are used when loading shaders during subsequent runs. Loading Shader programs from optimized binaries can also dramatically decrease Shader loading times. The Program Binary cache must be used in conjunction with the Shader Pipeline cache tool as it will populate the Program Binary cache during the initial run of your application. To enable the Program Binary cache in your project, you will need to add the following command to your AndroidEngine.ini or Device Profile.

  • r.ProgramBinaryCache.Enable=1

Note: Some devices do not support the required program binary extension, such devices will fallback to the previous behavior.

Emulated Uniform Buffers on Android
You can now use Emulated Uniform Buffers for projects that target the OpenGL ES3.1 feature level, significantly reducing memory usage and improving rendering performance depending on your application complexity. Emulated Uniform Buffers have also been optimized to help reduce the size of the data that needs to be transferred to the GPU when your project is being packaged. To enable Emulated Uniform Buffers when using the OpenGL ES3.1 feature level, add the following line to your project’s DefaultEngine.ini under [/Script/Engine.RendererSettings]:


CPU Thread Affinity Control on Android
The ConfigRules system can register whether or not to use a supplied little core affinity mask. If enabled, the following threads will use little cores which improves battery life and evens out performance since they won’t switch between big and little cores causing possible hitches: render, pool, taskgraph, stats, taskgraph background, async loading. For details on how to set this up, see the Config Rules documentation.

Improved GPU Particle Simulation Performance on Mobile
Mobile particle effects that utilize the GPU for particle simulation have been significantly improved. You now have the option of reducing the memory usage for GPU particle simulation by limiting the maximum number of simulated particles that can be used. By default the maximum number of GPU particles that can be simultaneously simulated is set to around one million particles which will use around 32 MB of memory. You can adjust the maximum number of particles to use by adding the following code to your project’s DefaultEngine.ini under [/Script/Engine.RendererSettings]:


  • Setting the value from 512 to 256 will reduce the memory footprint to around 8 MB.

  • The SimulationTextureSize size has to be a power of 2.

  • These improvements are especially apparent on devices that use the ARM Mali GPU.

Dithered LOD Transitions
Dithered LOD transitions are now supported on mobile platforms. When enabled, objects with Materials that have Dithered LOD transitions option enabled will now fade from one Level Of Detail (LOD) to another in an almost seamless manner. By default support for Dithered LOD transitions is disabled for mobile platforms. To enable it, go to Project Settings > Rendering > Mobile and then check the Allow Dithered LOD Transitions option.

Note: Materials that have Dithered LOD transitions** enabled **will be rendered as Masked Materials. This could have a negative performance impact on mobile platforms. We recommend enabling this effect only on Masked Materials.

New: Cooker Performance
The cooking process has been optimized resulting in up to 60% reductions in cook times! Low-level code now avoids performing unnecessary file system operations, and cooker timers have been streamlined. Handling of unsolicited Assets (with regard to Asset dependencies) has also been refactored to scale better. These changes are most pronounced on larger projects (projects with more than 100,000 Assets).

New: Pixel Streaming (Beta)
Run a packaged Unreal Engine application on a desktop PC in the cloud, and stream the viewport directly to any modern web browser on any platform! Get the highest-quality rendering in lightweight apps, even on mobile devices, with zero download, zero install.
A viewport rendered by Unreal Engine, embedded within a web UI. Images and models courtesy of McLaren.

You can broadcast a single game session to multiple viewers by simply sharing a link, or send each connecting user to their own separate game session.

The web page that hosts the Engine viewport automatically sends keyboard, mouse and touch events back to the Engine. You can also customize the page with your own HTML5 UIs, using custom JavaScript events to trigger and respond to gameplay events over the wire.

For details, see Pixel Streaming.

New: Animation System Optimizations and Improvements
The Animation System continues to build on its best-in-class features thanks to new workflow improvements, better surfacing of information, new tools, and more!

Animation Compression Updates
Animation Compression times are significantly reduced by using a whitelist of optimal codecs to avoid trying permutations that are unlikely to be selected which greatly reduces the number of codecs we attempt to compress with. On multicore systems, most of the codecs now evaluate in parallel during automatic compression, further reducing the time it takes to compress an animation sequence.

The following updates were made to the Animation Compression Stat Dialog window:

  • Fixed bugs that would cause dialog to show incorrect results

  • Added compression time stat

  • Added number of compressed animations

  • Added tracking for animation with largest average error

  • Added tracking of worst 10 items instead of just worse

  • Better labeling on dialog

  • Pass through FBoneData array more instead of recalculating

Please see Compression for more information.

Animation Notify Improvements
New Animation Notifies have been added that enable you to manage the state of dynamics and cloth simulations. We have also updated Notify add/replace menus to use class pickers for better searching of BP and native notifies. To add a Notify, right-click on a Notifies track, then under Add Notify, select the type of Notify you wish to add.

Please see Animation Notifications (Notifies) for more information.

Maintain Original Scale of Root Motion
Added Use Normalized Root Motion Scale option to maintain the original scale of Root Motion. This option is on by default and is the functionality that existed prior to this Engine release. Choosing to disable this option will now use the final blended animation instead.

Please see Enabling Root Motion for more information.

Added Caching and Autocomplete for “Sync Marker” Names
When creating Sync Markers, you can now access any Sync Markers assigned to the Skeleton from the Existing Sync Markers menu option. Entering text into the search box will also filter out Sync Markers based on your text entry.


Animation Sequence Framerate
The framerate of Animation Sequences is now displayed in the Animation Tools viewport and Content Browser tooltip.


Enable Auto Blend Out on Anim Montages
Anim Montages now have the option to enable or disable Auto Blend Out. This option is enabled by default, however you can disable it which won’t auto blend out the Montage and will keep the last pose.

Please see Montage Properties for more information.

CCDIK Skeletal Control Node
Use the new CCDIK (Cyclic Coordinate Descent Inverse Kinematics) Skeletal Control Node for a lightweight, IK algorithm suited for real-time calculation of relatively short IK chains, such as shoulder to fingertip.

Please see CCDIK Skeletal Control Node for more information.

Set Master Pose Component Force Update
The Set Master Pose Component function has a second input pin called** Force Update** that can be used to skip updating all runtime info if that info is the same as the Master Component or force the updating of the runtime info. This only applies to the registration process as that can be serialized, at which point it will need to refresh all runtime data.


Please see Master Pose Component for more information.

Miscellaneous Improvements and Updates

  • Live Animation Blueprint Recompilation is now non-experimental

  • Local Space is now the default Coordinate Space for Animation Editors

  • A notification is now displayed in the Animation Tools viewport when a min LOD is being applied.

New: Gauntlet Automation Framework (Beta)
The new beta Gauntlet automation framework enables you to automate the process of deploying builds to devices, running one or more clients and or/servers, and processing the results.

You can create Gauntlet scripts that automatically profile points of interest, validate gameplay logic, check return values from backend APIs, and more! Gauntlet has been battle tested for months in the process of optimizing Fortnite and is a key part of ensuring it runs smoothly on all platforms.

Gauntlet provides new profiling helpers that can record critical performance values between two points in time in order to track missed-Vsyncs, hitches, CPU Time, GPU Time, RHI Time, Draw Calls and more. Gauntlet also provides helper functions to gather these from logs so you can generate warnings, store them in databases, or create trend lines. All of the info captured during the test is available to be output into reports any way you want.

An example of a simple report is shown below:


Each Gauntlet test is a C# script that expresses a simple configuration for your test - how many clients, how many servers, and what parameters to pass. Gauntlet takes care of allocating machines from a pool, deploying and running builds, checking for common errors such as crashes, asserts, or timeouts, and collecting log files and other artifacts.

New: Submix Envelope Follower
Users of the new Unreal Audio Engine can now set an Envelope Follower Delegate on their Submixes allowing amplitude analysis of individual channels for that submix. This will help users power visualizations and Blueprint Events based on the amplitude characteristics of their Submixed audio.


New: Filter Sound Submix Effect
Users of the new Unreal Audio Engine now have the option of adding a multimode filter to their Submixes allowing dynamic filter effects on a single Submix.



New: Sound Submix Effect Reverb Dry Level
The Submix Effect Reverb in the new Unreal Audio Engine now supports Parallel Wet and Dry Levels allowing users to dial in specific Wet/Dry ratios making the Effect usable as an Insert-Style Effect as well as a Send-Style Effect.

New: Linux Defaults to Vulkan Renderer
Linux now uses Vulkan as the default renderer when available. In the event the API cannot be initialized, the Engine will fall back OpenGL without notification.

From the Project Settings, you can use the Target RHIs to add or disable a particular RHI or use command line switches -vulkan and -opengl4 to disable the fallback.

New: Linux Media Player
You can now use the bundled WebMMedia plugin to play back .webm VPX8/9 videos on Linux platforms.

New: Linux Crash Report Client GUI
We’ve added support for the Crash Reporter GUI on Linux so you can help us continue to improve support for Linux platforms. Please submit reports when they occur, even repeated ones! It helps our engineers assess the frequency and learn what circumstances cause the crash to happen.

New: Professional Video I/O Improvements (Beta)
We continue to make it easier to get video feeds into and out of the Unreal Editor over professional quality SDI video cards. You can now work with the same Unreal Engine Project across multiple computers with different hardware setups, without changing any configuration settings in the Project.

Create a MediaProfile on each machine, and set it up to handle the video card and formats that you need to use on that computer. You can also override the Project’s timecode and genlock sources from the same panel:


When you combine the Media Profile with the new Proxy Media Source and Proxy Media Output Asset types, you can automatically redirect input and output channels between the Project’s media content and the settings in your Media Profile. When you switch to a different Media Profile — for example, on a different computer with a different media card or different wiring setup — the input and output channels from that machine’s hardware are automatically routed through the proxies so that you don’t have to change any content in your Project.

For details, see Using Media Profiles and Proxies.

In addition, this release adds:

  • A dockable Timecode Provider panel (Window > Developer Tools > Timecode Provider) that shows the Unreal Engine’s current timecode and the source that timecode is coming from:

  • https://docs.unrealengine.com/Portals/0/SharedImages/Support/Builds/ReleaseNotes/4_21/image_18.png

  • Support for 10-bit input, audio I/O and interlaced/PsF inputs.

  • A new Blackmagic Media Player Plugin that supports SDI cards from Blackmagic Design. See the Blackmagic Video I/O Quick Start.

Note: The AJA Media Player and Blackmagic Media Player Plugins are now available through the Marketplace tab in the Epic Games Launcher, instead of being installed automatically with the Unreal Engine. Their source is freely available on GitHub, to give other developers a model of how to develop video I/O plugins on top of the Engine’s Media Core APIs.

New: Geographically Accurate Sun Positioning (Beta)
In the real world, the sun’s position in the sky depends on the latitude and longitude of the viewer, the date, and the time of day. You can now use the same mathematical equations to govern the sun’s position in your Unreal Engine Level.

This is particularly effective any time you need to simulate the real-world lighting conditions for a specific place on the Earth, such as for a major architectural or construction project. However, this can also be useful for any Level that you want to exhibit realistic sun movements and positioning based on global position and time of day.

For details, see Geographically Accurate Sun Positioning.

New: Static Mesh Processing
We have added several new Static Mesh processing options inside the Unreal Editor. You can now save memory by removing unnecessary UV mappings from your Static Meshes.

In addition, using Python and Blueprint scripts that you run inside the Unreal Editor, you can now:

New: Blueprint Usability Improvements
The Blueprint Graph editor now features “Quick Jump” navigation enhancing the existing bookmark feature by enabling users to save their current location and zoom level in the Blueprint Editor with CTRL + [0-9]. They can then quickly return to that graph at that location and zoom level by pressing SHIFT + [0-9] whenever the Blueprint editor window is open, even when working in a different Blueprint Asset. “Quick Jump” bookmarks persist across Editor sessions, and are local to the user/machine.

Users now have the ability to insert pins before or after a target pin for Sequence nodes via the context menu, rather than only being able to add them onto the end.

Monolithic engine header file exclusion from nativized Blueprint class C++ code is now available as a Project Setting. This can help to reduce the overall code size of the monolithic game EXE file, if code size is an issue. The option can be found at Project Settings->Packaging in the “Advanced” section under the “Blueprint Nativization Method” option. This option is disabled by default to maintain compatibility with existing objects.

New: Improvements to HTML5 Templates
HTML5 projects now use separate HTML, JavaScript, and CSS templates replacing the previous monolithic template file! Custom template files are also supported on a per-project basis:





The build process will automatically pick the project’s path or otherwise fallback to the Engine’s version.

This is based on GitHub PR#4780.

New: HTML5 README Files Updated
The HTML5 README file has been split up into multiple README files based on category:

  • Building UE4 HTML5

    • Get Source Files

    • Compiling Support Programs

    • Compiling UE4 Editor

    • Run UE4 Editor

    • Package The Project For HTML5

    • Test The HTML5 Packaged Project

  • Debugging UE4 HTML5

    • How To Dump The Stack And Print From Cpp

    • BugHunting GLSL

  • Emscripten and UE4

    • EMSDK

    • Emscripten toolchain and Thirdparty libraries

    • UE4 C# scripts

    • Test Build, Checking In, and CIS

New: Improved IPv6 Support
Support for IPv4 and IPv6 has been merged into a single socket subsystem, where previously support for each protocol was isolated to a specific subsystem. This allows platforms that used one of the BSD subsystems to support both IPv4 and IPv6 at the same time, and do it transparently to the calling code.

New: DDoS Detection and Mitigation
DDoS (distributed denial of service) attacks typically hinder game servers by flooding them with so many packets, that they are unable to process all of the packets without locking up and/or drowning out other players’ packets, causing players to time out or to suffer severe packet loss which hinders gameplay.

Typically these attacks use spoofed UDP packets, where the source IP is unverifiable. This optional DDoS detection focuses specifically on this situation, detecting/mitigating DDoS attacks based on configurable thresholds of spoofed UDP packets, which do not originate from an existing, known client connection. This is not a guarantee that servers will be safe from all attacks, since it’s still possible that a heavy attack can overwhelm the hardware or OS running the server.

New: Physics Interface Updates
The Physics Interface has been refactored to support an increased ownership of physics objects at the high level. As a consequence of these changes, we have deprecated the Async Scene which was only recommended for use with APEX Destruction. You can still achieve the same visual results using the Sync Scene.

As a result of these changes, much of the physics related C++ code API has changed. Functionally the API is the same and you should be able to use it very similarly to how you currently use it. We’ve made changes to the Physics Interface with the goal of a) reorganizing dependencies into one controlled place, and b) creating a common model for physics interactions when interacting with Unreal.

Please see 4.21 Physics Technical Notes for more information.

New: Pipeline State Object (PSO) Caching
We now support Pipeline State Object (PSO) Caching on Metal (iOS/Mac), DX12 and Vulkan platforms. PSO caching helps reduce any hitches your project might encounter when a Material requires a new Shader to be compiled. PSO Caching creates a list of all the needed Shaders that are required by the Materials which is then used to help speed up the compiling process of these Shaders when they are first encountered by your project. PSO Caching can be enabled in the Project Settings > Packaging section.

To find out more information about how to setup and use PSO caching in your UE4 project, make sure to check out the PSO Cachingdocuments.

New: Physical Lighting Units Updates
We have improved the workflow and usability for Physical Lighting Units based on feedback provided by the community. As part of these updates, the following changes have been made:

  • All light types now display their units type next to the Intensity value.

  • Directional Lights are now displayed in LUX with increased intensity range.

  • Sky Light intensity is now displayed in cd/m2 with increased intensity range.

  • Post Process Auto-Exposure settings can be expressed in EV-100 for an extended range of scene luminance. This can be enabled via Project Settings.

  • The Pixel Inspector can now display pre-exposure for Scene Color. This can be enabled via Project Settings.

  • HDR (Eye Adaptation) Visualization has been refactored in the following ways:

    • HDR Analysis picture-in-picture display over the current scene view allowing adjustments with instant feedback.

    • Visualization is now expressed in EV100.

    • Pixel Inspector-like feedback has been removed.

For additional information, see Physical Lighting Units.

New: Sequencer Event Track
The Sequencer Event Track has been completely refactored so that Events are now more tightly coupled to Blueprint graphs which makes it a much more familiar user-experience and more robust. By utilizing Blueprints and Interfaces, this offers better control and stability compared to the previous implementation which used struct payloads and anonymous named events.

Please see Event Track Overview and Calling Events through Sequencer for more information.

New: Geometry Cache Track (Experimental)
The new (and experimental) Geometry Cache Track allows you to scrub through a Geometry Cache and render it out with frame accuracy.

Please see Using the Geometry Cache Track for more information.

New: Sequencer Audio Bakedown (Beta)
You can now bake down the audio into a Master Audio Submix from the Render Movie Settings window. The process of baking audio occurs in a separate render pass and exports the audio in the sequence to a single file when you render a movie.

Please see Render Movie Settings for more information.

New: Sequencer Guide Marks
You can now lay down vertical guide marks on the timeline to use for snapping or identifying key points in your timeline.


Please see Using Frame Markers in Sequencer for more information.

New: Windows Mixed Reality Support
Unreal Engine 4 now natively supports the Windows Mixed Reality (WMR) platform and headsets, such as the HP Mixed Reality headset and the Samsung HMD Odyssey headset. To use our native WMR support, you must be on the April 2018 Windows 10 update or later, and have a supported headset. For more information on how to get up and running, see Windows Mixed Reality Development.


Image courtesy of HP

New: Magic Leap Qualified Developer Release Support
Unreal Engine 4 now supports all the features needed to develop complete applications on Magic Leap’s Lumin-based devices. We support rendering, controller support, gesture recognition, audio input/output, media, and more. For more information on how to be become a developer, please check out https://www.magicleap.com/.


New: Oculus Avatars
The Oculus Avatar SDK includes an Unreal package to assist developers in implementing first-person hand presence for the Rift and Touch controllers. The package includes avatar hand and body assets that are viewable by other users in social applications. The first-person hand models and third-person hand and body models supported by the Avatar SDK automatically pull the avatar configuration choices the user has made in Oculus Home to provide a consistent sense of identity across applications. For more information, see the Avatar SDK Developer Guide.

New: Round Robin Occlusions
Unreal Engine 4 now supports Round Robin Occlusions. With the newly added vr.RoundRobinOcclusion flag enabled, stereoscopic frames will kick off occlusion queries for one eye per frame using an alternating scheme (i.e. odd frames only kick off queries for the left eye, and even frames only kick off queries for the right). This approach cuts the number of occlusion draw calls per frame by half. In some situations, this improves performance significantly.

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

  • IDE Version the Build farm compiles against

    • Visual Studio: Visual Studio 2017 v15.6.3 toolchain (14.13.26128) and Windows 10 SDK (10.0.12699.0)

      • Minimum supported versions

        • Visual Studio 2017 v15.6

        • Visual Studio 2015 Update 3

    • Xcode: Xcode 9.4

  • **Android: **

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

  • HTML5: Emscripten 1.37.19

  • Linux “SDK” (cross-toolchain):

    • v12_clang-6.0.1-centos7

  • **Lumin: **0.16.0

  • Steam: 1.39

  • SteamVR: 1.39

  • Oculus Runtime: 1.28

  • Switch:

    • SDK 5.3.0 + optional NEX 4.4.2 (Firmware 5.0.0-4.0)

    • SDK 6.4.0 + optional NEX 4.6.2 (Firmware 6.0.0-5.0)

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • PS4:

    • 6.008.001

    • Firmware Version 6.008.021

    • Supported IDE: Visual Studio 2017, Visual Studio 2015

  • Xbox One:

    • XDK: June 2018 QFE-4

    • Firmware Version: June 2018 (version 10.0.17134.4056)

    • Supported IDE: Visual Studio 2017

  • macOS: SDK 10.14

  • iOS: SDK 12

  • tvOS: SDK 12

Release Notes

  • Crash Fix: Fixed AI asset factories crashing if WorldSettings.bEnableAISystem = false.

  • Bug Fix: Fixed navmesh tiles being calculated wrong for larger agents.

  • Bug Fix: Fixed NavigationSystemConfigs not respecting GEngine->NavigationSystemClassName’s value.

  • Bug Fix: UNavModifierComponent now correctly handles FKConvexElems.

  • New: Extended UAIPerceptionSystem’s “OnEvent” functions to enable users to override the “Sense” class that any given stimuli is directed at. The main use case for this is extending AIModule-implemented AI senses while still using the same stimulus event structures.

  • New: Added a GetTypeHash override for FGenericTeamId so that it can be used in a UPROPERTY TMap.

  • New: Hooked AISystemBase into the FGameModeEvents::OnGameModeMatchStateSetEvent(). It can be utilized by overriding AISystemBase.OnMatchStateSet function.

  • New: Added a function to PerceptionSystem that allows you to register a given Actor as a source with all registered senses, all in one call.

Behavior Tree

  • New: Error logging has been added for the BT task “Run Behavior Dynamic” if it’s executed with a subtree containing root-level decorators.

  • New: Added new BT task node “Finish With Result” that instantly finished when achieving a given result.

  • Improvement: Comments on root-level decorators now have clearer descriptions.

Debugging Tools

  • Crash Fix: Fixed an issue in EQS that was causing crashes if the EQSPawn was being used with a query in BP-implemented contexts.

  • Improvement: Extended VisLog’s functionality with a way to log arrows and to mass-log boxes.


  • Bug Fix: Made sure we pass the Querier over to the GetQueryFilter call when we’re constructing a meta navigation filter with UNavigationQueryFilter::GetQueryFilter.

  • Bug Fix: Fixed FPImplRecastNavMesh::ProjectPointToNavMesh needlessly allocating nav query’s node pool.

  • Bug Fix: Fixed NavigationSystemModuleConfig::CreateAndConfigureNavigationSystem to not complain if no nav system instance gets created.

  • Bug Fix: Fixed ‘Navmesh needs to be rebuild’ warning erroneously flashing during PIE.

  • New: Optimized how we check if a path needs updating due to GoalActor movement.

  • New: Added a way to offset navmesh tiles’ origin. Can be used to align tiles with game specific world subdivision (world tiles, rooms, logical grids).

  • New: Made couple of changes to NavigationSystem to allow it being created as a response to navigation data being streamed in with a sublevel.

  • New: Updated how we define rcSpanData’s bitfields so that the sizes are consistent with RC_SPAN_HEIGHT_BITS. This can be used to expand how much navmesh can be generated vertically. Note that will require changing recast code.

  • **New: **Added a “Cancel” button to “Navigation Build In Progress” Editor notify.

  • New: Made UActorComponent.bCanEverAffectNavigation configurable via ini files so that it can be change perf component class project wide. Useful if you want only deliberately picked components to affect navigation. This also allowed for some optimizations in SceneComponent resulting in never calling PostUpdateNavigationData for components that are never nav-relevant.

  • Improvement: Improved AvoidanceManager’s performance for the common case of CharacterMovementComponent.


  • Crash Fix: Fixed a crash due to retarget asset being garbage collected when using ULiveLinkInstance.

  • Crash Fix: Fixed a crash when importing an Alembic file as a Skeletal Mesh with Find Materials enabled.

  • Crash Fix: Fixed a crash when importing certain Alembic files with “Skip Empty Frames”.

  • Crash Fix: Fixed a hang occurring when importing Alembic files as a Skeletal Mesh.

  • Crash Fix: Fixed crash when importing an Alembic file containing heterogeneous meshes as a Skeletal Mesh.

  • Bug Fix: Fixed issue where curve keys were missing when importing an Alembic as a Skeletal Mesh with a Start Index larger than 0.

  • Bug Fix: Fixed curves on additive animations that are entirely negative getting discarded.

  • Bug Fix: Removed GetBoneTransfom logspam when bone indices cannot be found (now Verbose).

  • Bug Fix: Converted ensures about re-routed master/slave components to logs.

  • Bug Fix: Fixed runtime FName construction in FAnimInstanceProxy.

  • Bug Fix: Autoload Animation Blueprint compiler module in editor so that Anim Blueprint Message Log category is initialized properly.

  • Bug Fix: Fixed montages not playing if the start time is exactly on a section boundary.

  • Bug Fix: Fixed issues with multiple skeletal mesh components contributing to cloth collisions.

  • Bug Fix: Animation work now performs anim update even when we have zero bones, but still skips evaluation. It ensures that notifies still get triggered in all update-relevant tick modes, even on dedicated servers.

  • Bug Fix: Fixed incorrect interpolations when using URO and CopyPoseFromMesh.

  • Bug Fix: Correctly updated the socket-attached child transforms of slave component attachments.

  • Bug Fix: Fixed the doubling of playrate when using marker sync.

  • Bug Fix: Changed Live Link tab to Nomad.

  • **New: **The Animation Compression stat dialog has been updated with the following:

    • Fixed issues that would cause dialog to show incorrect results.

    • Improved labeling on the stat dialog.

    • Added compression time stat.

    • Added number of compressed animations.

    • Added tracking for animation with largest average error.

    • Added tracking of worst 10 items instead of just worse.

    • FBoneData is now passed through more often instead of being recalculated.

  • **New: **Added automatic component movement forces to Anim Dynamics when not simulating in world space.

  • New: Notify trigger type default value on Blendspace assets changed to “Highest Weighted Animation”.

  • New: Added DLL export to FAnimTrack::GetAnimationPose.

  • New: Add caching and autocomplete for “sync marker” names.

  • New: Added option to maintain original scale of root motion.

  • New: There are now native notifies in engine for dynamics and cloth management.

  • New: Added Animation Sequence framerate to editor viewport and content browser tooltip.

  • **Removed: **Removed an Engine dependency (via TimeManagement) from LiveLinkInterface.

Animation Assets

  • Crash Fix: Fixed a crash on Pose Asset after reimporting the mesh with a modified skeleton.

  • Bug Fix: Fixed additive pose blending issue with scale within the Pose Asset.

  • Bug Fix: Fixed scrollbar always being shown in animation notify track.

  • Bug Fix: Fixed and issue with Pose Asset so that “Update Pose” will mark asset dirty.

  • **Bug Fix: **Fixed an issue with stepping forward/backward not working with AnimComposite.

  • Bug Fix: Fixed an issue with the Control Rig where it was initially displaying an invalid field of view.

  • New: Optimize Pose Blending system using Pose Asset - this changes the way pose asset blending works. It’s optimized, we use UID to pose index mapping and we only keep the list of joints that matters from blending code.

  • New: Added the ability to refresh transform from existing meshes in the Control Rig.

  • New: Now AnimMontage has option to “Auto Blend Out” and you can disable it. Enabling this is existing and default behavior, but if you disable, it won’t auto blend out keeping the last pose.

  • New: Anim Composite now supports looping.

Animation Blueprints

  • Crash Fix: Fixed a crash when selecting multiple bone driven controllers.

  • Crash Fix: Drag-dropping a variable onto a state machine no longer causes a crash.

  • Bug Fix: Fixed incorrect sub instance error reporting when multiple sub-instances of the same class are used.

  • Bug Fix: Fixed bloom on drawing of pose link when weight is greater than 1.

  • Bug Fix: Anim graph root node is now hooked up at class Link() time.

  • Bug Fix: You can now access animation sub instance nodes by their tags.

  • Bug Fix: Fixed an issue with LinkedBones for curves are using mesh joint list and not skeleton.

  • Bug Fix: Fixed a flicker in graph preview in Anim State Machines.

  • Bug Fix: Fixed custom transition results being picked up as alternative roots on compilation, causing crashes and incorrect poses.

  • **Bug Fix: **Fixed an issue where parent constraints were no working properly for the Constraint Anim node.

  • New: Live Animation Blueprint recompilation is now non-experimental.

  • **New: **Added the following utility functions for animation:

    • DirectionBetweenSockets

    • MakePerlinNoiseAndRemap

    • MakePerlinNoiseVectorAndRemap

    • DistanceBetweenTwoSocketsAndMapRange

  • **New: **Added the “Trail Controller” Node

    • Added in-game debug info

    • Allow 2 chain to work

    • Allow disable rotation fix

Animation Tools

  • Crash Fix: Fixed a crash when creating a new notify that causes timing order to change.

  • Bug Fix: Fixed Preview Asset not loading properly when the asset hasn’t been loaded yet.

  • Bug Fix: Fixed an issue with a huge scale in root causing retarget to create invalid transform.

  • Bug Fix: Fixed issue with Animation Slot Window not displaying small icons when selected.

  • Bug Fix: Added a retarget source when recording a Skeletal Mesh, which fixes the recording of retargeted Skeletal Meshes.

  • Bug Fix: The set number of Skeletal Mesh vertex bone influences was not applied correctly when reducing a Skeletal Meshes using Simplygon.

  • New: Added the maximum number of bone influences for each section when viewing detailed info in Skeletal Mesh Editor.

  • New: Animation Editors now default to Local Space coordinates.

  • New: Added notification to the animation tools viewport when a min LOD is being applied.

  • New: Updated notify add/replace menus to use class pickers for better searching of BP and native notifies.

Skeletal Mesh

  • New: Added a second parameter to “Set Master Pose Component” function that can be used with “Force Update”. If it’s false, it will skip to update all runtime information if it’s the same input master component. It’s set to false by default. It is only true during registration since that can be serialized and it will need to refresh all runtime data.


  • Crash Fix: Fixed a crash in “Finish Recording Output” function call when not using the new audio engine.

  • Crash Fix: Fixed an audio crash that was only happening in Visual Studio 2017 by temporarily disabling optimization. For details see Microsoft’s Visual Studio Development Community.

  • Crash Fix: Crashing no longer occurs when unregistering a sound class.

  • Crash Fix: Fixed a crash that would occur when a USoundClass was garbage collected.

  • Bug Fix: Optimized source effect processing by performing processing per buffer versus per frame.

  • Bug Fix: Fixed issue where dry amount in the reverb effect would only play back in one channel.

  • Bug Fix: Fixed various issues with Modular Synth presets.

  • Bug Fix: Fixed issue where stereo sounds with the Binaural spatialization setting would not play back for certain spatialization plugins, like Resonance and Audio3D.

  • Bug Fix: Fixed an issue where child classes of USynthComponent generated from the editor would not compile.

  • Bug Fix: Fixed an issue where sounds would still be culled based on their attenuation settings when “Use Volume Attenuation” was set to false.

  • Bug Fix: Fixed issue where project packages for Lumin would be resampled based on audio resampling settings for Android.

  • Bug Fix: Resolved an issue where source buses were being rendered as sound wave thumbnails.

  • Bug Fix: Applied a fix for persistent submix effect settings between PIE sessions.

  • Bug Fix: Resolved several minor issues related to MediaSoundComponents causing them to clip when playing back when set to Mono and addressed various reasons causing stuttering audio during playback on all platforms.

  • Bug Fix: Fixed an issue with TSharedPtr on PIE shutdown.

  • Bug Fix: Fixed UI behaviors in Spatialization, Reverb, and Occlusion plugin menus in the Platform category of the Project Settings.

  • Bug Fix: Fixed warning when cooking source buses.

  • Bug Fix: Hooking up new audio icons in C++.

  • Bug Fix: Fixed an issue for the Audio Mixer source initialization state.

  • Bug Fix: Fixing source buses so that new source buses will work after being created.

  • Bug Fix: Fixed an issue with “Google Resonance” plugin when using -AudioPIEOnly and PIE shutdown where AudioPIEOnly decoding stream is never initialized.

  • Bug Fix: Fixed issue where audio sources would pop at the end of playback on iOS.

  • Bug Fix: Fixed issue on Windows where the new audio mixer would stall if no audio playback devices are available.

  • Bug Fix: Change label to Play When Silent for bVirtualizeWhenSilent.

  • Bug Fix: Fixed issues with audio device hot swapping.

  • Bug Fix: Fixed an issue that now immediately stops sounds when destroying its data.

  • New: Audio Capture Components now hook Lumin backgrounding notifications to pause capture.

  • New: Adding support for swapping between old and new audio engines so we can hotfix via CVAR.

  • New: The UVOIPTalker component is now supported with the Steam Online Subsystem as well as the null online subsystem.

  • New: Nintendo Switch’s default audio backend now supports panning spatialization.

  • New: Source effects are now per-buffer versus per-frame. It allows source effects to be more cache-coherent and opens the door to SIMD-able source effects.

  • New: Adding dry-level for submix effect reverb.


  • Bug Fix: The set number of Skeletal Mesh vertex bone influences was not being applied correctly when reducing a Skeletal Mesh using Simplygon.

  • Bug Fix: Fixed a call to ConcludeAutomationTests when forcibly stopping a run.

  • Bug Fix: Fixed automation hang when an error occurs during level load.

  • Bug Fix: Fixed PropertyPathHelpers bitfield in automated tests.

  • Bug Fix: Fixed an issue where BuildGraph was launched using AutomationTools and the tasks (graph nodes) were using AutomationTools and locking DLLs. Instead, we now use AutomationToolLauncher to allow shadow copying of the DLLs.

  • New: Added export to some functions in AutomationCommon.h.


  • Crash Fix: Crashing is now avoided when running the help command for the GenerateBlueprintAPICommandlet

  • Crash Fix: Fixed a crash in the Blueprint watch window that could happen when a watched Blueprint was deleted.

  • Crash Fix: Fixed a crash when pasting Timeline which references an external curve that has been force deleted.

  • Crash Fix: Fixed occasional crash when disabling a component’s ability to be editable when inherited.

  • Crash Fix: Prevent user from entering ‘None’ as parameter name on a Blueprint function, avoiding a crash in an internal engine system

  • Crash Fix: Fixed a crash when reloading circularly dependent widget Blueprints.

  • Crash Fix: Fixed a crash when ending a Transform Details panel edit operation with no changes.

  • Crash Fix: Fixed a crash when undoing after deleting a function graph that has a “Math Expression” node.

  • Crash Fix: Fixed a crash after hitting stop when debugging a Blueprint.

  • Bug Fix: If logic in a Blueprint Macro Library is changed, the Blueprints that use that macro library will now be recompiled when “Play” is clicked.

  • Bug Fix: Fixed loss of attachment information when compiling Actor Blueprints that have compile errors multiple times.

  • Bug Fix: “Assign [Delegate Name]” Blueprint context menu entries now properly create a “Custom Event” node again.

  • Bug Fix: Fixed one cause of subobjects disappearing after a Blueprint was compiled.

  • Bug Fix: Fixed “Unresolved Export” error after loading some circularly dependent .uassets that contained subobjects.

  • Bug Fix: Blueprint Editor is now closed when replacing a Blueprint which avoids a crash when using the Merge tool to reload a Blueprint.

  • Bug Fix: Fixed ensure after compiling a Blueprint that was implementing interface functions that were deleted.

  • Bug Fix: Can now click the magnifying glass to Find in Content Browser from a Blueprint node pin while PIE is running.

  • Bug Fix: Added tooltips from the delegate declarations in a UBlueprintAsyncActionBase subclass to the async execution pins on async task nodes

  • Bug Fix: Fix issue where async-loading Blueprints could cause false error messages about missing outers

  • Bug Fix: Intermediate Blueprint graphs (the results of Blueprint node expansion) can now be saved even if they are in the error state

  • Bug Fix: Fixed an issue where any locally declared macros with no specified category would result in an extra empty category in the dropdown

  • Bug Fix: Fixed ALT-drag and CTRL-W to allow duplication of non-instance Actor Blueprint instance components when selected in the level editor’s viewport.

  • **Bug Fix: **Fixed broken global in Find-in-Blueprint searches for Blueprint assets by interface name. The syntax is Interfaces=(Interface_Name).

  • Bug Fix: Blueprint bytecode interpreter optimized, especially when UserDefinedStructs are present

  • Bug Fix: An error icon is now shown when dragging a category from My Blueprint panel on to the event graph.

  • Bug Fix: Fixed a runtime assertion during nativized Blueprint class construction on attempt to register an instanced subobject that was constructed based on an archetype that was originally instanced through the editor UI.

  • Bug Fix: Fixed an invalid child actor template cast in nativized Blueprint C++ code when the child actor class type is also a converted Blueprint class asset.

  • Bug Fix: Correct icon is now displayed when dragging an event dispatcher variable.

  • Bug Fix: TOTAL_OVERHEAD_SCRIPT_STATS no longer double counts when script code is run on multiple threads

  • **Bug Fix: **Suppressed the UMG runtime warning about implicitly using the slow CreateWidget path for dynamic widget creation in a nativized widget Blueprint class for a non-shipping build configuration.

    • Note that fast path is not currently compatible with Blueprint nativization, so it is implicitly disabled at cook time regardless of the actual design choice in the editor to explicitly force the slow path, which would otherwise avoid the runtime warning.

  • Bug Fix: Ubergraph Function on a Blueprint is now final so that calls to it don’t need to search the target object’s list of functions

  • Bug Fix: Blueprint compilation that occurs during async loads will properly reinstance any objects that are loaded after compilation has completed

  • Bug Fix: TimelineComponent Update delegate will no longer execute three times when looping.

  • Bug Fix: Fixed incorrect code generation at cook time with Blueprint nativization enabled for objects instanced through the editor and assigned to an instanced object reference property.

  • Bug Fix: Fixed additional params being displayed on blutility asset/actor actions dialog

  • Bug Fix: Fixed an issue where “Get Data Table Row” node’s result pin was not properly updating when changing data table type if it was split.

  • Bug Fix: The struct input pin on “Set Member in Struct” nodes can no longer be split.

  • Bug Fix: “Get Data Table Row” node title now correctly updates when changing its type.

  • Bug Fix: Fixed cases where an Orphaned pin could lose its default value when changed back to the correct type.

  • Bug Fix: Fixed incomplete code generation for nativized Blueprint primitive component subobjects containing a customized ‘BodyInstance’ default value.

  • Bug Fix: Fixed missing backend support for initializing a container-typed function output to a literal default value term in nativized Blueprint C++ code.

  • Bug Fix: Serialized default value overrides are now properly applied at runtime to an instance of a component that’s based on an archetype inherited by a non-nativized child Blueprint class as a default subobject from a nativized parent Blueprint class.

  • Bug Fix: Blueprints that attempt to access outputs from nodes that are pruned now generate a compiler warning

  • Bug Fix: Fixed SceneCaptureComponent so ShowOnlyActors property is writable in Blueprints.

  • Bug Fix: Only print script call stacks if a Blueprint exception handler has been populated with one. This will avoid any potential memory allocation in the assert handler

  • Bug Fix: Clarified tooltips on various HSV<->RGB library functions to indicate what the range of each parameter is (0…360 for H, 0…1 for S and V)

  • Bug Fix: Added support for editing Blueprint pins of structs that are derived from FGameplayTag (using the same pin customization as FGameplayTag, and looking for Categories= metadata on the struct declaration)

  • Bug Fix: ParentClass now correctly displays again for Blueprints in the content browser

  • Bug Fix: Level Blueprints now show the debug filter control - it is useful when a user wants to filter based on the world

  • Bug Fix: Warnings and errors generated by Blueprint Macro expansion now include a link back to the macro instance nodes that created the suspect nodes

  • Bug Fix: The correct source Blueprint is now used when retrieving the tooltip text.

  • Bug Fix: Fixed a source of potential data loss in inherited SCS component default value overrides at runtime in a cooked build for an instance of a non-nativized child Blueprint class that inherits from a nativized parent Blueprint class.

  • Bug Fix: Fixed an EDL runtime assertion on load when constructing the CDO for a nativized Blueprint class containing an instanced object reference of another nativized Blueprint class type referencing an instance of a non-nativized Blueprint class as a nested, class-owned subobject.

  • New: Timeline nodes now display an icon if the timeline is replicated.

  • New: Formalized the concept of a Blueprint embedded within an asset for nativization and “Find in Blueprints”.

  • New: Added ability to insert pins before or after a target pin for Sequence nodes via the context menu

  • **New: **Monolithic engine header file exclusion from nativized Blueprint class C++ code is now available as a Project Setting.

    • This can help to reduce the overall code size of the monolithic game .exe file, if code size is an issue.

    • The option can be found at Project Settings->Packaging in the “Advanced” section under the “Blueprint Nativization Method” option. By default, it is disabled to maintain compatibility with existing projects.

  • New: The sort order of categories in the Blueprint Editor is now respected when viewing a Blueprint instance in the level editor or other details panels

  • New: Defaulting FText in Blueprints to Multiline.

  • New: “Get Player Controller ID” is now a pure node.

  • New: Some Blueprint warnings can now be disabled either outside the Editor or entirely. We added a optional message identifier to tokenized messages, then use the message identifier to facilitate suppressing a new warning in the Blueprint compiler before removing the unused (and unusable) FTokenizedMiscData.

  • New: You can call IsDataValid on the class default object as part of compilation, allowing an easy way for end users to do some validation at compile time and encouraging validation use.

  • New: You can now validate that a function that has the CommutativeAssociativeBinaryOperator metadata has the correct signature when Unreal Header Tool runs. It is also validated at compile time in case the function changes to an invalid signature later.

  • New: You can validate in Unreal Header Tool that BlueprintAssignable delegate parameters are of a Blueprint Type.

  • New: We now support construction of any native “noexport” struct-typed literal term in a nativized Blueprint class.

  • Improvement: Addressed a few QoL issues with cut/deletion of selected components via context menu or hotkey.

  • **Improvement: **Blueprint skeleton class generation is now more efficient.

  • Improvement: CPF_IsPlainOldData, CPF_ZeroConstructor and CPF_NoDestructor are now assigned for struct properties that that are User Defined Structs. Improved performance of bytecode that uses these properties.


  • Crash Fix: Fixed a crash when terminating the engine while initializing.

  • Crash Fix: Fixed dangling pointers into UWorld::LevelCollections which could cause a crash.

  • Crash Fix: Fixed a crash in Async Loading Graph’s CheckCycles. The garbage collector would kick in on the game thread and force the Async Loading thread to exit early.

  • Crash Fix: Fixed a crash in TBitArray which could occur when adding an element to a copied TBitArray.

  • Crash Fix: Fix for a potential crash when USoundNodeWavePlayer attempts to add USoundWave to its cluster while the sound wave is still being loaded.

  • Crash Fix: Fix for a potential crash when terminating the engine while it’s being initialized.

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

  • Crash Fix: Fixed a Garbage Collector crash caused by objects that are Async Loading from being collected too early.

  • Crash Fix: Added code to create FGCSyncObject’s singleton when the Async Loading Thread gets created to fix early startup crashes on XBox One.

  • Crash Fix: Fixed a crash when setting the initial size of the disregard for Garbage Collection pool to a value greater than 66560.

  • Crash Fix: Fixed a Cook On The Fly server crash when an asset that has been requested by the client is missing from the server.

  • Crash Fix: Fixed the wrongful modification of MaxBits in


    = causing it to be a non-power of two later resulting in asserts.

  • Crash Fix: MediaPlaylist will now be added to root set if the owning MediaPlayer is in the disregard for GC set. It resolves a garbage collection assumption violation crash.[br]

  • Crash Fix: Fixed a crash in FThreadStatsPool::GetFromPool().

  • Crash Fix: Fixed a crash when running a cooked game with -memoryprofiler in the command line.

  • Crash Fix: Made sure Material serialization is always using the same set of custom versions to prevent crashes when loading assets cooked with Cook on the fly.

  • Bug Fix: Fixed the CopyAction for runtime dependencies that need to be copied to different location, on non-XGE.

  • Bug Fix: SDropTarget now properly uses the horizontal and vertical border Slate brushes it is assigned.

  • Bug Fix: Added code to prevent packages from being saved when the final serialization pass added new custom versions that were not detected when tagging exports which would result in saving a corrupt package and causing crashes when loading it.

  • Bug Fix: Made sure that Garbage Collector’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 from their objects.

  • Bug Fix: Fixed false positive fatal error in the EDL seen in a soak test.

  • Bug Fix: Speculative fix for “Package_LoadSummary has zero prerequisites, but has not been queued” and related fatal errors.

  • Bug Fix: Modified code run async loading thread tick for a maximum of 33ms. This solved some issues with lengthy wait times for the GC lock.

  • Bug Fix: Fixed obscure bug with the rescheduling ticks.

  • Bug Fix: Fixed bogus “precache request should have been hot” errors and fixed minor bug that caused long waits during boot.

  • Bug Fix: Disabled Garbage Collector Clustering support for SoundCues, SoundNodes, and SoundWaves. Sound classes have a very dynamic nature which is not compatible with GC clustering and may lead to hard to track down crashes.

  • Bug Fix: Workaround for UE-58013, though not a full fix. Requires setting bAllowNonUFSIniWhenCooked in the Target.cs and using a cooked build with pak files. This will allow cooked, shipping builds to ignore ini’s not included with the build.

  • Bug Fix: Fixed rare case where insufficient space was preallocated for cooldown ticks.

  • Bug Fix: Assets referenced by FObjectFinder are no longer stale after code is hot reloaded.

  • Bug Fix: Fixed hitch detection stat names for tickables when STAT_NAMEDEVENTS is enabled. Note that this will not work in a Shipping build since it requires non-empty implementations for TStatId and FScopeCylceCounter.

  • Bug Fix: Fixed asynchronous loading code asserts when exiting game early due to an error.

  • Bug Fix: Clustered objects that are no longer reachable will now be marked immediately when gathering unreachable objects.

  • Bug Fix: Fixed Garbage Collector Cluster verification code reporting false positives when a cluster is referenced by another through ‘mutable’ objects list.

  • Bug Fix: Fixed printing of the hang detector multiplier and other logging information.

  • Bug Fix: Fixed TStaticBitArray::FindFirstSetBit() and TStaticBitArray::FindFirstClearBit() which could sometimes return the wrong result.

  • Bug Fix: Fixed case where nested components defined in a native class were not being initialized correctly from their blueprint template. Instead, they were being initialized with the property values from the native base class.

  • Bug Fix: PurgeLegacyBlueprints will no longer be called from within ForEachObjectWithOuter. There was an issues causing it to rename objects that resided in hash tables being iterated over which lead to undefined behavior.

  • Bug Fix: Fix for external profilers where the looper iterating over them was in fact not actually iterating over them.

  • Bug Fix: Made sure all imports and exports created during asynchronous loading are added to the FAsyncPackage referenced objects lists.

  • Bug Fix: Fixed SoftObjectPtr/Paths becoming invalid when saving a new world. It has been moved from /Temp/Untitled to its own package.

  • Bug Fix: Fix for chunk installer not being able to determine data that is available when built without streaming install chunks enabled

  • Bug Fix: The correct clock is now used when printing the scoped hitch stat. It needs to be the internal FGameThreadHitchHeartBeat clock incase FPlatformTime::Seconds becomes out of sync with FrameStartTime.

  • Bug Fix: Fixed exception handling in the png image wrapper.

  • Bug Fix: Boolean properties are now included in the dumped properties for package info commandlet.

  • Bug Fix: AnimScriptInstances created at runtime will now also be added to the owning component’s cluster to avoid Garbage Collection issues.

  • Bug Fix: Fixed TWeakObjectPtr::IsStale()'s default arguments to match FWeakObjectPtr::IsStale().

  • Bug Fix: Removed accidental check in PRAGMA_DISABLE_OPTIMIZATION from CookOnTheFlyServer.cpp.

  • Bug Fix: Fixed an issue where UCookOnTheFlyServer::GetCookOnTheFlyUnsolicitedFiles - UnsolicitedFiles was being passed by reference instead of by value.

  • Bug Fix: Fixed FParse::LineExtended to handle escaped quotes inside other quotes.

  • Bug Fix: Addressed some inconsistency with command line argument handling for Windows.

  • Bug Fix: Fixed debugger visualizers for TWeakObjectPtr and FWeakObjectPtr.

  • Bug Fix: Fixed a case where threaded animation blueprint execution could access the invalidated function cache.

  • Bug Fix: Ensure that strings formatted using FMicrosoftPlatformString::GetVarArgs() are always null terminated whether secure CRT is used or not.

  • Bug Fix: Fixed a incorrectly supplied variable name causing “Reason” to fail a check for the package name.

  • Bug Fix: Removed an invalid assert from TMemStackAllocator::MoveToEmpty().

  • Bug Fix: Creating new packages from the queue in the Event Driven Loader will now respect that Garbage Collector wants to run and exit before continuing to process packages and avoid blocking the Game Thread.

  • Bug Fix: Fixed an issue with async loading assets that have been renamed with ObjectRedirectors.

  • Bug Fix: Unrealpak will now load secondary keys from crypto json file, even when bDataCryptoRequired is set to false.

  • Bug Fix: Fixed a potential race condition when two threads want to acquire the Garbage Collector lock.

  • Bug Fix: Fixed Editor-only properties in CDOs and archetypes modified during PreSave() with a cook reporting a non-deterministic warning.

  • Bug Fix: Fixed ConditionalBeginDestroy profiling after changes to Incremental ConditionalBeginDestroy.

  • Bug Fix: When the engine starts up, it makes a backup of previous run’s log with a timestamp appended.

    • Previous code used the current engine startup time; basically recording the time it was backed up, not the time it was generated.

    • The change honors the file’s original timestamp, so files sort properly and give accurate information about when each log was generated.

  • Bug Fix: Changes in soft references to structs and functions renamed with CoreRedirects now work properly. It no longer redirects if the original is in memory to avoid any false positives.

  • Bug Fix: Fixed a hang when entering Play In Editor while Background Streaming is disabled.

  • Bug Fix: Fix for warnings about setting an empty value to the enum when selecting the default value.

  • Bug Fix: Fixed double logging issue with the console program.

  • Bug Fix: Fixed StompMalloc to return 16-byte aligned memory on 64 bit platforms.

  • Bug Fix: Fixed non-determinism cooking of the level list, caused by transient levels.

  • Bug Fix: Made sure that SoundWaves that haven’t been serialized yet are not used by SoundNodeWavePlayer.

  • Bug Fix: Implemented a use clamped local clock when timing out the renderthread. It prevents “suspend” and “resume” issues on platforms where suspend events may not occur or the system clock is not set to the process time.

  • Bug Fix: Fix for printing of the hang detector multiplier and other logging. The correct format specifier for a double is “f”.

  • Bug Fix: The correct clock is now used when printing the scoped hitch stat. It needs to be the internal FGameThreadHitchHeartBeat clock incase FPlatformTime::Seconds becomes out of sync with FrameStartTime.

  • Bug Fix: Fixed a bug that caused the code for reporting objects that have been waiting for FinishDestroy too long to not fire.

  • Bug Fix: Fixed instanced static mesh random seed cooking non-determinism.

  • Bug Fix: Made sure the Garbage Collector sync object is created before the async loading thread starts.

  • Bug Fix: Fixed a possible hang when worker threads are preventing Garbage Collector from running and something is later trying to FlushAsyncLoading with the Async Loading Thread enabled.

  • Bug Fix: Fix for a memory leak when saving packages.

  • Bug Fix: Fix for a potential assert when incremental purge garbage is pending and then something forces a full purge.

  • Bug Fix: Fix for debug builds on mobile devices causing constant erroneous NaN diagnostic errors.

  • Bug Fix: Fix for non deterministic audio generation issue.

  • Bug Fix: Fixed an issue in the CSV profiler with count strings for global stats.

  • Bug Fix: Fixed an issue in the CSV profiler where the last stat value in the series goes missing.

  • **Bug Fix: **Fixed TArray::HeapPop() to work with move-only types.

  • Bug Fix: Fixed InsertFeaturePacksIntoINIFile() function creating an invalid entry in the DefaultGame.ini file.

  • Bugfix:

    In IPlatformFile::DeleteDirectoryRecursively, attempts to delete files first and if it fails to clear the read-only attribute and try again.
    • Previously there was a call to clear the read only flag for every deleted file and this is a waste of resources 99% of the time.

    • The SetFileAttributes call accounted for a significant amount of time during cooker sandbox directory deletion.

  • Bug fix: Fixed out of bounds read in FWindowsPlatformMisc::QueryRegKey. String buffer size in bytes was erroneously used instead of length in characters to construct result FString.

  • New: Major optimization: eliminate GetUnsolicitedAssets from main cooker loop This reduces the overall time spent in the cooker by an additional 30-40% in the Fortnite case. Change will benefit any game with large (>100k) asset counts as the previous logic was basically exponential complexity. Also eliminated presave logic to simplify maintenance.

  • **New: **Added a method to remove some unnecessary strings from PakFile metadata after getting to a certain point in Engine initialization. It saved 20 MB on Switch in Fortnite and can be enabled with the following .ini settings:

    • [Pak]

    • UnloadPakEntryFilenamesIfPossible=true DirectoryRootsToKeepInMemoryWhenUnloadingPakEntryFilenames="*/Config/Tags/" +DirectoryRootsToKeepInMemoryWhenUnloadingPakEntryFilenames="*/Content/Localization/*" ShrinkPakEntriesMemoryUsage=true
  • New: Added a -skipbuild option that will override -build, which is useful for batch files that have -build baked in to be able to skip building easily.

  • New: Optimized handling of unsolicited assets in the cooker. The cooker now tracks packages as they are loaded and unloaded and only performs certain processing on new packages This change reduced the overall time spent cooking a game with 130000 assets by some 30%. Small games will not benefit as much.

  • New: Improved CPU utilization of “do async loading while we wait for vsync” and disabled it for dual core or less.

  • New: Added code to remove 1/7th of the GC pools after garbage collection. This keeps the memory from growing too much between full purges.

  • New: Fix typo in taskgraph. May offer a slight performance improvement.

  • New: Saved memory by trimming the page allocator.

  • New: Fixes to AttemptToFindUninitializedScriptStructMembers for embedded UStructs.

  • **New: **Added support for recording events at a given timestamp (even if it’s in the past or future) to the CSV profiler.

  • New: Added support for different sized buffers to FArchiveFileWriterGeneric per-platform so we can tune per-platform as needed.

    • No changes to existing defaults values of 1KB for read, 4KB for write.




  • New: Added CSV profiler stat count support using -csvstatcounts along with timestamp and custom stat counts. They appear with “COUNTS/” prefix. For example, “COUNTS/Category/Thread/StatName”.

  • **New: **The CSV profiler now outputs save timings to the log.

  • New: Added “Begin” and “End” ProfilerColor methods for colorizing named events including support for console profilers.

  • **New: **Enabled the lightweight stat hitch detector in Test builds (overhead is not significant.)

  • **New: **Write Device Profile to the fpschart data (including analytics). If the Device Profile changes during a match, write out “Mixed” so we can discard it.

  • New: Added exclusive CSV stats that provide a high level non-hierarchical breakdown of game thread time.

  • New: CSV stats for AddToWorld and RemoveFromWorld.

  • New: Add a single TTulple<Key,Value> “Add” function to TMap to allow Algo functions, such as Transform, to work on Maps.

  • New: Made FTimerHandle usable as a TMap key type.

  • New: Added a new “Reserve” and “Add” functions to TBitArray. Add is overloaded to allow adding multiple bits at once. Also, TSparseArray’s “Reserve” function has been optimized to call the overloaded Add function.

  • New: Added TUniqueFunction, which is a move-only TFunction that can hold move-only functors.TFunction has been simplified, reducing its memory footprint and FFunctionGraphTask and TFuture<> have been updated to use TUniqueFunction.

  • New: Added optimized Windows console output path to GenericConsoleOutput. When stdout is attached to a console, the "WriteConsoleW"0 function is used instead of wprintf since it is especially slow in unbuffered mode. See setvbuf call in LaunchengineLoop.cpp.

  • New: Added a new allocator, TNonRelocatableInlineAllocator, which eliminates conditional logic from the GetAllocation function at the expense of not being trivially relocatable. It provides a significant performance increase for allocators that are dereferenced frequently. However, it prevents instances of it being stored inside other allocators, which are expected to be trivially relocatable by default.

  • New: Implemented CountTrailingZeros(), CountLeadingZeros(), CountTrailingZeros64() and CountLeadingZeros64() in FMath consistently across all platforms.

  • New: Added the ability to disable incremental BeginDestroy in ini/project settings.

  • New: Included more stats for the new Garbage Collector internal functions.

  • The locking was redundant since the annotation maps are managed per thread and thus there is no risk of contention.

  • New: Added the option to filter clusters listed with gc.ListClusters by objects within them. Usage: gc.ListClusters Hierachy With=ObjectName1,ObjectName2.

  • New: Creating new objects from within ForEachObjectWithOuter will now result in a fatal error as it’s unsafe to change internal UObject hash tables when iterating over them.

  • New: Enabled platform crypto for Linux.

  • New: Added the option to change the log time for the current frame Timecode.

  • New: Removed implicit gamma to linear conversion from EXR writer.

  • New: Included the option to FStreamableHandle::WaitUntilComplete to not attempt to start stalled handles. It flushes all loads for Paks you currently have but don’t want to cause load failures for ones that are not yet mounted.

  • New: Expose “Generate Encryption Key” in the CryptoKeys plugin for generating AES keys.

  • New: It’s now possible to filter clusters that get logged with verbose cluster logging enabled.

    • (UE_GCCLUSTER_VERBOSE_LOGGING=1) by objects within them by specifying -DumpClustersWithObjects=ObjectName1,ObjectName2.

  • New: The warning “Calling StaticLoadObject during PostLoad may result in hitches during streaming” will now also report the object which had the Postload called on it when the StaticLoadObjet call happened. .

  • New: Added macros for PROJECTION and PROJECTION_MEMBER which provides the correct behavior when creating projections using functions that are overloaded or use default arguments.

  • New: Added extra checks to catch scenarios where the the Event Driven Loader Precache Buffer is flushed before a package header is fully read.

  • New: Included VectorLoadFloat2(Ptr)which loads { Ptr[0], Ptr[1], Ptr[0], Ptr[1] } into a VectorRegister.

  • New: Disregard for Garbage Collector pool will now be enabled by default in cooked builds.

  • New: Using debug file writer with framepro buffers more data which should reduce stalls when writing out on certain platforms.

  • New: Added non-deterministic cook warnings when redirecting soft object paths in a CDO or archetype during cook.

  • New: Improved the dumping of differences in export and import maps during a non-deterministic cook check.

  • New: Added FString “JoinBy” function for joining a range of elements by a projected string. It replaces existing FString “Join” overloads for TArray and TSet with a single template which takes any range.

  • New:

    Enable move semantics for TCircularQueue::Enqueue and TCircularQueue::Dequeue.
  • New: Implemented support for soft references to save games via ObjectAndNameAsStringProxyArchive.

  • New: Added support for exclusive stats to the CSV profiler that can be used to break down a thread’s timings into a single flat list. See CSV_SCOPED_TIMING_STAT_EXCLUSIVE in CSVProfiler.h.

  • New: Created custom CSV stat Basic/TicksQueued.

  • New: Support has been added for per-pak encryption keys using the “CryptoKeys” plugin.

    • Added “Secondary Encryption Keys” field to the settings where an arbitrary number of named keys can be generated.

    • Some minor refactoring of AES key generation for UBT / UAT.

    • Secondary Encryption Keys are parsed from .ini files and stored in CryptoSettings for use by the rest of the toolchain.

    • Added encryption key GUID to UAT deployment content and pass to UnrealPak.

    • Added -EncryptionKeyOverrideGuid option to UnrealPak which enables a specific encryption key to be forced from the secondary keys list and used for this pak file. The key is stored in the pak info header.

    • Added a core delegate for projets to register new encryption keys with the pak layer.

    • When pak files are detected by the platform file layer, a check is done to see if the required encryption key is available before mounting. If not, defer the mount until a new key is registered that matches the required one.

  • New: Added CreateWeakLambda() and BindWeakLambda() to delegates and AddWeakLambda() to multicast delegates. It enables a lambda to be bound with a UObject* where the lambda will not get invoked by the delegate if the object has been destroyed.

  • New: Changed FGCCSyncObject to use events when waiting for the Garbage Collector to finish so that it doesn’t spin on non-game threads.

  • New: Set the minimum Garbage Collector Cluster size to 5 so that Garbage Collector doesn’t have to process micro clusters which are more expensive than processing individual objects Exposed the minimum cluster size to ini and project settings as gc.MinGCClusterSize Added the ability to sort clusters by name/object count/mutable object count/referenced clusters count when dumping them with gc.ListClusters command

  • New: Suppressed Garbage Collector lock performance warnings in uncooked builds

  • Improvement: CSV Profiler optimizations to take scope time from 194 ns to 128 ns on consoles.

  • Improvement: Optimized I/O in editor and cooker by using synchronous I/O instead of async with immediate blocking. Also eliminated syscall which was issued for every write to update cached file size. Since we’re the only writers to the file (and access allows read sharing at most) we can authoritatively update the cached file size on write completion.

  • Improvement: Optimized low-level memory (LLM) tracker to reduce overhead when it is disabled. Previously FMemory functions would acquire the LLM singleton and call OnLowLevelFree/OnLowLevelAlloc which would check the bIsDisabled flag and early out if it was set. It now uses a static bool variable which can be checked without spending cycles on singleton logic.

  • Improvement: Log verbosity has been changed so that reporting individual cases of Garbage Collector cluster assumption violations are followed by an assert. This way there is a change to see all issues before we assert at the end of these checks.

  • **Improvement: **Dedicated servers or platforms which do not require data crypto do not configure Pak content encryption during the staging process.

  • **Improvement: **CSV timing macros no longer call the singleton since it isn’t necessary anymore and these are static functions. It saves 3% or so from the instrumentation overhead.

  • Improvement: Updated some VSCode generated by project file data so it works correctly with newer versions of VSCode.

  • Improvement: Clarified the comments on how the handle is treated in FTimerManager::SetTimer().

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

  • Improvement: Added GetNoInit function to FGameThreadHitchHeartBeat.

  • Improvement: Added -dumpsavestate= and -dumpsavestatebyarchetype= options to dump the states of particular objects during cooking. It helps track non-deterministic cook problems.

  • Improvement: Added code to make sure garbage collector nulls references to pending kill objects from all FAsyncPackage internal arrays.

  • Improvement: Optimized FFileManagerGeneric::CreateFileWriter to not call CreateDirectory redundantly when opening files for writing. It avoides calling IPlatformFile::CreateDirectoryTree if possible since it is a very expensive function for deep hierarchies as it performs directory creation starting from the root directory instead of the leaf.

  • Improvement: Improved accuracy in FMath::ComputeBoundingSphereForCone(). Also, improved wording and grammar in several math function comments.

  • Improvement: CreateDirectoryTree now creates directories leaf-to-root instead of the other way around. It is much more efficient since time is not spent on system API calls for directories which already exist, which accounted for a very large amount of CPU time in cooking where the full target file directory hierarchy would be “created” for every single output file.

  • Improvement: Made the FString(Num, Ptr) constructor work with any char pointer type, not just TCHAR.

  • Improvement: VirtualAlloc calls now more compliant with the documented API.

  • Improvement: Optimized cooker timers by improving data structures and memory management.

    • This change reduced cook times by 15% on a major game with 110000+ assets.

  • Improvement: Reduced memory usage and memory churn when producing reference chains in FreferenceChainSearch.

  • Improvement: Some tweaks to FQueuedThreadPoolBase scheduling and memory management to reduce overheads and improve cache locality.

  • Improvement: When entering Play In Editor the engine will no longer be resetting all linkers. It caused long load times when renaming the world package.

  • Improvement: Package probing logic now probes for binary formats first and text second. It improves performance for the current common case by eliminating redundant syscalls.

  • Improvement: Using debug file writer with framepro buffers more data which should reduce stalls when writing out on certain platforms.

  • Improvement: The editor will now use a standard platform reader for loading packages. It is better suited (faster) for loading Editor packages than the ones that are used in cooked builds.

  • Improvement: For better debugging of some hard to reproduce bugs, the “AddToCluster” function will no longer be virtual.

  • Improvement: Small FLinkerManager optimizations related to load times.

    • Reduced the number of critical section locks when deleting linkers by a factor of 2.

    • Replaced ObjectLoaders array copy with MoveTemp for better performance.

    • Removed unused FLinerManager functions and debug FLinkerManager code from test configs.

  • Improvement: Optimized the first part of the Mark Phase of Garbage Collection by up to 10ms.

  • Removed: Removed LeakTest functionality from the cooker.

  • Removed: Removed deprecated “MakeValid” function from FTimerHandle.

  • Removed: Removed child cooker support.

  • Removed: Removed FullGCAssetClasses logic in cooker.

  • Removed: Removed the deprecated function “ClearTimer” from FTimerManager.

  • Removed: Disabled GC clustering for UMediaPlayer and UMediaPlaylist since they do not qualify for clustering.

  • Removed: Removed the ULevel::IsPersistent() test during the creation of navigation settings, which caused non-deterministic cooking issues.

  • Removed: Took out annotation map locking in UObjectMarks.

  • Removed: Removed unused async loading stats.


  • Crash Fix: A crash no longer occurs when importing assets into a folder containing an invalid character for a package name.

  • Crash Fix: Resolved a crash that could happen when opening map Build Data.

  • Crash Fix: Fixed a crash when processing mainframe keybindings during slow tasks.

  • Crash Fix: If Slate shuts down while a drag and drop operation is in progress, you no longer get a crash.

  • Crash Fix: Fixed a crash on commit error with the Git plugin.

  • Crash Fix: Fixed a crash in ReversePolygonFacing of MeshDescription

  • Crash Fix: Engine crash no longer happens when saving a large (greater than 2 GB) level under a new name.

  • Crash Fix: Fixed a crash when opening a level after removing it as a sublevel.

  • Crash Fix: Prevented a crash when clicking “Use Selected Game Mode” multiple times.

  • Crash Fix: Crash no longer happens when toggling sub-level visibility after an undo / redo transaction.

  • Crash Fix: Fixed a crash if a mesh has invalid materials.

  • Crash Fix: Server shutdown related to data validation module loading other modules no longer causes a crash.

  • Crash Fix: Fixed a crash when re-importing an FBX using the importassets commandlet.

  • Crash Fix: Fixed a crash when opening a newly built HLOD proxy/mesh.

  • Crash Fix: HLOD system no longer crashes when one of the contained Actors had an empty Material Slot.

  • Crash Fix: When trying to merge removed or deleted Actors with the MergeActor tool no longer causes a crash.

  • Crash Fix: Fixed a crash that would occur when starting a PIE session if the Game Mode’s PlayerState class was set to null.

  • Crash Fix: Fixed a crash by adding an early out and log if focus is attempted to be set when a window is supposed to be disabled due to a modal window being up.

  • Bug Fix: You can now hide SDetailView Filterbox when no Actor is selected.

  • Bug Fix: Fixed an issue where the rotation widget would no longer correctly display the rotation label while rotating on high DPI.

  • Bug Fix: Fixed a navigation issue with empty search boxes causing focus to move and undesired functionality.

  • Bug Fix: Removed empty spacing in Source Control history to the right of the Details panel.

  • Bug Fix: Fixed insert / delete / duplicate children calling PostEditChange on the existing child node when not in the array.

  • Bug Fix: Fixed Brush Actors not showing the correct icon in World Outliner. Actors can now supply their own icon if needed.

  • Bug Fix: Fixed an issue with the FBX importer for Static Meshes where the Lightmap Index wasn’t checked before the build.

  • Bug Fix: Fixed Preview Mesh Actor becoming stuck to the cursor when the Editor or viewport loses focus.

  • Bug Fix: Namespace is now an import option on the FBX Importer.

  • Bug Fix: When converting relative path filenames in automated import, we now convert them relative to the project directory.

  • Bug Fix: Fixed hidden Asset properties in struct Details panels. All object properties with “allowedclasses” metadata are considered to be Asset properties since they only show an Asset Picker.

  • Bug Fix: Fixed tiny fonts from appearing in slow task dialogs.

  • Bug Fix: Fixed an issue causing the Lightmap Index to be uninitialized.

  • Bug Fix: Properly handled FPackageName::TryConvertFilenameToLongPackageName() failing in Cache Thumbnail.

  • Bug Fix: Fixed access violation for ImportAsset commandlet FBX reimport.

  • Bug Fix: TextScale is now properly set for OnScreenDebugMessages.

  • Bug Fix: Fixed touch events simulated through mouse not respecting high DPI.

  • Bug Fix: Removed Tab Spawner for Color Curve Editor if you’re not editing the color curve.

  • Bug Fix: Updated the Static Mesh LOD model max deviation when generating a LOD.

  • Bug Fix: Fixed cases where the the property nodes aren’t being rebuilt in time and the custom property UI can be using stale data.

  • Bug Fix: The Editor now prompts for permission before updating a project file with new plugin settings.

  • Bug Fix: Fixed FBX re-import assignment of Static Mesh sections.

  • Bug Fix: FindMaterialIndicesUsingTexture() now works as advertised.

  • Bug Fix: Prevented error log due to non-existing plugin directory.

  • Bug Fix: Fixed animation Range import that was preventing changing the option when validating the anim range.

  • Bug Fix: Fixed some bool values being ignored by Editor transaction diffing for undo / redo notifications.

  • Bug Fix: Fixed an issue where closing the Levels tab with a filter would still apply that filter with no way to remove it when reopening the Levels tab.

  • Bug Fix: Fixed where edit condition changes were not transacting for undo / redo.

  • Bug Fix: Fixed an issue with propagating vertex colors to Static Meshes not working correctly.

  • Bug Fix: Fixed soft object path data corruption issue that could happen if you renamed asset A to B, and then back to A in a single Editor session.

  • **Bug Fix: **Fixed scrollbars that are set to always display not clamping their size correctly.

  • Bug Fix: Fixed mis-reported HLOD build indicator.

  • Bug Fix: Fixed the Skeletal Mesh compute tangent to avoid setting adjacent triangle when they are mirrored.

  • Bug Fix: Limited the rate at which the cooked package progress will display to prevent LogCook spam.

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

  • Bug Fix: Fixed issue where loading levels from PIE or the Content Browser could break world composition loading.

  • Bug Fix: The order of rows in a Data Table will now stay the same when removing a row from the middle of the table in the Editor.

  • Bug Fix: Fix issued where levels would be incorrectly marked dirty in the Editor when loaded from PIE or the Content Browser

  • Bug Fix: Made change to broadcast end object movement at the end of setting the transform in the Details panel.

  • Bug Fix: You can no longer attempt to import a Data Table or Curve Table unless the row struct or interpolation type has been specified.

  • Bug Fix: Saving HLODs from a new Level now always saves the level first.

  • Bug Fix: Applied a fix for taking HDR screenshots when the buffer write is disabled.

  • Bug Fix: Fixing missing asset factories in asset picker window.

  • Bug Fix: Fixed project GUID generated and invalidated menu items when text is focused at the same time.

  • Bug Fix: Instances of components that are not editable no longer appear in the Level Editor’s component window.

  • Bug Fix: Reset Layout now resets sub Editors.

  • Bug Fix: Slow task dialog now respects ESlowTaskVisibility setting.

  • Bug Fix: Improved the way HLOD Actor exclusion for specific levels works.

  • Bug Fix: Thumbnails now render in dropdown menus.

  • Bug Fix: Fix to generate cleaner C++ files when using “New C++ Class.”

  • Bug Fix: Duplicating Color Themes now duplicates the Color Labels as well.

  • New: The SceneViewport uses the default backbuffer pixel format defined in the Project Settings.

  • New: When renaming a row in a Data Table, the Editor now checks that the name is not empty, contains only whitespace, or contains invalid characters.

  • New: Reduction is now allowed on Static Mesh LOD 0.

  • New: Added new test for string allocation size for TestPAL.

  • New: AutomationTool now accepts values for its -client and -server parameters, letting you have multiple Client and Server targets per-project. So if you have ClientA.Target.cs and ClientB.Target.cs, run UAT with -client=ClientB to make a build of that variant. If there is only one target of a particular type (true for all projects up to this point) UAT will detect and use it. If more than one target is found, you must specify which one to use.

  • New: Added a system to allow a project to override an enum’s DisplayName (or any metadata string), like this:

    • Enum: TEXTUREGROUP_Project01 UMETA(DisplayName=“ini:Project Group 01”)

    • DefaultEngine.ini: [EnumRemap] TEXTUREGROUP_Project01.DisplayName=Spaceships

    • If the enum is not remapped, it uses the name after the ini.

    • Added 10 “project” texture groups that can be renamed with the above system if desired.

  • New: Added option to Class Pickers to force use of class Display Names.

  • New: Mac OS X now symbolicates the crash logs.

  • New: Added a utility struct for dealing with Editor Actor layers from within Blueprints.

  • New: Can select the TimecodeSynchronizer from the Toolbar menu. Can be defaulted by user / machine.

  • **New: **“Edit” and “Paste” are now hidden from the PropertyMenuAssetPicker.

  • **New: **The Editor’s Feature Level Preview now persists between sessions.

  • New: Added imported framerate info to animation sequence.

  • New: Added a “Report Bug” menu entry to the Help menu.

  • New: Add some FBX file information to the FBX import dialog.

  • New: Added support for paths longer than MAX_PATH in the Editor. Requires Windows 10 version 1607, and the functionality to be enabled via a registry key or group policy. For additional information, see https://docs.microsoft.com/en-us/win…/naming-a-file.

  • New: Single property setting changes will now also call OnModified delegate for their section.

  • New: The FBX importer now has the possibility to use different sample rate when importing an animation.

  • New: RGB values for Curves can now be set greater than 1.

  • New: The FBX import dialog shows the conflict status for both skeleton and materials. It enables the user to cancel the import before re-importing the asset.

  • New: Added a reset material feature inside the material conflict dialog.

  • New: Added 1D Perlin Noise support to Camera Shakes.

    • Use the new “Perlin Noise” option in the “Waveform” dropdown in the Oscillator section of your Camera Shake settings.

    • Also added a new “Perlin Noise 1D” Blueprint math function.

  • New: In the Static and Skeletal Mesh Editors you can now delete any unused Material slots even if it’s not the last Material slot.

  • New: Add functionality to DataValidation plugin where it will call IsDataValid on assets after saving them from the Editor, reporting any errors to the message log. This will not do anything unless IsDataValid is overridden for your specific asset type.

  • New: “Keep Simulation Changes” command is now undoable.

  • New: New Skeletal Mesh FBX import workflow. The rigger and modeler can now re-import only the skinning or only the the geometry part of the Skeletal Mesh Asset.

  • New: Autosave of packages no longer saves map Build Data packages.

  • New: You can hide the ‘Source File’ property of media textures in Editor.

  • Improvement: PlacementModeTools shapes are now searchable and have thumbnails.

  • Improvement: Bookmark usability and extensibility has been improved.

  • Improvement: Updated MediaRecorder to use the ImageWriteQueue.

  • Improvement: Added a flag in IImageWriteQueue.Enqueue to prevent block if the queue is full.

  • Improvement: The Plugin Wizard now sets new modules to type “Runtime” rather than “Developer” by default.

  • Improvement: Increased the amount of frame time allowed to scan asset registry at Editor startup. It will be 3x faster when running in the background and has a better progress bar.

  • Removed: ABC Importer is now using FMeshDescription instead of FRawMesh.

  • Removed: GLTF importer is now using FMeshDescription instead of FRawMesh.

  • Removed: Editor scripting utilities is now using FMeshDescription instead of FRawMesh.

  • Removed: SpeedTreeImporter is now using FMeshDescription instead of FRawMesh.


  • Bug Fix: Fixed an issue with copying Particle Emitter properties when duplicating or exporting emitters.

Content Browser

  • Crash Fix: Fixed a crash in the Material Editor if content hot-reloading a texture was used by the material.

  • Crash Fix: Fixed a crash that could happen after attempting to to content hot-reload a package that is too new.

  • Crash Fix: Fixed crash when content hot-reloading the build data for the currently loaded world.

  • Crash Fix: Fixed some crashes and issues that could be caused by lingering object references during a content hot-reload.

  • Crash Fix: Fixed a crash with content browser search filter “Recent” when asset list contained classes.

  • Crash Fix: Fix a crash if the file path to reimport from is not set on a DataTable asset.

  • Bug Fix: Fix “Other” filters toggling all assets to show up.

  • Bug Fix: Fixed an issue when the Context Menu was opened that would cancel a rename.

  • Bug Fix: Favorites now stay the right size.

  • New: Added a filter for Curve Atlas Assets to the Content Browser.

  • Improvement: Added icons to folder Context Menu Favorites.


  • Bug Fix: UAT didn’t produce .pak file while cooking on the fly.


  • Bug Fix: Fixed lightmap / shadowmap UV mapping.

  • Bug Fix: Fixed a flickering issue that could happen if instances were added at runtime and all removed.

  • Bug Fix: Added a change that will only rebuild foliage if the Density Scaling has changed.

  • Bug Fix: Resolved an issue when migrating from 4.18 to 4.19 or higher, there could be a migration error that could cause to double the Static Mesh instances when using a Blueprint to spawn them.

  • Bug Fix: Fixed Editor instance count to only include placed instances. Calling GenerateProceduralContent will no longer automatically remove the current content, as we might want to get the generation for something else than replacing existing data. When deleting procedural foliage, we can now specify if we want to rebuild the tree.

  • Improvement: Modified foliage thumbnail color to better show when it is inactive.


  • **Crash Fix: **Fixed a crash during cooking for certain landscapes with collision data out of sync with render data.

  • Bug Fix: Fixed an issue with bNoWeightBlend option is now properly saved during tiled landscape import in World Composition.

  • **Bug Fix: **Fixed a LOD transition issue that could occurs if the LOD Distribution settings were too close to 1.0.

  • **Bug Fix: **Added all Materials and Materials overrides to SerializeStateHashes to detect any changes requiring rebuilding the platform data.

  • New: Added landscape keyboard shortcuts for brush size, brush falloff, and brush strength.

  • New: You can now hold a key then move the mouse to adjust a Landscape Brush’s Size, Falloff, and Strength. If you drag anywhere up and to the right, it will increase the value and dragging down and / or to the left will decrease the value.

    • Note that keys are not set by default, but you can set them in the Editor Preferences > Keyboard Shortcuts. They are listed as Change Brush Size, Change Brush Strength, and Change Brush Falloff.

  • New: Added a new Blueprint node that can be used in Editor to export the landscape heightmap to a render target.

  • New: Added the possibility to override the material used per LOD. To use the system, simply specify at which LOD you want each material and it will fill the not specified LOD.

  • New: Landscape MID will now work in Editor too.

  • **Improvement: **Increased the maximum Landscape Layer usage color to 15 so that you can have a different color when debugging.

Material Editor

  • Crash Fix: Added a condition to guard against crashing when pasting comments.

  • Bug Fix: Fixed new Texture Sample nodes not taking the selected texture from the Content Browser as the starting value.

  • Bug Fix: Allowed Material graph nodes to have duplicate names in all cases except creating a new parameter from a constant.

  • Bug Fix: Fixed an issue omitting Material Function Instances as allowed classes to create on the Material Function call dropdown.

  • Bug Fix: Fixed a compile error when generating example layer and blend graphs.

  • Bug Fix: Fixed for default Material Layer and Material Layer Blend asset names.

  • Bug Fix: Fixed not being able to reopen Details panel after closing it.

  • New: When selecting a node while the Details panel is behind a different panel in the same docked tab, the Details panel is brought forward.

  • New: Landscape layer samples will now be found when searching for their sample name.

  • New: Assets that can be dragged into the Material Graph now indicate that with a check mark.

  • New: Landscape layer Switch and Weight nodes will now also find parameter names.

  • New: Now all renamable nodes do name verification.

  • New: Material node display can be toggled by feature level and quality level. Note that it doesn’t affect a Material’s ability to compile.

Media Framework

  • Bug Fix: Reworked the timing for AJA Media Player.

  • **Bug Fix: **Fixed an issue in supported format for media recorder.

  • Bug Fix: Set base timecode for AJA TimecodeProvider.

  • Bug Fix: Fixed output not working in PIE for the MediaCapture panel.

  • **Bug Fix: **Created a 10 bit Media Texture for CharBGR10A2 media format.

  • **Bug Fix: **Fixed an issue that didn’t set and reset bIsOwned properly when it was first initialized as “not owned.”

  • New: Upgrade AJA SDK from to 14.2.0.

  • New: Extended the SequenceRecorder to support additional objects to record from other plugins.

  • **New: **Added SequenceRecorder for MediaPlayer. It will record every frame to disk that the MediaPlayer produces.

  • **New: **Added MediaCapture’s name and an image to represent the status. Use a ScrollBox around the “preview” output. It can select any Actors and only show the selectable camera grid when there is more than one camera.

  • New: Media Profile with timecode provider and custom time step.

  • New: With MediaCapture, we allow the user to change the source of a capture without stopping the current capture.

  • New: Added a widget that let you select a single permutation from a list of possible permutations. It groups the values into categories and removes duplicates inside that category.

  • New: Added support to read LTC from the reference In. Added additional detail on video format and device and MediaSource uses the Permutations Selection widget to select its mode and device.

    • Removed debugging option to trigger an AJA custom time step and timecode provider.

    • Removed the UYVY pixel option from AJA. It’s better to do the conversion on the AJA card than on the GPU.

  • New: Added a option in AjaCustomTimeStep to wait until the frame to be ready. It won’t work with interlaced because the 2 fields are processed at the same time. In interlaced, it will get a 30 fps behaviour when we actually want a 60 fps.

  • New: Added the option to automatically try to reopen the MediaSource again if an error is detected.

  • New: Added a Timecode Widget, TimecodeProvider Widget, and a TimecodeProvider Tab.

  • New: Added Timecode accessor to Media Samples.

  • New: Audio tracks can now be chosen when opening a video and don’t require custom event handling.

  • New: Added support for 10 bit A2BGR10 texture.

  • New: Added MediaSourceProxy and MediaOutputProxy to a regular MediaSource and MediaOutput.

  • New: Added MediaProfile which lets the user select their media sources and media outputs by machine or by user.

  • New: Enabled world rendering is now exposed to Blueprint. It’s useful to free up hardware resources while playing full screen videos.

  • **Improvement: **Changed the tooltip and category for some AjaMediaSource properties.

  • Improvement: AJA improvements:

    • Added an initialization thread with a command queue

    • Fixed an issue with WaitForInterrupt.

    • Fixed multiple wait was requested, where we were not waiting for the Channel index.

    • Fixed an invalid dropped frame warning when using ping-pong.

  • Removed: Removed color box that tells the status of the MediaCapture.

  • Removed: Removed MediaFrameworkUtilititesModule dependency to the Settings module at runtime.


  • Crash Fix: The editor no longer crashes on shutdown after binding a Python member function to delegate.

  • Crash Fix: Recompiling a Blueprint or Script class that serializes an object reference manually no longer causes a crash.

  • Crash Fix: Fixed a crash when passing None as the world on Python Actor iterators.

  • **Crash Fix: **Fixed a crash when re-pointing an object referenced in Python.

  • Crash Fix: MovieSceneCaptuer no longer causes a crash when iteration on classes are defined in the script.

  • Crash Fix: Fixed a crash when passing “None” as the class for unreal.find_asset or unreal.load_asset.

  • Bug Fix: Ensure that Python generated types create their default object at the correct point.

  • Bug Fix: Editor command line argument ‘ExecutePythonScript’ can now also include arguments.

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

  • **New: **Scripted FBX import can now autodetect type.

  • New: Exposed transactions to Blueprints.

  • New: Added a SetLodFromStaticMesh script utility function that allows to set a static mesh LOD by copying the geometry of another mesh.

  • New: Show an error if trying to use -ExecutePythonScript without Python enabled.

  • New: Expose OpenEditorForAssets to script.

  • New: Added support for BlueprintAssignable properties in Python.

  • New: Sequencer scripting: Exposed “Get Playback Range”, sub Sequence get Sequence.

  • New: Added methods to convert an Unreal relative path to absolute.


  • **Crash Fix: **Fixed a crash caused by having too many pending tasks in ImageWriteQueue.

  • Crash Fix: Fixed a crash caused by splitting a subsection without a Sequence.

  • Crash Fix: Fixed crash that happened when importing FBX cameras with identical names to existing objects in the Level. Cameras are added if bound objects don’t exist. Changed logs to popup toasts.

  • Bug Fix: Fixed an issue where a Movie Scene Player’s Start Offset would be ignored because it was getting nullified due to Stop() getting called last.

  • Bug Fix: Fixed a logic issue where a newly added key would not expand the section range.

  • Bug Fix: Fixed an issue with Rich Curve to not expose RCIM_None and RCTM_None as DisplayName=“None”. It doesn’t make sense to have no interpolation.

  • Bug Fix: Made unique spawnable name to avoid it being renamed in SetActorLabel.

  • Bug Fix: Added the relevant property name in an ensure that is caused by trying to bind to a track with a null object.

  • Bug Fix: Fixed an issue where some newly added objects would not get added to selected folders. We now call OnAddTrack for some newly added tracks so that they automatically get added to the selected folders.

  • Bug Fix: Removed debugging from Shipping builds.

  • Bug Fix: Fixed an issue where GetParents was not recursing properly to get parent Actors. This fixes trajectory drawing when there’s more than 1 parent in the chain.

  • Bug Fix: Fixed problems with duplicating hovered keys and sections so that they are selected before duplicating if they’re not already selected.

  • Bug Fix: Refresh Actor list to clean up “Deleted Actor” in the outliner when drawing thumbnails and converting to spawnable.

  • Bug Fix: We now always bake at the display rate. Otherwise, baking at tick resolution can be pretty heavy handed.

  • Bug Fix: Fixed an issue in SequenceRecorder where StopRecording conditional when there is an Actor recording that doesn’t have a valid Actor to record.

  • Bug Fix: Fixed CurrentShot LocalTime computation by using sequence time in playback resolution to compute the local shot time. Also, fixed the BurnIn asset so that CurrentShotLocalTime is hooked up to ShotFrame instead of MasterTime. This fixes a bug where the burnin’s {ShotFrame} is not reporting the local shot frame number.

  • Bug Fix: Test for movie scene read-only before calling modify / transactions.

  • Bug Fix: Fixed an issue to use non-throttled spin box for numeric key Editor.

  • Bug Fix: Fixed an issue in SequenceRecorder so that Actor tags are now unique.

  • Bug Fix: When importing FBX, if a camera is created, mapping is now forced to be by name matching only so that other nodes in the FBX file does not get mapped onto the newly created camera.

  • Bug Fix: Fixed an issue which caused movie burnout not to use a fixed timestep.

  • Bug Fix: Sequence Recorder: When recording animation in world space, the transform keys are compensated by the root bone. There was a bug when not recording animation in world space where there would be no transform keys. This is because the root bone values are all identity (since they’re not in world space). To fix this, the transform recorder now records as usual, filling the buffered transforms from the Actor, rather than swapping them in during finalize from the root bone.

  • Bug Fix: Sequence Recorder: When removing root animation from the animation asset, we now push the root animation to the transform recorder, which records to the transform track only when the animation is not in world space.

  • Bug Fix: If playback is at the end, calling play again now resets to the beginning.

  • Bug Fix: Audio track visualizations scale correctly with pitch scaling.

  • Bug Fix: When re-keying, interpolation is no longer set on existing keys.

  • Bug Fix: Fixed the restore state for attach tracks so that the original parent is re-attached.

  • Bug Fix: Fixed an issue where duplicated spawnable tracks were not being saved. This is done by clearing transient flags from the tracks / sections coming from the FMovieSceneCopyableBinding.

  • Bug Fix: The custom widget (ie. +Section) is now overlayed on the key Editors.

  • Bug Fix: Sequence Recorder: Fixed an issue caused by updating the target Level Sequence when duplicating before recording into the Level Sequence.

  • Bug Fix: We no longer attempt to select Actors / Components on locked levels.

  • Bug Fix: We now pause playback before scrubbing begins. This fixes an issue where if you play the Sequence with audio and scrub and release, the audio keeps playing. This is because there’s no explicit evaluation in the stopped state OnEndScrubbing.

  • Bug Fix: Fixed an issue in SequenceRecorder with auto size sections after recording to expand to time range of recorded data.

  • Bug Fix: Reset the last view target when stopping the Sequence so that it gets recached when evaluating the Sequence again.

  • Bug Fix: Level Sequences now check to see if they are adding themselves as a tick dependency.

  • Bug Fix: Fixed additional edit widgets not appearing on top-level key area nodes.

  • Bug Fix: Fixed GoToEndAndStop() and other jump state so that when calling stop, Sequencer gets torn down properly. It fixes an issue where if you just call GoToEndAndStop() and the Sequence won’t actually stop and tear down.

  • Bug Fix: Fixed the file extensions for movie files on Mac.

  • Bug Fix: Moved Linux warning to initialize to avoid spamming the log every frame for the Movie Scene Capture.

  • Bug Fix: Intersect the section range with the visit range to ensure keys that fall outside the section range aren’t snapped against.

  • Bug Fix: Made a change so adding a track through the Add Track menu doesn’t automatically create a key.

  • Bug Fix: Changed HandleSingleNode fallback check for collapsed parents. This fixes cases where selecting keyframes could miss partial keys.

  • Bug Fix: All sounds are now stopped on tear down.

  • Bug Fix: We now use cached object bindings when drawing motion trails. It is because FindObjectId can be slow because it clears the cached bindings.

  • Bug Fix: Fixed an issue where key reduction was not working on imported FBX channel. Implemented 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 (eg. with the DisplayRate).

  • Bug Fix: Sequencer Possessable references will no longer lose their references when saving an Untitled map for the first time.

  • Bug Fix: Step to next/prev key no longer uses ExclusiveEndFrame - 1. It 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: We now restore drawing paths for selected nodes and channels.

  • Bug Fix: Added functionality to check for property type in evaluation. This fixes an issue where the property type is changed after the track has been created.

  • Bug Fix: Fixed edits to subsections not invalidating their sub Sequence data for deep hierarchical Sequence structures

    • Full hierarchical sub Sequence data is stored in the outermost Sequence hierarchy as part of the compilation, but such data was not necessarily being invalidated for deep hierarchies (sub-subsections) when an outer subsection / Sequence was modified.

    • When an outer subsection modification is encountered, the whole child hierarchy is now invalidated.

    • Additionally, inner sub Sequence data that is cached in grandparent sequence hierarchies had no method of being invalidated if the grandchild subsection was changed in some way.

    • The subsection signature and outer to inner transform now exists on the sub data to check for such situations as part of the compilation steps.

  • Bug Fix: Fixed regression where the default audio volume on the audio track is restored properly.

  • Bug Fix: We now account for framerate when copying key tangents when converting from Matinee to Level Sequence.

  • Bug Fix: Fixed the FBX export node name so that it uses the Sequencer display name.

  • Bug Fix: Fixed FrameNumber numeric input fields not understanding asterisk (*) which prevented pressing Ctrl + G and then Enter to escape focus when evaluating a sub-frame.

  • Bug Fix: Undo / redo transactions while Sequencer is opened should now have appropriate behavior for keyed Actors.

  • Bug Fix: Fixed Timecode fields not displaying Subframe markers.

  • Bug Fix: Fixed various issues with copying and pasting Spawnables from one Sequence to another and within the same Sequence. No longer prints superfluous warnings on paste and properly initializes the new object template so that it does not get garbage collected / cause issues on save.

  • Bug Fix: Renaming object bindings in Sequencer now marks the package as modified so they prompt for save requests and pass the rename onto the Spawnable so that a copy and pasted object bindings doesn’t revert to the original name from when it was created.

  • Bug Fix: Fixed an issue in SequenceRecorder which changed to record only child components and not other scene component hierarchy that’s not owned. It led to problems where components would be doubly recorded.

  • Bug Fix: Added ability to turn off saving Animation Sequences when exporting level meshes so we don’t save the Animation Sequence twice when saving FBX from the Sequencer, which was causes an issue in this file since the times weren’t in sync.

  • New: Sequencer Marked Frames are represented as teal vertical lines extending from the top timeline slider to the bottom timeline slider. Marked Frames can be created by using the “M” hotkey to toggle a mark on or off or by using the right-click menu on the timeline slider track. Marked Frames are also used for Snapping. Shortcuts to jump the current playhead time to the next/previous marks are defaulted to “CTRL+SHIFT+,” and “CTRL+SHIFT+.”.

  • New: Added tooltips to the Cinematic Viewport UI to help clarify what some of the numbers being shown are.

  • New: Sequencer now initiates a slow task when opening via the Cinematics dropdown in the UI. It helps with first time opening of large cinematics that require compressing audio and animation data.

  • New: Added ability to import / export Tangent Weights from FBX.

  • New: Added quaternion interpolation option to UMovieScene3DTransformSection. It mimics how Matinee used to work by basically finding the keys between a time and interpolating the angles as quat’s between them. As noted in the code the algorithm needs to handle the case when the x,y,z Rotation keys all aren’t at the same time which was not handled by Matinee.

  • New: Synchronize Selected Sections using Source Timecode via the section right-click menu now syncs sections relative to the first selected section. It replaces the previous “Synchronize to Source Timecode” function.

  • New: Added GetObjectBindings() to retrieve the object bindings for the passed in UObject.

  • New: Added the option to double click to open the Shot asset directly.

  • New: Newly created sections now throb and are selected so that it’s clear if there’s an overlapping section that gets created.

  • New: Added default sections for all tracks and not just property tracks.

  • New: We now export “Manual Focus Distance” and ensure that the property is animatable.

  • New: Added to SequenceRecorder the option to record to the target Level Sequence playback range length.

  • New: Added support to SequencerRecorder for looping / rolling takes.

  • New: In SequenceRecorder we now save recorded audio files if autosave is on.

  • New: Added support to SequencerRecorder to specify properties from Actor classes (camera rig rail - current position on rail).

  • **New: **Added the ability to implement custom capture protocols for movie scene captures.

    • Converted capture protocol settings and instances to be single UObjects. This unifies the two concepts, and allows for Blueprint implementations.

    • Removed capture protocol registry since it is no longer required.

    • Removed FCaptureProtocolID in favor of class discovery at runtime.

    • Added new module “ImageWriteQueue”, responsible for asynchronously managing a queue of image file write operations.

    • Added new capture protocol for capturing final pixels to EXR (including burn-ins).

    • Added a new BP function, ExportToDisk, accessible on all UTexture properties for writing texture and render target data to image files.

    • New global BP nodes for querying movie capture status: IsCaptureInProgress, FindCaptureProtocol.

    • Removed Flush On Draw functionality from viewports and frame grabber since it is unnecessary.

  • New: Added movie scene locking / read only and fixed a few issues with locked sections because you shouldn’t be able to create or move keys on locked sections

  • New: Added the ability to switch the takes of all the selected shots / subsections.

  • New: In the Cine Camera the ActorToTrack has been changed to a TSoftObjectPtr to support cross level references.

  • New: Added compensation for the added transform when an attach track is added.

    • If there’s no existing transform track, create one and add the compensation to that transform section.

    • If there’s an existing transform section without keys, compensate to that transform section.

    • Otherwise, create an additive transform section and compensate to that transform section.

  • New: Added FindCachedObjectId which retrieves the binding without clearing the cache.

  • New: Added protection against null movie scene sections to SequencerRecorder.

  • New: Audio is now disabled when playing backwards.

  • Improvement: Clarified allowed bindings from asset tooltips.

  • Improvement: Clarified tooltip for export FBX.

  • Improvement: Corrected a description for Cinematic Camera’s “Maximum Aperture”.

  • Improvement: Rewrote bOverridesDefault’s tooltip so that it reads correctly.

  • Improvement: Increased curve color contrast.

  • Improvement: Media Sections on a Media Track can now optionally set a looping flag to hint to the underlying media player. This aids in some media players (like EXR) that can use the looping flag to pre-cache data properly.

  • Improvement: Spawnable Object Bindings now show up Gray in Sequencer instead of Red when they have not been spawned yet due to the evaluation of the Spawn track.

  • Improvement: Renamed “Cinematic Preview” to “Allow Cinematic Control” to remove confusion with the difference between Cinematic Preview and Cinematic Viewport.

  • Improvement: Opening the Add Track menu in Sequencer and trying to add an Actor from the map to the sequence should take significantly less time now on maps that have tens of thousands of Actors.

  • Removed: Removed Ctrl+O and Shift+O bindings to toggle node collapsing and expanding since they conflict with Open Level.

  • Removed: Removed restriction on hidden mobility. It’s too wide to restrict transform tracks.

  • Removed: Removed “Show Transport Controls” from the Level Editor Viewport UI as the controls have been completely surpassed by the Cinematic Viewport Preview.

  • Removed: Removed ctrl-w as a hotkey to toggle weighted/non-weighted because it conflicts with the more generic binding to duplicate objects/tracks.


  • Crash Fix: Fixed a crash caused by spamming trigger presses in VR mode.

  • Crash Fix: Added fix to prevent crash caused by floating text if asset container does not exist. VR Editor floating text is now not placeable or Blueprintable.

  • **Crash Fix: **Fixed for VR Mode crash when undoing camera duplication.

  • Bug Fix: Moved all asset container access to PostActorCreated to avoid VR Editor assets in cooks.

  • Bug Fix: Updated VR Mode button to become inactive during SIE (instead of disappearing altogether).

  • **Bug Fix: **Gamma correction fixes added for VR Mode Content Browser icons and camera previews.

  • **Bug Fix: **Fixed added for the Actor previews not unpinning when entering VR mode.

  • **New: **Added a third looping option to the Sequencer Radial Menu. Selecting the Looping option now cycles through No Looping > Loop All > Loop Range

  • **New: **Added set start/end range buttons to radial menu.

  • **New: **Fixed for opening a sequence in VR mode blocking level Editor tab drag and drop.

  • **New: **Making a VR Edit show flags mode that is similar to Game Mode but without the Game flag set to true, now hides billboards and cameras are now visible in VR mode.

  • **New: **Placing cameras now only summons the preview panel once you release.

  • **New: **Added a new spawn location for camera preview window (in front and to the side, on whichever side matches your UI hand).

  • **New: **Changed some VR Editor elements to be hidden from camera preview.

  • **New: **Added camera burnin text on preview windows as well.

  • **New: **Support for multiple viewport previews in VR mode has been added.

  • **New: **Any dockable window can now be docked to the world.

  • **New: **Exposed settings for tweaking VR mode movement.

  • **New: **Sequencer scrubbing will now pause when removing your thumb from a Vive touchpad.

  • **New: **Added external UI panel support to VREditor module.

Gameplay Framework

  • **Crash Fix: **Fixed a crash when using a GameplayCueManager without explicitly setting an asset / class in config.

  • Crash Fix: Fixed a crash when trying to create an object when one with that name already exists for Child Actor template.

  • Crash Fix: Fixed a potential crash when changing a Child Actor’s class dynamically.

  • Crash Fix: Resolved a crash that could happen when ending PIE while a Level is in the middle of loading in.

  • Crash Fix: Addressed a potential crash in UAbilitySystemComponent::ServerSetReplicatedTargetData_Implementation.

  • Crash Fix: Fixed Gameplay Ability crash if an ability tries to remove itself during activation.

  • Crash Fix: Fixed a crash coming from Gameplay Tag Editor widgets.

  • Crash Fix: Fixed crash when reloading level that contained sub-levels that were created by duplication actions

  • Bug Fix: Fixed connecting during seamless travel without a transition map.

  • Bug Fix: Setting invalid quality values for GameUserSettings is no longer possible.

  • Bug Fix: You can make a copy before iterating in UGameplayAbility::ApplyGameplayEffectSpecToTarget in case of side effects that alter the container.

  • Bug Fix: Added checks to curve table import to prevent users from importing curves that contain entries with multiple keys with the same time entry. This prevents unexpected behaviour where only one of the entries would be displayed in the editor and only one entry would be used in curve table evaluation (but not necessarily the same entry in both cases).

  • Bug Fix: Fixed comments on buried methods in APlayerCameraManager.

  • Bug Fix: Fixed an issue where spring arm components with bDoRotationLag=true would never pass through pitches of 90 or -90 degrees.

  • Bug Fix: Replicated Child Actors are now correctly spawned using the ChildActorTemplate and not the Class Default Object archetype.

  • Bug Fix: Fixed bWantsToCrouch not set for simulated proxies, which could cause premature crouch/uncrouch issues if proxies use root motion that runs through the full PerformMovement->UpdateCharacterStateBeforeMovement() flow.

  • Bug Fix: Fixed various issues with FindTeleportSpot to reduce the chance of players falling out of the environment, and to improve overall placement consistency.

  • Bug Fix: Player Input’s “Discard Player Input” now correctly discards the player input.

  • Bug Fix: Fixed immutable structs with non-editable properties corrupting later properties in the component instance data cache byte stream.

  • Bug Fix: Print String messages with duration no longer display for shorter periods of time when playing in PIE with multiple player viewports.

  • Bug Fix: Fixed an issue where FGameplayAbilitySpecHandle::GenerateNewHandle could create duplicate handles if called from different modules.

  • Bug Fix: Fixed a bug where we don’t tick USceneCaptureComponent on DS by default now.

  • Bug Fix: Hierarchy is now correctly maintained when harvesting components to create a Blueprint, including maintaining relative transforms when creating a Blueprint from Actors that have an attachment relationship but an intervening Actor is not selected. For example, A → B → C, only A & C are selected.

  • **Bug Fix: **Fixed potential corruption of the Streaming Levels array if an on Level visibility delegate makes additional additions or removals of Streaming Levels.

  • **Bug Fix: **Fixed a bug where the AssetManager could fail to call load delegates in synchronous load mode.

  • New: Adding key flags so that we can earmark touch keys as touch input.

  • **New: **Added UActorComponent::bVisualizationComponent boolean to indicate that a component is being used as a visualizer and is not a part of the component hierarchy. This prevents it from being selected in viewports (if clicked it will route to its parent component) or displaying the component trees by default. This replaces using bIsEditor to imply the component is for visualization purposes.

  • **New: **Added UGameplayStatics::LoadGameFromMemory function for use by native code.

  • New: Changed display name of some Gameplay Cue Blueprint functions to be more explicit about what they are doing.

  • New: Latent actions are no longer processed for non-Blueprint objects.

  • New: Added AActor::CanDeleteSelectedActor virtual that allows Actors to indicate they cannot currently be deleted and what the reason is.

  • New: Mark several functions as “BlueprintThreadSafe” for less common gameplay types that might want to be used by animation.

  • New: Added MinimalApi to ACullDistanceVolume.

  • New: Added template cast versions of UWorld::GetFirstPlayerController, UWorld::GetFirstLocalPlayerFromController, AActor::GetGameInstance, AController::GetPlayerState, APawn::GetController, and UUserWidget::GetOwningLocalPlayer.

  • New: Added two new data types, composite data tables and composite curve tables. These types allow you to combine multiple data and curve tables that share the same row type. Composite tables are effectively a stack of other tables. Each table on the stack can add new rows or overwrite rows that were added by previous tables on the stack.

  • New: The FManagedObject reference returned from GetManagedObject is no longer const as there is need to be able to cache values in sub-classed FManagedObject structs.

  • New: Add ExecutionOptions enum to GameplayCue functions, allowing skipping notifies/interfaces to save on performance.

  • New: Add GameplayTags.DumpTagList editor command to output all gameplay tags and metadata to a csv in Reports/TagList.csv.

  • New: Added a new lifecycle event UGameInstance::PostCreateGameModeForPIE, called when starting up PIE right after the game mode is spawned; this allows early validation / rejection of pie settings before player controllers are created, etc.

  • New: Added a Blueprint method DoesDataTableRowExist to determine whether or not a table contains the specified row.

  • New: UE4 now defaults to symmetric mouse horizontal and vertical sensitivity. (Previously, pitch was 70% less than yaw.)

  • New: Added “GetAllLocation” exec command. Removed “GetAllState” as it does not actually get the state of anything.

  • New: Optimized FTimerManager for faster lookup and removal of existing timers by handle and by bound object.

  • New: Optimize AActor::WasRecentlyRendered for cases where it has been recently rendered and we’ve recently queried the last render time.

  • New: TInlineComponentArray can now specify to include components from Child Actors.

  • New: Publicly expose the Engine’s Particle System pool used by GameplayStatics.

  • New: Added new vertical split screen mode for 3 and 4 players that give each player full height and divides the screen horizontally.

  • New: To avoid Level Streaming hitches, RouteActorInitialize will now always run in a separate frame from any other Level Streaming incremental steps if we are using Streaming time limits.

  • New: Added UWorld::IsRefreshingStreamingLevels function to query if we are currently executing a RefreshStreamingLevels call.

  • **New: **Added new broadcast events for Game Mode for “Initialized”, “Prelogin”, and “Match State Set.” Also, fixed up other delegates to use accessor and changed their privacy. Note that these events are not PIE friendly because they could fire across all instances.

  • Removed: Removed previously deprecated InputGesture.h Marked FInputGesture as deprecated.


  • Crash Fix: Fixed an assert when hot-reloading a String Table asset.

  • Bug Fix: Stale subtitles are no longer used in dialogue waves.

  • Bug Fix: Fixed an issue that caused the Editor to fail when loading native game localization data during initialization.

  • New: Added functions to get the localized spoken and subtitle text from a dialogue wave.

  • **Improvement: **Localization Resource (*.LocRes) files will now use narrow strings where possible rather than always forcing wide strings. It can produce considerably smaller files that are up to 50% smaller.

  • Improvement: Changing localization target settings in the dashboard now updates the gather .ini files immediately.


  • Crash Fix: A potential crash was fixed when connecting to a server if the travel is cancelled at a specific time.

  • Crash Fix: Fixed a rare crash that could occur while loading maps that contained blueprints with replicated variables or events.

  • Crash Fix: Fixed a server crash when trying to add a split-screen player with an invalid net index.

  • Crash Fix: Fixed some crashes that could occur if the engine received malformed network data.

  • Crash Fix: Fix for a crash that could occur if a socket error occurred while sending the initial join request to a server.

  • Crash Fix: Fixed a crash in the ShooterGame replication graph when seamless traveling with streaming levels.

  • Crash Fix: Fixed a rare GC assertion / crash with Qos.

  • Bug Fix: Fixed null socket error message to use SocketSubsystem name instead of WinSock.

  • Bug Fix: Added a speculative fix for net driver freeze when pulling PS4 LAN cable.

  • Bug Fix: Fixed GetHostName failing to convert UTF-8 data correctly.

  • Bug Fix: Fix for the ability system that would try to replicate data for a pending kill attribute set.

  • Bug Fix: Fixed GetNetMode calculation on UWorld for Editor builds. Bad logic used PIE derivation for -game/-server Editor builds was returning NM_Standalone while PendingNetGame and Cooked builds would return NM_Client during this time.

  • Bug Fix: Fixed some garbage collection issues with replicated level script actors in streaming levels.

  • Bug Fix: Timespan variables can now be replicated.

  • **Bug Fix: **Fixed an issue on Windows where stopping a FramePro capture would also freeze the process. Some named events have been added within the replication graph to help with profiling.

  • Bug Fix: Prevented Streaming Level Visibility changes from closing channels for static actors on the server. It should prevent them from being destroyed on the client.

  • Bug Fix: Fix for pawn relevancy position stuck at possession point. It fixes an issue where relevancy position becomes incorrect.

  • Bug Fix: Fixed an issue where the animation of a remote client character could appear to stutter from the perspective of a listen server.

  • Bug Fix: Actor components that are dynamically created in blueprints and have their replication flag set will now properly replicate.

  • Bug Fix: Fixed an issue with FUrl improperly removing opening and closing brackets from Ipv6 addresses.

  • Bug Fix: Fixed the compilation of unit test minimal client for shipping builds.

  • Bug Fix: Fixed FQuat network serialization modifying the original value.

  • Bug Fix: Fixed warnings caused by not marking a streaming level’s world settings channel during seamless travel.

  • Bug Fix: Fix for SteamAuth spamming logs on dedicated servers when it is unable to punish an invalid user immediately.

  • Bug Fix: Fixed incorrect value of out parameter properties in remote multicast calls when using the shared network serialization path.

  • Bug Fix: Fixed an issue that could introduce extra latency in property or unreliable RPC replication if reliable RPCs were also replicating under moderate to high packet loss.

  • New: Added new “net pktlossburst=x” debug console command. It will drop incoming and outgoing packets for the next x milliseconds and is particularly useful with the “setbind” command to debug issues that only occur under packet loss.

  • New: The “UDP Messaging” plugin wire format is now in binary. It uses the CBOR protocol instead of JSON, cutting message size significantly. Communication is backwards compatible and does not require updating older “MessageBus” nodes to work.

  • New: Total packets sent/received, total number of bytes sent/received, and total packets lost both in and out are now kept track in the net driver.

  • New: Replaced FDateTime::UtcNow() calls with FPlatformTime::Seconds() in FSocketBSD since UTCNow calls are slower on some platforms.

  • New: MessageBus UDP messages can now be marked optionally reliable using message flags.

  • New: Added a cycle counter stat for the system socket send call in IP connections that can be tracked in UE4 stat captures.

  • New: Added support for gameplay tags and containers to use the shared network serialization path.

  • **New: **Added support for the IP net driver to optionally use a separate thread to receive packets.

    • This is a useful optimization for platforms where the socket system calls can take a while.

    • Can be toggled by the console variable net.IpNetDriverUseReceiveThread.

    • Added a Shutdown function to FSocket that wraps the BSD shutdown function. This is used to cause the Wait() call on the receive thread to return when the net driver shuts down.

    • Added an IsSocketWaitSupported function in ISocketSubsystem so that callers can find out if the system supports the FSocket::Wait() call. If not, the net driver won’t use a receive thread.

    • The BSD socket implementation of Wait() now interprets a negative timeout as no timeout.

  • New: Added support for IP connections to optionally make the socket send call on a background thread. It helps platforms where the socket send system calls can take a while. You can toggle it using net.IpConnectionUseSendTasks.

  • New: Adding a new compare function for FInternetAddrs. The CompareEndpoints function can handle protocol differences instead of straight checking the structure data.

  • **New: **GameMode class now verifies the type of unique id the client is using before letting them onto the server.

    • If unique ids are used and types don’t match it rejects the player

  • New: Added DDoS detection/mitigation, for non-NetConnection UDP packets - for dedicated servers. See DDoSDetection.cpp for more details. description.

  • New: Added mapped IP searching for matching incoming packet IP’s, to NetConnections - as a performance optimization

  • New: Added the ability to query address information in a protocol-agnostic way with the new ISocketSubsystem::GetAddressInfo function. For those familiar with BSD sockets, wraps the BSD getaddrinfo function within the socket subsystems.

  • New: Added FInternetAddr::GetRawIp and FInternetAddr::SetRawIp functions to allow setting the bits of an address with arbitrary length to support the larger size of IPv6 addresses.

  • New: Added the FInternetAddr::Clone function to enable copying addresses without losing extra information that may be stored in subclasses, such as extra information for IPv6.

  • New: Added the FInternetAddr::CompareEndpoints function. As opposed to directly comparing the raw bytes of the address, it can account for different protocols, allowing an IPv4-formatted address to compare equal to the same address stored as an IPv4-mapped address in IPv6.

  • New: Modified Strophe to pass expat memory alloc wrappers so that expat calls into UE4 to allocate.

  • Improvement: Included some extra validation to FStropheWebsocketConnection just to sanity check the parameters sent to libstrope.

  • Improvement: Modified some cvars in replication code paths to reduce virtual calls.

  • Improvement: Made some optimizations to object copying in the packet handler code.

  • Improvement: Reduced memory usage of the replication system when using the dormancy feature.

  • Improvement: Optimized the memory size of some internal networking data structures which may improve performance in projects that use large amounts of bandwidth for replicated data.

  • Removed: STATS requirements have been removed for the Network Profiler and now only works in non Shipping and Test Builds.

  • Removed: Removed some excessive logging in the replication graph.


  • Crash Fix: Fixed a rare replay scrubbing crash when iterating the levels of the loaded world.

  • CrashFix: Fixed a rare crash that could occur during replay playback.

  • Crash Fix: Fixed a crash when retrieving cached response headers in the HTTP network replay streamer on Xbox.

  • **Crash Fix: **Fixed a crash that could occur when trying to play a replay during a PIE session.

  • Bug Fix: Modified replay checkpoint serialization to include additional network identifiers.

  • Bug Fix: Moved the local file replay streamer tasks to background thread priority, and added additional stats.

  • Bug Fix: Adding a warning when importing replay files into the save game streamer on PS4 if they are not the correct case.

  • Bug Fix: Added additional checks for a corrupt replay files in the local file streamer.

  • Bug Fix: Fixed incompatible property logging when playing older replays.

  • Bug Fix: Fixed a race condition in the local file replay streamer that could cause the replay to pause indefinitely.

  • Bug Fix: Added the ability to toggle between interpolated and standard replicated character movement in replay playback.

  • Bug Fix: Fixed multicast remote calls not being passed to the replay system when using a replication graph.

  • Bug Fix: Fixed a slow memory leak in client replay recording if the demo.ClientRecordAsyncEndOfFrame console variable was enabled.

  • Bug Fix: Fixed an issue with incorrect character rotation in client recorded replays.

  • Bug Fix: Fixed an issue where modifying an existing local replay file could cause data corruption.

  • Bug Fix: Fixed potential memory exhaustion when rapidly scrubbing during replay playback.

  • Bug Fix: Fixed an issue where some actors would be incorrectly teleported to the origin after scrubbing during replay playback.

  • Bug Fix: Fixed an issue that could cause the data in a dynamic array on static actors to be incorrect after scrubbing a replay.

  • Bug Fix: Fixed an issue with incorrect timestamps being saved into replays when using amortized checkpoint writes.

  • New: Modified replication property changelist merging to use array moves.

  • New: Added a unique identifier to the network replay header.

  • New: Added a throttle warning when exceeding the maximum replay record time.

  • Removed: Removed an unused Printf string format parameter in the HTTP network replace streamer.


  • Crash Fix: Fixed a potential crash in OnlineSubsystem::GetByPlatform during shutdown. Code will no longer try to load a module if it was already unloaded.

  • Bug Fix: Fixed and issue with PartyBeacon manual team assignment to verify that the assignment can actually fit on the team in question.

  • Bug Fix: Added more failure cases to the rich presence test such that it fails if the platform does not respond during extended testing scenarios.

  • Bug Fix: LoginFlow module now accesses the web browser singleton on demand when setting cookies. This is to prevent instantiating the singleton when it is not required.

  • Bug Fix: Fixed BuildPatchTool file ignore list to parse using platform agnostic method.

  • Bug Fix: FVariantData json type now has ToString() support.

  • Bug Fix: Fixed github major builds getting filtered out when performing matchmaking over Steam.

  • Bug Fix: QoS region detection will no longer try to set a default region if region determination has never been made.

  • Bug Fix: Fixed an issue causing the engine to not realize when the default OSS name changes when -no is specified on the command line. Now the code returns runtime the default OSS name and not just what’s in the .ini.

  • Bug Fix: Fixed a timeout in Steam matchmaking when the results contain a lobby we are already in.

  • Bug Fix: Fixed a network disconnect that could occur in certain rare scenarios when Steam authentication was enabled.

  • Bug Fix: Switch Online Subsystem will now trigger the “OnConnectionStatusChanged” delegate when the nifm network connection status changes.

  • Bug Fix: Fixed FUniqueNetIdRepl serialization for out of engine Online Subsystems

  • New: Added a TCHAR* constructor for FOnlineError. Constructing an FOnlineError with a TCHAR* previously would invoke the bool constructor.

  • New: Steam can now query various different types of friends list, bringing support in parity with other platforms.

  • New: Disk space requirement can now be lower when patching if destructive patch mode is enabled. This mode will delete existing old files once they are not needed.

  • New: HTTP modules can now be used to detect proxies in the libwebsockets wrapper.

  • New: QOS ping code has changed format to accommodate SubRegions

    • topology setup so that clients can hint at sub region preference

    • added cheat codes to dump regions and ping on demand

    • +RegionDefinitions=(DisplayName=NSLOCTEXT(“MMRegion”, “Region”, “RegionDisplay”), RegionId=“USA”, bEnabled=true, bVisible=false, bAutoAssignable=false)

    • +DatacenterDefinitions=(Id=“VA”, RegionId=“USA”, bEnabled=true, Servers[0]=(Address=“x.y.z.w”, Port=xxxx), )

  • New: OnlineSubsystem now has a IsUniqueIdLocal function for determining location of player (not Play in Editor safe)

  • **New: **OnlineSubsystemIOS purchase interface will now trigger “unexpected purchase” delegate when a deferred (ask to buy) transaction is approved. Deferred purchase test harness for iOS was added since “simulate ask to buy” did not work. It can be enabled with TEST_DEFERRED_TRANSACTIONS to add delay to all successful purchases.

  • New: BPT PackageChunks: Adding tool mode JSON output for listing created chunkdb files.

  • New: Added support for pinning certificates for HTTP (Android, Linux, Windows) and Websocket (Android, iOS, Linux, Mac, PS4, Windows) connections.

  • **New: **Added a whitelist for allowed domains when initiating HTTP requests.

  • New: Changed string encoding of Switch FUniqueNetIdSwitch to be more compact.

  • New: Added the ability to set a Correlation ID Generator method on the HTTP Manager.

  • New: CEF Web Browser now exposes “net security expiration” feature via bEnableNetSecurityExpiration

  • New: Only create an HTTP thread if the platform uses threaded HTTP

  • New: Added specific logging categories for all the major OSS interfaces which default to Log and follow the format LogOnline

  • Improvement: Increase FUDPPing::UDPEcho precision on Switch.

  • Removed: Removed redundant logic in OSSSteam.

  • Removed: Remove WinInet Http implementation. The curl implementation provides a superset of features.


  • Bug Fix: Fixed an issue which required the “Extract” button to be pressed twice if the naming template was modified while extracting sprites.

  • Bug Fix: Fixed an issue caused by using a multi-tile brush from a tile set with a different tile size than the tile map being edited.

  • Bug Fix: Collision tiles are no longer offset incorrectly for tiles from a TileSet with a different size than the TileMap they were placed in.

  • New: Default thumbnail size has been increased for related sprites list in the Sprite Editor.


  • Bug Fix: Fixed an issue with a PhysXCollision log message name printing in ANSI instead of a wide string literal.

  • Bug Fix: Fixed overlaps re-triggering on movement due to bad transform chaining from component to physics Actor to shape

  • New: Moved immediate mode into engine, as it is now depended on by the physics engine.

  • New: Renamed Snap To Bone Constraint to reflect that this only snaps for translation.

  • **New: **Added gravity override option for Clothing Assets, Anim Dynamics nodes, and the Physics Asset Editor settings.


  • Crash Fix: Reduced bone transform ensure in clothing context to a warning. This no longer occurs requiring an ensure to fire.

  • Crash Fix: Fixed NaN ensure in physical mesh skinning for clothing if the render mesh has a vertex with a zero-length normal.

  • Bug Fix: Fixed erratic clothing simulation caused by LOD updates triggering extra simulations of low LOD Actors.

Collision Detection

  • **New: **Added a new console variable (p.HitDistanceTolerance) threshold for what depth inside an object is permitting when performing a hit test. Previously, smaller errors could result in a body interpenetrating and getting stuck indefinitely.

Physics Asset Editor
Bug Fix: Updated key chord for multi-frame edit of constraints in the Physics Asset Editor. Now when rotating constraints both frames rotate by default and to split them ALT needs to be held to stop accidental frame splitting when setting up a Physics Asset.

Rigid Bodies

  • Bug Fix: Fixed out of bounds access when meshes have bones removed under a Physics Assets.


  • Bug Fix: Fixed an issue where nn::fs::Commit may be called with existing file handles open to journaled mount points (“cache:”).All open file handles are now tracked for each journaled mount point. They will be closed and reopened if the journal needs to be committed.

  • Crash Fix: Fixed a crash that could happen with loading by making sure the read order of the pak files at the same patch layer are are the same. That way, when a delete record in one patch pak file won’t skip loading of assets from another patch pak file that has the same patch layer.

  • Bug Fix: Fixed Mesh Decal rendering when render target write mask is enabled and no Deferred Decals are in the scene.

  • **Bug Fix: **Fixed a bug with ASTC texture compression where we always assumed a block size of 4. The other block sizes will now properly compress textures with the correct multiple, for example, a 6x6 block size will now properly compress a 42x42 texture which would have not compressed previously.

  • Bug Fix: Fixed an issue where the Editor would cook debug viewmodes shaders on Desktop platforms even though they are never used in packaged games.

  • Bug Fix: Fixed CrashReportClient window size in high DPI mode.

  • New: Improved cook times by optimizing the way we calculate the total size of files for packages in FAssetRegistryGenerator::GenerateStreamingInstallManifest.

  • **New: **Terrain weight maps are now compressed on mobile. They use the same compression as specified for the World texture group.

  • New: Normal maps will now default to a 6x6 block when compressing via ASTC. It will provide better memory utilization for a small decrease in quality.

  • New: Added “HasSecurePackageFormat” function to TargetPlatform which indicates whether or not to consider the platform’s Shipping package format to be secure or not.

  • New: Added a frame-present-based hang detection. The new hang detection is based on the RHI thread presenting frames and is independent from the original hang detector. This allows the new hang detector to fire if, for example, the game thread is stuck in an async loading loop and is ticking the game thread heartbeat but making no progress.

  • New: Pulled LLMOverhead out into a column in LLMPlatform.

  • New: Refactored shader defines and platform headers to allow more easily supporting NDA or restricted platforms.

  • **New: **Implemented a new thread heartbeat clock to solve the suspend / resume problem across all platforms.

    • The hang and hitch detectors now maintain their own clocks which are ticked by their respective threads.

    • If the title is suspended, the ticking thread will stop and the clock will stop advancing. On resume, the maximum delta in the clock is clamped to a small value, so we ignore all the time the thread was not ticking for (i.e. the duration of the title being suspended).

    • As such, we don’t need any logic for handling PLM suspend / resume in the hang and hitch detectors, so this change removes that too.

  • New: Added a CSV stat for the needed size of the streaming texture pool, which is set by using the console variable r.StreamingPool.Size.

  • Improvement: Optimized DBuffer Decals on all consoles.

    • Removed the need for a fast clear eliminate by rejecting samples using the decoded cmask which saves saves 0.3ms.

    • Added support for per-DBuffer rejection but needed to remove the fast clear eliminate to do so.

All Mobile

  • Bug Fix: Fixed an issue where Unreal Remote 2 did not send information about motion control.

  • Bug Fix: Fixed an issue where Android “Launch On All” was unable to run during an existing Launch On session on Windows. The previous sessions are now cancelled before launching the selected configuration.

  • **Bug Fix: **Fixed “SpeedTree” node not working on feature level ES3.1.

  • Bug Fix: Fixed an issue where force changed events were firing after “Touch End” event was causing us to have mystery touches that were blocking multi-finger touch in the front end.

  • Bug Fix: Typo in Support Software Occlusion Culling tooltip in Project Settings.

  • New: Added support for transparency in the 3D Widget components on mobile by modifying Web Texture’s material blend mode to “Translucent.”

  • New: SetVisibility implemented on iOS and Android’s web browsers, by extending the implementation on Windows. This uses a list to store references to the web browsers in the scene , then in WebBrowserSingleton::Tick check if the cached web browsers windows or widgets ticked on the last frame.

  • **New: **Fixed LLM “Total Memory” to be accurate on mobile.

  • **Improvement: **Improvements the experimental Mobile PIE including device bezel support, rotation and zoom support.


  • Bug Fix: Fixed an issue where Android DLC profile in Project Launcher failed if there was a space in the path for the destination directory. We now avoid enclosing path arguments in double quotes (“”). MakePathSafeToUseWithCommandLine() already adds quotes when needed.

  • Bug Fix: Fixed an issue where the cursor was not being shown in Editor text boxes when focused on. Updated the widget’s cursor position from the native code.

  • Bug Fix: Fixed an issue where the Android Launch On “Running…” toast intermittently didn’t appear.

  • **Bug Fix: **Fixed Android’s double printing of Display messages.

  • Bug Fix: Screensaver state is now restored if the window resets on Android.

  • Bug Fix: Fixed virtual keyboard crashes on Android.

  • Bug Fix: Fixed an issue where console commands would be sent to the engine prior to its initialization being completed.

  • Bug Fix: Added some additional flags to configChanges in AndroidManifest.xml to prevent false application restarts.

  • Bug Fix: Fixes added to support the Samsung Game Tools floating keyboard.

  • Bug Fix: Fixed an issue where WiFi and wired ethernet status were not being returned properly when airplane mode enabled on Android

  • Bug Fix: Fixed string formatting for some locales in GetMetaDataString Method.

  • Bug Fix: Changes made to trigger a restart if startup movie, preload screen, or engine are not finished initializing and game is backgrounded instead of only showing a black screen after resuming.

  • Bug Fix: Build now stops after UPL parsing errors instead of continuing and creating an APK not including the UPL modifications.

  • Bug Fix: Fixed an issue where the alpha channel was inverted during the PrefilterPlanarReflectionPS step, causing Planar Reflection gamma / brightness to be incorrect on Samsung Galaxy S5.

  • Bug Fix: Fixed issues with LLDB data formatters with 2 byte characters.

  • Bug Fix: Fixed crash caused by FD_SET macro being invoked when Socket FD exceed 1023.

  • Bug Fix: Fixed an issue where the sample app URL was malformed, causing the Web Browser widget to not load a default page on Android.

  • Bug Fix: Updated default Android splash screens to match iOS.

  • Bug Fix: Corrected issue with AKEYCODE_BACK being ignored if controller support is disabled.

  • Bug Fix: Fixed string formatting for some locales in GetMetaDataString method.

  • **Bug Fix: **Fixed handling of line endings in ConfigRulesTool.jar parsing for Linux.

  • **Bug Fix: **Fixed an issue caused by an app pause event triggered when the obb downloader starts and puts the activity in background. Adding a flag to ignore the first app pause in this situation.

  • **Bug Fix: **Fixed TWeakPtr/TSharedPtr usage for virtual keyboard and startup movies on Android.

  • **Bug Fix: **Fixed issue with hover events and Viewport GetMousePosition not working on Android when using an external mouse.

  • Bug Fix: Do not call getPresentationDeadlineNanos on older Android versions.

  • Bug Fix: Corrected TextureFormats reporting for PVRTC.

  • Bug Fix: Avoided async PSO compilation on OpenGL, since it’s a waste of time. Tuned PSO cache batching to work around a bug in S8 mali drivers.

  • Bug Fix: Added external URL calls to purchase flow on Android.

  • New: Added code to avoid tripping up profilers on android when the number of unique threads call vobis decompression is unbounded.

  • New: Implemented RHISubmitCommandsHint for OpenGL to call glFlush.

  • New: Tweaked out Android frame pacing. The main change here is to identify and respect the display refresh rate. There is also a lot of changes to the choreographer method, but these are not active.

  • New: Adjusted Android frame pacing based on the results of new code that is able to monitor the progress of frames out to the display.

  • New: Updated CodeWorks for Android to 1R7u1 (NDK 14b, SDK 26).

  • New: Tweaked OpenGL platforms on the reporting of new PSOs. OpenGL is a BSS platform so anything with the correct shaders is a match, state doesn’t matter.

  • New: Reduced *.stable.upipelinecache files for OpenGL platforms to just hit each bound shader state. OpenGL does not care about the render state or vertex decl when compiling shaders.

  • New: Reworked how OpenGL occlusion queries work with an RHI thread (Android). We now poll the queries more frequently and also deal with the case where we wait for the GPU more quickly. Measurements showed an occlusion query latency of 2 was slightly faster, so that is now used.

  • New: Android native media volume control has been reenabled.

  • **New: **Added notification channel for Android 26 compatibility.

  • **New: **Android Shipping builds now use the internal (i.e. application-private) storage when writing to the Saved folder.

  • **New: **Added support to Android device profile matching to match a rule based on command line parameters using SRC_CommandLine.

  • **New: **The ES2 feature level now permits texture sampling in vertex shaders.

  • New: Added support for Android devices to make a low power mode callback, similar to other mobile systems.

  • **New: **Added an Android Project Settings checkbox to enable detection of Vulkan device support by default. If unchecked, the -detectvulkan command line parameter can be used. This is useful if you want to configure device profiles to support vulkan but do not want to use it by default during development.

  • **New: **The experimental Mobile PIE can now export a .json profile file for the currently-connected Android device.

  • **New: **Added support to Android strings to use 2-byte TCHARs, saving memory.

  • New: Added ConfigRules system to allow chipset identification and assigning thread affinity.

  • New: Added FPlatformMisc::GetCPUChipset and it is now appended to FPlatformMisc::GetDeviceMakeAndModel if detected.

  • New: Access to “getProp” from C++ through AndroidThunkCpp_GetMetalDataString is now allowed. For example, TEXT(“getProp:ro.hardware”) returns “ro.hardware”. It allows extending the GameActivity implementing sections with UPL.

  • **New: **Added way for UPL to disable minify and Proguard.

    • Disable minify by adding DISABLE_MINIFY=1 to UPL block

    • Disable Proguard by adding DISABLE_PROGUARD=1 to UPL block

  • New: Added Project Setting allowing OBB larger than 2 GB for Android.

  • New: The following Javascript is available with the web browser java bridge. Use the following to define device and window dimensions where (x,y) = device width and height, and (z,w) = window width and height (if you need it).

    • window.uePlatform = “Android”;

    • window.ueDeviceWidth = x;

    • window.ueDeviceHeight = y;

    • window.ueWindowWidth = z;

    • window.ueWindowHeight = w;

  • New: Added SRC_DeviceBuildNumber for Android device profiles to check driver version.

  • New: Added FAndroidMisc::GetConfigRulesVariable() to look up variables from new ConfigRules system.

  • New: Added a CallDoubleMethod method to FJavaWrapper for JNI methods that return doubles.

  • New: Moved the virtual keyboard out of Experimental and make it enabled by default.

  • **New: **Added access to refresh rate and presentation time in AndroidThunkCpp_GetMetaDataFloat(TEXT(“ue4.display.getRefreshRate”)).

  • **Improvement: **On Android, the kernel / adb logcat output logging is no longer buffered by Unreal. It fixes out of order logging problems with LowLevelOutputDebugString and improves the reliability of UE_LOG lines being displayed when debugging crashes.

  • Improvement: Appended Vulkan to GRHIAdapterName on Android to make it easier to tell if using Vulkan RHI.

  • **Improvement: **Improved Android OpenGL binary shader program caching system with shader LRU cache

  • Improvement: We no longer use the NDK headers for Vulkan and instead use the ones we distribute in the ThirdParty folder, or the ones in the SDK folder if a newer is installed.

  • Improvement: Improved determination of used physical memory stat on Android. It updates every 10 seconds on another thread to prevent hitching and reports to logcat.

  • Improvement: We now use a better way to get store version using APK package info during deployment.

  • **Improvement: **Updated APK size limit tooltip.

  • **Improvement: **Vulkan on Android is no longer marked as experimental.

  • Removed: Disabled thread rendering for Kindle Fire HD 7 5th gen. See DefaultDeviceProfiles.ini.

  • **Removed: **Removed x86 option for Android. It is no longer supported by PhysX 3.4.

  • Removed: Removed the x86 architecture from Android Project Settings that is no longer supported. Instead, use x86_64.


  • New: We now make use of the enums in UAsyncTaskDownloadImage::HandleImageRequest() to enable RGBA vs BGRA options for JPG decoder.

  • New: Splitting single large template files into smaller component (e.g. js & css) files is now supported. Custom template files are now also supported on a per-project basis: copy …/Engine/Build/HTML5/GameX.*.template to /Build/HTML5/. The build will automatically pick up the project’s path (otherwise fallback to the Engine’s version).


  • Crash Fix: Fix added for crashes caused by MSAA-depth-resolve not being available on A7, A8 & A8X.

  • Bug Fix: Validate that the current iOS/macOS version can support the desired Metal shader version and if not open a message dialog then exit.

  • Bug Fix: iOS “low power mode changed” delegate is now handled on the game thread.

  • Bug Fix: Fixed an issue caused by having a space in the manifest name.

  • Bug Fix: Fixed an issue where OnUrlChanged did not fire on mobile.

  • Bug Fix: Fixed the default Online Subsystem on IOS to be the correct Online Subsystem.

  • Bug Fix: Fixed a memory leak caused by certain overlay dialogs being active.

  • Bug Fix: Prevent Xcode upgrade warnings for >9.0 versions.

  • Bug Fix: Made a change to always set the Store actions on Apple A8 devices when using an MSAA texture - there’s a driver bug that prevents using deferred store actions in this case.

  • Bug Fix: Fixed an issue with the default orientation on iOS applications by adding Initial interface orientation in the generated Plist file (UIInterfaceOrientation key). Also implemented preferredInterfaceOrientationForPresentation in the IOSViewController - re-arranged the orientation list in the Plist file.

  • Bug Fix: Added a workaround for an iOS Metal limitation where using samplers with anisotropic filtering in vertex shaders produces incorrect results by creating a version of the sampler without anisotropic filtering that is bound to vertex & compute shaders instead. This fixes longstanding problems with World Position Offset in the Forward renderer on iOS.

  • **Bug Fix: **Updated IphonePackager to be able to verify UDID on new devices (XS or newer).

  • **Bug Fix: **Startup movies were not automatically playing for tvOS due to the “Apple Movie Player” plugin being disabled. It is now enabled by default.

  • **Bug Fix: **Fixed null pointer exception in IPhonePackager when a matching certificate could not be found.

  • **Bug Fix: **Fixed a problem with deployment on IOS failing if a project file generator other than Xcode is selected.

  • Bug Fix: Sorted out the way we report R11G11B10 support for Metal so that it should work correctly on iOS & tvOS.

  • Bug Fix: Fixed a bug where we were tracking device orientation rather than interface orientation to set UI safe zones.

  • Bug Fix: Fixed force feedback on iPhone 6 and 6s.

  • Bug Fix: Resolved an issue where tvOS images were throwing errors when attempting to deploy to iTunes Connect.

  • Bug Fix: Fixed an issue to allow more recent Metal shader versions and features to compile for Apple tv by adding explicit tvOS shader platforms. We were relying on a bug in Apple’s Metal toolchain to allow sharing shader bytecode between iOS and tvOS but that has been fixed in more recent releases.

  • New: Add support for new iOS UserNotifications framework. It is enabled if the minimum iOS version is set to 10 or higher.

  • New: Added support for iOS Client builds.

  • New: Added QuantizeSize to MallocBinned1 which saves memory on iOS.

  • New: Added support for Windows Store version of iTunes.

  • New: Added support for SetNativeVolume to iOS media player.

  • New: Implemented the equivalent of FAndroidJSScripting for iOS.

  • New: New splash screens for iOS with UE logo.

  • New: On iOS11, we now use a new method for determining available storage space.

  • Improvement: Precompiled headers are now enabled by default for IOS. Reduces build time by ~25%.

  • New: Movies can now be played from the Persistent Download Directory. This allows developers to download the movie from an internet source for playback.

  • New: Background downloading is now supported on iOS. This is currently experimental and can be enabled in the games IOSEngine.ini file under the [/Script/IOSRuntimeSettings.IOSRuntimeSettings] section. Set bEnableBackgroundFetch to true and it will then be enabled. Developers will still need to write their own code to handle the download in the background.

  • New: Added ability to determine if the device is in low power mode. Developers may now call the IsInLowPowerMode method on PlatformMisc to retrieve the low power state of the device.

  • Bugfix: Optimized the retrieval of the thermal temperature and the battery levels. This should reduce the overall impact of retrieving this data.

  • Bugfix: The Documents/ | Engine]/Content directories are no longer back up to iCloud. These directories do not contain any user data and usually contain downloaded content which should not be backed up to the cloud.


  • Crash Fix: Fixed a crash caused by the SplashScreen window being destroyed.

  • Crash Fix: Removed an old runtime crash that was caused by symbolicating code.

  • Crash Fix: Fixed a crash caused by no valid LinuxApplication being present.

  • Crash Fix: Fixed a crash when running editor automation tests with -nullrhi.

  • Bug Fix: Fixed an issue where making a third party plugin DLLIMPORT would have different defined statements.

  • Bug Fix: Resolved an issue that caused ICU to be disabled by default on servers.

  • Bug Fix: The slate renderer is now kept in sync with the requested window size.

  • Bug Fix: Fixed an issue caused when launching to a remote Linux machine running X11 where DISPLAY=:0 was assumed.

  • **Bug Fix: **bIsVisible is now preserved when using BringToFront over Show/Hide the window.

  • Bug Fix: We now write to stderr when we fail to find the sym file that was expected to be found for main Module.

  • Bug Fix: We now use the Target RHI list as the default ordering for which RHI is preferred.

  • Bug Fix: Command lines are now allowed to preserve the psym file from dump_syms.

  • Bug Fix: Fixed some issues where, when symbolicating, line numbers would show as zero.

  • Bug Fix: Cygwin will be removed from %PATH% when cross-building PhysX on Windows.

  • Bug Fix: We now use MallocCrash for logging when out of memory in BinnedAllocFromOS.

  • Bug Fix: We now use MallocCrash when hitting out of memory issues in BinnedAllocFromOS.

  • Bug Fix: Changed BreakpadSymbolEncoder to handle the situation of a file not having a newline at EOF.

  • Bug Fix: Fixed missing defaults if there are no settings found when clicking Launch On.

  • Bug Fix: We now run UnrealVersionSelector in the background to avoid blocking a chain command with Setup.sh.

  • Bug Fix: Disabled generating CFI info when running dump_syms.

  • Bug Fix: Fixed an issue where char pointer became invalidated before it got to the Vulkan call that used it due to TCHAR_TO_ANSI.

  • Bug Fix: Fixed an issue where the cursor would be confined if the width/height bounding box was less than or equal to zero.

  • Bug Fix: Fixed the handling of build scripts when out of directory.

  • Bug Fix: Fixed a deadlock when printing during a signal handler.

  • Bug Fix: In Vulkan RHI, we no longer use UBsOptimization if it is not supported.

  • Bug Fix: Fixed ContainerBuildThirdParty.sh to pick the first default interface.

  • Bug Fix: Resolved an issue in which context menus were closing when opening and closing multiple sub menus quickly.

  • Bug Fix: We now only add escape color codes when outputting to a terminal.

  • Bug Fix: Fixed LLDB visualizers.

  • Bug Fix: If we are using the native bundled toolchain set LC_ALL=C to avoid locale issues.

  • Bug Fix: Clean up children processes of RunUAT.sh if a SIGTERM is received.

  • Bug Fix: Automatically symbolicate Phyx/Apex when they rebuild for Linux.

  • **Bug Fix: **Fix confining pointer to a window when the window was moved or resized.

  • **Bug Fix: **Made SetReuseAddr() also set SO_REUSEPORT where available.

  • Bug Fix: Fixed a crash issue with Vulkan on Linux when alt-tabbing while in fullscreen.

  • **Bug Fix: **Added a workaround for corrupted tooltips on Vulkan.

  • **Bug Fix: **Fixed ARM32 and ARM64 PhysX libraries.

  • New: Enabled audio streaming. No longer need to use ADPCM.

  • New: Updated LLVM libc++.a libc++abi.a to version 6.0.1.

  • New: Rebuild SDL2 to a newer version hg-12121:4358e537000a.

  • New: Implemented the minimized function for LinuxWindow.

  • New: Made popup/context menus borderless. Slate controls this behavior and will give the menu events.

  • New: Added basic WebM video playback support for Linux.

    • Support added for *.mkv container.

    • Support added for *.vp8 and *.vp9 video codecs.

    • Support added for *.opus audio codec.

  • New: Updated toolchain setup script to download v12 when it is available.

  • New: OpenGL 3 RHI will no longer be enabled by default (can still be enabled manually).

  • New: Added support when symbolicating at runtime for inline call site. It fixes function names being shown improperly while symbolicating.

  • New: Switched Linux platform to use 16 bit wide strings.

  • New: Added test cases for inline callstacks.

  • New: We now cache the bundled toolchain when using Git builds.

  • New: Added support for KSM (Kernel same-page merging) by using madvice on our mmap’d memory pool. Enable with -useksm but requires specific kernel settings to be used.

  • New: CrashReportClient will now have user interface on Linux.

  • New: We now cache files that are invalid or the wrong case sensitivity to avoid multiple slow lookups in quick succession.

  • New: Vulkan: Exposed some additional driver information for Unix platform.

  • New: FramePro captures now work on Linux dedicated servers.

  • New: Windows that want to be resizable are now resizable.

  • New: GenericPlatformStrings::VarArgs() - implemented %-*s, %lu, %z, %h formatting.

  • New: Linux binaries will attempt to use Vulkan RHI by default and fall back to OpenGL if cannot initialize.

  • New: Added haptic support for controllers.

  • New: Added support to compile with ASan or TSan.

  • New: Bundled Linux toolchain (both cross and native) has been updated to clang 6.0.1.

  • New: Updated native toolchain buildscript to support clang 6.0.1.

  • Improvement: We now include more debug info in the build.

  • Improvement: Overhauled memory allocation under Linux, greatly reducing the number of VMAs.

  • Removed: Ability to target GL3 has been removed from Linux RHI settings.


  • Crash Fix:

    Fixed a rare crash in FMacApplication::DeferEvent().
  • Crash Fix: Fixed a crash when handling eGPU added/removed notifications.

  • Crash Fix: Fixed a crash in the editor on trying to browse for Git binary.

  • Crash Fix: Fixed a crash on Mac caused by an attempt to access a window that was already closed.

  • Bug Fix: Fixed a problem with packaged Mac apps not showing correct icon in Finder in certain conditions.

  • Bug Fix: We now retain-refs on Nvidia and old Intel drivers because they appear to be broken still.

  • Bug Fix: Enabled the more efficient buffer blitting code for AMD Vega and FirePro GPUs on macOS from 10.13.5.

  • Bug Fix: Made a slight change to ComputeNeighborhoodBoundingbox so that hlslcc can unroll the loop properly and thus avoid an AMD Metal shader compiler error.

  • Bug Fix: Improved reliability of drag and drop operations on Mac.

  • Bug Fix: Fixed issues with cursor locking on window activation on Mac.

  • Bug Fix: Fixed Xbox One controller mapping on Mac to match the defaults in latest drivers.

  • Bug Fix: Fixed an issue where holding down left mouse button would block other input in certain conditions.

  • Bug Fix: Fixed a problem with mouse click / drag events being received by incorrect window / widget in certain conditions while dragging windows on Mac.

  • Bug Fix: Fixed issues with window position and size when toggling between fullscreen and windowed modes.

  • Bug Fix: Report Metal PSO creation failures as warnings instead of fatal errors for PSOs created while preloading the cache. It works around a rare problem with the cache generating incompatible vertex / pixel shader pairs.

  • New: Enabled *.webm videos playback on Mac using IMediaPlayer and IMediaStreamer interfaces.

  • New: Moved Mac Ogg and Vorbis libraries to Engine/Binaries/ThirdParty to make them available for use in plugins.

  • New: Added a message box on Mac (for games only) asking users to update macOS to latest if they are running version older than 10.13.5.

  • New: Changed the required Xcode version for Metal shader compilation to 9.4.

  • New: Use -vsmac to generate a solution with GenerateProjectFiles.sh compatible with Visual Studio for Mac that allows development and debugging of UAT scripts.

  • New: Implemented BeginNamedEvent/EndNamedEvent on macOS and iOS using Apple’s new os_signpost API when compiling for iOS 12 and macOS 10.14 or later - it still requires turning on the CVar “Apple.InstrumentsEvents” because there’s no need to add overhead and this code will add some.

  • New: Added support for Nintendo Switch Pro controller and newer versions of PS4 and Xbox One controllers on Mac.

  • New: Improved Mac cook times by avoiding ANSICHAR to TCHAR conversion when processing Metal shader text.

  • Improvement: For non-sandboxed builds on Mac, we now make a copy of the OS-level shader cache and restore it on startup if it is purged by the OS. This helps to minimize startup time when using shader precompilation.

  • Improvement: Improved the Xcode project generator and unified compile warning flags across all Apple platforms.


  • Bug Fix: Disabled WHQL verification during the Windows hardware survey as this adds an additional network reliance to the process and can bloat processing times.

  • Bug Fix: Fixed out of bounds read in FWindowsPlatformMisc::QueryRegKey.

  • New: Stopped reporting STATUS_CONTROL_C_EXIT as abnormal shutdown. Closing the console log window is the most common way to get this exit code. From the app’s perspective this is a termination, not a normal exit. We now treat this as if it were a normal closure event.

  • New: Added -waitforattach commandline parameter. Specifying this when running Windows build will make the application wait until the debugger is attached.


  • **Bug Fix: **Fixed an initialization order bug with FColor and FLinearColor constants.

    • The original constants were dynamically initialized during startup. Using these constants from other global constructors may result in getting the wrong value (transparent black) if a given constructor runs before FColor/FLinearColor’s constructor.

    • Adding constexpr to the FColor/FLinearColor constructor makes these constants known at compile-time, and included in the read-only data section, so they don’t require dynamic initialization.

  • Bug Fix: Fixed issue in PrepareContext in the Environment Query System for vector and rotator cases where if an invalid value was in the input data, it would leave uninitialized memory in the output data.

  • Bug Fix: Fixed an issue where the child depth wasn’t properly calculated for children that shared the same parent when it isn’t at the root level.

  • **Bug Fix: **Packaging a plugin will now include the “Shaders” folder.

  • Bug Fix: Fixed an issue issue where the Framepro.StartRec console command wasn’t overriding the minimum scope time to 25 ms.

  • New: Added a module that implements a reader and writer for the cbor protocol. For more information, see http://cbor.io or https://en.wikipedia.org/wiki/CBOR.](CBOR - Wikipedia)

  • New: Added an OnCloseEvent delegate to the ISequencer API.

  • New: Added Checked and Ref variants of the Find functions in TLruCache.

  • New: Added a Merge function to FTransactionObjectEvent.

  • New: FStructOnScope can now be default constructed and moved.

  • **New: **If a plugin module is whitelisted for a specific program (via “WhitelistPrograms”: “UnrealHeaderTool” ], for example), it will be enabled regardless of whether the Type is “Program” or not.

  • **New: **Added the FramePro.StartRecScopeOverride console command to override the minimum scope times for events to get written to a FramePro capture.

  • New: Added FPlatformApplicationMisc::IsScreensaverEnabled for all platforms.

  • New: Added “Then” and “Next” functions to the TFuture interface to allow setting continuation. Also, added “Reset” to invalidate TFuture and any continuation that could have been set.

  • Improvement: Modified FKey to expose the existing support for getting a short name from FKeyDetails.

  • Improvement: Reworked the TimecodeSynchronizer to be able to handle sources other than media. It includes allowing Live Link Sources to be synchronizable, as well as converting System Time to be a Timecode Provider.

  • Improvement: Optimized SortActorsHierarchy, which is called by ULevel::IncrementalUpdateComponents.


  • Crash Fix: Fixed a crash when trying to “Update Mesh Section” on any procedural mesh just after “Clear Mesh Section” and “Create Mesh Section” for different vertices and triangles.

  • Crash Fix: Fixed crash when Swarm is not properly initialized. The swarm interface API changes slightly. Added more verbosity to Swarm initialization routines.

  • Crash Fix: Fixed a crash on small textures with LOD biases when using compressed formats.

  • Crash Fix: Fixed an Editor crash on second PIE session start with “nDisplay” plugin enabled.

  • Crash Fix: To avoid crashing when creating a shader-resource-view or unordered-access-view from a Metal buffer we need to ensure that the RHI object isn’t disposed of before it completes the RHI command.

  • Crash Fix: Fixed crashes caused by a threading-violation when creating MultiFrame uniform-buffers on Metal.

  • Crash Fix: Fixed Crash on startup if a Cubemap Texture for a Skylight is set in the constructor.

  • Crash Fix: Fixed a potential NVIDIA Ansel crash.

  • Crash Fix: Applied fixes for DX12 PSO cache crashes.

  • Crash Fix: Added a workaround for low repro-rate PSO cache crash.

  • Bug Fix: Fixed some issues with Vulkan stability on Linux and Android.

  • Bug Fix: Culling distance on Hierarchical Instanced Static Meshes is now correctly prioritized over LOD swap distance.

  • Bug Fix: Fix MetalRHI texture region update logic to avoid reading off the end of the source buffer when the update region is not an exact texture line by line match.

  • Bug Fix: Updated the LLM tag buckets between Materials and Shaders to better reflect the actual data layout. There is no change in the combined data size.

  • Bug Fix: Metal will now avoid incorrect rendering when callers of Create*Buffer fail to provide one of the BUF_Volatile|BUF_Dynamic|BUF_Static flags.

  • Bug Fix: Metal shaders will now prefer the use of fast-intrinsics wrapped to handle NaN/INF where necessary versus the precise intrinsics for improved performance.

  • Bug Fix: Fixed buffer visualization bug, where exposure was influencing it’s brightness.

  • Bug Fix: Minor optimizations to BoxSphereBounds construction.

  • Bug Fix: Fixed shader stage signature mismatches between lightmap density and depth-only shaders.

  • Bug Fix: When debugging Metal, we only keep information when r.Shades.KeepDebugInfo is set to 1 and when compiling with Xcode 10 is enabled in order to retain Metal code. The new shader compiler adds more instrumentation to support the shader debugger, which we don’t want in shipping games.

  • Bug Fix: Fixed errors caused by incorrect binding of UAVs in SetRenderTargets on MetalRHI when using linear-textures or texture-buffers.

  • Bug Fix: Metal 2.1 and above can now use the new “invariant” keyword to ensure that the position interpolator is optimized correctly, which eliminates the need to use fused-multiply-add instructions. Earlier versions of Metal still need to use FMA’s when compiling a tessellation shader or when compiling. This improves GPU shader performance slightly for Metal 2.1 and macOS 10.14/iOS 12 or later.

  • Bug Fix: Fixed depth downsampling in case of certain resolutions caused by occlusion culling issues on the borders of the screen.

  • Bug Fix: Fixed volume texture tracing editor view with LODBias.

  • Bug Fix: Improved Metal performance slightly to take advantage of shader compilation changes and allow us to upload less data via temporary buffer allocations.

  • Bug Fix: Scene Capture no longer uses “Capture On Movement” if “Capture Every Frame” is enabled. It prevents the capture from happening twice in one frame.

  • Bug Fix: Fixed hidden dynamic meshes with bCastHiddenShadows.

  • **Bug Fix: **Fixed a memory scribble bug in the black depth texture cube on platforms with 16-bit depth. Original code was writing a FColor into the locked texture data, which causes a 2 byte scribble if the PF_ShadowDepth format is 16-bits.

  • Bug Fix: LPV visualisation now works on macOS to aid debugging.

  • Bug Fix: Constant-buffer bindings that are actually used by Metal shaders are now exported to prevent overwriting SRVs & UAVs with unused uniform-buffer data.

  • Bug Fix: Removed ancient Metal workaround for sparse render target array used when rendering decals - this wasn’t allowed on Mac OS X 10.11 back in 2015 but it works now. Probably fixes bugs on iOS Desktop Forward rendering with Decals due to the way everything was configured.

  • Bug Fix: Slightly improved performance on Metal by reallocating a temporary depth-stencil texture only when necessary and using the optimum load-action for each platform.

  • Bug Fix: Fixed Metal LLM double-counting, amend stats gathering to work reliably and reduce performance impact.

  • Bug Fix: Fixed for Pipeline State Object cache file save and load operations using the same journal file extension to protect against corrupt files.

  • Bug Fix: Render target size no longer changes when reflecting views. This fixes reflection capture rendering that leads to severe visual corruption on Switch and possibly on Android.

  • Bug Fix: Fixed various bugs in hlslcc & MetalShaderFormat to ensure that all compiler passes are deterministic.

  • Bug Fix: Disabled exposure in the buffer visualization so it doesn’t influence buffer visualization brightness.

  • Bug Fix: Fixed initialization of FMetalCodeHeader structures to prevent non-determinism when generating FShaderResource data.

  • Bug Fix: Updated the Vulkan RHI to obey r.VSync (and the vsync and novsync command-line arguments).

  • Bug Fix: Fixed Fast-Fourier-Transform compute shaders on Metal by explicitly setting the MaxTotalThreadsPerThreadgroup property for compute pipelines. This feature is only available on macOS 10.14 and iOS 12 or later, FFT Bloom and other FFT shaders will be automatically disabled on earlier OS versions.

  • Bug Fix: Multiple fixes for nDisplay:

    • nDisplay Launcher now handles paths with space correctly.

    • nDisplay now renders single view for monoscopic devices

    • nDisplay with OpenGL 3/4 monoscopic devices is now functional.

    • Addressed some viewport positioning issues.

  • Bug Fix: Zero-initialise Metal buffers by default within the RHI because sub-allocation means the driver can’t do it for us.

  • Bug Fix: When targeting Metal 2.0 make all RW/Buffer objects use Metal’s “Linear Texture” feature and for Metal 2.1 and later use the new MTLTextureBuffer type. Handle the case where atomic operations still require us to compile to plain pointers. It simplifies the Metal shaders and sends them down the same hardware paths as used by HLSL.

  • Bug Fix: Fixed SpeedTree leaves not being rendered in shipping when using wind.

  • Bug Fix: Use a clamped local clock when timing out the renderthread. - This prevents suspend and resume issues on platforms where suspend events may not occur or the system clock is not set to the process time.

  • **Bug Fix: **Default high quality level to UMaterial will now always append a if nothing else is set. This fixes some of the missing materials in cooked builds.

  • Bug Fix: Fixed an issue with visibility state when moving from a level with HLODs to one without.

  • Bug Fix: Fixed wrong number of buffered in planar reflection occlusion queries frames.

  • Bug Fix: Fixed PIX for packaged builds.

  • Bug Fix: Fixed rendering errors in mesh merge.

  • Bug Fix: PlanarReflection occlusion culling fixed.

  • Bug Fix: Fixed and issue that caused GPU Compute Skincache to apply the incorrect conversion to/from snorm.

  • Bug Fix: Fixed bug where bPresent flag wasn’t being honored on DX11.

  • Bug Fix: Fixed intermittent hangs in the editor by forcing a commandbuffer submission at the end of a frame so we always signal semaphore.

  • Bug Fix: RHICreateGraphicsPipelineState will now return nullptr if a compilation fails on Metal, Vulkan, and D3D12.

  • Bug Fix: Disabled Aftermath by default until a leak fix is made on the NV side.

  • Bug Fix: Fixed Skinned vertices not using INTERPOLATE_VERTEX_COLOR flag.

  • Bug Fix: Fixed Typos in glObjectPtrLabel definitions.

  • Bug Fix: Fixed some issues with how semaphore variable are handled.

    • Moved the completion handler to EndFrame (out of FlushFreeList())

    • FlushFreeList() attached a handler to the command butter that signaled the semaphore. It can be called through RHIFlushResources which will cause a mismatch signal().

    • Added BeginFrame / EndFrame to the loop in AddModalWindows so the renderer gets the expected frame delimiters. Also, removed call to EndFrame from EndDrawingViewport.

  • Bug Fix: Fixed CPU particle rendering in TM-ShaderModels fmin/fmax/clamp have different behavior on iOS in fast vs precise modes.

  • Bug Fix: Need to always run CheckSingleJob and the validation functions to get the errors out. It fixes an issue where custom nodes in the Material graph didn’t report compile errors.

  • Bug Fix: Fixed deletion of Metal Pipeline State during failure to compile.

  • **Bug Fix: **Fixed GPU stats not adding up to the total.

  • **Bug Fix: **Fixed the unnecessary stall in the default RHI implementation of RHICreateTextureReference.

  • Bug Fix: Older AMD graphics cards and drivers no longer produce graphical artifacts on Oculus Rift headsets

  • **New: **Added iOS HDR support and OSX cleanup.

  • **New: **Some HDR refactoring. Previously the DisplayOutput and ColorGamut were only set in GameUserSettings. I added a Sink that checks the HDR enable. If it’s toggled we apply the correct DisplayOutput and ColorGamut for the current platform (this way we get good settings even if you toggle via the console). These settings are still exposed via the console and can be set independently if the user wants.

  • **New: **Added r.d3d11.dumpliveobjects to dump d3d state when using -d3ddebug to help find object leaks.

  • New: Vulkan now has console commands for testing device lost.

  • New: Metal 2.1 is now exposed on both macOS and iOS/tvOS through the Editor settings.

  • New: Magic Leap now uses Vulkan by default instead of OpenGL. Note that the setting for OpenGL was removed from the UI as we are focusing on Vulkan for future releases.

  • New: Global shader map is now stored in multiple DDC entries (one per shader filename) instead of keeping everything in a single one. This allows to skip recompilation of unchanged global shader files.

  • New: Added support for -ReduceThreadUsage so stand-alone programs can use less threads by not creating the taskgraph.

  • New: When compiling from HLSL to MetalSL all the global shader parameters are now packed into a single constant-buffer like D3D and keep the names of all such parameters and input/output attributes, this makes the shader much more debuggable.

  • New: Added a CSV stat for the needed size of the streaming texture pool (r.StreamingPool.Size).

  • New: Slightly improved Metal performance by deferring creation of render command encoders until required to avoid creating redundant encoders.

  • New: 10bits ABGR format are now exosed to TextureRenderTarget2D.

  • New: Added Shading Path material expression node to allow a picking a different compile path based on the shading path/renderer type for the currently compiling shader platform. Mobile will be selected when the RHI is compiling for ES3_1 or lower. Forward will be selected when that shader platform has forward rendering support enabled in the project settings (per hardware platform for some shader platforms). Deferred will be selected otherwise.

  • New: Project setting r.DefaultFeature.PointLightUnits and r.DefaultFeature.SpotLightUnits are now replaced by a unique r.DefaultFeature.LightUnits, which also controls rectangle light units.

  • New: nDisplay config now supports per node ‘swap eye’ attribute.

  • New: Implemented support for Metal’s native parallel render command encoding API across AMD, Intel, and Apple GPUs. Note that it is slightly more efficient on the CPU than encoding parallel command-buffers on all platforms and is more efficient on iOS GPUs.

  • New: Checked in a change for Vulkan memory allocation that reduces overall memory usage even when not freeing all pages, keeping one around to help reduce allocation performance spikes. It’s enable only on Android for now until we test more widely. Eventually we can probably remove the #define and all the old code.

  • **New: **Vulkan buffer changes.

    • Disabled Vulkan memory binning within buffers. It can be enabled with r.vulkan.UseBufferBinning.

    • Disabled the “keep one page alive” as it keeps the staging buffers around forever which are around about 64 MB in size.

    • Reduced the heap size for images on Android since it could easily waste 100 MB on a Samsung Galaxy S9 depending on the amount of RAM in the device.

    • Merged more buffers together by adding all buffer types into the BufferUsage flags for non-texel/storage buffers.

    • Added some more information to DumpMemory.

  • Improvement: Cleaned up timing API which turns on the dynamic resolution globals on macOS 10.13 or higher and iOS 10.3 or higher. Logic is now fully in the Metal handlers which enables libdispatch to enforce ordering and not need atomics. However, atomic writes are being used to publish the final values.

    • Each command buffer finishes and accumulates it time.

    • On frame end, these times are converted into cycles and published.

    • Present is a different case because it occurs on its own command buffer outside of the normal submission scheme and Metal presents when a command buffer is scheduled.

    • The timing is not included in the time published in RecordFrame.

    • Note that GPUStart/EndTime are SPI on macOS but are being used here because the alternative is to use CPU times.

  • Improvement: Reduced the time it takes to compile Metal shaders into native shader libraries by splitting them into several smaller libraries that can be constructed in parallel by the cooker.

  • Improvement: Updated Vulkan memory tracking to work better with LLM.

  • Removed: Removed unused RHISupportsShaderCompression function.

  • Removed: Removed unused flag TexCreate_AllowFailure and instead added TexCreate_InputAttachment for Vulkan subpasses.


  • Crash Fix: Fixed a crash in Niagara when trying to sample a pseudo volume texture on the CPU.

  • Crash Fix: Removed GPU contexts from the emitter instance batcher when the emitter instance is destroyed that was causing a crash when opening a GPU emitter running in the world.

  • Crash Fix: Prevented a crash when fixing dependencies in event scripts. Modules dealing with force have been updated so they are not available in even scripts.

  • Crash Fix: Custom HLSL node no longer crashes when dragging in new Parameter pins.

  • Crash Fix: Fixed random crashes with GPU simulation in Niagara due to threading and simulation context lifetime issues.

  • Crash Fix: Fixed cooking of Niagara compute shaders for target platforms with more than one shader platform. It fixes crashes trying to cook content for DirectX 10 and for using certain platforms in cooked games.

  • Bug Fix: Skeletal Mesh DataInterface now guards against sampling from negative tri indices.

  • Bug Fix: Fixed Niagara GPU emitters not being rendering when running non-cooked game.

  • Bug Fix: Made tabbing through Stack in Niagara easier by changing options dropdown arrow to no longer be a tab-stop.

  • Bug Fix: Skeletal Mesh DataInterface no longer fails to initialize if sampled Skeletal Mesh asset does not have vertex color.

  • Bug Fix: Niagara Emitter assets no longer display System-only UI options.

  • Bug Fix: Skeletal Mesh DataInterface now binds the correct function template for Random Vertex.

  • Bug Fix: Fixed the passthrough of data to material particle nodes for our renderers so that all existing particle material nodes function properly with Niagara.

  • **Bug Fix: **Fixed ribbon width so that it’s the actual width of the ribbon and not the width from the center to the edge of the ribbon.

  • Bug Fix: Emitter.LocalSpace now properly accessible to emitter scripts.

  • Bug Fix: Prevented drawing of Niagara particles if the RHI layer doesn’t support SRVs.

  • Bug Fix: Fixed issues where GPU systems could fail to compile due to DataInstance.Alive usage.

  • Bug Fix: Particle Cutouts with 8 verts now always use stochastic approach. Circle textures with > 234 edges in the convex hull were overflowing the uint64 calculation of the total number of combinations, causing an infinite loop.

  • Bug Fix: Fixed Niagara math operation description tool tips and keyword searches in the graph add menu.

  • **Bug Fix: **Fixed and standardized tool tip handling for script objects in menus.

  • Bug Fix: Skeletal mesh data interface detail customization now handles object lifetime and delegates more safely.

  • Bug Fix: Fixed compile issue when not using UpdateAge module in Niagara Particle Update scripts.

  • Bug Fix: Fixed bounds calculation to match other engine components, and uniform parameter updating.

  • Bug Fix: Fixed usage of transforms in Niagara emitter scripts.

  • Bug Fix: Fixed playback issues where completed systems wouldn’t simulate again until you pressed play.

  • Bug Fix: Fixed dynamic material parameters for ribbons.

  • Bug Fix: Fixed the generated code window so that it doesn’t show an extra gpu hlsl view which is invalid, and doesn’t show an invalid assembly entry for gpu.

  • Bug Fix: ParticleModuleLocationBoneSocket will no longer attach to the wrong actor if the particle system was pooled.

  • Bug Fix: Improved some optimization in VM compiler.

  • Bug Fix: Fixed an issue where nested dynamic inputs could be reset when modifying dynamic inputs for the same module.

  • Bug Fix: System and emitter simulations now receive a tick of their update script on spawn.

  • **New: **Added support for keyword searches for user defined scripts to match the built in ops.

  • New: Validating modules reads and writes. Users cannot read/write from particles namespace in system and emitter scripts. Users cannot write to user or NPC namespaces ever. Users cannot write to system/emitter namespaces in particle scripts.

  • New: Smooth interpolated spawning now possible from discrete points in a single emitter. Spawn Rate module exposes a spawn group that is available in particle spawn for use in placing initial position of particles etc.

  • New: Added helper function dynamic inputs for bone sampling, spawn groups, and generating ribbon IDs from spawn groups

  • New: You can now drag Parameters from the Panel into the stack.

  • New: Added D3D12 support for Niagara GPU emitters.

  • New: Added kill Volumes (Sphere, Box, Slab, Plane).

  • New: Added Point behind plane helper function with bool and signed output.

  • **New: **Improved comments on some original transform helper modules.

  • **New: **Added OwnerAxes helper function which returns the engine owner axes or local equivalent depending on the localspace flag.

  • New: Added support for setting integer user parameters from blueprint.

  • New: Generating compiler debug info for Niagara VM shaders will now work just like other Materials using the r.DumpShaderDebugInfo.

  • New: Added several new template emitters and systems for the new Emitter and System wizards.

  • New: Added dynamic Inputs for dot, cross, sine expressions.

  • New: Added proper collision event modules Velocity threshold,Time threshold, and a boolean for additional control.

  • New: Added functions Lerp Quaternion, mesh look at lerp factor using the lerp quat, scale and bias float dynamic input.

  • New: Added functions NLerp quaternion, SLerp quaternion, Angle between quaternions, SinXoverX, and make custom float from bool dynamic input.

  • New: Added a dynamic input for creating a Niagara ID.

  • New: Added a Sprite Rotation Rate module.

  • New: Added a dynamic input to Normalize Distance Range

  • New: Added a Normalize Vector dynamic input.

  • New: Niagara simulations can now be paused from code and BP. Note that it suspends all ticks for that system but continues rendering.

  • Removed: Removed debug code that printed out info per skeletal mesh.


  • Bug Fix: Fixed from Stephen Hill for incorrect light grid culling near the near plane.

  • Bug Fix: Fixed incorrect intensity when spawning RectLight using Lumens as default light units.

  • Bug Fix: Fixed distance field shadow leaks between meshes.

  • Bug Fix: Fixed an issue when packing UVs for lightmaps which could result in UV islands that didn’t have the correct spacing from some meshes.

  • Bug Fix: Fixed USpotLightComponent::GetEffectiveScreenRadius.

  • Bug Fix: Fix for light culling artifacts when view size is not evenly divisible by tile size.

  • Bug Fix: Always enable stationary skylight permutation when using desktop forward rendering.

  • Bug Fix: Fixed an issue causing missing reflections in Blueprint Editor.

  • Bug Fix: Fixed rebuild lighting was showing an incorrect error message when “Force no precomputed lighting” was enabled.

  • Bug Fix: Made planar reflections more stable with dynamic resolution changes by keeping filter size constant in screen space.

  • Bug Fix: Fixed an issue were some maps always had their lighting build dirty.

  • Bug Fix: Fixed heightfield holes inside global SDF.

  • Bugfix: Fixed Rect Light lightmass issues causing emitted light in the wrong direction for Volumetric Lightmaps and indirect bounces.

  • New: Experimental Virtual Texturing support has been added for use with Lightmaps. It enables very high resolution lightmaps to be used with a reasonable memory budget. It can be enabled with r.VirtualTexturedLightmaps 1.

  • **New: **Shadow faderesolution can now be set via scalability.

  • New: Scene static shadows on translucency are now sampled based on the Material “translucency.lighting mode” in Forward shading the same as it is in Deferred shading.

  • New: Added custom overrides to reset ULightComponent::Intensity to default in FLightComponentDetails. Setting a light Intesity to default now resets the brightness to the archetype brightness. This handles cases where the intensity units differs between the two objects.

  • **New: **Changed FLocalLightComponentDetails so that changing intensity units keeps the same brightness by recomputing the Intensity.

  • New: Added “Source Texture” property to RectLightComponent. Textures used need to use mipgen setting “Blur5” to get the correct behavior.


  • Crash Fix: Fixed a crash on MacOS in translucent tile mesh rendering caused by missing ReflectionCaptureUniformBuffer on opaque meshes.

  • Crash Fix: Fixed a crash where a recently unparented material instance would crash evaluating relevancy.

  • CrashFix: Fixed crash when cooking small textures with LODBias.

  • Bug Fix: Added custom node validation in order to prevent reading unbound SceneTextureStruct from a base pass shader.

  • Bug Fix: Fixed an issue where some vertex parameters in post process materials were unbound.

  • Bug Fix: Fixed a bug where material collections were not updating sometimes.

  • Bug Fix: The Scene Depth material node is now considered an estimated texture lookup.

  • Bug Fix: Resolved an issue where vertex interpolator nodes on unused graph branches, such as behind a feature level node, could still emit errors and cause the material to fail compilation.

  • Bug Fix: Resolved an issue where an invalid viewport UV would be accessed in a post process material vertex shader.

  • Bug Fix: Vertex interpolator nodes are now handled correctly by lightmass materials.

  • Bug Fix: Fixed potential infinite stall when merging Materials.

  • Bug Fix: Fix for incorrect results on MacOS Metal AMD GPU’s returning incorrect results when using the SinCos Math function.

  • Bug Fix: Fixed depth-pass shader and editor hit-proxy support for the “world position excluding offsets” material node.

  • Bug Fix: Fix Incredibuild shader compilation to work on Incredibuild 9+.

  • Bug Fix: Fixed low quality texture issues when changing material quality settings.

  • New: Shader instructions are now excluded that are related to Editor selection color support from pixel shaders on non-editor platforms.

  • New: Fixed stable path PSOFC output from the cooker when there is more than one shader format per platform. This should fix Vulkan Android.

  • New: Added a Revit master material with exposed parameters matching the API when possible.

  • New: Added support for scaling and rotating UVs around arbitrary pivot for Datasmith.

  • New: The UVEdit Material Function now supports mirroring.

  • New: Added support for platform-specific shader quality settings to be loaded from Platform/PlatformEngine.ini entries.

  • New: Material parameter collections are checked before rendering a texture to ensure stale parameter values are not used.

  • New: It’s now possible to discard unused shader quality levels at cook time rather than runtime, which may drastically improve material disk space and load time. For a fixed quality platform currently using the “Discard on Load” feature that utilizes all three quality levels but discards two, it’s reasonable to see 60% improvements in Serialize and PostLoad times for those materials when this feature is enabled.

    • To set this up, it must be done manually by specifying the active quality levels per-shader format in the relevant project Engine.ini files and is available for all platforms. The application is responsible for ensuring the cooked out data remains unused. For example, disabling “High” and “Medium” quality shaders from being cooked for Android ES3.1 would be as follows:

    • [ForwardShadingQuality_GLSL_ES3_1_ANDROID ShaderPlatformQualitySettings] +QualityOverrides[0]=(bDiscardQualityDuringCook=False,bEnableOverride=True) +QualityOverrides[1]=(bDiscardQualityDuringCook=True,bEnableOverride=False) +QualityOverrides[2]=(bDiscardQualityDuringCook=True,bEnableOverride=False)
    • The shader format is appended for identification and any listed in the RHIShaderFormatDefinitions will be compatible. For projects no already using multiple quality levels in Materials, or those that allow swapping quality at runtime, there will likely be no gain from enabling this feature.

Mobile Rendering

  • Crash Fix: Fixed: Crash when running project packaged with ES3.1 feature level on the Shield Tablet devices.

  • Crash Fix: Fix a crash that can occur when mobile shadows are disabled via showflags.

  • Crash Fix: Fixed an Editor crash in Mobile Preview when the scene has a Skeletal Mesh with more than 75 bones per section.

    • The maximum number of supported bones for ES2 and ES3.1 feature levels is 75.

    • Meshes with a larger number of bones will not render in Mobile Preview. The project has to specify Compat.MAX_GPUSKIN_BONES=75 and reimport those Skeletal Meshes to be able to use them on ES2 and ES3.1 feature level devices.

  • **Bugfix: **Fixed Skeletal Mesh rendering on PowerVR devices running with feature level ES3.1.

  • **Bug Fix: **DepthFade material node now clamps pixel depth to (65500 - FadeDistance) on mobile to avoid false fading of distant pixels.

  • **Bug Fix: **Default precision is not set properly in mobile GLSL shaders to avoid emitting unnecessary precision modifiers. This reduces size of generated GLSL shaders.

  • **Bug Fix: **Fixed sky reflection capture corruption on ES2 platforms.

  • **Bug Fix: **TAA now works properly on mobile.

  • **Bug Fix: **DepthFade material node now works properly in Editor mobile preview with MSAA enabled.

  • **Bug Fix: **Mobile renderer now respects bRenderInMainPass option on Skeletal Meshes.

  • **Bug Fix: **Fixed cases where custom post-processing materials could sample scene textures using incorrect coordinate system.

  • **Bug Fix: **Fixed an issue where Post Processing Materials that sample “SceneDepth” failed in Mobile Preview and on Mobile devices when MSAA is enabled. Scene depth can only be sampled in Post Process Material that have blendable locations set to “Before Translucency” or “Before Tonemapping”, otherwise they will fail to compile. Also, sampling from SceneDepth is only supported when MobileHDR is enabled and the device supports floating point render targets.

  • Bug Fix: Fix for incorrect Scene Capture brightness when used with a movable light with lightmap.

  • Bug Fix: Objects no longer disappear from unexpected viewpoints with mobile multi-view and cascaded shadow maps turned on.

  • Bug Fix: Fixed a case where where MSAA depth buffer was never released on Android.

  • New: Improved GPU particles simulation performance on Android devices with Mali GPUs.

  • New: Added “r.Mobile.SkyLightPermutation” to control SkyLight shader permutations on mobile platforms.

    • This option allows culling of unnecessary shaders depending on application supported features.

    • 0: Generate both sky-light and non-skylight permutations. (default)

    • 1: Generate only non-skylight permutations

    • 2: Generate only skylight permutations

  • New: Improved performance of “Emulated Uniform Buffers” feature on mobile. Now it packs shader constants more tightly which reduces amount of data CPU has to send to GPU on each draw call.

  • New: Added option to support emulated uniforms buffers on OpenGL ES3.1, (OpenGL.UseEmulatedUBs=1). eUB path often reduces memory usage and could improve rendering performance depending on application.

  • New: Multiple improvements to Vulkan memory usage and performance on Mobile.

  • New: Occlusion queries are now supported with mobile multi-view enabled.

  • New: Exposed “Support Software Occlusion Culling” option to Project Settings to simply setup of Software Occlusion Culling. You can find it under Project Settings > Rendering > Mobile section.

  • **New: **Refraction is now applied as a Post Process effect for mobile devices due to rendering artifacts caused when using MSAA on mobile. As a post process effect, it now correctly handles multiple overlapping distortions, however, this change has the side effect that foreground translucency will be distorted as well. To enable, MobileHDR must be set in the Project Settings and the device must support floating point render targets.


  • Bug Fix: Improved Metal performance by ensuring that the command-buffer that presents a frame to the display does not include any commands from the following frame which may cause unnecessary driver dependencies.

  • Bug Fix: Managed buffers on macOS are will be Sub-allocated to reduce the time spent on the CPU allocating resources.

  • Bug Fix: MetalRHI will now reuse empty command-buffers to avoid redundant submissions that cause unnecessary CPU & GPU synchronization.

  • Bug Fix: Fixed shadow array being sorted for every shadow, instead of once per frame.

  • **Bug Fix: **Windows no longer bypasses commandlists in editor builds.

  • **Bug Fix: **Fixed the Forward rendering GPUProjection stat.

  • **Bug Fix: **Fixed “Constant Allocator had to grow!” warning in InfiltratorDemo with -dx12.

  • **New: **flushrenderingcommands will not be called when changing cvars unless it’s actually required.

  • **New: **Added Vulkan LLM support

  • New: Added Platform specific shader cache in order to make shader hashes platform independent.

  • New: Added support for external GPU stats, so we can use one stat across multiple CPPs.

  • **New: **Added console variables to the Shader Pipeline Cache to specify a target time to spend per-frame precompiling shader pipelines.

    • When r.ShaderPipelineCache.BatchTime is set to the number of milliseconds to spend compiling, it will adjust the batch size up and down in response to how long shader precompilation takes to try and make full use of the allotted time, though due to the nature of PSO compilation, it will spike above this. The default is 16.0 milliseconds.

    • r.ShaderPipelineCache.BackgroundBatchTime is the number of milliseconds to spend compiling in the background. By default, this is disabled.

    • These are especially useful for the second time the user launches the application. You should have a local binary cache either within our code (for example, Android OpenGL) or handled by the OS (like macOS and iOS Metal) which means that the pipeline creation is virtually free, so PSO compilation completes far more rapidly with this feature enabled than it did before.

  • New: Global SDF object update pass now uses 16 bit indices if possible (instead of 32 bit by default).

  • New: Added Shader permutation cleanup inside FReflectionEnvironmentSkyLightingPS. This allows removal of 223 shaders from the global shader map.

  • New: Direct texel fetching is now used for ForwardScreenSpaceShadowMaskTexture and IndirectOcclusionTexture to remove the need for a sampler. It fixes compile errors in some shaders when Forward Shading is enabled.

  • **Improvement: **Optimized RemoveUniformBuffersFromSource to bring it from approximately 20% to around 1.5% during testing.

  • Improvement: Optimizations to Global SDF heighfield update.

  • Improvement: Slightly optimized material and shader class sizes to reduce runtime cost by removing unnecessary debug data.


  • Bug Fix: Fixed the post process pixel inspector on MacOS not updating all sections.

  • Bug Fix: Fixed an issue where a post process component would fail to activate when it’s child shape contains the camera if a valid physics body had not been assigned. The shape is now used directly.

  • **Bug Fix: **Fixed a bug with VR forward renderer for consoles where the SceneColor is not properly resolved, causing uninitialized pixels to bleed bloom into the scene.

  • **Bug Fix: **Fixed r.EyeAdaptationQuality 0 causing AutoExposureBias to be disabled.

  • New: Enables Depth of Field diaphragm on Switch.

  • New: Translucency nows work in Split Screen.


  • Bug Fix: In dump_syms we removed extra uses of std::flush when outputting each line to a file.

  • Bug Fix: Actors created via Alt-drag duplication now correctly tick in Editor.

  • Bug Fix: Changing the capitalization of a tooltip for a custom struct or one of its members now properly persists.

  • New: ImportFileAsTexture2D has been split into two functions so you can also import from a buffer.

  • New: In dump_syms we replaced inline file / line with their callsite over the inline location Fix appearing as the names for the functions. CFI generation is disabled for Windows (by command line for Linux) and speeds up symbol generation. Some examples can be shown by running “TestPAL inline”.

  • New: Added new Property metadata properties, DisplayAfter and DisplayPriority, that allow ordering of properties within a category.

    • DisplayAfter indicates the property that the specifying UPROPERTY is to be listed after in the details panel.

    • DisplayPriority indicates the relative priority for display. When used in conjunction with DisplayAfter it is the relative ordering of properties each specifying the same property to be displayed after.

  • Improvement: Sped up saving packages by removing checks for external packages as that was a UE3 feature that is no longer used.


  • Bug Fix: Fixed AutomationTool being compiled when invoked from installed builds.

  • New: Added the -VersionCookedContent argument to disable the -unversioned parameter on the cooker command line when packaging.

  • New: The uebp_CLIENT environment variable can now be specified without requiring uebp_BuildRoot_P4 and uebp_CLIENT_ROOT to also be set.


  • New: We now allow setting the target to build when using the task.

Memory Profiler

  • New: Added support for allocating an array of more than 2 Gb on 64 bit machines for the Memory Profiler.


  • Bug Fix: Fixed support for edit and continue for Windows builds (though performance and stability of Visual Studio when applying changes is poor). Not recommended for general use.

  • Bug Fix: The bEnableExceptions flag is now honored correctly when choosing precompiled headers for a module.

  • Bug Fix: Fixed an issue caused by blank lines with XGE timing info when running with -progress. Some tools don’t have any output, but our markup triggers writing to stdout, and XGE appends a timing string to it (for example, “@action (0:01:23 at +0:34)”).

  • Bug Fix: Fixed an issue where MaxProcessorCount and ProcessorCountMultiplier settings would only affect the first class found. These values can now be configured for each executor separately via the LocalExecutor, ParallelExecutor, and SNDBS sections in BuildConfiguration.xml.

  • **Bug Fix: **Fixed an assumption that console encoding is UTF-8 when building with ParallelExecutor. It fixes garbled output when compiling in Japanese.

  • **Bug Fix: **Files being added or removed from a source directory are now detected and will invalidate the cached compile actions without requiring a rebuild.

  • **Bug Fix: **Building a project from Visual Studio when an invalid solution configuration is selected will now give an error, rather than building for Win32.

  • Bug Fix: Fixed Visual Studio prompting to save solution file freshly generated by UBT when closing.

  • New: The Windows SDK directory, VC toolchain directory, and VC toolchain version number are now exposed as properties on the TargetRules and ReadOnlyTargetRules classes (for example, Target.WindowsPlatform.WindowsSdkDir, Target.WindowsPlatform.ToolChainDir, Target.WindowsPlatform.ToolChainVersion).

  • **New: **We now include the Visual Studio .natvis file as a solution item in order to fix problems with VS2017 15.8.5 not finding it in a makefile project.

  • New: Modules may now explicitly specify rpaths on Linux via the PublicRuntimeLibraryPaths and PrivateRuntimeLibraryPaths properties.

  • New: Added a “SupportedPrograms” field to plugin descriptors, which allows plugins to declare which plugins they support independently of individual modules. Programs now respect the “bEnabledByDefault” setting in plugins. Plugins that are compatible with a program now need to list that program in the SupportedPrograms list, and whitelist any modules that should load for that program.

  • New: Runtime dependencies can now be copied to output directories as part of the build. When adding a runtime dependency, an optional source location can be specified to copy from. Both the source and target paths can use variables can be used as part of the path, for example, $(TargetOutputDir), $(BinaryOutputDir), $(ModuleDir), $(PluginDir).

  • New: Changed the order in which Visual C++ toolchains are enumerated to prefer full releases over preview releases.

  • New: Modular DebugGame configurations now always output a separate executable rather than requiring a -Debug argument at runtime to switch behaviors.

  • New: Added an option to automatically enable edit and continue for files in the adaptive non-unity working set. E&C doesn’t seem very useful for UE4 projects right now; compile time is comparable to regular build times, but it can take several minutes to apply code changes for large projects.

  • New: Added a bCompileAgainstApplicationCore setting to the target rules, which allows compiling out references to the ApplicationCore module, which should only be necessary for applications with a GUI. Removed ApplicationCore dependency from several engine tools and utilities.

  • New: Added support for expanding UE-specific variables in include paths and library paths: $(EngineDir), $(ProjectDir), $(PluginDir), $(ModuleDir).

  • New: Remote Mac/IOS compilation now uploads the entire workspace to the remote Mac and executes a separate remote instance of UBT rather than synchronizing individual actions.

    • This makes the remote compile codepath much simpler, and removes a lot of special cases that exist to support it previously.

    • The list of files to be transferred to the remote are listed as rsync filter rules in Engine/Build/Rsync/RsyncEngine.txt and RsyncProject.txt, which are applied to the root engine directory and project directory respectively.

    • Projects that need to customize which files are uploaded can add their own /Build/Rsync/RsyncProject.txt file, which will be included in the filter before the default version.

  • New: Added support for using adaptive non-unity builds when the engine and project are in separate repositories.

  • New: Added an error for if a module referenced by a plugin descriptor doesn’t exist.

  • New: Added the build setting bAdaptiveUnityCreatesDedicatedPCH which allows creating a dedicated PCH for every file that’s excluded from the unity working set. Improves iteration times when working on individual cpp files, but slows down iterating on header changes and can take a lot of disk space for large changes. The dedicated PCH contains all includes scraped from the top of each cpp file, until a non-include directive is encountered.

  • New: Plugins can now be enabled and disabled from the .target.cs file for targets that do not use the shared compile environment, by compiling the list of enabled/disabled plugin names into the Projects module.

  • New: Added the ability to generate manifests to any arbitrary locations with the -Manifest= argument.

  • Removed: Removed the Embree and FBX DLLs that are checked in to Engine/Binaries/Win64, and copy them from the ThirdParty directory as part of the build process instead. This fixes issues where the editor executable is under the project directory rather than the engine directory because it’s been built with custom settings.


  • **New: **Project Launcher now includes an option to package the prerequisites installer.


  • Bug Fix: Fixed custom build steps dialog inadvertently modifying config file settings in-place.

  • Bug Fix: The Editor executable path is now read from the target receipt, allowing targets that don’t use the shared build environment to launch properly.

  • Bug Fix: Fixed an exception caused by entering custom server settings when UGS registry key does not exist.

  • Bug Fix: Fixed parsing of progress markup when using parallel executor.

  • Bug Fix: Fixed attempts to automatically reopen projects while a modal dialog is up, or the workspace is syncing.

  • Bug Fix: The main window is now restored to normal size when activated by clicking on the tray icon.

  • Bug Fix: Fixed an issue where the schedule settings were lost for any open projects whenever the settings dialog was opened.

  • Bug Fix: Fixed an exception on shutdown due to the icon being hidden after it’s already been disposed.

  • New: Added support for DPI scaling.

  • New: When browsing for a project file, we now always default to the directory containing the current selection.

  • New: The number of characters displayed for build badges now shrinks to fit on the available space.

  • New: The “Sync Precompiled Editor” option is now always shown, but is disabled and includes a tooltip explaining why if it is not available.

  • New: The setting for whether or not to use incremental builds is now exposed through the variable “$(UseIncrementalBuilds)” for use by custom build steps.

  • New: Added a per-project list of folders and extensions to be deleted by default when running the ‘clean workspace’ tool.

    • Paths are stored /Build/UnrealGameSync.ini, and may be specified for an individual branch (via a category with the depot path to the project) or for wherever the project is currently open (via the [Default] category).

    • The SafeToDeleteFolders list specifies a substring that will be checked against folder paths. Anything containing this folder will be marked as safe for delete by default.

    • The SafeToDeleteExtensions list specifies a list of extensions for files that can always be deleted.

  • New: Added a dialog which shows all the required platform SDKs for a branch, linked from the status panel in UGS.


  • New: UHT can now parse FText default parameter values:

    • INVTEXT, NSLOCTEXT, LOCTABLE, FText::GetEmpty(), and FText() are supported.

    • LOCTEXT isn’t supported as it relies on an external macro that is known to C++ but not to UHT (NSLOCTEXT should be used instead).


  • Bug Fix: Fixed UnrealLightmass communication issues for Linux and Mac.


  • Bug Fix: Fixed that padding data was non-deterministic when compression is disabled.

  • **Bug Fix: **Fixed bug in the calculation of max pak file size.

  • New: “ExportDependencies” command has been moved into an editor commandlet, since it relies on the UObject system, asset registry, etc.

  • New: Added an UnrealPak editor commandlet with the same functionality as the standalone UnrealPak program. It can be invoked by running the editor with -run=UnrealPak and the standard UnrealPak command line options.

  • New: Added support for delete records in patch .pak files. If an asset is deleted or moved to a different pak chunk during a patch, a delete record is created in the patch pak file to prevent the engine attempting to load the stale asset from an earlier patch tier.

  • New: Precompiled UnrealPak binaries are no longer submitted to source control. The tool should be built on demand as needed.

  • New: Added -WhatsAtOffset command to query a pak file for files at a particular offset.


  • Bug Fix: Fixed single-file compile not working for foreign projects, if the engine folder contains a space.


  • Bug Fix: Fixed an issue that prevented being able to set a hyperlink on notifications with unbound attributes that had explicit values set.

  • Bug Fix: Game windows that have been modified by adjusting the edges of the window should no longer go to the previous window size when applying settings.

  • Bug Fix: Fixed several obscure issues with the PreloadSettingsContainer and the SlateRHIResourceManager where the net results were leaking textures.

  • New: Drag and drop now takes into account multi-touch / multiple pointer indices.

  • New: NativeOnInitialized now gets called on widget components.


  • Bug Fix: Fixed a bug where sliders would react inappropriately to simultaneous inputs.

  • Bug Fix: Fixed an issue where resize Width and Height was not being cast to integer before checking if it is already that size.

  • Bug Fix: Fixed a bug where the Slate file dialog modal window was not setting its parent, getting lost behind main window while stealing events.

  • Bug Fix: Fixed an issue where Slate widgets would revert back to their default after compiling a Blueprint. They now retain their category name.

  • Bug Fix: Changed addresses of SlateReflector to be more portable.

  • Bug Fix: Editable text focus selection is now deferred until mouse-up to allow the user to make an initial selection.

  • Bug Fix: Fixed an issue where outline colors were not updating when changing on the fly.

  • Bug Fix: Modified the drag-and-drop code to send MouseLeave and OnDragEnter events to the correct widgets on drag start, and to not use the fake drag-start widget list if a drag-and-drop operation did not actually start (i.e. did not have any drag content).

  • **Bugfix: **Fixed a bug on macOS where by the color picker window eyedropper tool did not work correctly.

  • Bug Fix: Fixed bug where table view scrolling stole focus too quickly from contents.

  • Bug Fix: We now reset the pressed button state when the application is deactivated in case you were midclick, or were right click scrolling, all of that state is now reset.

  • Bug Fix: We no longer try to render text with zero height.

  • Bug Fix: When slate brushes are updated with a new resource object through the details panel we need to manually invalidate their rendering resource cache otherwise the images don’t update in the designer.

  • Bug Fix: RichTextImageDecorator - Vertical align center the images by default.

  • Bug Fix: Take destination stride into account when uploading texture data. This fixes corrupted textures on DX12.

  • Bug Fix: SSafeZone is now more resilient to attempting to sample the current safezones before the game is ready. It will tray again if it fails the first time.

  • **Improvement: **The Widget Reflector is getting a big boost!

    • It now has a Details view in Editor builds enabling you to see the realtime UObject values of the corresponding UWidget if the Slate widget was created by a UMG counterpart.

    • There are now two picking modes, 1) what we’ve always had, hit testing based picking, and 2) visual tree picking which actively captures the paint stack and enables you to hit test against the painted geometry rather than the hit testable geometry. It’s very useful when examining elements on a HUD.

  • **New: **Due to layering problems and a large maintenance burden with little benefit, we’re going back to a single FSlateDrawElement, rather than splitting it out into separate drawable elements.

  • New: Slate stencil buffer is set when the render thread and game thread differ depending on whether or not it is required.

  • New: SExpandableArea is now able to use an attribute for BorderImage.


  • Crash Fix: Focus on a text block’s text variable is cleared once the text is committed. Fixes assert on undo.

  • Crash Fix: Fixed a crash caused by a Dynamic Entry Box switching entry box type from “non-overlay” to “overlay” and from “wrapbox” to “non-wrapbox”.

  • Bug Fix: Improved UMG rename validation to respect the errors from the Blueprint validator. This fixes at least the case where it misreported the issue when the name was greater than the length limit in Blueprints.

  • Bug Fix: Fixed an issue where the destruction of UWidgets was delayed when they were manually removed from a panel as part of tear down.

  • Bug Fix: Fixed a problem where the UMG rename command was not being executed.

  • Bug Fix: Fixed a problem where widget animations were being duplicated with names that differ from their generated-class counterparts.

  • Bug Fix: AutoKey didn’t work with position UMG widgets since our changes are done to a preview widget that is deleted after the drop happens. To fix it, we just re-import the changes on the the new preview widget that we get from the widget reference, retriggering the auto-key onto the correct preview widget.

  • Bug Fix: Updated Variable Details panels to not display unusable metadata options for UMG widget references.

  • Bug Fix: UMG Hierarchy now remembers expansion state when being destroyed and recreated which was due to closing widget or switching to Graph view.

  • Bug Fix: Blueprints inheriting from UWidget will now show up in the Palette view even if they are not loaded.

  • Bug Fix: Added a fix for an issue where a ListView not propagating selection change events.

  • Bug Fix: Fixed a recursion of calls through SetDesignerFlags to avoid double-recursion with many nested panels.

  • Bug Fix: Fix for trying to move widget to a new parent on every tick where it was renaming widget on every tick during a drag and drop

  • Bug Fix: Rewrote the logic for AbsoluteToViewport and ScreenToWidgetAbsolute so that they don’t depend on the VirtualDesktop calls on FViewport. Now, Slate geometry is used exclusively so that it’s unaffected by other framework changes which fixes some issues with projected Widget components into the viewport.

  • Bug Fix: The RichTextBlockImageDecorator can now be subclassed.

  • Bug Fix: Widgets hidden in the designer (the eye) are no longer hittestable.

  • New: If you create a widget using CreateWidget from inside another widget, we now check if the world context object is a widget. If so, we use it as the outer source for the widget, thus ensuring things like design time flags are properly carried over.

  • New: There are now configurable compiler rules for UMG widgets based on the directory they are in. You can now choose to restrict access to certain performance degrading features in UMG. You can restrict what you want your team utilizing based on context. You can also extend the compiler to include additional checks, example auditing the fonts used.

  • New: Adding a File > option to the UMG Editor to generate a native base class using the current native class as the base class.

  • New: Adding the native ability of UImage to handle Soft Texture2D references and stream them in.

  • New: Adding a Blueprint exposed function to create an entry of a specific class to the Dynamic Entry Box widget.

  • New: Added the possibility to bind a widget animation from C++ to animations created in the widget blueprint.

  • New: Added duplicate widget functionality for UMG Editor.

  • Improvement: Changes to more accurately represent Android behavior in PIE and UMG.


  • Crash Fix: Fixed an issue involving stereo layers crashing on exit, where the DebugCanvas was destroyed after the layer manager, causing a nullptr dereference.

  • Crash Fix: Fixed a crash that could occur when setting the screen percentage and using the stereo preview through the editor.

  • **Crash Fix: **Previously on ARKit, there was an assert and crash if the Session you requested was invalid and the Configuration came back null which happens if the device / OS doesn’t support ARKit 2.0 and you request an image tracking session. It is now changed to just print out an error to the log and keep running if this happens.

  • Bug Fix: Fixed a bug in stereo rendering where scene capture’s would continuously reallocate render targets causing performance issues.

  • **Bug Fix: **Fixed runtime material switching on MRMeshComponent (which is used for real-world meshing).

  • **Bug Fix: **Fixed a MRMesh Normal problem where Normals were being scaled to the world scale.

  • **Bug Fix: **Fixed the use of deprecated NSKeyedArchiver and NSKeyedUnarchiver methods

  • New: Added in support for locking HMD tracking to an external tracking environment (for example, mocap tracker).

    • It is not meant to drive the position continually in lieu of an HMD’s built in system but is rather to help keep the HMD from generally getting out of alignment with another tracking system.

    • Use “CalibrateExternalTrackingToHMD” to allow for arbitrary rigid offsets between the HMD and the external tracking source.

    • Use “UpdateExternalTrackingHMDPosition” to allow for updating that offset as desired.

  • New: Added mobile multi-view support for translucent objects.

  • Improvement: Changed the world mapping state conversion in ARKit to return NotAvailable, Mapping, Mapped


  • Crash Fix: Adding check for PLATFORM_LUMIN to MagicLeap ImageTrackerComponent to prevent PIE crash running code that was designed to only run on device.

  • Bug Fix: Fixed an issue on Magic Leap where the development console window wasn’t positioning / sizing properly.

  • Bug Fix: Fixed an issue with gesture keypoint drift where if the render state is recreated and SendRenderTransform_Concurrent doesn’t happen, we need to also update the cached old transform in CreateRenderState_Concurrent.

  • Bug Fix: Fixed the setting of light estimation using the wrong value to determine the setting on ARKit.

  • Bug Fix:

    Fixed a member copy step in AppleARKitFrame::operator=.
  • Bug Fix: Fixed logic that decides if we should flip or not flip the passthrough camera inversion on GoogleAR.

  • Bug Fix: Added a check for an invalid physical size when specifying a candidate image for detection within a AR scene.

  • New: Added support to query and specify the desired video format for an AR session.

  • New: Added ARSkyLight class to automatically rebuild the sky cube maps as AR environment maps get updated.

  • New: Magic Leap HandTracking has been exposed via LiveLink:

    • Added Blueprint function to get the LiveLink source.

    • Exposed LiveLinkSourceHandle through ILiveLinkSource.h so that it can be used by the “Magic Leap” plugin.

    • The transforms are in tracking space meaning they form a hierarchical skeleton with HandCenter as the root. See FMagicLeapHandTracking::SetupLiveLinkData() for details on the hierarchy.

    • For more information, see Magic Leap documentation about which transforms are populated with the current Lumin Runtime.

  • New: Added a UPL file to AppleARKit that modifies the plist to include the requirement of ARKit and request for camera access.

  • New: Added support for DefaultStereoLayers on Lumin platforms.

  • New: Added a setting to specify the AR world alignment transform type a session should use.

  • Improvement: Changed how timestamps for ARKit objects are updated to make them more amenable with the engine.

  • Improvement: Made display names for AR Blueprint operations more descriptive.

  • Improvement: Changed the AR World Save and AR Get Candidate Object latent actions to use the new mechanism to reduce code.

  • Removed: Deleted some old ARKit configuration code that wasn’t being used.


  • Crash Fix: Fixed crash when having too many VR devices (trackers) connected to SteamVR.

  • Crash Fix: Fixed issue where packaged game/Editor with Stereo Layers crashes when exiting game through SteamVR overlay.

  • Bug Fix: Mac’s Daydream Instant Preview encountered handled ensures when running the first VR preview of an Editor run. Some FOV values from the Google instant preview were sometimes reported as negative, which broke the math in the projection matrix setup and resulted in inf and nan values. Now, we are taking the absolute value of the FOV instead.

  • Bug Fix: Fixed a bug with Oculus, where world stereo layers would drift when using a specific camera set up.

  • Bug Fix: Fixed a bug with Oculus which caused CheckIfPointWithinPlayArea to return the wrong results.

  • Bug Fix: Fixed a bug for Oculus, where required Oculus assets (render materials) weren’t being cooked with projects.

  • Bug Fix: Fixed a bug causing SteamVR to always enter full screen regardless of user settings.

  • New: The bundled Steam OpenVR SDK was updated to version 1.0.16.

  • New: Added Google 6DOF Motion Controller Support on Daydream:

    • Use Project Settings > Android > Advanced APK Packaging > Configure GoogleVR to support specific hardware configurations and then set to Daydream(6.6 DoF) to enable support for two 6DOF controllers.

    • A single 3dof controller is also supported by this configuration, as is a single 6dof controller.

    • Per Google’s recommendation, the 3DOF controller is detected only by noticing that the positions returned for all controllers are exactly 0,0,0. A future API should make it explicit when a controller is 3DOF or 6DOF.

    • Currently, we arbitrarily make the controller at index 0 the right and index 1 the left. A future API should enable us to query for controller handedness.

  • New: Added a composite debug canvas layer to Spectator Screen:

    • The debug canvas layer is now copied onto the spectator screen if both of those features are active.

    • The layer is mapped onto the spectator screen with letterboxing, so its aspect ratio will be preserved but additional unused screen space may exist (usually on the left and right).

    • The layer resolution is unlikely to match screen resolution so the display is expected to be somewhat fuzzier than normal.

    • Spectator modes that use API level support for mirroring to monitor rather than the SpectatorScreenController will continue to function as before where they do the monitor mirroring after the debug UI is drawn so it will appear but may be cropped oddly.

  • New: When enabling the experimental SteamVR Input feature, the editor will create blank bindings for common controller types. This makes it easier to edit the bindings in the “view bindings” tool accessible from the Steam VR Developer Settings.

  • New: VR Preview window: When using “Eye Plus Texture” mode, there is now a flag for whether or not to use alpha when compositing the texture on top of the image from the HMD.

Upgrade Notes

  • New: Added methods in FApp to get the current Timecode FrameRate. Older projects should no longer use UTimecodeProvider::GetFrameRate() when trying to determine the System’s Frame Rate for timecode related purposes.

  • New: Added support for Untracked Soft Object References, so if you add the Untracked metadata or use FSoftObjectPathSerializationScope with NeverCollect, those soft references will not be automatically cooked, reported to the asset registry, or cause warnings when deleting a referenced Actor. If you want your systems to work properly in PIE, we recommend that you transition anything using TLazyPtr to instead use TSoftObjectPtr with the new Untracked featured.


  • **New: **Added PostLoad check and additional GetClampedColorValue Blueprint function for linear color curves so that all color curves now respect RGB values greater than 1. If you were relying on HSV clamping, there is now a GetClampedColorValue function to use instead.

  • Bug Fix: Fixed an issue where using “Use Mouse for Touch” was not saving absolute positions for restoration when capture ended and resulted in PIE teleporting the mouse.

Media Framework

  • New: Slate brushes can no longer reference Media Textures directly. Instead, reference a Material that uses a Media Texture.

Gameplay Framework

  • New: APlayerState now maintains a reference to the Pawn it controls. APawn::PlayerState is now private and setting it will update APlayerState’s bi-directional Pawn reference. Use GetPlayerState and SetPlayerState to access / manipulate.


  • New: Android upgrade notes:

    • If you were using a CurlCertificates/ca-bundle.pem, move it to Certificates/cacert.pem and set bUsePlatformProvidedCertificates to false.

    • If you were using CurlCertificates/ca-additions.pem, move it to Certifcates/cacert.pem and set bUsePlatformProvidedCertificates to true.

    • In either of these cases, you may move the file to Certificates/Android/cacert.pem if it is Android-specific.


  • Bug Fix: Slate content file extensions have been replaced since they could cause problems on case-sensitive file systems. If you’re upgrading to an already synced workspace, this may require a “P4 flush” and removing the old files before re-syncing them like below, replacing “Engine” with the full root path on disc.

    • p4 sync Engine\Content\Slate\Common\DebugBorder.PNG#none Engine\Content\Slate\Old\Border.PNG#none Engine\Content\Slate\Common\TextBoxLabelBorder.PNG#none Engine\Content\Slate\Common\X.PNG#none Engine\Content\Slate\Common\RoundedSelection_16x.PNG#none Engine\Content\Slate\Common\ProgressBar_Marquee.PNG#none Engine\Content\Slate\Common\SearchGlass.PNG#none Engine\Content\Slate\Common\Spinbox.PNG#none Engine\Content\Slate\Common\HeaderSplitterGrip.PNG#none

    • p4 sync Engine\Content\Slate\Common\DebugBorder.png#head E:\DC\Engine\Content\Slate\Old\Border.png#head Engine\Content\Slate\Common\TextBoxLabelBorder.png#head E:\DC\Engine\Content\Slate\Common\X.png#head Engine\Content\Slate\Common\RoundedSelection_16x.png#head Engine\Content\Slate\Common\ProgressBar_Marquee.png#head Engine\Content\Slate\Common\SearchGlass.png#head Engine\Content\Slate\Common\Spinbox.png#head Engine\Content\Slate\Common\HeaderSplitterGrip.png#head


  • New: If you wish to target or run on macOS 10.12, you will need to change the Metal Shader Standard option to use Metal 1.2 via the Project Settings > Mac.


  • New: Existing calls to Skeletal Mesh triangle sampling functions in Niagara will now fail to compile. These should be replaced with a single call to GetSkinnedTriangleData(WS) for skinned data and GetTriUV() for UVs.


  • New: Fixes for Metal PrecompiledHeader compile clashes when compiling shaders (local or during cook) in separate streams at the same time that have different UE4_stdllib.metal versions.

  • New: Added the ability to fade in a Decal component the same way fade out is already supported. You can trigger a fade in on any DecalComponent by calling “SetFadeIn” on it, or by setting the “Fade In Duration” and “Fade In Start Delay” properties.


  • New: Added support for Dynamic Resolution for D3D11 for Intel hardware using MetricsDiscovery API.


  • New: Split screen now supports Bloom, Temporal Anti-Aliasing, and Motion Blur.


  • Bug Fix: Fixed the game window from running off of the the screen by utilizing the minimum size on the SWindow class and adding some math to the WM_SIZING block of ProcessWindowsMessages to make sure we’re not going to push the window around if we’re going under a valid minimum size. You can specify the minimum window width and height in DefaultGame.ini under [/Script/EngineSettings.GeneralProjectSettings] by specifying MinWindowWidth= or MinWindowHeight=.


  • **New: **Face AR has now been moved to its own plugin so that it can be independently enabled / disabled from Room AR. Your project must now explicitly include the Face AR plugin for it to be included in your build. It prevents Apple from rejecting AR apps that weren’t using Face AR features but that had the code included.

Behavior Tree

  • New: Made UBTCompositeNode::OnNextChild deprecated and switched over to Virtual functions.

Debugging Tools

  • New: Extended VisLog’s functionality with a way to log arrows and to mass-log boxes.


  • Bug Fix: Fixed InputTouch not showing up as an event in the graph list.

  • **Bug Fix: **Demoted a ValidateTemplates warning to a log message, since it is the expected outcome when reparenting base classes where derived classes modified a component that no longer exists in the grandparent


  • New: Fixed binding an unbound TFunction to another TFunction with a different signature. Also fixed binding a null function pointer or member function pointer to a TFunction. Added TIsMemberPointer type trait and renamed TIsATFunction and TIsATFunctionRef to TIsTFunction and TIsTFunctionRef.


  • Bug Fix: Selecting cancel when importing a csv file will no longer open an error message saying that the import failed.

  • New: The Editor now records delta changes done to objects on undo / redo transactions to provide more context to undo clients.

Gameplay Framework

  • New: Added UActorComponent::bVisualizationComponent boolean to indicate that a component is being used as a visualizer and is not a part of the component hierarchy. It prevents it from being selected in viewports (if clicked it will route to its parent component) or displaying the component trees by default. This setting replaces using bIsEditor to imply the component is for visualization purposes.

  • **Bug Fix: **You are no longer allowed to make a restricted Gameplay Tag not allow non-restricted children if it already has non-restricted children. It fixes issues related to deleting restricted Gameplay Tags.


  • New: Introduce an option to limit to the total number of created GL programs active at any one time.

    • This is to work around a limitation with some Android OpenGL drivers which could result in program link failure or graphical corruption if too many programs are created.

    • When enabled, if the number of active programs reaches a specified threshold an LRU system is used to destroy the least recently used program from the GL context before any more programs are created.

    • Destroyed programs are stored in binary form and when required, are retrieved via the binary for quicker program creation.

    • When used in combination with the OpenGL program binary cache and shader library, all programs are created and stored in their binary form (‘evicted’) the programs are recovered to actual GL programs on-demand during drawing. This prevents any LRU thrashing and possible driver heap fragmentation that could otherwise occur with large shader library during startup.

    • Enable the program LRU by setting r.OpenGL.EnableProgramLRUCache=1 and the total program count threshold is set using r.OpenGL.ProgramLRUCount=<limit>.

Xbox One

  • **New: **The default Xbox One XDK has been updated to June 2018 QFE 4.

  • New: Increase max srvs to 48. It has a performance hit of around 0.06ms on the RHI thread but will allow more complicated Landscape Materials to compile without issues.

  • New: Adding support for differentiating between left and right Shift / Ctrl / Alt keys.

  • New: Added Xbox-specific fast PDB linking build configuration .xml option that can be enabled without affecting PC / Editor builds. It is experimental and a small number of people have reported that Visual Studio crashes. If it works, it can get link times below 2 minutes. See the programming upgrade notes for details.


  • New: Added Serialize function to ITransactionObjectAnnotation.


  • Bug Fix: Preventing a division by 0 when we set the r.StaticMeshLODDistance but since 0 is a semi-valid value (it causes a division by 0 but having a very small number in the divisor is still valid) we will treat is as if it was 1.0f in all use cases currently.

Mobile Rendering

  • Bugfix: Mobile rendering will now properly handle “Dither LOD Transitions” when the Material has the option enabled via the Project Settings > Rendering > Mobile. Previously, if “Use Stencil for LOD Dither Fading” was enabled (disabled by default), mobile shaders were not excluding dithering code properly.


  • New: The usage of the bBuildDeveloperTools build switch is now independent of the bCompileAgainstEngine switch allowing developer plugins when not compiling against the engine.


  • New: Added compression and versioning to the AR saved world data.

  • Removed: Removed the bSupportAR flag since the inclusion of the AR plugins determines whether an app uses it or not.


  • New: A first pass refactor of network communications has been started with the intent of making future usage of the Engine more protocol agnostic, allowing for future compatibility of all projects down the road and prepares the engine for the growing adoption rate of IPv6. These fixes and changes resolve outdated functionality on the lower level socket systems, providing a better overall experience for users. There is also new functionality for querying address and service information in addition to better handling and manipulation of address data.

    • Moving functionality to the main BSD classes is preferable and usage of GetIP and SetIp function that take integers should be dropped in favor of using the raw versions of those functions.

    • Functions that take strings to create addresses should move to using the new GetAddressInformation calls.


  • New: For Forward Shading mode (when the GBuffer is not available), an auto-conversion from Deferred to DBuffer Decals has been implemented. Appearance of some DBuffer Decals may be affected by this change, since specular and metallic channel values previously hard-coded in DBufferDecalShared.ush were forced to be non-metallic and have specular of 4% (0.5 numeric value). Now the authored decal material values will be used, which matches GBuffer Decals.[br]

  • Bug Fix: Replaced automatic virtual shader directory mapping with manual approach in StartupModule(). It should reduce the amount of directory exists queries at Editor startup.


  • The TextBlock bAutoWrapText has been deprecated. A slight modification was made so that base synchronize sets the autowrap value.

Gameplay Framework

  • Deprecated USignificanceManager::RegisterObject has been changed to take FManagedObjectInfo as a parameter to the significance functions instead of UObject. This allows object info to be subclassed and cache information to avoid cache misses to inspect relatively static data stored in the object.

  • Deprecated ULevelStreamingKismet has been renamed to ULevelStreamingDynamic.


  • FSocketSubsystemBSDIPv6 and related specific classes have been marked for deprecation. Use FSocketSubsystemBSD and similar classes.


  • Beginning in 4.21, support for IOS 9 has been deprecated. The minimum supported OS version will be IOS 10. When loading a project in the editor, it will be automatically updated to a minimum version of IOS 10 if your project is set to support IOS 9.


  • Deprecated Linux set up scripts will no longer install mono and clang packages, instead, relying on bundled mono and clang.


  • Deprecated Metal 1.2 on macOS, the default is now Metal 2.0 and support for macOS 10.12 Sierra will be removed in 4.22.


  • Deprecated Draw Primitive calls no longer use the PrimitiveType argument, instead it will use the current Pipeline State Object’s PrimitiveType.

  • Deprecated Draw*PrimitiveUp has been deprecated. Note that you should use explicit temporary Vertex-buffers marked with BUF_Volatile from now on. See an example implementation in RenderUlilities.h.

  • Deprecated ABGR16 and Float RGB from EDefaultBackBufferPixelFormat. They are not supported by D3DX SwapChain.


  • Deprecated FShaderCache public interface is no longer used for caching. Caching is now achieved by Pipeline State Objects. See FShaderPipelineCache for details on the new system.


  • Bokeh DOF, Gaussian DOF and Circle DOF have been deprecated for deferred shading renderer.


  • Deprecated renamed CommandUtils.Log to CommandUtils.LogInformation, to avoid conflicts with the underlying Tools.DotNETCommon.Log class.


  • Deprecated modules must now explicitly specify the path to the header used to generate a PCH if one is desired, rather than the header being determined automatically by attempting to parse the source code.


  • Changed FSlateWindowElementList GetWindow to be thread safe. It is accessed on multiple threads so it needs to be safe. GetWindow is now deprecated and instead GetPaintWindow should be used instead.

Known Issues
For a complete listing of known issues affecting Unreal Engine 4.21, please see the Unreal Engine Public Issue Tracker.

Thank you for all optimizations for mobile platforms! :smiley: Mobile support is better and better with every UE4 release :cool:

CCDIK looks promising.

Amazing list of fixes and some great new features. Thanks for another A+ update!

Super happy with the material ID and LOD import bugs being fixed, hopefully it means what I hope it means and saves me from a ton of fix up work in the future.

How do we enable the experimental SteamVR Input support? I can’t find anything in plug-ins or project settings for it.

In the video, I showed that I want to swap functions, functions in the library, macros in the library, but now only the macros change places and then not everywhere. In the current versions, in order to change a function or a macro in a library, you need to duplicate those elements that should move for the moved element, then delete then change duplicates, then duplicate check that they are established in the game logic. This may take a hefty amount of time !!!
Steps to play:

  1. Create a NewMacroLibrary NewFunctionLibrary NewWidgetBlueprint
  2. open NewMacroLibrary to create a couple of macros and try swapping them, and dragging one macro to another macro. In my opinion, any elements should be reversed in the editor, because it helps in the search.
  3. open NewFunctionLibrary to create a couple of functions and try swapping them.
  4. open NewWidgetBlueprint to create a couple of functions and try swapping them. Create a pair of Dispatchers and try swapping them. Create a couple of components and try swapping them. Create a couple of interfaces and try swapping them.
    In general, many small improvements that have been tortured to wait …

Is issue with Nvidia drivers 4xx (screen flickering/blinking in Editor) now fixed?

The best features always get the least attention!

I demand clarification!

I will keep praying until you fix this bug or you let AudioCapture component works on mobile too .

I didn’t even think Android captured audio from mic in UE4. Voted.

Great job!

I was told that 4.21 fixes the Display on/off problem on NVidia 4xx.xx drivers, however now that I have 4.21 installed it is still not fixed. What is the timeline on actually fixing this issue? It goes away if I put the display in HDR mode, but I want to create content in SDR mode, as UE4 has no editor HDR mode.

I found a bug: 4.21 doesn’t load up anymore - if you disable “allow static lighting” in the project settings.
Just tested with a blank project and can confirm this is what is causing the problem. It’s stuck loading at 45% and never goes any higher.

Without that option disabled, 4.21 loads just fine.

In all versions before, I could always disable “allow static lighting” in the project settings and the editor would load up just fine in under 20 seconds (usually less than 10 seconds).

Can we please have a fix for this problem in the next quick-patch?

Awesome! Though I am curious about the Geographic Sun.
It’s not in the plugin editor ( but it is in the plugin folder for the Editor, so the files are present. )
And when I drop it into a project, it requires a recompile.

Of course, even if I make a new C++ project to compile things, I immediately get
Datasmith ( 5 different plugins.)

are missing/built with a different engine version.
And I can’t compile them either.

Are some of the plugins compiled for the preview builds, instead of release builds? Or is this just an error on my part due to the cooking optimizations?
(I haven’t had any issues with plugin compilation etc in 4.20, so I’m a bit puzzled.)

At 45% the editor compiles shaders. When you disable AllowStaticLighting it recompiles all shaders. So I would give it some more time to load.

Thanks Epic! Another great release!

No that’s not it, in prior engine versions when I disable AllowStaticLighting, it didn’t take any longer time for me to load the engine, it started right away regardless. The longest I ever waited was two minutes, certainly not the 15+ minutes that I have waited now.

EDIT: I’m not sure the shaders are the fault, because in the task manager it doesn’t show any shader compiling task at all. It only shows 3x UnrealGame task + 1 Unreal Editor task.
And the hardrive runs at 100% all the time.

Also, without disabling AllowStaticLighting, the editor just takes me only 4 seconds to load up.

Hey, Thanks Epic, great work. Unfortunately the new Geographic Sun doesn’t seem to work. I followed the exact same steps, but I can’t find the Blueprint.

Lighting Channels seems to be broken inside BP (On MAC) :