Unreal Engine 4.12 Released!
June 1, 2016

Unreal Engine 4.12 Released!

By Alexander Paschall

This release brings hundreds of updates for Unreal Engine 4, including 106 improvements submitted by the community of Unreal Engine developers on GitHub! Thanks to all of these contributors to Unreal Engine 4.12:

aninda, amcofi, Artem V. Navrotskiy (bozaro), Beau Hardy (psychogony), Black Phoenix (PhoenixBlack), Brent Scriver (FineRedMist), Cedric Neukirchen (eXifreXi), Céleste (CelPlays), chendi (cdsama), Courtland Idstrom (Frugality), David Palacios (Hevedy), DavidNSllva, Erik (erikbye), esdasuka, Frank Force (KilledByAPixel), Graham Hughes (graehu), Grimmick, Hannah Gamiel (hgamiel), Hongjun Han (h27han), Ian Fox (MaideCa), jamendxman3, James Baxter (TheJamsh), Jarl Gullberg (Nihlus), Jason (Abatron), Jeremy (JeroMiya), Jorge Martins (SNikon), Kartik (i64), Kim Sang Kyun (skkim-ginno), Konstantin Zaitcev (kosz78), Leon Rosengarten (lion03), M3d10n, MacAndor, Maik Klein (MaikKlein), Manny (Manny-MADE), Marat Radchenko (slonopotamus), Mathew Wadstein (MWadstein), Lucyberad, Matthias Hölzl (hoelzl), MAVRIN (artemavrin), Maxim Pestun (maxpestun), mbehensky, meChiel, mfortin-bhvr, mipg, Narendra Umate (ardneran), Nikola Dimitroff (nikoladimitroff), Pablo Zurita (pzurita), phoboz-net, Pierre-Luc Loyer (plloyer), Piotr Bąk (Pierdek), projectgheist, Rama (EverNewJoy), Robert Chubb (SaxonRah), Robert Khalikov (nbjk667), Robert Segal (robertfsegal), RobertTroughton, Ryan Nielson (RyanNielson), Samuel Groß (saelo), Sasha Petrovich (xulture), Sébastien Rombauts (SRombauts), Stephen Whittle (stephenwhittle), Taces, Temaran, Tim Lindeberg (timlindeberg), Tobias Mollstam (mollstam), wdhwg001, Will Stahl (merlin91), WymzeeLabs, Yohann Martel (ymartel06), Zelex.

What’s New

Sequencer is ready to use in Unreal Engine 4.12! This is our fully non-linear, real-time cinematics and animation tool, and the successor to Matinee. It has many powerful features, including automatic keyframing, cinematic cameras, and live gameplay recording. Sequencer allows for easier collaboration on large animation projects, because you can freely organize your sequences into as many assets as you want. Sequencer will offer to import your existing Matinee animations when you open them, but Matinee is still supported as well.

A preview of our VR Editor is available in this release! This is a forward-looking feature that allows you to freely navigate your worlds in VR using motion controllers. You can select and move actors, place new objects and even access the editor's UI, all while immersed in VR. This feature currently requires either an HTC Vive or Oculus Touch development hardware. To try it out, simply turn on "Enable VR Editing" in the Experimental section of your Editor Preferences.

Please note, for C++ programmers on Windows: Unreal Engine now requires Visual Studio 2015. All desktop versions of Visual Studio 2015 are supported, including the (free) Express and Community editions. Please upgrade at your convenience.

Of course, in every release we work hard to deliver important new features for rendering, VR, animation, audio and mobile devices, as well as performance improvements and fixes to reported bugs. We hope you enjoy Unreal Engine 4.12!

Major Features

New: Sequencer

Sequencer combines the power of a non-linear editor with 3D animation editing to allow you to produce in-game cinematics as well as a sequence of shots for film, television, and previsualization.

Non-Linear Workflow

Sequencer’s non-linear workflow gives you the ability to compose and edit your shots in a creative and iterative fashion. You can easily make changes to a particular shot, like change the color of a light or add a fog element, and rollback to a previous take to experiment with how your sequence comes together. It’s also designed so that multiple artists can work on multiple shots simultaneously. Check out the Subway Sequencer Project on the Learn Tab of the Launcher to see Sequencer in action.

  • Rearrange shots like a traditional non-linear editing package.
  • Create alternate takes of a shot and rollback with ease.
  • Make per-shot tweaks and spawn shot-specific actors.
  • Designed for collaboration.

Intuitive User Interface

The user interface design is inspired by the best of Matinee and traditional 3D software packages. The interface allows you to view, edit, and organize your animation data in a clear and concise manner. 3D content creators will find the interface intuitive and familiar.

  • Automatic track creation based on actor type.
  • Standardized keyboard shortcuts.
  • Auto-keyframing.
  • Embedded track and key editing/creation widgets.
  • User-definable track coloring.
  • Keyframe shapes and colors defined by interpolation behavior.
  • Folders and labels for organization.

Cinematic Cameras and Cinematic Viewport

A new cinematic camera actor coupled with new camera rig actors provide filmmakers as well as novices with the ability to create realistic camera shots with ease. A new streamlined viewport allows you to view a sequence of shots for dailies in filmmaking.

  • Cinematic Camera Actor with properties to mimic real-world cameras.
  • Customizable lenses and filmback settings.
  • Focal length.
  • Look-at tracking.
  • Camera Rig Crane and Camera Rig Rail Actors.
  • Cinematic Viewport .
  • Embedded timeline and transport controls.
  • Frame numbers indicating shot in and out cut points.
  • Overlays and framing helpers for composition.

Sequence Recording

Sequence recording allows you to record gameplay and immediately place the recorded elements into your shot. You can even make a recording while playing back a previous recording.

