What's New

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

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

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

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

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

Major Features

New: Landscape Nondestructive Editing (Beta)

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

Landscape Edit Layers

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

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

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



Landscape Blueprint Brushes

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

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

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

Landmass Plugin (Experimental)

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

New: Physically-Based Sky Atmosphere Component

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

This new component supports:

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

Artistic direction through Atmosphere properties and custom material setups

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

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

Detailed debug visualizations

And much more

For additional details, see the Sky Atmosphere documentation.

Simplified Sun and Sky Workflow

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

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

The new Sky Atmosphere Component

Geographically accurate sun positioning

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

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

For more information, see Sun and Sky Actor page.

New: Screen Space Global Illumination (Beta)

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

1 - SSGI Enabled; 2 - SSGI Disabled

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

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

For additional information, see Screen Space Global Illumination documentation.

New: Live Universal Scene Description Stage (Beta)

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

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

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

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

Supports third-party USD plugins.

New: Datasmith and Unreal Studio for Everyone!

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

Datasmith

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

Get started reading about it here .

Other Unreal Studio Features

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

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

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

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

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

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

Mac OS X and Linux Support

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

For details on Datasmith platform support, see here .

New: Visual Dataprep (Beta)

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

With the Visual Dataprep system, you can:

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

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

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

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

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

For details, see the Visual Dataprep documentation.

New: Project Creation Workflow Improvements

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

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

New: Hair and Fur Rendering and Simulation (Experimental)

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

With this release, the feature supports:

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

Creation and setting up of Groom Components

Authoring and editing of Hair Materials

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

For additional information, see Hair Rendering and Simulation documentation.

New: nDisplay Setup Improvements

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

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

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

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

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

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

New: Ray Tracing Improvements (Beta)

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

These improvements include:

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

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

Added support for reflection multi-samples per pixel denoising.

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

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

Improved Ray Traced Global Illumination Method (Experimental)**

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

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

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

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

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

New Material Types

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

Base Color

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

YCoCg Base Color, Normal, Roughness, and Specular

World Height (new in 4.24)

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

New Streaming Virtual Texture Build for Runtime Virtual Texture

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

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

Improved Runtime Virtual Texture Asset Settings

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

New Runtime Virtual Texture Base Color Storage

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

New Runtime Virtual Texture Normal Storage

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

New Runtime Virtual Texture Asset Actions

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

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

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

Added Scalability Options and Console Variables

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

Runtime Virtual Texture Pool Improvements

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

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



Runtime Virtual Texture Parameter Support

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

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

New: Inertial Blending (Beta)

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

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

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

New: Animation Blueprint Linking (Beta)

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

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

New: Control Rig Track in Sequencer (Experimental)

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

New: Audio Mixer Enabled

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

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

New: Audio Stream Caching (Beta)

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

New: Audio Mixed Modulation (Beta)

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

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

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

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

New: Audio Synesthesia (Beta)

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



New: Sound Cue Templates (Beta)

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

New: Variant Manager Improvements

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

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

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

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

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

New: In-Editor UV Improvements

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

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

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

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

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

For details, see Working with UV Channels .

New: Datasmith Interop Improvements

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

Alias Studio

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

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

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

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

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

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

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

3ds Max

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

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

SketchUp

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

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

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

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

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

Revit

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

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

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

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

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

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

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

CAD

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

AxF

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

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

New: Editor Performance Improvements for High Actor Counts

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

New: RoboMerge (Beta)

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

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

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

New: BuildAgent (Beta)

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

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

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

New: AutoSDK (Beta)

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

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

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

For additional details, see the AutoSDK Reference .

New: Extended Editor UI Layouts

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

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

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

New: Sparse Class Data (Beta)

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

New: Auto-Instancing on Mobile

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

r.Mobile.SupportGPUScene=1

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

r.Mobile.UseGPUSceneTexture=1

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

New: Steam Sockets

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

Ping calculation support for Steam lobbies

Built-in DDoS Protections

End-to-end encryption

Improved NAT traversal over the old SteamNetworking protocol

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

SteamSockets gets stripped from builds for platforms other than PCs.

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

New: Network Engine Test Suite

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

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

New: DTLS Support

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

[PacketHandlerComponents] EncryptionComponent=DTLSHandlerComponent

New: Niagara Editor System Overview (Beta)

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

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

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

New: Collab Viewer Template Improvements

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

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

Measure distances between objects and surfaces.

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

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

For more, see the Collab Viewer Template documentation.

New: Pixel Streaming Improvements

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

Pixel Streaming is now supported for applications based on DirectX12

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

The Pixel Streaming plugin now uses WebRTC release 70.

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

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

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

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

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

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

Fixed video connection issue on Firefox 68+

