<track id="5sipw"><track id="5sipw"><span id="5sipw"></span></track></track><delect id="5sipw"></delect>

<meter id="5sipw"></meter>

  • <meter id="5sipw"><ins id="5sipw"><strike id="5sipw"></strike></ins></meter><nobr id="5sipw"><input id="5sipw"><ruby id="5sipw"></ruby></input></nobr>

      1. <cite id="5sipw"></cite>

          Unreal Engine 4.23 Release Notes

          Release Notes for Unreal Engine 4.23


          What's New

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

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

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

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

          Doug Richardson "drichardson", Morva Kristóf "KristofMorva", Reece Dunham "RDIL", "projectgheist", Jorgen P. Tjerno "jorgenpt", Ondrej Hrusovsky "Skylonxe", Miguel Fernandez "muit", Geordie Hall "geordiemhall", Artem Umerov "umerov1999", Marat Radchenko "slonopotamus", "AgentOttsel", Eric Spevacek "Mouthlessbobcat", Danny de Bruijne "danskidb", Serta? Ogan "SertacOgan", Trond Abusdal "trond", Joe Best-Rotheray "cajoebestrotheray", Nick Edwards "NEdwards-SumoDigital", Marcel "Zaratusa", Mark Whitty "Mosel3y", "YuchenMei", Branislav Grujic "grujicbr", "Rei-halycon", Michael Hills "MichaelHills", Nick Pearson "Nick-Pearson", "mastercoms", Zhi Kang Shao "ZKShao", Nick "eezstreet", "temporalflux", Vladislav Dmitrievich Turbanov "vladipus", Daniel Marshall "SuperWig", Brian Marshall "TurtleSimos", Sergey Vikhirev "Bormor", Robert Rouhani "Robmaister", Maxime Griot ""yamashi", Igor Karatayev "yatagarasu25", "Zeblote", Hesham Wahba "druidsbane", Joe Best-Rotheray "cajoebestrotheray", MoRunChang "MoRunChang2015", Sébastien Rombauts "SRombauts", JinWook Kim "zelon", Riley Labrecque "rlabrecque", Дмитрий "Yakim3396", "DanMilwardSumo", Wesley Barlow "Wesxdz", Franco Pulido "Franco Pulido", Kimmo Hernborg "KimmoHernborg", John Dunbar "Volbard", Micha? Siejak "Nadrin", kalle H?m?l?inen "kallehamalainen", "KaosSpectrum", Evan Hart "ehartNV", Skyler Clark "sclark39", Thomas Miller "tmiv", Stephen A. Imhoff "Clockwork-Muse", David Payne "davidpayne-cv", "CyberKatana", "roidanton", Milan ??astny "aknarts", Alex P-B chozabu, Marco Antonio Alvarez "surakin", Taikatou, Do?a Can Yan?ko?lu "dyanikoglu", "Kalmalyzer", "phi16", Mikhail Zakharov "zz77", Paul Hampson "TBBle", "NextTurn", "Punlord", kalle H?m?l?inen "kallehamalainen", Robert Pr?pper "rproepp", Yohann Martel ""ymartel06", Francis J. Sun "francisjsun", Eric Wasylishen "ericwa", Phillip Baxter "PhilBax", Alan Liu "PicaroonX",Mathias Hübscher "user37337",Daisuke Ban "exceed-alae", Brandon Wilson "Brandon-Wilson", Marcin Gorzel "mgorzel", "prolenorm"

          Major Features

          New: Chaos - Destruction (Beta)

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

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

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

          Geometry Collections

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

          image alt text

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


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

          image alt text

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


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

          image alt text

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

          Connection Graph

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

          image alt text

          Blue - Potential for Chaos; Yellow - Anchored Nodes

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


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

          Cached Simulations

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

          Niagara Integration

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

          New: Real-Time Ray Tracing Improvements (Beta)

          Ray Tracing support has received many optimizations and stability improvements in addition to several important new features.

          image alt text

          Performance and Stability

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

          • Expanded DirectX 12 Support for Unreal Engine as a whole

          • Improved Denoiser quality for Ray Traced Features

          • Increased Ray Traced Global Illumination (RTGI) quality

          Additional Geometry and Material Support

          We now support additional geometry and material types, such as:

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

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

          • Procedural Meshes

          • Transmission with SubSurface Materials

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

          Multi-Bounce Reflection Fallback

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

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

          image alt text

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

          New: Virtual Texturing (Beta)

          With this release, Virtual Texturing beta support enables you to create and use large textures for a lower and more constant memory footprint at runtime.

          Streaming Virtual Texturing

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

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

          For full details, see the Streaming Virtual Texturing documentation.

          Runtime Virtual Texturing

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

          For full details, see the Runtime Virtual Texturing documentation.

          New: Unreal Insights (Beta)

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

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

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

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

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

          New: HoloLens 2 Native Support (Beta)

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

          image alt text

          image alt text

          For more information, see Microsoft HoloLens 2 Development .

          New: Virtual Production Pipeline Improvements

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

          In-Camera VFX (Beta)

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

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

          VR Scouting for Filmmakers (Beta)

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

          image alt text

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

          For details, see Virtual Scouting .

          Live Link Datatypes and UX Improvements

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

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

          Additional improvements:

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

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

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

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

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

          For details, see the Live Link Plugin documentation.

          Remote Control over HTTP (Beta)

          You can now send commands to Unreal Engine and Unreal Editor remotely over HTTP!

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

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

          For details, see Web Remote Control .

          New: nDisplay Warp and Blend for Curved Surfaces

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

          image alt text

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

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

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

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

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

          New: Niagara Improvements (Beta)

          Integration into Chaos Physics

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

          GPU Simulation Improvements

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

          GPU Support for Static and Skeletal Mesh Sampling

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

          Ray Tracing Support for Niagara Sprite Emitters

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

          Currently only sprite emitter particles are supported.

          Emitter Inheritance

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

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

          Compiling and Cooking Improvements

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

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

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

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

          Improved Error Reporting

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

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

          Static Switches

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

          image alt text

          Increased Feature Parity with Cascade

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

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

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

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

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

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

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

          New: Platform Extensions

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

          New: Skin Weight Profiles

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

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

          New: Animation Streaming (Experimental)

          Animations can now be streamed for improved memory usage and memory management, which is particularly useful when playing back animation data in long cinematics.

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

          New: Dynamic Animation Graphs (Experimental)

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

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

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

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

          New: Open Sound Control (Beta)

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

          image alt text

          New: Wavetable Synthesis Plugin

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

          New: CSVToSVG Tool (Beta)

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

          image alt text

          New: Sequencer Curve Editor Improvements (Beta)

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

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

          Extending the Curve Editor

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

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

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

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

            • Bake (UCurveEditorBakeFilter)

            • Simplify (UCurveEditorReduceFilter)

            • Smoothing (UCurveEditorFFTFilter)

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

          View Modes

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

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

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

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

          image alt text

          New Filter Menu

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

          Multiple Framing Options

          Multiple different framing options are now available.

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

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

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

          image alt text

          Retiming Tool

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

          image alt text

          Transform Tool

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

          New: Sequencer Usability Improvements

          A number of workflow and usability improvements have been added including:

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

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

            image alt text

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

            image alt text

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

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

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

          New: Data Validation Extensibility

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

          New: DebugCameraController Improvements

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

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

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

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

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

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

          New: Multi-User Editing Improvements (Beta)

          Multi-User Editing is significantly improved with the goal of making it a better fit for real-world production use cases.

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

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

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

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

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

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

          New: Disaster Recovery (Experimental)

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

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

          New: Drag and Drop to Fill Array

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

          See the Array Control page for more information.

          New: EditConditions Metadata Improvements (Beta)

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

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

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

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

          Additional examples of valid expressions:

          • MyInteger > 5 &amp;&amp; MyFloat &lt;= 10

          • MyEnum == EnumType::B

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

          New: Editor Utility Blueprints (Beta)

          This release introduces Editor Utility Blueprints: a new kind of Blueprint class that is intended specifically for running Blueprint logic only in the Unreal Editor rather than at runtime. These Blueprints have a similar purpose to Editor Utility Widgets , but are ideal for use when you don't need to expose a custom UI for your Blueprint logic.

          Editor Utility Blueprints replace the former experimental Blutilities feature (short for Blueprint Utilities). If you've used Blutilities in the past, you'll notice a few changes:

          • Unlike Blutilities, the parent class of an Editor Utility Blueprint can be any Editor-only class that isn't a widget.

          • The GlobalEditorUtilityBase and PlacedEditorUtilityBase classes have been deprecated. If you have Blutilities that inherit directly from these parent classes, you'll need to reparent your classes. EditorUtilityObject and EditorUtilityActor are good replacement options.

          • The Blutility Shelf has been removed. When you double-click an Editor Utility Blueprint, it opens in the Blueprint Editor like any other Blueprint class.

          • Editor Utility Blueprints that derive from Actor do not expose buttons in the Details panel for Events and Functions that have the Call in Editor option enabled. If you need UI to run your Blueprint logic, consider using an Editor Utility Widget instead, which offers all the flexibility of UMG .

          • You can configure the Editor to create an instance of an Editor Utility Blueprint or Editor Utility Widget class on startup class and run a predetermined function. You can use this behavior to run custom logic every time your Project is edited, such as binding to stateful editor events. See Startup Objects .

          See also Scripting the Editor using Blueprints .

          New: Hide Unrelated Nodes

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

          New: Landscape Splines Improvements

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

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

          New: Editor Performance Improvements

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

          New: Material Editor Updates

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

          image alt text

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

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

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

            • For material instances, GetStaticSwitchParameterValue.

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

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

          New: UMG Accessibility Screen Reader Support (Experimental)

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

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

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

          For more information, see Supporting Screen Readers .

          New: Wacom Tablet Support (Experimental)

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

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

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

          New: UMG Widget Diffing

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

          image alt text

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

          New: Non-Destructive Landscape Editing (Experimental)

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

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

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

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

          New: Place Interactive Actors with Foliage Tool

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

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

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

          For additional information, read more about Foliage Mode .

          New: HDRI Backdrop Actor

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

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

          New: Dual Height Fog for Exponential Height Fog

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

          image alt text

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

          New: Dynamic Shadow Bias Improvement

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

          image alt text

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

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

          To control the Receiver Bias, use the console variables under r.Shadow.* to set a value between 0 (better accuracy with more artifacts) and 1 (less accuracy with fewer artifacts) to set the receiver bias globally per-light type. You can set any light-type's constant and slope bias globally using console variables, also.

          New: Pre-Skinned Local Bounds Material Expression

          We've added a new Material Expression to return the Pre-Skinned Local Bounds of Skeletal Meshes. This expression enables you to be able to calculate a relative position inside the bounds of an Actor through the Material. Since these bounds don't change - even when animated - it enables you to apply a material in a consistent or fixed manner, such as a pattern like a decorative wrap applied to a weapon or vehicle. In the Animation Editors, you can visualize the Pre-Skinned Bounds of any mesh from the Character drop-down under the Mesh category.

          New: Storing Custom Per-Primitive Data

          We now support storing data on a per-primitive level instead of per-Material Instance, enabling primitives to be automatically considered for dynamic instance drawing.

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

          New: From Material Expression Shading Model

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

          image alt text

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

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

          For additional details, see the From Material Expression documentation.

          New: IES Profile Improvements

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

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

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

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

          For additional details, see IES Light Profiles .

          New: Render Dependency Graph

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

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

          For additional information, see Render Dependency Graph .

          New: Composure Improvements

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

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

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

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

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

          New: Python Import/Export FBX

          Python scripting now supports importing and exporting FBX animations.

          New: Pro Video Codecs

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

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

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

          • Multiple frame rates and resolutions.

          • Embedded timecode track is supported.

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

          • Supported on Windows platforms only.

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

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

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

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

          • Full support for alpha channels.

          • Multiple frame rates and resolutions.

          • No embedded audio or timecode support.

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

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

          New: Stereo Panoramic Capture Tool Improvements (Experimental)

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

          New: Platform SDK Upgrades

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


          • IDE Version the Build farm compiles against

            • Visual Studio - Visual Studio 2017 v15.9.11 toolchain (14.16.27023) and Windows 10 SDK (10.0.16299.0)

              • Minimum Supported versions

                • Visual Studio 2017 v15.6

              • Requires NET 4.6.2 Targeting Pack

            • Xcode - Xcode 10.3

          • Android

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

          • ARCore

            • 1.7

          • HTML5

            • Emscripten 1.38.31

          • Linux "SDK" (cross-toolchain)

          • Oculus Runtime

            • 1.37

          • OpenXR

            • 1.0

          • Google Stadia

            • 1.34

          • Lumin

            • 0.19.0

          • Steam

            • 1.42

          • SteamVR

            • 1.5.17

          • Switch

            • SDK 8.3.0 + optional NEX 4.6.3 (Firmware Version: 8.1.0-1.1)

            • Supported IDE: Visual Studio 2017, Visual Studio 2015

          • PS4

            • 6.508.001

            • Firmware Version 6.510.011

            • Supported IDE: Visual Studio 2017, Visual Studio 2015

          • XBoxOne

            • XDK: July 2018 QFE-9

            • Firmware Version: May 2019 10.0.18362.3055

            • Supported IDE: Visual Studio 2017

          • MacOS

            • SDK 10.14

          • iOS

            • SDK 12

          • tvOS

            • SDK 12

          Upgrade Notes



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

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

          VR Editor

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



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


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

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

          Release Notes


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

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

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

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

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

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

          • New: TeamAttitude enum is now a BlueprintType.

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

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

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

          Behavior Tree

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

          Debugging Tools

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          Animation Blueprints

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

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

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

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

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

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

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

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

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

          Animation Tools

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

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

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

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

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


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

          • New: Added MorphTarget support when exporting Skeletal Mesh.

          Skeletal Mesh

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

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

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

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

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


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

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

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

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

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

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

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

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

          • Crash Fix: Fixed a hang during cook.

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

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

          • Crash Fix: Fixed a hang in audio streaming.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Bug Fix: Fixed distortion and zippering during panning.

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

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

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

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

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

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

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

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

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

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

          • Bug Fix: Fixed XMA2 streaming for audio mixer.

          • Bug Fix: Fixed audio streaming crashes.

          • Bug Fix: Fixed occlusion interpolation.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Removed: Removed OneShotPriorityCullThreshold in AudioDevice.

          • Removed: Removed UAudioSettings::MaxWaveInstances.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Added development commands to audit bytecode contents:

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

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

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

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

          • New: Added GetActorOfClass node.

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

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

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

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

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

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

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

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

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

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

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

          • New: Added GetInputChordDisplayName node.

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

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


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

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

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

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

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

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

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

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

          • Bug Fix: Fixed TUnion missing the assignment operator.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Bug Fix: Fixed FText to truncate rounding errors.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Bug Fix: Fixed documentation comments in FWeakObjectPtr.

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

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

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

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

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

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

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

          • Bug Fix: Fixed uninitialized member access in FExportReferenceSorter.

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

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Cleaned up LLM behaviour with Realloc:

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

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Improved Visual Studio debugger visualization of FNames.

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

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

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

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

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

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

          • New: Added weighted moving average smoothing functions.

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

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

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

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

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

          • New: Added TIsConst metafunction.

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

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Enabled TSharedPtr to be comparable to nullptr.

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

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

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

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

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

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

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

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

          • New: Added support for uint64 bitfield properties.

          • New: Added support for using FString with RegisterConsoleVariableRef.

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

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

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

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

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

          • New: Added a small Zip file Utility API.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Added new FPaths::GetPathLeaf function.

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

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

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

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

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

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

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

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

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

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

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

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

          • New: Added Unreal Insights to Win64 Installed Builds.

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

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

          • Improvement: Implemented minor optimization in StreamableHandle.

          • Improvement: Optimized performance while Async Loading.

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

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

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

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

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

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

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

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

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

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

          • Improvement: Made several optimizations to ShaderCodeLibrary cooking.

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

          • Improvement: Added FName improvements and optimizations:

          • Encoding improvements

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

            • Changed NAME_INDEX from contiguous int to monotonically increasing int

          • General improvements

            • Improved API and documentation

            • Allowed getting FName as TCHAR without dynamic allocations

            • Added New constructor that enables supplying string length

            • Document IsValid and clarify IsNone semantics

            • Hid global state such as GetNames

            • Reduced amount of implementation details visible in header

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

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

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

          • Optimizations

            • Implemented memory optimizations that reduce per entry overhead

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

            • Avoided extra copying when splitting numbers

            • Implemented more efficient IsPureAnsi check and wide-narrow conversions

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

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

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

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

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

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

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

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

          • Improvement: Made improvements to pak file check command:

            • Added timing information to the log.

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

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

          • Improvement: Minor UnrealPak refactor:

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

          • New: Added Win32 support.

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

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

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

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

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

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

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

          Media Framework

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

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



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

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

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

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

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

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

          • New: Added RunUAT stub scripts to workspace root.

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

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

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

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

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


          • New: Task now has a Project="" attribute that specifies the path to a foreign project.

          Live Coding

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

            • UIMin and UIMax for float properties.

            • UIMin and UIMax settings for float parameters on Functions.

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Bug Fix:

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

            • Limited the user Display name to 32 characters.

            • Limited the default session name to 128 characters.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • Bug Fix: Fixed parsing errors in RendererSe