New: Unreal VR Editor (Preview)

The new "VR Editor" mode allows you to navigate and edit levels while immersed in virtual reality! You can select and move objects, and even grab the "world" itself and freely drag, rotate or scale your entire level! With motion controllers in VR, you have one-to-one control over objects and your perspective.

You can access familiar editor features like Content Browser while in VR, and use the transform gizmo to precisely place objects. Snapping tools help you get everything lined up perfectly.

If you grab the world with both hands and pull, you can scale the world really big. This makes it easy to inspect and edit fine details of your level.

This feature is an early preview, so you'll need to turn on "Enable VR Editing" under the Experimental/VR section of Editor Preferences. Afterwards, a new "VR Mode" toolbar button will appear that allows you to instantly toggle into VR at any time! You can use VR Editor in any project you want, or check out the new "VR-Basic" map (accessible through the File -> New option) for a simple playground to experiment within.

Important: VR Editor mode requires motion controllers to interact with the world and UI, so you'll need either an HTC Vive or an Oculus Rift with Touch controller development hardware.

Please keep in mind this is an early experimental feature, but we'll be improving it continuously over time. Check it out and send us your feedback! Here are some links with lots of additional information about Unreal’s VR Editor:

New: Daydream VR Support

We're happy to announce that 4.12 support Google's new Daydream platform! Daydream is an exciting new mobile VR platform that brings high quality VR experiences to Daydream-certified phones. UE4 includes full support for the platform, including the motion controller that comes with every Daydream set.

If you don't have a Daydream developer kit yet, you can still get started! Using the same plugin, you can create Google Cardboard apps. Features that require a Daydream phone will simply be turned off on other Android devices.

To enable support, go to the Plugins window in the editor, and enable "Google VR" and "Google VR Controller."

New: Planar Reflections

We now have support for real-time planar reflections!

These work by rendering the scene again from the direction of the reflection, so there’s a significant cost to using this feature. However, the reflection quality is much more reliable than with Screen Space Reflections.

Left: Screen Space Reflections with off-screen leaking, Right: Planar Reflections To use planar reflections, first enable "Support global clip plane for Planar Reflections" in the Rendering project settings, and restart the editor. Then place a Planar Reflection Actor and position it in your scene. Any nearby reflective materials will automatically be affected by the planar reflection and their normals will be used to distort the reflection, allowing simulated waves.

This is a new feature and has a number of limitations:

  • There’s no way to control what rendering features are enabled in the reflection pass.
  • Dynamic shadowing and fog are incorrect in the reflection pass.
  • Only a constant roughness value is supported, and it’s specified on the planar reflection component.
  • Planar reflections work on mobile, but materials which use planar reflections need the "Planar Reflections" flag set under the "Mobile” section of the material properties.

New: High Quality Reflections

For this release, we’ve added various new rendering features to allow for highly realistic surface reflections!

We wanted to achieve very high quality, crisp reflections in order to achieve more realistic car paints among other things. This required improvements to several areas from how we process and encode geometry data to enabling high resolution reflection captures of the scene.

High Precision Static Mesh Vertex Normal and Tangent Encoding - The single most important factor in achieving high quality reflections is how accurately the vertex normal and tangent can be represented. We added the option to encode normals and tangents as 16 bits per channel vectors. This allows developers make the trade off between higher quality and how much additional memory is used encoding vertex buffers. This option, Use High Precision Tangent Basis, can be found in the Build Settings section of the Static Mesh editor.

Custom Resolutions for Sky Cubemaps and Reflection Probes - The second part of achieving high quality reflections is what we are actually reflecting - the environment and local reflections. Previously the engine hard-coded the resolution of the cooked cubemaps that skylights and reflection probes would use. We now allow developers to choose the resolution that best suits their needs based on performance, memory, and quality tradeoffs. Note that skylight cubemap resolutions can be set per skylight, while reflection probes’ cubemap resolution is set as a project wide setting. Using a very high resolution can dramatically affect performance due to GPU memory requirements.

Custom Cubemaps for Reflection Probes - Developers are now also able to specify a custom cubemap if they choose for each reflection probe. This allows for creating custom cubemaps with additional details that can enhance or fine tune the look of local reflections.

High Precision GBuffer Normal Encoding - Finally, we exposed an option to select a high precision GBuffer Normal encoding format so that SSR among other techniques can rely on high precision normals. The high precision GBuffer Normal encoding encodes the normal vector into three channels, 16 bits per channel. This encoding requires increased GPU memory and will have an impact on performance.

New: Dual-Normal Clear Coat Shading Model

You can now use multiple normal maps with Clear Coat materials to achieve realistic shading for surfaces like carbon fiber.

Left: Old UE4 Clear Coat, Center: New UE4 Clear Coat with Bottom Normal, Right: Actual Photograph

The Clear Coat shading model now has the option to specify a second normal map for the surface below the clearcoat layer. This allows us to more accurately model complex materials such as carbon fiber which have a different geometric surface than the clearcoat layer.

This option must be enabled via the project settings: Rendering -> Clear Coat Use Dual Normal. Enabling this feature adds some cost to all clearcoat materials as well as some additional overhead to the main rendering code.

To use it, you must place a *Clear Coat Bottom Normal*

  • node in the material graph. This is where you will plug in the output of your second normal calculation.

New: OSVR Support (Preview)

Thanks to the efforts of the OSVR team, UE4 now supports OSVR out of the box!

The OSVR software platform allows a wide variety of VR and AR devices and peripherals to talk through a common layer to the engine. For more information about the platform and supported devices, please visit http://www.osvr.org/