For details, see Pixel Streaming .

New: Event Track Workflow Improvements

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

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

For more information see Calling Events through Sequencer .

New: Local or Master Time Shot Export

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

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

For more information see Exporting and Importing FBX files .

New: Tagged Object Bindings in Sequencer

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

New: Sequencer Curve Editor Enhancements

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

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

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

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

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

For more information, see the Sequencer Editor Reference guide.

New: Sequencer Quality of Life Improvements

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

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

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

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

For more information on these updates, see Sequencer Overview .

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

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

New: Sequencer Track Enhancements

There are several improvements and enhancements when using Sequencer Tracks.

Evaluating Individual Tracks in a Sequence

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



Attaching Objects to a Track

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

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

Spatialized Audio Tracks

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

Skeletal Animation Looping

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

New: Template Sequences (Experimental)

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

New: Chaos Fracture Toolbars

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

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

New: AVID DNxHR Support

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

For details, see Exporting Pro Media Files .

New: Virtual Scouting Improvements (Beta)

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

To get started, see Virtual Scouting .

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

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

New: 3D Text (Experimental)

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

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

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

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

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

For details, see [TODO:doc link].

New: ARKit 3.0 Support

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

New: OpenXR Support (Beta)

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

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

Improved hand meshing support.

Improved touchpad gesture support.

Improved audio support via the Unreal SoundField plugin.

New: Mission AR HoloLens 2 Sample

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

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

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

Create immersive narrative sequences and triggered events

Implement touch-based input and interactivity

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

New: Burley Subsurface Scattering

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

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

New: Material Layers (Beta)

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

New: Platform SDK Upgrades

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

IDE Version the Build farm compiles against Visual Studio - Visual Studio 2017 v15.9.4 toolchain (14.16.27023) and Windows 10 SDK (10.0.16299.0) Minimum Supported versions Visual Studio 2017 v15.6 Requires NET 4.6.2 Targeting Pack Xcode - Xcode 11.1

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

ARCore 1.7

ARKit 3.0

Linux "SDK" (cross-toolchain) -v15 clang-8.0.1-based (CentOS 7)

Oculus 1.40 API Level 23

OpenXR 1.0

Google Stadia 1.39

Lumin 0.22

Steam 1.46

SteamVR 1.5.17

Switch SDK 9.3.1 + optional NEX 4.6.3 (Firmware Version: 9.0.1-1.0) Supported IDE: Visual Studio 2017, Visual Studio 2015

PS4 Orbis SDK 7.008.001 System Software 7.008.021 Supported IDE: Visual Studio 2017, Visual Studio 2015

XboxOne XDK: July 2018 QFE-9 Firmware Version: Recovery May 2019 10.0.18362.3055 Supported IDE: Visual Studio 2017

macOS SDK 10.15

iOS SDK 13

tvOS SDK 13



Major Upgrade Notes

Editor

Matinee

You can no longer access Matinee Editor from the Cinematics Menu and Details Panel. This is part of the transition to remove Matinee from UE4 completely in 4.25. You can still convert Matinee actors to Sequencer assets using the Matinee to Sequencer Conversion Tool .

XR

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

Release Notes

AI

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

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

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

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

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

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

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

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

Navigation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Behavior Tree

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

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

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

Animation

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

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

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

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

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

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

Bug Fix: CurrentMontageStop no longer ignores the OverrideBlendOutTime argument.

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

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

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

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

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

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

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

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

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

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

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

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

Improvement: Optimized animation spawning in the following ways: Added deferred root node initialization. When an anim instance is set to initialize to a reference pose, this defers the first call to initialize the blend tree until just before the first Update() call on a worker thread. The system skips ConditionallyCacheBonesForState in state machines in the case where we would call CacheBones_AnyThread during first Initialize_AnyThread. This avoids duplicate work being done because traversal counters will let through synchronization calls if they have yet to be updated (for example, when their count is INDEX_NONE). Cache access to nodes that need pre-update, dynamic reset, or one-time initialization, as well as state machines in the generated class, to avoid iterating all anim nodes on initialization. Cache access to node properties when re-linking nodes to avoid duplicate memory round trips. Cache access to LUT size in FBaseBlendedCurve::GetValidElementCount, avoiding duplicate memory round trips. The system now prevents FName rehashing from string (intended to strip whitespace) when initializing FBoneReferences. Cache access to AnimCurveMapping smart name container on USkeleton, preventing a TMap lookup every time the smart name container is accessed. USkeleton::GetCurveMetaData now uses a "fast path" when accessing by using smart name UID. In this case, we can avoid the TMap lookup as the UID is always a direct index to metadata at runtime (slow path still applies in editor builds). Avoids calling FAnimNode_LayeredBoneBlend::ReinitializeBoneBlendWeights in Initialize_AnyThread, as CacheBones_AnyThread will be called straight after. Cache access to curve UID count and LinkedBones array in FAnimNode_LayeredBoneBlend::ReinitializeBoneBlendWeights, avoiding duplicate memory round trips.