New: Vulkan Mobile Renderer (Preview)

An early preview of mobile rendering using the Vulkan graphics API is available in this release.

The above screenshot shows the Vulkan-rendered ProtoStar demo from the Samsung Galaxy S7 Unpacked event. Currently only mobile rendering features have been implemented.

New: High Quality Mobile Post-Processing

The filmic tonemapper with color grading now works on mobile devices!

Higher quality Gaussian depth-of-field is now supported on mobile devices with ES3.1 support!

New: Improved Shadows for Mobile

Dynamic cascaded shadow maps for a single stationary light is now supported in the mobile renderer!

A stationary directional light can now cast whole-scene dynamic CSM shadows from just movable objects, blending correctly with precomputed shadows cast by the static objects in the scene. CSM shadows do not exhibit the double shadowing you see with modulated shadows and this technique is also faster when casting shadows for multiple objects.

  • The feature makes use of one extra texture sampler, but it can be disabled via the project settings: Rendering -> Mobile -> Combined Static and CSM Shadowing which will free the sampler for material use.
  • Components which should receive combined shadows need the flag Receive Combined Static and CSM Shadows from Stationary Lights set on them.

New: GPU Particles on High-end Android and iOS devices

GPU particles with vector fields now work on high end mobile devices!

  • This feature requires a mobile device that supports 32-bit floating point render targets with MRT support.
  • Supported on Apple devices with A8+ (iPhone 6, iPad Air 2, iPad Mini 4, and newer).
  • Supported on Android 6.0 devices with Adreno 4xx and Mali-T7xx GPUs (Galaxy Note 4, Note 5, S6, S7, Nexus 6P and others).

New: Cooking Blueprints to C++ (Preview)

To reduce the VM overhead that goes into executing Blueprints, we’ve added a feature that lets you package Blueprints into native source code. This feature is still experimental and should not yet be relied upon for shipping games, but please try it out and send us feedback!

  • This is enabled in the editor through your project’s Packaging Settings: Experimental => Nativize Blueprint Assets.
  • It can also be invoked by passing -NativizeAssets as a parameter to the UAT BuildCookRun script.
  • Generated source is saved as a plugin in your project’s intermediate folder, under: …\Intermediate\\NativizedAssets\
  • You can exclude certain Blueprints from the process in your game’s DefaultEditor.ini file under [BlueprintNativizationSettings].
  • General "types" of Blueprints can be excluded: +ExcludedBlueprintTypes=/Script/UMGEditor.WidgetBlueprint
  • Specific assets can also be excluded: +ExcludedAssets=/Game/Blueprints/MyBlueprint

New: Grass and Foliage Scalability

The scalability system has a new Foliage scalability setting. Landscape grass and foliage density can be reduced automatically based on the current scalability setting, and the setting is able to be changed at runtime, so games can implement a foliage detail setting slider.

Landscape Grass is automatically included in the foliage scalability, but Foliage must opt-in via the "Enable Density Scaling" option in the Scalability section on the FoliageType. It should typically be enabled for “detail” foliage without collision, such as small rocks and bushes. It should be disabled for foliage types with collision such as trees, as the collision for removed instances will continue to exist in the game. The density scaling to apply to grass and foliage at each scalability level is configured with the "grass.DensityScale" and “foliage.DensityScale” variables in the [FoliageQuality] sections of BaseScalability.ini and can be overridden in your game’s DefaultScalability.ini.

New: Web Browser Widget for UMG on iOS

The UMG Web Browser widget is now supported on iOS!

Chromium is used for the web browser widget on desktop platforms, but both iOS and Android use native WebKit controls aligned to match your UMG layout, which keeps executable size to a minimum and increases performance.

New: Twist Corrective Animation Node

We have added a new Twist Corrective node that can drive curve values, such as Morph Targets, based on the twist of one bone relative to another. As an example, when the neck is twisted too far to the right or left you can apply a Morph Target to the neck in order to create a more natural look.

You can specify the Base Frame and Twist Frame using bone name and local axis, and a Twist Normal as the axis of twist. Angle Delta of range [Ref Pose Delta Angle, Max Angle] will be mapped to [Mapped Ranged Min, Mapped Ranged Max] using a named curve.

New: Full Scene Importer

With Full Scene Importing you can now take that environment you’ve already constructed in Max / Maya / Blender and import the entire scene into a level in the editor.

A new Scene FBX asset is created for your environment so that you can re-import it allowing iteration on the environment as well. An early version was available in 4.11 supporting only scenes containing static meshes. The 4.12 version is more complete including the ability to import scenes that include skeletal meshes.. To try out the feature, just go to File > Import Scene, and select an FBX environment to import.

New: Actor Merging

You can now easily merge mesh actors together right in the level viewport. This allows you to reduce draw calls to get better performance.

Example of merging static meshes, *left* before view in Level viewport / *right* after view in the Static Mesh Editor The Merge Actor functionality is no longer an experimental feature of the Engine, and can now be found under Window/Developer/Miscellaneous. The UI panel has been extended and updated to support the latest changes made to the merging path for the Hierarchical LOD System.

New: Pixel Inspector

The new Pixel Inspector tool lets you click on a pixel in the scene and visualize the material and rendering state that contributed to its color.

Have you ever asked yourself why a pixel in the scene has a strange color? What about a tool that will tell you what material input is driving a pixel's color? The Pixel Inspector tool is here to help!

The Pixel Inspector tool can be found under Developer Tools in the toolbar. Click the Enable Pixel Inspector checkbox, then move your mouse over any editor viewport (level, material, blueprint…) to see the following. If you hit the Esc key, the Pixel Inspector will stop inspecting, which will let you analyze the last inspected pixel.

New: Platform SDK Updates

In every release, we update the engine to support the latest SDK releases from platform partners. This release brings updates to console platforms as well as HTML5 and Android.

  • Xbox One: Upgraded to March 2016 XDK.
  • Playstation 4: Upgraded to PS4 SDK 3.508.031.
  • HTML5: Updated to Emscripten 1.35.0.
  • Android: Updated to NDK 11c. New CodeWorks for Android 1R4 installer replaces previous AndroidWorks 1R1 (located in Engine/Extras/AndroidWorks).

New: Mask Field Variables

Integer properties can now be declared as being a bitmask, and optionally associated with an enum which encapsulates bitflag values. These work in both C++ and Blueprints!

  • Native properties can be marked with "Bitmask" metadata, whereas variables added in the Blueprint editor have a “Bitmask” checkbox.
  • A bitmask variable will have a different "Default Value" interface, letting you check multiple bits (same with the Set node).
  • New nodes to support bitmask operations have been added: "Make Bitmask" and “Bitwise NOT”.

New: TV Safe Zone Debugging

When working on console titles, it is important that UI is not too close to the edges of the TV screen. We have added a simple tool to help ensure this is not the case.

To use, either edit your DefaultEngine.ini and add the following to [SystemSettings] or type them in the command console:

*r.DebugSafeZone.Mode* controls the debug visualization overlay (0..2, default 0)

  • 0: Do not display the safe zone overlay
  • 1: Display the overlay for the title safe zone
  • 2: Display the overlay for the action safe zone

*r.DebugSafeZone.OverlayAlpha* controls how opaque the debug visualization overlay is (0..1, default 0.3)

On platforms that don't natively support safe zones, you can simulate a safe zone for quick/easy testing in the editor:

  • r.DebugSafeZone.TitleRatio controls the title safe zone margins returned in FDisplayMetrics
  • r.DebugActionZone.ActionRatio controls the action safe zone margins returned in FDisplayMetrics
  • These both range from 0..1, and default to 1 indicating 100% of the display is safe. A typical test value would be 0.9

New: Embedded Composite Animations

You can now embed an AnimComposite within another AnimMontage or AnimComposite, allowing you to create your own animation asset in a more flexible way. In the image below, TEST_Montage contains TEST_AnimComposite, which itself contains a number of other animation sequences.

New: Selective LOD for Collision Mesh

You can now choose which LOD of a Static Mesh to use for ‘complex’ (per-poly) collision. This allows you to import or generate a simpler collision representation for a mesh, where using ‘simple’ (convex hull) collision is not appropriate. This can improve behaviour and performance, and greatly reduce memory usage on high-poly meshes.

New: Default Collision for Meshes

Static Mesh Component now supports Default Collision, which means they will use collision settings from the StaticMesh asset. This makes it easier to specify collision information in a central place without having to remember to update each individual instance as you place them in the map. An example might be a sky dome mesh, where you can now disable collision on the asset, and each instance will default to having collision disabled.

You can still override this on per-instance basis if desired by changing the setting on the StaticMeshComponent to something other than Default.

New: Character Movement Speed Hack Protection

Networked games are often the target of users trying to gain unfair advantages through exploits. A common, game-generic exploit uses cheat software to speed up how quickly time passes on the game client. Games made using unmodified character movement functionality were susceptible to this exploit, resulting in cheaters being able to move at increased rates.

We have added configurable time discrepancy detection and resolution (aka speed hack protection) to character movement to help prevent these types of exploits.

Detection works by the server comparing client timestamp deltas against the known server authoritative time delta since the last move was received and keeping a running tally on this difference. When this time discrepancy reaches a configurable threshold we trigger detection and optionally resolution logic - resolution works by overriding future client-reported delta times to server time and having a portion of those move deltas be used for "paying back" the stolen time (the total time discrepancy detected) until the time difference has equalized.

Time discrepancy protection is disabled by default, new configurable options live in the GameNetworkManager - base values can be found in BaseGame.ini and can be overridden in your project-specific game config file.

New: Network Replication Optimizations

We have added a new feature we call adaptive network update frequency that can save CPU cycles that would normally be wasted in redundant attempts to replicate an actor when nothing is really changing. The system will learn how often properties are changing on an actor and dynamically adapt the actor’s network update frequency over time.

Using this new feature can result in massive replication performance improvement!

New: Custom Data in Network Replays

Replays can now store information separate from the normal network stream. We have used this feature to greatly improve the position smoothing in Character Movement Component. Since the position data is stored separately, we can now look ahead in the stream which allows us to time the positions of characters to be at the exact spot they’re supposed to be so that they better line up with effects and other events.

You can take a look at ACharacter::PreReplication to get a feel for how this feature is used. ChangedPropertyTracker.SetExternalData is used to store any data you like for the actor on that frame. Then look at CharacterMovementCompoment.cpp, and notice how we use UDemoNetDriver::GetExternalDataArrayForObject to retrieve this additional information.

New: Dynamic SoundClass Adjustment Overrides for Sound Mixes

UE4 Sound Mixes are a powerful tool for dynamically adjusting sound class properties. However, prior to this release, a major limitation was that the sound mix assets themselves could not dynamically change during gameplay. One way of working around this limitation was to create a large number of sound mixes that only differed in volume adjustments. Then, during gameplay they would push and pop these static sound mixes to couple the game’s sound classes to the game state. This was a complex and error-prone implementation strategy that did not allow for smooth and continuous mapping of game states to sound class adjustments.

With 4.12, sound mixes can now dynamically override their sound class adjustments from Blueprints using a new Blueprint function, "Set Sound Mix Class Override".