Animation Assets

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

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

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

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

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

New: Added direction display for an axis label.

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

Animation Blueprints

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Import/Export

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

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

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

Skeletal Mesh

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

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

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

Audio

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Improvement: The AudioCapture module has been split into several modules: AudioCaptureCore—Includes our core audio capture interfaces that don't rely on the Engine. AudioCapture—Includes engine dependent classes such as UAudioCaptureComponent. Platform-specific implementations of IAudioCaptureStream in independent modules (AudioCaptureRtAudio, AudioCaptureAudioUnit, and so on).

Improvement: The AudioMixer module has been split into several modules: AudioMixer—Includes any engine-dependent code used in Unreal Audio. AudioMixerCore—Includes IAudioMixerPlatformInterface and other audio classes that don't rely on the engine module. SignalProcessing—Does not rely on the engine, and is used as our general purpose audio DSP library.



Automation

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

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

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

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

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

Blueprints

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

New: There is a new experimental feature that you can select that enables modifying Blueprints during Play in Editor by adding a parent class in the BaseClassesToAllowRecompilingDuringPlayInEditor list (empty by default). Whether or not this will work in your particular use case depends on the circumstances: Things that are spawned on demand with no active instances, such as gameplay cues, are the most likely to work, and leaf things that usually aren't referenced by other gameplay code directly, such as props, should generally be fine as well. Core gameplay code is sketchier. For example, iterating on a player controller Blueprint may not work. UMG widgets with existing instances do not work. (If there is a way to recreate your UI during PIE, then it should work after the widgets are recreated.) This feature is experimental and may increase the chance of crashes during Play In Editor when recompiling Blueprints, so save first and use with caution.

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

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

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

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

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

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

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

Core

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Bug Fix: Fixed TStringConversion's move constructor.

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

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

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

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

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

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

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

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

Bug Fix: Separated abbreviations in the Display Name.

Bug Fix: Removed unused lambda capture.

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

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

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

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

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

Bug Fix: Fixed a memory stomp in Trace writer.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fixed a crash when exiting early during init caused by disregard for GC set not being closed. Fixed a crash when exiting early during init caused by classes not being fully initialized. Added guards to prevent other threads from manipulating UObjects when the final GC runs.

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

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

Bug Fix: Fixed possible buffer overruns in WritePipe functions.

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

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

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

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

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

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

New: Added ToString method to FrandomStream.

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

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

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

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

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

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

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

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

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

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

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

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

New: Made the structured archive's macros more consistent in terms of names and string types. NAMED_ITEM(AnsiName, Value) and NAMED_FIELD(Value) are now merged into a single SA_VALUE(TCharName, Value). FIELD_NAME(TCharName) and FIELD_NAME_TEXT(AnsiName) are now merged into a single SA_FIELD_NAME(TCharName).

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

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

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

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

New: Added TSet and TMap XxxByHash() functions.

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

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

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

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

New: Added support for zero-copy consumes.

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

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

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

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

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

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

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

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

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

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

New: Convert UDataTable serialization to use structured archives.

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

New: Converts UAssetImportData serialization to use structured archives.

New: Exposed FDeferredMessageLog for public use.

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

New: Better serialization of engine versions to structured archives.

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

New: Only calls CloseHandle on valid handles.

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

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

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

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

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

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

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

New: Added some unit tests for LexTryParseFromString.

New: Updated type test messages.

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

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

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

New: Constructed FVector2D from single float.

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

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

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

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

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

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

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

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

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

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

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

New: Flagged Windows ANSI malloc as thread-safe.

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

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

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

Deprecated: Deprecated ARRAY_COUNT and changed it to UE_ARRAY_COUNT.

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

Removed: Removed tagged binary formatters from structured archive code.

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

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

Removed: Removed unused MAX_MERGED_COMPRESSION_CHUNKSIZE, ENABLE_PACKAGE_CLASS_SERIALIZATION_TIMES, ENABLE_TAGEXPORTS_CLASS_PRESAVE_TIMES.

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

Removed: Removed some unused package flags PKG_Need and PKG_DisallowLazyLoading.

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

Removed: Removed redundant USkeletalMesh::AddReferencedObjects.

Removed: Removed obsolete cooker save setting bConsiderCompressedPackageFileLengthRequirements.

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

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

Improvement: Optimizes AllowDebugViewmodes (TLightMapDensityDS::ShouldCompilePermutation) by replacing lots of temporary string allocations and individual stri