The sound class adjustment values inside the sound mix will interpolate to the given values over the specified fade-in time. If the specified sound class doesn’t exist inside the sound mix, the sound class will append to the sound mix and interpolate to the target values from 1.0 (i.e. from un-applied to applied). This feature will enable sound designers to tightly integrate sound-mix volumes to dynamic gameplay events or game state. . For example, it’s now possible to tightly couple the properties of sound classes to any game state: how fast a car is driving, precise locations in a map, actor health-levels, fear-level of a player, etc. With this feature, it’s also possible to write a volume preferences panel for a game in Slate without having to write C++ code to manually override sound class volumes and write to static asset data.

To remove the override, use the new Blueprint function, "Clear Sound Mix Class Override". This will interpolate to what the sound class adjustment values would have been if they had not been overridden. If the sound class was originally not in the sound mix, then the adjustment values will interpolate to 1.0 over the fade-out time, and upon completion, remove themselves from the sound mix.

New: Audio Localization (Preview)

4.12 improves our built-in support for audio localization (via dialogue wave and dialogue voice assets) to the point where you’re now encouraged to try and it out and provide feedback.

  • Spoken text is now gathered from dialogue wave assets and included in your PO files for translation along with your other asset based text.
  • Several new commandlets have been added to facilitate the recording and importing of audio for your dialogue wave assets (these are also integrated into the Localization Dashboard).
  • ExportDialogueScript - Exports a per-culture CSV file containing each line of dialogue and its associated filename.
  • ImportDialogueScript - Imports a copy-edited per-culture CSV file and updates any translations with the recorded dialogue.
  • ImportLocalizedDialogue - Imports per-culture recorded WAV files and generates localized dialogue and sound wave assets.

New: Async Compute on Xbox One

Async compute is now supported for Xbox One. This allows the GPU to use spare resources during drawing to do other work, resulting in faster overall frame times on GPU. This is currently used by the reflection environment and SSAO passes with more coming in future.

New: Landscape Collision Improvements

Landscape now supports Simplified Player Collision. The new Simple Collision Mip Level setting allows you to choose which landscape LOD level to use for simplified collision. The Collision Mip Level value is still used to specify the landscape LOD level to use for detailed collision.

Collision can now be generated for Spline meshes created at runtime.

Release Notes


  • New: Ability System's attributes' v-logging is now controlled by a console variable, g.debug.vlog.AttributeGraph.
  • Note that this also means it can be disabled for the entire project if added to DefaultEngine.ini.
  • New: Added new option to Environment Query system (EQS) to do tests using depth rather than breadth.
  • New: Added a blueprint function to set named parameters for use when running an EQS query from blueprints.
  • New: Added a query count warning threshold to detect and report large numbers of queries being made in EQS.
  • By default this is disabled, but easily enabled through a config file value change to QueryCountWarningThreshold and QueryCountWarningInterval in Game ini files (e.g. BaseGame.ini, DefaultGame.ini, etc.).
  • New: EnvQueryContext_BlueprintBase no longer requires the Querier Actor to be non-NULL. It also now specifies a Querier Object (which is a UObject* and can be NULL). The new Querier Object is available through all of the blueprint-implementable functions on the context which return location(s) or actor(s): Provide Single Actor, Provide Single Location, Provide Actors Set, Provide Locations Set.
  • Bugfix: AI perception system stability and performance improvements.
  • GetHostileActors function no longer retrieves actors already forgotten by AI.
  • Perception stimulus of a expired actors is marked accordingly, but not removed.
  • Bugfix: Fixed a bug in EQS that occasionally reset the scoring equation on query asset load.
  • Bugfix: AI perception system no longer notifies listeners of information from senses they're not registered for.
  • AIController’s SetFocus function will now implicitly clear any location focus at the same priority.
  • EQS tests' "Sweet Spot" feature has been renamed to "Reference Value".
  • EQS’s "Average Instance Response Time" stat now uses milliseconds instead of seconds.

Behavior Tree

  • New: Added support for using service nodes directly on behavior tree tasks.
  • New: Behavior Tree editor will now always display nodes' execution index, rather than child index.
  • Bugfix: Forced stopping of Behavior Tree no longer results in failure if the active task required latent abort mechanics.
  • Bugfix: Behavior tree search does not skip over branch when restart request comes in while task is aborting.
  • Bugfix: Fixed a bug that was preventing "On Value Change" BT decorator observation mode from working as expected.
  • Bugfix: Using undo on decorators or services will not corrupt behavior tree data.
  • Bugfix: Execution index displayed on nodes of behavior tree now update correctly after move or undo operations.

Debugging Tools

  • Bugfix: EQS debugger stores data properly when a subsequent Option is the one that produces the end result.
  • Bugfix: Visual Log now grabs logged element's "snapshot" even if it's not an Actor.
  • General Visual Logger stability improvements.


  • New: Added acceleration-driven path following, controlled by the "Use Acceleration For Paths" flag in movement components.
  • New: Added support for using Tri Mesh Collision as navigation obstacles.
  • New: Navmesh markup for Nav Modifier Component will now combine all relevant shapes of its parent actor instead of creating simple box.
  • Bugfix: Fixed a bug in navigation filters that could result in differences in how navigation areas work in development versus debug builds.
  • Bugfix: Crowd simulation state of agent is now being set correctly.
  • Bugfix: Multiple blocking hits in geometry conforming for NavWalking movement mode will now be handled correctly.
  • Bugfix: Memory leak removed from crowd simulation manager.
  • Bugfix: Navigation export works correctly for destructible meshes without collision.
  • Bugfix: Fixed navigation updates of attachments when actor is being moved in editor world.
  • Bugfix: Navmesh raycasts no longer fail due to 2D checks performed on the last node.
  • Bugfix: Path Following Component block detection no longer results in testing against different a mechanism than requested.
  • Bugfix: Smart navlink initialization on map load works properly.


  • New: Added ability to force-reset states as they are re-entered even if they haven't completely blended out.
  • New: Added "Teleport To Explicit Time" option to Sequence Evaluators. Defaults to true to maintain prior behavior. If true, does NOT advance time, so that notifies are not triggered, root motion is not extracted, etc. If false, will advance time, triggering notifies, extracting root motion if applicable, etc. Note: Using a sync group forces advancing time regardless of what this option is set to.
  • New: Added a new node, Copy Bone Delta, that accumulates or copies the transform of a source bone relative to its original reference position.
  • New: Added a new version of the shader complexity viewmode that also shows quad overdraw cost.
  • New: Added an error message to Persona viewport when additive ref pose animations have a 0 scale.
  • New: Added bone name display to titles of anim dynamics nodes.
  • New: Added duplicate slot option to Montages.
  • New: Added editable fixed bounds for skeletal meshes, exposed getters to blueprints.
  • New: Added flag to Skeletal Mesh Component Initialize to initialize to ref pose instead of ticking the anim instance. This option reduces spawn time for Skeletal Mesh Components.
  • New: Added functionality for driving named parameters from animation data using the bone-driven controller.
  • New: Added "Test Skeleton Curve Names for Use" menu option to Persona to list all curves on all animations that don’t drive a morph target or material parameter. Helps users identify possible candidates for removal to improve performance.
  • New: Added processing to animation blueprint compiler and animation instance to store and double-buffer internal machine state weights on the instance. They can be queried cross-machine without issue.
  • New: Added retargeting for variable-referenced sequences in animation blueprints.
  • New: Allowed curve renaming in Curve Track to work for existing Curve Names. The existing curve will just take the new UID/Name, and preserve everything else. Added a warning when trying to rename a curve to a name already in use in current sequence.
  • New: Animation Retargeting supports scale and root motion.
  • New: Import Material Curves now has a "Set Material Drive Parameter On Custom Attribute" option which can be used to set material parameter flags automatically when importing curves.
  • New: The "Look At" node will now accept a socket as the target.
  • New: Top-level state machines are now reinitialized when they become relevant. This matches the behavior of nested state machines.
  • New: Retargeting a skeleton now copies sockets as well.
  • Bugfix: Fixed an issue with not serializing metadata in the Anim Montage or Anim Composite.
  • Bugfix: Fixed a crash when trying to convert curves to metadata after importing an anim sequence.
  • Bugfix: BlendSpace now merges the weights of identical samples. In addition to being an optimization, this fixes an issue with evaluating marker-based syncs in the same sample with different data.
  • Bugfix: Fixed issue with different materials with same parameter name not working in Animation Curves.
  • Bugfix: The "Linear" alpha blend option now returns a clamped Alpha value. Unclamped values could cause negative transition weights in state machines.
  • Bugfix: Animations now record off-screen correctly when using the RecordAnimation command.
  • ZERO_ANIMWEIGHT_THRESH conditional checks are abstracted out by new IsRelevant and IsFullWeight functions in FAnimWeight.
  • Added compression-related asset registry tags for anim sequences.
  • Added filtering to animation node asset pickers so that the wrong type of animation can not be set on an existing node.
  • Added indicator displayed on animation nodes when they use the "fast path".
  • Added invalid cached curve data test to Skeletal Mesh Component’s Refresh Bone Transforms evaluation logic so invalid cache data will not be used.
  • Anim graphs are now debuggable in the Persona graph editor.
  • Bugfix: Anim blueprint exposed value handlers no longer hold function references to TRASHCLASS.
  • Bugfix: Garbage collection and undo/redo issues with anim instance proxy have been resolved.
  • Bugfix: Fixed values not being copied correctly when layered blend per bone was accessed from a struct in the "fast path".
  • Bugfix: Split pins now working as anim graph node inputs.
  • Bugfix: Fixed a number of animation 'fast path' corner case issues:
  • Bitfield pins are now properly supported.
  • Object pins are now properly supported in cooked games.
  • Bugfix: Fixed a crash that could occur when attempting to paste a state machine node inside the state machine itself.
  • Bugfix: Fixed a number of crashes when editing animation blueprint state machines and issues that could cause state machine subgraphs to erroneously get marked as read-only.
  • Bugfix: Bone transforms are no longer harvested from a pose when the bone isn't valid for the current LOD.
  • Bugfix: Fixed blendspace players only reporting normalized time when using a time getter in an anim graph transition.
  • Bugfix: BP notifies are now displayed in the "Add Notify" context menu when they derive from an abstract base class.
  • Bugfix: Merged skeletal meshes no longer crash when composed ref pose matrices are accessed before the mesh is finalized.
  • Bugfix: Persona animation preview tooltip no longer crashes when switching between blendspaces with different numbers of samples.
  • Bugfix: Custom blend graphs no longer appear inappropriately as read-only after a copy/paste operation.
  • Bugfix: Fixed duplicate slot names in anim slot groups.
  • Bugfix: Incorrect bone transforms are no longer being pushed to the renderer during Set Skeletal Mesh. This presented as motion blur artifacts in the editor.
  • Bugfix: Fixed INF being generated (which turned into NaNs) when bone scales were close to zero.
  • Bugfix: Fixed invalid state for Skeletal meshes having their mobility set to static.
  • Bugfix: "Prev Marker not found in GetMarkerIndicesForPosition" assert no longer triggers during marker sync animation ticking.
  • Bugfix: Animation objects are no longer inappropriately Garbage Collected in game. Also added an optimization to recording curves so that we don't add keys except when finishing record.
  • Bugfix: Cache Bones are properly called from State Machines when needed.
  • Bugfix: Fixed missing scaling curves when exporting an animation to FBX.
  • Bugfix: Notifies are now triggered correctly when the server calls Montage_JumpToSection.
  • Bugfix: Notifies within anim sequences within montages now correctly trigger even if the notify is at time 0.
  • Bugfix: Slave Component's Morphtarget works with Master Pose Component. Slave Components can also override their own Morphtarget.
  • Bugfix: Fixed some pins in older animation blueprints being non-transactional.
  • Bugfix: Fixed uninitialized baked animation object indices so writing out CDO/defaulted versions is deterministic.
  • Bugfix: Modifying bones in Persona that are not part of the currently viewed LOD no longer crashes.
  • Bugfix: Fixed a crash when trying to look up sync group indices by name on child Anim Blueprints.
  • Bugfix: Fixed animation blueprints getting flagged for bytecode-only recompile, which fails to reinitialize the script instance.
  • Bugfix: Fixed a bug in montage segment lookup where we would compare against the segment animation start time and not the segment start time.
  • Bugfix: Get Instance Asset Player Time no longer returns normalized time for blendspace assets.
  • Morphtarget DeltaTangentZ is no longer of type PackedNormal. It is now of type FVector, because values range from -2 to 2.
  • Removed component reregistering logic from Set Skeletal Mesh. This allows Set Skeletal Mesh to preserve the current pose across mesh changes.
  • Set initial position for animation playback to the end of the animation when dragging an animation with a negative play rate into a level.
  • Standalone games now benefit from parallel anim update if possible.


  • New: Added ability to get currently active reverb from blueprints.
  • New: Added ability to set preferred audio device in windows platform project settings.
  • New: Added ability to enable or disable subtitles from blueprints.
  • New: Added ability to set a custom trace channel for audio occlusion trace calls.
  • New: Enabling asynchronous audio occlusion ray tracing by default.
  • New: New console command "AudioMemReport" generates a detailed audio report.
  • New: Previewing sounds in content browser and sound-cue preview are exempt from master volume and always play at full volume
  • Bugfix: Fixed playing anim montage with negative scale in the level viewport.
  • Bugfix: Fix for 2D sounds having attenuation applied.
  • Bugfix: Fix memory reporting issue on PS4
  • Bugfix: Looping sounds no longer stop looping when none of the children are playing a sound. This could happen if a random node had a disconnected pin, for example.
  • Bugfix: Reverb fixed on PS4.
  • Improvements to ogg-vorbis decoding:
  • Reducing CPU hitches due to audio decompression of Ogg-Vorbis by making initial file info parsing asynchronous.
  • Moved real-time asynchronous ogg-vorbis decoding task management to audio device thread, fixes real-time decoding buffer under-runs.
  • Can now play real-time decoded audio through loading screens and other times when main-thread perf hitches.
  • Made multiple improvements to quality-of-life features of the SoundCue editor for DialogueWave assets.
  • No longer duplicating compressed AT9 audio assets on PS4.
  • Updated tooltip for sound concurrency resolution StopLowestPriority so that it indicates that the system will stop the oldest sound if all sounds are the same priority.
  • Updated Oculus Audio SDK to 1.02.


  • New: Added BuildPatchTool to the binary build.
  • New: UAT will automatically look for Build\NoRedist\Keys.txt in the project directory. If it exists, all pak files will be signed using those keys.
  • Bugfix: Fixes for UAT where server staging targets wouldn't have their target directories cleaned properly beforehand, resulting in redundant data being left behind.
  • Bugfix: UAT VersionUpdater utility now won't touch the target file if nothing was actually changed
  • Bugfix: Added UnrealPak location so that MakeFeaturePacks node can run correctly on Mac.


  • New: Added a conversion node that will allow pin connections between related struct types (routing a child struct into a parent struct pin). This also resolves a crash that could occur from direct connections.
  • New: Added a feature where duplicated Blueprint graphs are automatically opened and focused.
  • New: Added a MakeHitResult node.
  • New: Added a new "copy" node, for guarding reference outputs against unwanted modifications.
  • New: Added a warning and new name for copy pasted event nodes, to better communicate that the copy will not be triggered with the original.
  • New: Added collision generation for spline mesh components which are created or updated at runtime.
  • This is not intended for realtime collision changes while a spline moves around like a tentacle, but it should work for spline meshes that are procedurally generated or otherwise created through blueprint.
  • Note: Spline mesh components are "static" by default. To spawn them at runtime you may need to alter their mobility to "movable" in the details panel or the "add component" blueprint node.
  • New: Added a commandlet for rerunning the conversion step for all assets listed in a manifest, syntax is "-run=NativeCodeGen platformname1 platformname2", eg "C:\MyProject\MyProject.uproject -run=NativeCodeGen windowsnoeditor”.
  • New: Added draw time and additional color options to Blueprint "Line Trace” functions.
  • New: Added Is Valid Index node to Blueprint array library.
  • New: Added Make Plane From Point And Normal to the Blueprint math library.
  • New: Added new EulerInterp and DualQuatInterp options to "Lerp (Transform)" node.
  • New: Added nodes to convert formatted strings into Vectors, Rotators, and Floats.
  • New: Added Random Bool With Weight node to generate a random result based on a percent value.
  • New: Added the ability for users to fully expand tree views in the MyBlueprints panel by holding shift while clicking an arrow.
  • New: Step Over and Step Out have been added as key mappings, although no actual inputs have been configured yet. To make use of the new functionality, either review or remap the keys assigned in editor preferences to step in/step over/step out in Editor Preferences/General - Keyboard Shortcuts/Play World.
  • New: Asset name is now displayed in the cook log for blueprint compile errors.
  • New: GUIDs are now used to identify properties created from blueprints. This grants more effective retention of user values.
  • New: Hooked up lots of new icons for component classes.
  • New: Macros can now have local variables of type 'wildcard'.
  • New: Project Settings now includes a new Cooker option for enabling a potentially-faster path for dynamic instancing of Blueprint Actor types with multiple components at runtime.
  • The option is titled "Cook Blueprint Component data for faster instancing at runtime."
  • The option is off by default, but can be turned on to potentially boost performance in a cooked build when Blueprint Class instances (Actors) with several components are dynamically spawned at runtime.
  • New : Added a filter to show only replicated properties of a Blueprint.
  • Bugfix: Fixed editor crash during Blueprint recompilation before Play In Editor.
  • Bugfix: An issue preventing users from using debugging keys in blueprints to step through and debug blueprints has been resolved. Graphs no longer lose focus when stepping through blueprints.
  • Bugfix: Blueprints based on classes other than Actor will now correctly be detected as data only.
  • Bugfix: SpawnActor/ConstructObject nodes correctly update their hovertext when the Class pin is changed.
  • Bugfix: Scale no longer changes while drag-scaling inside the Blueprint editor's preview viewport. This is accomplished by not applying near-zero delta values.
  • Bugfix: Ease node properly handles interpolation between values other than 0 and 1.
  • Bugfix: Editing the default value of a struct variable no longer causes pins to disconnect.
  • Added information to the Blueprints search tool to distinguish between out-of-date and unindexed Blueprints.
  • Corrected inconsistent function names in Blueprint Editor.
  • Bugfix: The PostConstructLink chain is correctly terminated when relinking a Blueprint class.
  • Bugfix: Fixed a Blueprint compiler error that could occur when switching an interface function's output to an input.
  • Bugfix: Fixed a bug that could cause a crash after force-deleting a Blueprint referenced by another.
  • Bugfix: Fixed a bug that could cause a crash when searching Blueprints after switching the Editor language setting.
  • Bugfix: Using local object variables inside a Blueprint function no longer crashes.
  • Bugfix: Custom collision channels will no longer become out of sync with their associated names.
  • Bugfix: Blueprint compiler error no longer occurs when using a SpawnActor node for an actor with a struct member exposed through the node.
  • Bugfix: Fixed a bug that would leave collapsed graph nodes in an invalid state, after undoing the deletion of one.
  • Bugfix: Fixed a bug that would prevent variable references in an interface function from showing up in a Blueprints search.
  • Bugfix: Arrays of TimerHandles will no longer be cleared when trying to remove a single item.
  • Bugfix: Blueprint functions within Blueprints that implement an interface are now searchable.
  • Bugfix: Blueprint nodes added through keyboard shortcuts can now be undone.
  • Bugfix: When Playing in Editor with a dedicated server running in-process, cosmetic function calls will no longer be skipped.
  • Bugfix: Fixed a bug where malformed variables were being created through a pin's "Promote to variable" option.
  • Bugfix: Blueprint function parameters now correctly display their default values.
  • Bugfix: Blueprints modified by a variable node's "Replace variable with..." option are correctly marked as needing compile.
  • Bugfix: The "Set Members in [Struct]" node now correctly handles literal structs referenced by the output pin.
  • Bugfix: Fixed a cook error that could occur when a Blueprint interface wasn't completely loaded before the Blueprint that uses it.
  • Bugfix: Fixed a cook error that could occur when collapsing a split pin with a debug watch on one of the values.
  • Bugfix: Fixed a crash that could occur when adding, selecting, or removing a Blueprint node.
  • Bugfix: Fixed a crash that could occur when applying instance changes to a Blueprint (when the Blueprint contained an array of text elements).
  • Bugfix: Fixed a crash that could occur when changing a Blueprint struct array to use a different struct type.
  • Bugfix: Fixed a hole in cyclic dependency loading, where other Blueprints could be loaded at the wrong time through the text import process (config files, etc.).
  • Bugfix: Blueprint classes now properly inherit "HideCategories" metadata.
  • Bugfix: Blueprints correctly handle promoting their functions while removing an interface.
  • Bugfix: Invoking Redo while transaction buffer is empty no longer causes a crash.
  • Bugfix: Fixed inconsistent transform scale behavior after replacing the root component via drag-and-drop in the Blueprint editor.
  • Bugfix: Searches for Blueprint event references now include places that the event is called.
  • Bugfix: Actor-based Blueprint classes utilizing one or more latent function call nodes (e.g. Delay) in the event graph no longer crash in editor after recompiling.
  • Bugfix: Loading a project with a struct and Blueprint that cyclically depend on each other will no longer cause a crash.
  • Bugfix: Per-instance customizations on an actor made from a blueprint which has severe compile errors will no longer be lost when the blueprint compile errors are resolved.
  • Bugfix: Property edits to inherited components no longer cause a blueprint to be non-data-only
  • Bugfix: The Components tree view will once again update after an undo/redo of a component attachment action in the Blueprint Editor. This was accidentally broken in the previous version.
  • Bugfix: Editor no longer crashes when a component with 'Within' markup is added to a Blueprint.
  • Bugfix: Blueprint Editor will no longer crash when renaming a component to the name of a component that was previously added and then reverted via the undo command.
  • Bugfix: Fixed the root cause of a potential runtime assertion when attempting to dynamically spawn Actor-based Blueprint Class instances with one or more nested default subobjects created through native parent class construction.
  • Removed a misleading load warning (complaining about