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

Andrew Zhilin (zoon), Artem V. Navrotskiy (bozaro), Artyom Sovetnikov, Ben Rog-Wilhelm(zorbathut), Ben Wiklund (bwiklund), Black Phoenix (PheonixBlack), Błażej Szczygieł (zaps166), Brad Grantham (bradgrantham), Brent Scriver (FineRedMist), Cengiz Terzibas (yaakuro), chipgw, Christian Radich (yoyohobo665), Christopher P. Yarger (cpyarger), Clay Chai (chaiyuntian), Cliff Jolly (ExpiredPopsicle), Dave Newson (dave-newson), Derek van Vliet (derekvanvliet), Dorgon Chang (dorgonman), ewirch, Felix Laurie von Massenbach (erbridge), Gabriel Hare (GabrielHare), gatools, Hakki Ozturk (ozturkhakki), HueyPark, JaredTherriault, Jason Spangler (Stormwind99), Javier Osset (Xaklse), Jeff Rous (JeffRous), JohnAlcatraz, Kitatus Studios (KitatusStudios), Konstantin Nosov (gildor2), korypostma, Lee Berger (MrCrowbar), Maarten Scholl (maartenscholl), Marat Radchenko (slonopotamus), marynate, Matthias Huerbe (MatzeOGH), Maxim (maxpestun), Michael Allar (Allar), Michael3DX, MiniTurtle, Moritz Wundke (moritz-wundke), Nako Sung (nakosung), Nari Demura (demuyan), Nastenko Michael (deM-on), Nathan Stocks (CleanCut), Niels Huylebroeck (red15), Pablo Zurita (pzurita), Patrick Flanagan (valtrain), Pedja Ljubomirovic (3dluvr), Philipp Smorygo (fsmorygo), Pierdek, Piotr Bąk (Pierdek), Quadtree, Rajko Stojadinovik (rajkosto), Rama (EverNewJoy), Rem (rveilleux), rlefebvre, Robert Khalikov (nbjk667), Russ Treadwell (trdwll), Salamanderrake, Sebastian Witkowski (witkowski-seb), Sébastien Rombauts (Srombauts), Simon Taylor (simontaylor81), Stephen Whittle (stephenwhittle), szyszq, TK-Master, Tobias Mollstam (mollstam), Tomasz Sterna (smokku), user37337, Victor Xie (FTPiano), Vladimir Ivanov (ArCorvus), Will Stahl (merlin91), yamashi, Zhi Kang Shao (zkshao)

Major Features

Enhanced Support for Mobile Devices

We've been working to greatly improve support for mobile platforms, and this release contains many exciting rendering features to help you create leading-edge mobile titles. New additions include efficient dynamic shadows, movable lights and decals. Expect to see continued improvements to mobile and HTML5 rendering quality in the future. In this release, iOS In-App Purchase functionality has been improved, and we've added Remote Push Notifications and support for CloudKit. For Android, we've added OpenGL ES 3.1, Immersive Mode support, asynchronous audio decompression, and better orientation features. NVIDIA AndroidWorks is now also included to make it easy to get up and running on your device. UE4 now ships with a Flurry analytics plugin for iOS out of the box, too! Many of the new features for mobile devices are also available in your HTML5 games as well.

New: Dynamic Character Shadows for Mobile

Dynamic modulated character shadows from directional lights are now supported on mobile devices!

You can use dynamic modulated shadows even if your scene is statically lit.

To enable this feature, turn on the "Cast Modulated Shadows" option on a directional light!

New: Dynamic Point Lights for Mobile

Dynamic point lights are now supported on mobile devices and HTML5!

These can be used to enhance short-lived visual effects such as explosions, projectiles, particle effects, etc.

Up to four dynamic point lights are supported on each object being illuminated.

Note: Dynamic shadows cast from point lights are not yet supported.

New: Decals on Mobile

Decals are now supported by the mobile renderer!

Translucent, additive and modulated blend modes are supported.

Note: Only unlit decals are supported on mobile and web, currently.

Steam VR (HTC Vive)

Unreal Engine's SteamVR plugin includes many major fixes to make it easier to use, and more performant.

SteamVR improvements include:

Fix for latency issues that appeared in 4.8 Preview 2+

Support for the standard Motion Controller abstraction, so both Vive controllers can route to the same player

C++ projects are now cleanly supported by the plugin API

Various improvements and bug fixes

This revision fixes several major Gear VR rendering bugs and issues present in the 0.5.0 release, as well as some hardware compatibility issues.

New: VR Motion Controller Support

Motion Controllers are now supported through a common abstraction layer in UE4!

This means that motion controller devices will now all be available through a common interface. The HTC Vive controller is currently supported, with more (such as the PlayStation Move) to come soon. Input button presses and triggers can now be routed to a single player from multiple controllers using the Motion Controller key abstraction. Additionally, you can add motion tracking to your project by simply adding a Motion Controller component to your character, which automatically updates anything attached to it to follow the position of your controllers! We recommend that all plugins for motion controllers move over to the new system, so that they can be part of the device-agnostic interface.

New: Experimental DirectX 12 Support

DirectX 12 is now supported as an experimental feature! If you are using Windows 10, try it out by running the engine with "-DX12" on the command line.

Microsoft's engineers added support for DirectX 12 to UE4, and we have worked with them to integrate their changes into 4.9. The feature is still new and is considered experimental. DirectX 12 offers a much lower-level rendering API that is more efficient and allows for rendering commands to be submitted in parallel across many threads, a feature inspired by console rendering APIs. Going forward, we'll continue to improve support for DirectX 12 and look for ways to leverage the new API in upcoming versions of the engine.

New: Full Scene Particle Collision with Mesh Distance Fields

Distance field GPU particle collision allows particles to efficiently collide with the entire scene.

This can be used for sparks colliding with surfaces.

It can also be used for various effects like and snow that accumulates on surfaces,

The Collision module on GPU particle emitters has a new property called 'Collision Mode' where you can specify 'Distance Field.'

In order for a particle to collide we need to have a colliding plane, and this can be extracted very efficiently from the distance field. A single sample of the distance field gives distance to the nearest colliding surface. Computing the gradient of the distance field provides the direction to that surface, and the surface's normal. Putting these together gives the collision plane.

Particle collision using this method is more reliable than the existing Scene Depth collision, which only collides against what's on your screen, restricting it to effects with short lifetimes. However, the global distance field is fairly low resolution so particles will pass through thin objects, and sharp corners are rounded.

As with all distance field features, this requires 'Generate Mesh Distance Fields' to be enabled in the Rendering Project settings. Distance field particle collision is a Shader Model 5 feature, on hardware that doesn't support SM5, the particles will fall back to scene depth collision instead.

Particle collision with distance fields is very efficient - it costs about the same as particle collision with scene depth.

New: Hierarchical LOD Fast Preview and Clustering

Hierarchical Level-of-Detail (HLOD) is a system introduced in 4.8 which allows many objects in your levels to be collapsed down to only a few objects when they are small on screen. This helps you achieve much higher quality levels when viewing objects up close, and faster overall performance for your level. We've made improvements to HLOD in 4.9 and will continue to in future releases.

Fast HLOD Preview

In order to allow for rapid iteration on Hierarchical LOD builds, you can now use the Preview HLOD option. This will create the HLOD Actors with only a visual representation of their bounds and objects without merging and creating the HLODs meshes themselves. Their bounds are rendered according to the Draw Distance setting inside the LOD System settings for the specific Hierarchical LOD Level.

The image above shows both the first and second Hierarchical LOD level clusters popping into view, this gives a clear indication how the level is clustered without having to go through the time-consuming process of merging and creating the Hierarchical LOD meshes. Be aware that this is an initial implementation of the preview system and may tend to change and improve over time.

Custom LOD Clustering (HLOD Volumes)

In order to allow for more granular control over the clustering process for the Hierarchical LODs, you can now place Hierarchical LOD Volumes which will define a cluster for the Actors it encapsulates. Use this to manually define which areas and objects within a level should be clustered together.

New: "Arch Vis" Character Controls

The new "ArchVisCharacter” plugin adds a character class that provides out-of-the-box controls appropriate for architectural visualization applications. It is intended to feel pleasant and natural to control at realistic world scales, and to enable smoother videos and live demos.

You can hook up ArchVisCharacter directly as your Pawn Class, or you can create custom blueprints from it to tweak the movement settings as you see fit.

New: Widget Depth Ordering

Widget Components in screen space now automatically sort based on distance from the viewer, ensuring the closest screen space widget component is always on top of the other components.

We now sort all widget components against one another based on distance to the camera. Previously it was based a manual Z Order, or whoever was added to the viewport first.

New: Area Shadows (for stationary lights)

You're no longer limited to sharp shadows with uniform penumbra sizes. The Lightmass ray-tracer now supports area shadows for stationary lights!

Turn on the "Use Area Shadows for Stationary Light" option to use this feature. The 'Light Source Angle' (or 'Source Radius' for a point light) controls how soft these shadows are.

Performance details:

Uniform penumbra shadows are still better at dealing with low lightmap resolutions, so those stay the default. Previously the uniform penumbra size was controlled with an obscure project setting; now it is controlled by the 'Light Source Angle' property, just like the area shadows are. Double the source angle to get twice as soft shadows, etc.

There's also a new optimization for areas of maps which are only affected by a single stationary light channel (e.g., one Stationary Directional light). Their shadow maps will be packed into a single channel texture instead of a four-channel texture, for 1/4th the memory cost.

New: Ambient Occlusion Material Mask

The new Ambient Occlusion Material Mask feature lets you access Lightmass calculated AO in your material, which can be useful for procedural texturing, for example to add in aging effects and dirt in areas where it would accumulate.

The above screenshot uses an AO mask to blend a dirt layer automatically into corners of the environment.

To use AO mask, you'll need to enable both 'Use Ambient Occlusion' and 'Generate Ambient Occlusion Material Mask' under World Settings -> Lightmass settings, and then build lighting. The other AO controls like Max Occlusion Distance can be useful to tweak the look. (Be sure to set Direct and Indirect Occlusion Fraction to 0, so that this AO will not be applied to the actual level lighting.)

Then, in your material you can access the AO as a 0-1 mask with the PrecomputedAOMask node. This node will provide 1 in occluded areas and 0 elsewhere.

Performance details:

Using the PrecomputedAOMask node is just a standard texture lookup. Enabling the feature adds half a byte per lightmap texel, where the default usage is about 4 bytes per lightmap texel.

AOMaterialMask texture memory can be inspected with the ‘ListTextures' console command.

New: Mesh Distance Field Materials

This feature allows your materials to cheaply determine the distance to the nearst solid from any point in space. There are two new nodes to access the global distance field properties within the material editor.

DistanceToNearestSurface returns signed distance in world space units. Note that the distance will always be near 0 on the surface of an opaque mesh. DistanceToNearestSurface can be used to have effects avoid occluders:

UE4 user Roel Bartstra has already found some interesting uses for this - one to get a soft body look, and another to create flow maps that automatically avoid surfaces.

As with all distance field features, this requires 'Generate Mesh Distance Fields' to be enabled in the Rendering Project settings. Distance field material access is a Shader Model 5 feature. Use a FeatureLevelSwitch material node to provide fallbacks for Shader Model 4 hardware.

New: Improved Distance Field Ambient Occlusion

Sky occlusion gives nice soft shadows around objects lit by the sky, especially important in overcast lighting scenarios, a use case traditionally hard to render at high quality without precomputed lighting. Distance Field Ambient Occlusion solves this for fully dynamic games where both the time of day and environment can change at any time. We've put a lot of effort into improving the quality and performance of the technology for 4.9 and believe that it is now a shippable feature on medium spec PC and PlayStation 4 level hardware with a total GPU cost of under 4ms for a typical game scene!

The previous method did adaptive sampling, so flat surfaces did less work, but this also caused a lot of splotchiness in clean environments.

The AO computations are now fast enough to get rid of the adaptive sampling, so occlusion is much smoother.

The catch is that the new method requires a longer history filter, which can contribute to ghosting, especially when shadow casters are moved. Hopefully this can be improved in the future.

Performance

Distance Field AO has been made much faster such that it can run on medium spec PC and PS4. It also has a much more reliable cost now, so that it's mostly constant, with a slight dependency on object density.

In cases with a static camera and mostly flat surfaces, the new method is 1.6x faster. In complex scenes with foliage and a fast moving camera, the new method is 5.5x faster. The cost of Distance Field AO on PS4 for a full game scene is 3.7ms.

Technical details

The main optimization is the use of a global distance field, which follows the camera around. This is created by compositing all the usual per-object distance fields into a few volume textures centered around the camera, called clipmaps. Only newly visible areas or those affected by a scene modification need to be updated, so the composition doesn't cost much.

Visualization of the texel size of the clipmaps - each clipmap is a different color

The global distance field is lower resolution than the object distance fields, so it can't be used for everything. When computing cone traces for sky occlusion, the object distance fields are sampled near the point being shaded, while the much faster global distance field is sampled further away.

This is a visualization of ray tracing the global distance field vs object distance fields. Surfaces in the global distance field have become blobby and thin objects disappear.

New: Content Browser Advanced Search

The Content Browser now supports advanced search syntax. Unreal Engine 4 is used on many large projects, including some with teams comprising hundreds of developers, and content libraries with hundreds of thousands of assets! These new search features improve the workflow for finding your content on projects of any size.

This augments the existing simple search syntax by providing a way to match key->value pairs from the asset metadata, as well as the following special keys:

Name - Tests against the asset name.

Path - Tests against the asset path.

Class (alias: Type) - Tests against the asset class.

Collection (alias: Tag) - Tests against the names of any collections that contain the asset.

New: Collection Improvements

This release includes many changes to Collections that allow you to help you manage assets in your game such as collection nesting, smart collections and tagging functionality.

Nested Collections

Your collections of assets can now be organized into a hierarchy.

Child collections can be created by choosing the "New…" option from a given collections context menu. Alternatively, collections can be parented via drag-and-drop.

Dynamic Collections

Dynamic collections leverage the power of the Advanced Content Browser Search Syntax to allow you to create and share Content Browser filters.

Anything you can do with the Content Browser text search can be saved as a dynamic collection, including referencing other collections (both static and dynamic).

You can create a dynamic collection using the "Save" button to the right of the Content Browser text filter.

Quick Asset Management

You can now quickly add an asset to many collections at once using the new Quick Asset Management check boxes.

These are available within the collections view itself, or alternatively, via the context menu of any selected asset(s).

Improved Robustness

Collections will now automatically follow any redirectors that they contain, which avoids the issue of an asset seeming to vanish from a collection when it was renamed or moved. Additionally, collections are now considered when fixing up (and ultimately removing) redirectors via the Content Browser.

Improved Status Reporting

Each collection now has a little status indicator at the right hand side of its row item. This changes color depending on the current state of the collection, with each color meaning: Red - The collection is in some kind of bad or read-only state. See the tooltip for how to resolve the issue. Orange - The collection is not up-to-date with the latest version in source control. Blue - The collection has local unsaved changes. This may happen if a save or auto-checkin fails, or if the collection had its redirectors followed. Green - The collection is non-empty and up-to-date. Grey - The collection is empty and up-to-date.



Improved Asset Tooltips

The static collections for a given object are now shown as part of its tooltip in the Content Browser.

New: Plugin Creation Wizard

Its now easy to create new C++ plugins for Unreal Engine 4! Check out or new plugin wizard.

The Plugins browser (accessible from the Window menu) now lets you create a new plugin!

You'll be able to give your new plugin a name and select from a few preset plugin types (Blank, Toolbar, Standalone Window).

This will create all of the initial files you need for your plugin to compile and be loaded into the editor

New: Enhanced Curve Editor

We've made many improvements to the Curve Editor to make it easier to manipulate curve keys and tangents.

Middle mouse now also moves selected keyframes or selected tangents

There's now support for selecting and manipulating multiple tangents

Selection now respects control (toggle) and shift (add to existing selection)

Holding down shift will restrict movement to one axis

Navigation: alt-middle mouse pans the view and alt-right mouse zooms the view

New tangent display options: Always show tangents, show tangents for selected points, never show tangents

New pre-post infinity extrapolation options for curves

Make adding keys more predictable Keys are only added under the mouse when there is only one curve to edit When multiple curves are available clicking on a curve will add a key inline on that curve, and clicking off of the curve will add keys to all curves Changed the text of the menu item to make it clear what's going to happen



New: Multiple Return Nodes in Blueprints

A function can now have multiple return nodes. As soon as execution reaches a return the function's execution is terminated. This can be used to return early from a Blueprint function, or to branch and return differing values.

New: Construct Custom Objects in Blueprints

In Blueprints, you can now spawn baser object types (not just actors/components). The Construct Object From Class node takes a class and creates a new object of that type, similar to Spawn Actor From Class (except for types that are not an actor).

The "Outer" input will serve as the new object's owner, which controls the lifetime of the created object.

For actor classes, you'll still use the Spawn Actor From Class node. And for widgets, you'll use the Create Widget node. In a future release we may try to combine these different features.

New: Blueprint Class Defaults

In Blueprints, it is now possible to access a class's defaults through the new "Get Class Defaults" node. This can be helpful when working with data-only Blueprints, giving you access to those Blueprints' values without having to create an instance.

To keep the output pins from growing too unwieldy, use the node's details to show/hide specific defaults

New: Level Blueprint Communication

Level Blueprints can now be communicated with through interfaces. They can adopt and implement interface functions just as Class Blueprints can. After an interface has been added to a Level Blueprint, calls can be made through interface message nodes (using a streaming level as the target).

Use the "Get Streaming Level" node to get the level to communicate with Since you have to use "Get Streaming Level" to target a specific level, this will only work for sub-levels



New: Optimized Math Expression

We've optimized the Math Expression node so that it is more performant than regular nodes. It is now roughly twice as fast to use a Math Expression node, when compared to a series of operation/function nodes representing the same expression.

New: Blueprint Asset IDs

We've made it possible for Blueprints to load assets on-demand instead of right away. There are two new data types exposed to Blueprints: "Asset ID" and “Class Asset ID”. An Asset ID represents a loaded or unloaded asset, and can be resolved into an object using the “Resolve Asset” node. If the asset was not loaded, then the “Resolve Asset” node returns an invalid object. You can load the asset using the “Load Asset” node. Similarly, a “Class Asset ID” will resolve into a class, and can be loaded with the “Load Asset Class” node.

New: Montage Element Timing Interface

​We've added a new panel to the Montage editor to help you control the order that Montage events will fire when your animations execute at runtime.

New: Non-Linear Animation Blending

We now support many different blending functions between animation poses and transitions!

Previously, only linear or cubic blending was supported. Now you can select from many different blending functions: Linear, Cubic, Hermite Cubic, Sinusoidal, Quadratic, Circular, Exponential and Custom. For most types, you can separately control whether you want easing on either the "in" or the “out” of the curve.

The "Custom" option requires a “Curve Float” asset. After creating one, you can assign it in the details panel for the relevant nodes:

This will allow you to specify just about any blend you want to perform. The length of the curve will be normalized and scaled down to meet the specified blend time and any values that are outside of the range 0-1 are clamped back to fit (this limitation will hopefully be lifted soon, watch this space). If a custom curve is not specified the system will fall back to a linear blend.

New: Bone-driven Animation Controllers

This allows a "Driver" bone to dynamically affect the motion of one or more “Driven” bones. This is great for characters that have accessories attached! You can avoid geometry intersecting during an animation, even when a lot of blending is used.

In the above example, the attached accessory (green) has no authored animations, and is being driven in two axes as a function of the character's thigh bone. This is all calculated at runtime, so a blend of animations ends up working quite well here, even without hand-authored tweaking.

You can either set the "Driver" value directly with a multiplier, remap it into a whole new range, or just use a Curve Asset to drive the motion. Using a curve is usually the best approach as it lets you define the response naturally and interactively tweak points/tangents, seeing the changes in real-time.

Here are the new settings for bone-driven animation controllers:

New: Animation Transition Rules

This release contains improvements to animation blending trees, particularly to how transition rules work.

Better handling of animation Asset Overrides

Nodes like Time Remaining in transition rules now correctly respond to changes in animation length due to overriden animations in Child Animation Blueprints. This means that animations referenced by transition rules no longer have to be the same length in every child Animation Blueprint.

Referencing the most relevant animation player

In order to make state machines more maintainable, you can now use a new class of getter that always picks the highest weighted animation from the source state, rather than targeting a specific animation that might change in the future. The following nodes are now available:

Custom Blend Graph Improvements

Additional information is now exposed in Custom Blend graphs to allow them to be used for more than just a one-shot custom transition animation. The following nodes that provide information about the corresponding transition node and source/destination states are now available in custom blend graphs:

You can also use getter methods that reference the asset players, just like in a transition rule.

New: Animation Curve Evaluation Change

Animation Curve Evaluation used to happen in Update phase of animation, but now it is moved to Evaluate phase. This comes with following benefits.

The curve's weight is properly is evaluated with blended weights. Cache Nodes Additive Nodes: Additive nodes will apply the delta of additive curve data from base to the current pose as animation bone transform does Layered Node: This was a bit more tricky to make it work properly as you don't know which curve is influencing which part of joint. Right now it does provide option of how to blend curves. Max Weight: It choose the max weight of curves from blended poses Normalize by Weight: It sums up all weights of blended poses for all curves and normalize to 1 Blend by Weight: It just sums up (weights * curve value)



​

Curve Evaluation has moved to multi-threading if you're using parallel evaluation

Eventually this will allow us to create a node that can drive curve from bone transform and vice versa

However, if you need a curve that hasn't been evaluated (if you're ticking but not evaluating), you won't get the up-to-date data. Curve data is treated as bone transform now as opposed to treated as notifies before.

New: Animation Asset Metadata Support

We now support metadata that can be added to animation assets. The metadata is a Blueprintable class derived from the Anim Meta Data class. This allows you to add custom metadata to animation assets. Anim Sequence, Anim Montage, Anim Composite, and Blendspace are all supported.

You can query those data from an animation asset in C++ by calling the GetMetaData() method, or by using GetSectionMetaData() on Anim Montages.

New: Sound Quality Levels

A new feature has been added that gives sound designers the ability to manage audio memory usage and (to some extent) performance for lower end machines/devices.

The available Sound Quality Levels are defined in the Audio section of the Project Settings. Each Quality Level can currently specify the maximum number of audio channels created by the audio device (though some platforms, notably Android, can still limit that value a lower number).

In a Sound Cue you can place a Quality Level sound node that will provide an input pin for each Quality Level defined in the Project Settings and only the branch connected to the active Quality Level will be executed. This can be used to reduce the number of variations that are loaded or it could be used to specify reduced fidelity wave files.

When playing a standalone game, the Quality Level is specified via the Game User Settings and only the Sound Waves that are needed for that Quality Level will be loaded in to memory. The default value can be set per game or platform via the appropriate GameUserSettings.ini file and games can allow setting the value via their settings UI. Currently, the game will need to be restarted for the quality changes to take effect.

For Play in Editor you can specify which Quality Level to use via the Level Editor Play Settings. Changing this value will work while the Play session is active and new sounds will use the current Quality Level.

New: Custom Audio Attenuation Curves

You can now define your own custom curve for attenuating sounds rather than simply being limited to the built in algorithms.

In the attenuation settings set the Distance Algorithm to "Custom" and you will see the custom curve section appear. You can then either specify an external curve asset from the content browser or define a custom curve directly in the details panel yourself.

New: Actor Tick Intervals

You can now specify an interval at which a tick function will be executed allowing you to reduce the overhead of per-frame tick execution without the overhead or complexity of timers.

This is exposed to end users via the Actor and Component default properties and for programmers it can be set in C++ similarly to any other Tick Function property.

A few implementation details to be aware of:

All Tick functions execute the first frame they are registered, at which point they will wait the tick interval until their next tick.

Changing the tick interval of an already ticking function will not change when the next scheduled tick will occur. If you wish the change to take effect immediately you should disable the tick, change the interval, and then re-enable the tick.

Tick functions will occur as close as possible to the specified interval by providing a credit for any overrun when scheduling the next tick. For example if a function is specified to occur every 1 second and it has been 1.1 seconds since the last tick at the point the tick function is executed it will be scheduled to occur once another 0.9 seconds have passed. However, no tick function will execute more than once in a frame even if a multiple of its interval has occurred during the frame.

DeltaTime for tick functions remains the same regardless of tick interval. It is not the time since the last time this function ticked, but always the delta time of the frame in question.

An Actor's Custom Time Dilation does not apply to the Tick Interval. The frequency with which the tick is dispatched remains constant regardless of whether the individual Actor has its own Time Dilation, that Time Dilation is only applied to the DeltaTime passed in to the tick function.

New: Actor Encroachment Detection

Encroachment detection is also more robust and works in more situations. We've added new customization options for encroachment, too.

The "Spawn Even If Colliding" option ("bNoCollisionFail" in C++) when spawning an actor has extended to support four methods of handling collision at the spawn point:

Spawn it there anyway.

Spawn at suitable location nearby if possible, else just spawn it there anyway.

Spawn only if a suitable location can be found nearby, else don't spawn.

Just don't spawn it.

Existing Blueprints will update automatically to choose the correct corresponding choice. Some code has been deprecated and will need to be manually updated.

Actor classes have a new blueprint-exposed member called Spawn Collision Handling Method that controls how to resolve spawn collisions by default. This can be overridden by the setting on the Spawn Actor node or function call.

For actors with a Movement Component, it is assumed the updated component is the primary collision shape and will be the only component tested for encroachment. For other actors, all components with appropriate collision settings will now be checked. Be aware this may result in some situations where actors fail to spawn after upgrading -- double check your collision settings, handling method, and spawn transform if this occurs.

New: Post Process Blending

Post process "Blendables" are used to transition post process effects between different states. We've made improvements to this system.

You can now set a blending weight value for each Blendable. This blending weight can be modified at runtime in either Blueprints or C++ code, so you can do some interesting things with post process transitions.

You're also now able to define post process settings "inline" right within the post process volume, or you can opt to create a standalone Blendables asset that you can share between many objects!

Also, we've made it easier to define your own custom blendable settings. You no longer have to modify the engine's built-in PostProcessSettings structure, but instead can define new structures with settings, such as the Light Propagation Volume Blendable settings above.

Finally, here's an example of how you'd use Blueprints to edit the blending weight value for a Blendable at runtime:

New: Runtime Asset Cache

Some games need to support storing local copies of assets that may not have shipped with the game. For example if you have a lot of procedurally created assets, or assets that come from a server (such as advertisement graphics). The new Runtime Asset Cache is a generic asset cache system that can be used to persistently store data generated during runtime in configurable asset buckets.

The Runtime Asset Cache has the following characteristics:

Multiple buckets, separately storing assets of types intended by user, e.g., Character Image cache and Advertisement Image cache.

Each bucket has separately configurable size.

Asset versioning, allowing to rebuild cache entry when it becomes obsolete.

Synchronous and asynchronous cache querying.

When cache grows larger than specified size, oldest entries are removed from it.

New: Volume Decals (Experimental only!)

3D function field rendering is an alternative to polygons for describing geometry. It is better-suited to solving some hard rendering problems such as shadows, Boolean operations, smoothing, ambient occlusion, ray tracing, and deformation. 2D and 3D distance functions are already in use in various places in the engine, like fonts, lightmaps, and distance field shadows/ambient occlusion. The new Volume Decals feature enables a distance function to be rendered as opaque objects into the GBuffer, using all of the information normally available to deferred passes, including ambient occlusion, screen-space reflections, lighting, and depth of field. The bowl in the following image is a Volume Decal.

The object was created (see image below, from left to right)

by defining a sphere with the distance to the decal center and a texture projection

defining a sphere another sphere and taking the maximum of both (boolean intersection)

moving the spheres to adjust the shape

adding another sphere and changing the material (boolean subtraction)

adjusting the shape again

This is how the distance function for the sphere is defined:

The feature is unfinished. Shadow casting, normal map support, and indirect lighting are missing, and performance and quality optimizations have not been made. In addition, the feature will always be costly on the GPU (distance function needs to be evaluated maybe hundreds of times for each pixel). We will polish it further by adding material functions, shadow casting, documentation, etc., but it might never be fast enough for real-time use.

Documentation pages now have skill level, engine version, and category tags which are displayed at the top and bottom of pages that enable you to find other pages with matching tags.

You can now filter the sitemap, which now has\ an expandable tree view, by skill level and/or engine version. When filtered, the tree is expanded to show matching items while non-matching items appear grayed out.

Skill Level, Engine Version, and Tags on pages also now link to the sitemap and automatically filter it. Clicking a tag opens the sitemap filtered to only show pages with that tag.

Links to tutorials (how-to's, quick starts, etc.) display the skill level and engine version of that tutorial:

New: Asynchronous Real-time Audio Decompression

Platforms that support real-time ogg-vorbis based audio decompression (PC, Xbox One, Mac, Android) now perform the decompression asynchronously when possible to avoid blocking operations on the main game thread.

New: Shared Resources for Feature Packs and Templates

We now support shared resources in templates and feature packs. This is achieved by allowing both templates and feature packs to specify other feature packs to include. This means that many assets that were common to all templates now only exist once. It also means that we no longer need to duplicate assets that are shared between the Blueprint and C++ versions of templates.

Multiple target platforms are supported, so different assets can exist in a template or feature pack for mobile and desktop targets. That's useful when you want lower detail models on one platform but not another, for example.

New: Improved HTML5 (Easy Setup, Amazon S3 Support, Networking)

You no longer need to install any third party SDKs to start development with HTML5 and package your game for a web browser! To package, simply select HTML5 in the File -> Package menu.

Other improvements include:

Emitting compressed javascript which reduce the size of the builds drastically.

A small web server is included with the game during packaging which can handle serving compressed files for local testing.

HTML5 Networking is now supported! There is now a Unreal Build Tool configuration variable which can be used to create dedicated servers that support HTML5 clients.

We now support uploading to Amazon S3 during packaging. Once the credentials for AWS are filled in, the build will be uploaded to S3 and the game can be served to browser directly from S3.

Release Notes

AI

New: A dedicated AI asset category has been created and is available in Content Browser's context menu.

New: Added log errors when EQS (Environmental Querying System) queries take longer than 0.25 seconds (cumulatively). When the query completes we also log how long each test took to perform.

New: Added support for trace based projection in EQS generators.

New: Added Z offset for circle center(s) in the On Circle EQS generator that uses data bindings.

New: AI Controller's Path Following Component has been exposed to blueprint and can be tweaked via blueprint-created classes' default properties.

New: Blackboard assets have been made blueprint types to allow blueprint users to interact with them.

New: Exposed filtering and scoring options for multiple contexts of EQS query.

Fixed "Skip Item" in EQS not always showing results in debug view.

Fixed "Skip Item" acting like "Pass" and in some cases like "Fail" when handling filtering.

Fixed crash when unregistering the Pawn Actions Component when the Controlled Pawn is pending kill pending.

Fixed AI stimuli never expiring which resulted in AI never forgetting perceived actors.

Fixed crash in pathfinding batch EQS test.

Fixed crash on running a EQS query without valid options.

Fixed EQS pathing grid generator getting stuck on points inside geometry.

Fixed restoring EQS query asset with multiple options.

Fixed crash when doing a pathfinding batch EQS Query Test when test items are not considered valid.

Fixed "On Circle" EQS generator crashing if its query owner is not an actor.

Blueprint compilation and loading are much more efficient.

Behavior Tree

New: Added dynamic subtree injection support for behavior trees.

New: Added new restart mode for behavior tree tasks, they can now ignore restart which leads back into running the same task again. Use case depends on task type and its parameters: some of them work better with restarting every time (e.g. movement), some should finish their action (e.g. animation).

Blueprint based behavior tree tasks will now ignore Finish Execute and Finish Abort calls depending on state of task, fixed latent blueprint actions not being cleared when task finishes execution.

Fixed behavior tree decorators losing blackboard observers.

Fixed behavior tree restarts from blackboard decorator in On Value Change mode.

Fixed Behavior Tree tag cooldown decorator testing the current value of the tag cooldown end time against its duration. (Duration in the Tag Cooldown decorator should only be applied when we deactivate, not used for comparison.)

Fixed behavior tree's search update for branch with loop decorator.

Fixed bug with aux nodes losing all changes in memory block during discarded search.

Fixed crash on pasting composite decorator node in behavior tree editor.

Fixed drag & drop operation for composite decorators.

Fixed duplicated subnodes in behavior tree editor.

Fixed order of behavior tree nodes when creating a new node from existing pin.

Fixed rare crash on aborting behavior tree task connected to parallel node.

Fixed Rotate to Face task getting stuck on receiving abort event.

Replaced Has Reached Goal decorator with Is At Location.

New: Added "-LogNavOctree" command line parameter, to log Nav Octree debug geometry to visual logger, on stop logging.

New: Added new shapes to log with Visual Logger: mesh, convex polygon, navarea / pulled convex and Nav Octree dump from given bounding box.

New: Minor improvements to gameplay debugger. Added multiple logs selection to Visual Logger tool, to analyze all selected objects simultaneously. Added debug camera to gameplay debugger, to have a way to fly around (Tab key to switch between cameras). Added alternate keyboard bindings to gameplay debugger, for keyboards without numpad (can be enabled in gameplay debugger settings). It uses Alt + [regular number] shortcuts.

Added more data about EQS queries to vlogs.

EQS score for the winning item will no longer be set to 1 when picking a single item. That way, scores can be compared appropriately since none of the other scores have been normalized. They will all be on the same relative scale.

Fixes Gameplay Debugger's client server issues. Everything should replicate to clients correctly again.

Tweaked description width for EQS debug display from 200 to 312 to allow for slightly longer descriptions without overlapping the next column. Item Description Width, Item Score Width, and Test Score Width can now be tweaked in code (they are now variables rather than in-line values).

Navigation

New: Added a dedicated blueprint-bindable event to AI Perception Component that's being triggered for every newly sensed stimulus.

New: Added bUseNavAgentGoalLocation to pathfinding Reached tests for moving to Actors. (Sometimes it is useful to move towards / test against the actual actor's location, rather than its location projected into the navigation system.)

New: Added custom navigation export for skeletal meshes.

New: Added navigation agent selectors to navmesh bounds volume, defining zones per agent.

New: Added navigation updates for destructible mesh.

New: Added new option to navigation link, which allows connecting to cheapest area in snap radius.

A bug in editor-time navigation system, resulting in removing all the saved data in static navmesh on map load, has been fixed.

Abstract navigation data actor will no longer be visible in scene outliner.

Added timeout for path following's waiting state.

Fixed a bug in navigation system preventing collision-less shape components from affecting navmesh generation by other means (like nav areas).

Fixed bounds of "standalone" nav relevant components (without navigation parent), which caused them to be ignored during navmesh generation.

Fixed crash in crowd movement when AI is using direct path to location.

Fixed crowd simulation updates for moving without pathfinding.

Fixed Floating Pawn Movement component's issue resulting in teleporting AI following a path, ignoring Max Speed limits.

Fixed geometry projection for navmesh walking mode using cached location even if pawn moved far away on Z axis.

Fixed handling of custom navigation links loaded with map before navigation system is created.

Fixed issue with navigation system being stuck on Initial Lock in editor mode.

Fixed missing abstract navigation data (handling direct paths) in game.

Fixed missing navigation links with big snap height.

Fixed navigable collision export from convex elements of Body Setup not using element's local transform.

Fixed navigation relevancy and update order of custom navigation links in Nav Link Proxy actor.

Fixed Navigation System not handling properly deep Actor hierarchies. Now you can have Actors attached to Actors attached to Actors and all of them will affect navmesh generation just as expected!

Fixed updating Nav Relevant Components attached to an actor without collision component.

Navmesh's rendering component has been made transient and we made sure any navigation rendering component saved with old maps won't break anything.

Updated deprecation messages for Navigation System's "get random point" functions family to be more precise.

Animation

New: "Observe Bone" nodes for debugging animations.

These let you print out the current position of a bone (at that particular point in the animation tree) and have a couple of options for coordinate space and whether to display relative to the reference pose.

The observe bone nodes are meant for debugging. They don't cost much but are not currently compiled out of a shipping build, so you should probably remove them when you are done working with the graph.

New: Added turntable feature for Persona.

New: Added a "Remove this LOD" button to each LOD (after 0) in Persona's mesh mode.

New: Added an icon overlay to the 3D thumbnail for Animation Blueprint assets in the Content Browser.

New: Added 'Blend Out Trigger Time' to AnimMontages. Time from Sequence End to trigger blend out. <0 means using Blend Out Time, so Blend Out finishes as Montage ends. >=0 means using "Sequence End - Blend Out Trigger Time" to trigger blend out. Also added as an optional parameter to Play Slot Animation As Dynamic Montage.

New: Added compilation warnings to the Modify Bone skeletal control when it will do nothing (e.g., when all components are set to be ignored or no bone is selected).

New: Added event for Post Evaluation. This gets triggered after bone evaluation is done. If your mesh component has physics, it will trigger after bone is blended back to it.

New: Optimized animation evaluation by looping over the bones directly instead of indirectly.

New: Added flag to notifies to stop them triggering on dedicated servers.

New: Added friendly display names to Bone Modification Mode enumerants.

New: Added new node "Bind Cloth To Master Pose Component" that makes cloth on a slaved skeletal mesh component to reuse the simulation data from the master component, rather than processing the cloth separately.

New: Added new node "Is Section Using Cloth" to query whether a skeletal mesh section has cloth data.

New: Added reference pose toggle toolbar. Also now you can edit during reference pose.

New: Added sorting of Smart Name curves.

New: Added support for Montage-to-Montage synchronization. A montage can only have a single leader. A leader can have multiple followers. Synchronization is performed once before any of the leader or followers are updated in a given frame. Essentially, synchronization is performed one frame late, so tick order between montages is not an issue.

New: Allowed skeletal controls to specify the coordinate space that they would prefer the gizmo to be displayed in by implementing GetWidgetCoordinateSystem.

New: First pass of the dependency preloading system. Uses asset information created during cooking to determine the dependencies for all packages and make them load BEFORE the requested package. When using pak files, the pak file will be ordered to match this load order, giving much reduced seek times. Currently disabled by default, but can be enabled with "s.PreloadPackageDependencies 1" in the console.

New: Look At Control now supports look axis in local space.

New: Started moving animation nodes out of Engine into a new AnimGraphRuntime module.

New: Support Append Frames in the begin/end of the AnimSequence. Also fixed to rearrange notifies and curve keys.

New: Wrapped re-entrancy checks during AnimationBlueprint node Update/Evaluate in DO_CHECK tests so that they are compiled out in shipping builds.

Animation and joint name now supports UTF-8 when importing.

Animation Record gives default path and available name.

Changed MasterPoseComponent serialization so that you can use it in a construction script.

Changed animation stat names to reflect whether they are running on the main game thread or a worker thread.

Changed new NativeNotify menu to display the localized class name.

Fix for crash in BlendSpaces when referenced AnimSequences have been deleted.

Fixed a bug where the latent action manager wasn't correctly removing actions.

Fixed a crash due to incorrect current time when switching a sequence player node's animation to one that is shorter than the current one.

Fixed a crash when compiling a malformed Animation Blueprint (containing a missing node caused by deleted code or a disabled plugin) and added a graph validation pass prior to compilation.

Fixed adding an extra frame when importing animations.

Fixed an issue where the message log was not displayed/refreshed when using the "click to recompile AnimBP" prompt rather than the Compile button.

Fixed client/server disagreements when playing root motion animations. When a Montage ends, some left over root motion could stick around and be used the next time around, potentially creating positional differences between client and server. If sending a DualServerMove when root motion starts, server can update root motion for a move that didn't use root motion on the client yet.

Fixed crash during animation blueprint compilation due to incorrect parent class being accessed during skeleton recompile.

Fixed crash during skeleton class recompile when structurally changing some animation blueprints.

Fixed crash in blend node with when evaluating a LOD'd skeleton (bones were stripped out.)

Fixed crash when enabling Show Uncompressed Bones.

Fixed crash when pausing the game and using "Tick when paused" on a SkeletalMeshComponent.

Fixed crash when you mix additive and non additive animations within montage.

Fixed crashes relating to animation notifies that had invalid slot indices when linked in montages.

Fixed divide by zero when importing zero-length animations. (Contributed by rajkosto, pull request 1148.)

Fixed incorrect state machine weights when using a custom blend on a transition.

Fixed montage linkable elements sometimes losing segment links when external animations had changed.

Fixed non-human-controlled characters moving much more than they should while running root motion on dedicated servers with AnimUpdateRateOptimizations and RootMotionFromMontages ON.

Fixed 'phantom' warnings that could show up the first time an Animation Blueprint was opened in an editor session but would go away when you recompiled interactively.

Fixed reimporting breaking RetargetBasePose.

Fixed variable initialization order bug that caused evaluation skipping on SkeletalMeshComponents to not function properly.

If you import a mesh that adds bones to a skeleton, but don't save the skeleton, it could cause a crash. Added the ability to recover these bones in the editor.

Minor style fixes for padding/fonts of bone references and the alpha scale/bias of a skeletal control.

Removed WITH_EDITOR define around GetActiveSocketList in QuerySupportedSockets so behaviour of QuerySupportedSockets is consistent between editor and non editor builds.

Reworked animation track segment looping logic to reduce floating point error problems.

When Skeleton detects inconsistent hierarchy, it will try fix up. You're going to notice merge bone effort with error message. When this message comes up, please resave skeleton.

While piloting an object, 'move to' object button functionality works properly.

Audio

New: Added ability to set the volume headroom per platform with a new Engine.ini field.

New: Improved Gameplay Statics sound API: New Spawn at Location functions return an Audio Component that allows manipulation of the played sound similar to the Attached version. Play at Location still does not return the audio component and should be used for one-shot sounds. Rotation parameter added to API calls that specify location or attachment. This causes non-spherical attenuation shapes to face the intended direction. Play Attached renamed to Spawn Attached. Sound and Dialogue APIs are now consistent.

Fixed volume differences on the Mac platform due to splitting and merging audio streams when using reverb, EQ, or radio effects. Added low-pass filter for voice audio units to closer match PC audio.

Fixed to use proper linear-to-dB volume equation on the Android platform.

Fixed a Core Audio API crash for Mac when the number of active sounds exceeded the number of available audio units.

Automation

New: Basic lighting tests have been separated from the 'General Editor Test'. They are now: "System.Promotion.Editor.Lighting.Place Scale Rotate", "System.Promotion.Editor.Lighting.Modify Properties", and "System.Promotion.Editor.Lighting.Duplicate and Copy Paste".

New: GenerateProjectFiles.bat will now exit with a non-zero exit code (1) when any failure happens.

New: Material Editor promotion tests are now contained in the MaterialEditor module. Fully exported UMaterialGraph.

New: Particle system promotion tests are now contained in the Cascade module.

New: The geometry automation tests have been separated from the 'General Editor Tests' automation test. It is now: "System.Promotion.Editor.Geometry Validation".

New: UAT and UBT will no longer wait for the global mutex, and will fail immediately instead. Previously, each instance would wait in line serially, hiding the fact that the command was not actually running.

Fixed UAT base path being invalid if the UE4 workspace is mounted directly onto a drive letter (e.g. C:\Engine, D:\Engine, etc.).

Blueprints

New: Added Blueprint-exposed GetBoundingBox function to StaticMesh.

New: Added Equals and NearlyEquals functions for Transforms to Blueprint math library.

New: Added TimeSecondsToString function to convert float seconds to formatted string.

New: Added a node icon to identify editor-only properties referenced in Blueprint script. Properties like a Character's arrow component, or a TargetPoint's sprite. Fixed crashes that would occur from referencing these properties in cooked builds (replaced with a logged exception instead).

New: Added editor .ini config settings that can be used to hide specific Blueprint menu entries. Use the "[BlueprintEditor.Menu]" section header to add exclusions under in the .ini file. In the .ini file, specific fields can be hidden like so: +BlueprintHiddenFields="/Script/Engine.Actor:GetTransform". In the .ini file, specific nodes can be hidden like so: +BlueprintHiddenNodes="/Script/BlueprintGraph.K2Node_IfThenElse".

New: Added Get Map Range Value Unclamped and renamed Get Mapped Range Value to Get Mapped Range Value Clamped.

New: Added Invert Transform blueprint node.

New: Added support for expressing a per-parameter Display Name using the markup UPARAM(DisplayName="Something neat") before the parameter declaration. This allows renaming parameters without using a K2ParamRedirect, and the use of names that are not legal C++ identifiers. e.g. static void DoSomethingAwesome(UPARAM(DisplayName="Awesome Param") float BoringParam);

New: Added the ability to filter out library functions and macros from the Blueprint context menu.

New: Added various improvements related to Select node. The node doesn't return a copy of input parameter, it returns a reference to the input.

New: An "InternalUseParam" meta tag for UFUNCTION has been added to support hiding function parameters from Blueprints. The pin for that parameter will be hidden and not connectable.

New: Blueprint Timer API improvements. Set Timer By Delegate now returns a Timer Handle to be used when interacting with the timer via other functions. Interacting with timers by handle is significantly more performant and enables the same timer delegate to be used for multiple timers simultaneously. Set Timer By Name, and all timer manipulation functions, by name and delegate have been deprecated.

New: Blueprint Timeline UI updates: Made individual tracks collapsable. Added an option to turn off the view synchronization for an individual track. General padding and layout tweaks.

New: Game/URL Options parsing nodes are now exposed to blueprints.

New: Can change a variable's type in the My Blueprint window by clicking on its type icon, or right-clicking to toggle whether or not it's an array.

New: Can drag and drop custom events from the My Blueprint window to add a call function for the event.

New: Can promote pins to local variables in Blueprint function graphs (or their child graphs).

New: Can set the Advanced Display flag on Blueprint member variables.

New: Made the boolean pin in Blueprints less subtle.

New: Fixed a crash that could occur with data-only Blueprints that explicitly called their parent's construction script.

New: Fixed error about missing World Context pin in blueprint library.

New: CreateEvent nodes are now more user friendly - they will use the current blueprint as the default context and no longer suggest that the user select an asset for context.

New: Improved details panel for nodes: Make, Break and Set Member. Properties are grouped in categories. Improvements for PostProcessSettings.

New: Improved the logic for when to reuse an existing graph tab versus open a new one. All subgraphs will now open in the parent when double-clicking on a node in a graph. Holding down Shift while clicking on an item in the My Blueprint tree or in the graph will force the creation of a new tab regardless of what is already opened.

New: Node "Set member in .." has an output pin for the post-modified struct.

New: Object Reference, Class Reference, Asset ID, Asset Class ID pin types have been spun off into a sub-menu on the item to reduce duplication of these items in the listview.

New: The output pin subtype for a GetClass function call node is now linked to the input pin's subtype.

New: Added support for multi-line editing to blueprint comment nodes. To enter a newline in the comment title use shift + enter.

New: Exposed NOR and NAND node support to blueprints. The nodes can be found in the math/Boolean section in the blueprint action menus.

"Color" name is not longer restricted.

Added "magnitude" keyword to vector length functions.

Adding or removing members from an editor created structure will no longer cause 'inappropriate outermost' warnings when blueprints that use that structure are saved without recompiling.

Adding pins to a MakeArray node will give the new pin a default values.

After context fail (Access None error) return data are properly cleared.

Attaching a bool to the "Select" nodes index pin will force the node to update it's pin names even when there are only two options.

Axis mapping value getters can no longer be called from other blueprints.

Blueprint Diff Tool no longer has buttons to switch between the components, graph, and defaults views. Navigation is now done via the list of differences.

Blueprint Editor context menu filtering is much more efficient.

Blueprint member variables of type component that are not generated by SCS now have the details options normally available to exposed variables.

Breakpoint is triggered on Access None error.

C++ Functions that are tagged as BlueprintImplementableEvent and are overridden as a function graph in Blueprints will display an error when attempting to drag and drop into the graph to inform the user that the function is not Blueprint Callable.

Call Function nodes will no longer change the function reference when duplicating the node or duplicating the entire Blueprint.

Can no longer split pins on Blueprint nodes if the struct does not have any valid properties.

Can now Make and Break the DateTime struct in Blueprints.

Can right click in collapsed graphs to add local variables that are part of the outer function graph.

Can right click on any node to search for references of it. Does initial search only in current Blueprint.

Can use unicode characters in Math Expression nodes. All unicode "letters" are now allowed for variable/input/output names. This does not extend to symbols and only the underscore symbol is still allowed.

Cannot name Timeline tracks the same as any of the native pins on the node. Any nodes previously broken by this functionality should work again.

Changing a pin type on a Select node will recombine all sub pins on the option and result pins before setting the new pin type.

Changing the Class of a "Spawn Actor from Class" node will no longer disconnect the result pin's links if they are still valid.

Child components in a Blueprint Class asset attached to a default scene root will no longer be lost after reparenting to a Blueprint Class that also has a default scene root.

Connecting function result node array pins to a reroute node will no longer prevent the node from compiling with all its output parameters.

Copying and pasting a K2Node_CallFunction with an interface pin for the self pin will no longer change the self pin into a normal Object Reference pin.

Deleting a custom event when there are no other events in the Blueprint will no longer disallow you to name other items placed in the Blueprint the same as the deleted custom event.

Drag and dropping a component from the SCS editor to a graph will no longer incorrectly report that the graph is outside of scope when it is a part of the same Blueprint.

Dragging and dropping variables from the My Blueprint tab will no longer default to assuming that the variable is read-only.

Duplicating function or macro graphs that contain nodes with Text pins will no longer incorrectly link the original and duplicated pins so that changes in one appear to affect the other.

Duplicating the "Add Scene Component" node while the transform pin is split will no longer make visible the transform pin on the duplicated node.

Editing a blueprint that is instanced in a hidden sub level no longer resets transforms on the hidden instances.

Ensure 'bExchangedRoles' is not set after serialization of an Actor-based Blueprint Class asset.

Examining the value of an enum array pin will show the enum value's display name.

Fixed a crash when compiling a Blueprint while intermediate graphs are open.

Fixed a crash while compiling a Blueprint with a validated Get node that is missing a property.

Fixed a crash when compiling a Blueprint while Find-in-Blueprints is searching all Blueprints.

Fixed a crash when vectors are compared in Math Expression using operator!=.

Fixed a potential crash during component registration when constructing instances of a Blueprint Class.

Fixed a potential crash on load during component template serialization for older Blueprint Class assets.

Fixed a potential crash when copying an array of USTRUCTs from one Actor instance to another.

Fixed an issue where deleting the scene root component in the Blueprint editor could lead to incorrect state of instances of the Blueprint class post-reconstruction.

Fixed crash executing cast to a class that is not loaded (presumably due to referencing a class in an unloaded module).

Fixed crash on reload of maps saved with constructed component instances that match archetypes by name but no longer by type.

Fixed a crash that would occur when editing an instanced variable nested within another instanced variable.

Fixed propagation of material swaps when editing "native" component templates (i.e. inherited from the C++ class) in the Blueprint Class editor.

Fixed socket browsing in the Blueprint editor for inherited component templates.

Fixed stale components persisting in a Blueprint Class asset after changing a native parent class's inheritance hierarchy.

Fixed vector axis input event nodes displaying a float output pin instead of a vector pin.

Fixed a bug that prevented new components from having the same name as a deleted one (prior to a compile).

Fixed a bug that was preventing copy, duplicate, and rename hotkeys from working in the Blueprint viewport.

Fixed a bug where certain keywords for Blueprint menu items were being ignored.

Fixed a bug where dirty Blueprints were not being compiled before you selected "Launch".

Fixed a bug where static functions were being hidden from Blueprints with Hide Categories metadata.

Fixed a bug with cyclic parent/child dependencies, where inherited components could be trashed when compiled.

Fixed a bug with parent/child cyclic dependencies, where the child's overridden property values would be cleared on load.

Fixed a crash after renaming local variables when other functions have local variables of the same name.

Fixed a crash that could occur when passing a default Blueprint Session Result object to the "Join Session" Blueprint node. Instead of crashing, the join will fail an execution will continue from the "On Failure" pin, as normal.

Fixed a crash that could occur when undoing, after compiling an Actor Blueprint with components.

Fixed a crash that would occur in specific cyclic dependency cases involving an Actor and Actor Component Blueprints.

Fixed a crash that would occur when hovering over the "Edit Blueprint" button, for Blueprint instances that had components added in their construction script.

Fixed a crash that would occur when loading a Blueprint that depended on a plugin that was disabled.

Fixed a crash that would occur when removing an event/function param in a Blueprint that was associated with the set GameMode.

Fixed a crash that would occur when removing a pin that had a debug watch applied to it.

Fixed a crash when deleting a map while it's level Blueprint was opened.

Fixed a crash when restarting level after streaming sublevels in.

Fixed a cyclical dependency bug involving macro libraries, where Blueprints could load with a false error.

Fixed a potential failure to restore component instance data during reconstruction of an Actor-based Blueprint Class instance.

Fixed an issue where it would appear that the Increment/Decrement macros would occur twice when using the output pin from the macro.

Fixed an issue where some component property values on a Blueprint class instance in the current scene could be reset as a result of recompiling the Blueprint class.

Fixed crash when Local Variable of array type is compiled.

Fixed crash when making changes with multiple components selected in the blueprint editor.

Fixed crash when selecting for "None" class type on the Spawn Actor From Class node after having already selected another class.

Fixed crash when struct value is copied from invalid object using Set node.

Fixed crash, when two empty User Defined Enums have the same name.

Fixed decrement int macro node to actually decrement.

Fixed duplication of components within the component tree in the Blueprint editor.

Fixed editing of Instanced Static Mesh Component and Hierarchical Instanced Static Mesh Component.

Fixed exposed APEX cloth functions not appearing in blueprint editors.

Fixed incorrect tooltips between "Convert to validated Get" and "Convert to pure Get" options on Get variable nodes.

Fixed issues that could occur if an existing Blueprint class default object or instance contained one or more invalid property values for native (C++-defined) component subobjects on load.

Fixed issues with graph node bubbles rendering incorrectly when there is nothing in the top slot

Fixed issues with hiding categories in Blueprints not always hiding all the expected nodes.

Fixed issues with node titles being out of date (e.g., animation skeletal controls) by forcing node titles to be updated when a property on a graph node is modified

Fixed issues with Target pins being invalid after reparenting a blueprint.

Fixed rare crash in the Blueprint diff tool that occurred when user dragged certain UI elements.

Fixed the cause of a 'Critical Failure' that could occur when replacing references to one blueprint with references to a different blueprint.

Fixed crash with Find-in-Blueprints, fallout from changes to FString.

Hidden pins generated from native functions will correctly use their default values.

Improved the Pin Type Selector filter so order of words and case sensitivity does not matter.

In the pin type selector dropdown, hitting the shift key will no longer move the cursor back to the start of the search box and hitting the down and up arrow keys will again navigate the list view.

Input action and key events will no longer be placeable in Blueprint functions.

Input Touch event node cannot be placed in function or macro graphs.

Local variables in Blueprint functions will now be set to the default values of the user defined struct their type represents.

Math expression functions without any parameters will still provide their end parenthesis in the Math Expression node.

Math Expression nodes will again correctly lookup by the display name of a function.

Math Expression nodes will no longer always appear as changed when doing a diff on a Blueprint. Improved diffing support to see how the expression has changed between revisions.

MathExpression nodes will not count function inputs as valid variables to access via getter nodes.

More strict restrictions related to WeakObjectPtr exposed to blueprint. No arrays of WeakObjectPtr.

On Blueprint enum pins, tooltips will appear when hovering over items in the drop down menu.

On the select node, setting the Index pin's type will always change the pin names of the option pins to "False" and "True".

Exposed FMath::FixedTurn to Blueprints. (Contributed by MatzeOGH, pull request 1254.)

Preventing in UK2Node::AutowireNode hidden pins from being auto-connected to passed in Wildcard pins. This prevents issues with wildcards connecting to the "self" pin of functions when dragging off them.

Proper error is generated when incompatible Blueprint pins are connected.

Recompiling a Blueprint with a Component parent class now correctly re-registers any instances of the blueprinted component in the level. Previously existing instances could disappear.

Removed a check that was asserting when compiling a Blueprint with invalid Call Function or Call Parent Function nodes.

Renaming a component and then adding a new component of the same type in the Blueprint editor will no longer result in broken defaults editing.

Select nodes using enums with hidden values will no longer incorrectly match up the Option pin connections to the improper enum value.

Selecting a pin type for a Select node will not fail the first time.

Setting default values of Text properties in the User Defined Struct or for Local Variable properties in Blueprints will correctly assign the value and preserve the value between instances of the editor.

Splitting pins on the Function Result node will no longer attempt to compile the split pins as result pins.

The "Get" pin(s) on "Set" variable nodes will now display the name of the pin if the pin has been generated by splitting a struct pin.

The details view in Blueprints of non-member variables (either from a parent class or an external member reference) will no longer show various detail uneditable options as editable.

The eye icon appears now for marking a user created component variable as editable in the My Blueprints window.

Tooltips will display for sub-menu items in the Pin Type Selector.

Tweaked the tooltip for "Expand Nodes" menu option to better describe what the action will do.

When dragging off a pin in a function graph, local variable nodes will no longer be filtered out of the context menu for placement if they are valid for connection.

When indexing all Blueprints, hitting "No" will correctly skip checking out all un-indexed Blueprints.

When loading a blueprint pin types that don't match are no longer disconnected, instead we rely on compile errors to prevent the potentially broken blueprint from executing bad code.

When signature of a function is updated, its instances in the Event Graph are properly updated.

Core

New: A plugin with the same name but of different versions can be placed in multiple game projects. This allows studios with multiple projects to utilize the same plugin at different revisions as long as the plugin is part of the game project.

New: Added module path caching to improve editor startup times.

New: Added pre-allocated memory pool which is freed when the system runs out of memory to properly handle such crashes.

New: Added 'stat slow' console command. Displays the game and render thread stats. Can take two optional parameters -ms=x -depth=n that specify the minimum stat duration and the displayed hierarchy depth respectively.

New: Added the ability to force garbage collection when worker threads are inside of garbage collection lock. In this case main thread will be blocked and wait until lock is over. This can be configured in Project Settings under Garbage Collection section.

New: Added two new parameters to AutomationTool's BuildCookRun command: IgnoreCookErrors - Ignores all cook errors and continues with deploying the project. FastCook - Passes fast cook parameter to the cooker, which is handled on a per-project basis.

New: Changed the file reader to use async I/O for a 1.6x+ speedup reading files on Windows based platforms.

New: CMake project generator now works on Mac and Windows. Pass -cmakefile to GenerateProjectFiles and use CLion or other IDEs to build UE4.

New: DirectoryWatcher can now optionally ignore changes in subdirectories (works on Windows and Linux; Mac implementation ignores this flag).

New: Exposed garbage collection settings to Project Settings under Garbage Collection category.

New: Exposed Streaming settings to Project Settings under Streaming section.

New: Improved missing import message to include the source asset name.

New: Improved the clean command in Unreal Build Tool. It will now properly clean up modules no longer referenced by the project.

New: Made zlib to also use standard Unreal memory allocators, which makes it easier to track them.

New: Memory stats will now also be reported when the engine crashes.

New: More verbose log message when the engine crashes because of a corrupted file.

New: Optimized transaction processing, saving unnecessary iteration when performing an ObjectRecord preload.

New: Improvement in garbage collection performance by implementing three micro-optimizations. (Contributed by pzurita, pull request 1348.)

New: Slightly optimized object loading by looking up the object in memory before flushing async loading.

New: Small optimizations for structure serialization: Added native serialization for immutable structures. Added POD flags for various math classes.

New: The amount of logging information displayed in the editor has been reduced. The removed logging is now only written to the log file.

New: TAssetPtr now supports conversion from derived to base.

Fixed a memory leak in the FLinkerLoad in debug builds, never clearing itself from the list of live linker loaders.

Added a system for deferring linker deletion to fix crashes during async loading.

Added attribute serialization to the XML File writer.

Added code to force exit when a worker thread crashes.

Added message log error for source name collisions in redirector ini sections.

Always use the Engine directory instead of the Process directory to locate executables on Windows.

Changed "CreateExport: Failed to load Outer..." message to be emitted to the message log so it is better surfaced to the user when running the editor.

Changed the message about missing config files on startup to make it more accurate.

Disabled runtime crash processing for launcher builds to reduce memory footprint. Callstacks will still be processed by CrashReporter.

Editing "Project Settings" value now only edits a single value in the config ini file. With the exception of Arrays, which need a whole new implementation.

EPackageFlags & EObjectFlags can now be properly viewed in the debugger as a collection of enum entries, e.g. RF_Public | RF_Transactional, rather than just the raw numerical value.

Fixed crash reporting on Windows to make it more reliable.

Fixed "nearly equal" math comparisons not returning true when values are exactly equal and tolerance is zero.

Fixed a bug in TBB allocator that caused aligned allocations to overlap incorrectly.

Fixed Get Value Range function on Curve Base giving Min instead of Max. (Contributed by MiniTurtle, pull request 1314.)

Fixed a bug where game thread graph was not always enabled after loading a UE4Stats file in the profiler.

Fixed a bug where profiler could not perform 2 captures in a row through UI.

Fixed a crash after renaming a map or asset that couldn't have been renamed due to errors.

Fixed a crash in Online Async Task Manager Null when running the game with "-nothreading" on Windows.

Fixed a crash on exit after streaming levels in a cooked game.

Fixed an assert when checking for existing linker after async loading.

Fixed an intermittent deadlock when shutting down a game.

Fixed an issue where installed plugins would cause a content-only game to build when packaging.

Fixed Blueprint compilation errors after hot-reload.

Fixed build failures that could happen when user tried to add modules' dependencies.

Fixed crash on exit in packaged games caused by random order of destruction of some of the core UObject systems.

Fixed crash reporting and the engine not reporting correct windows version for Windows 8 and 10.

Fixed redirectors assets "Fail to load" messages that could appear in certain situations in the editor making redirector assets unusable and unfixable.

Fixed saving failure after hot-reload when blueprint node contained a reference to a class default object.

Fixed sporadic audio crash after hot reload.

Fixed the search order for detecting a target for game projects.

Fixed the search paths for plugins when running a packaged content-only game.

Fixed BSP texture align tools all being initialized to default. (Contributed by yamashi, pull request 1136.)

Fixed a crash if list of delayed linkers includes multiple entries of the same linker. (Contributed by MarcKamradt, pull request 1197.)

Fixed broken UnrealBuildTool dependency file caches when the process is terminated unexpectedly.

Fixed UnrealBuildTool not being able to harvest environment variables when the user's Windows login name contains non-ASCII characters.

Fixed UnrealBuildTool not updating the makefile when a .Build.cs or .uproject file changes.

Fixed UnrealHeaderTool crash that was occurring in some rare cases if parsing step had other errors.

Fixed UnrealSwarm "Channel already registered" error to log the actual reason why exception has happened, cause until now it was very misleading.

Fixed UnrealSwarm connection problems, which were happening if coordinator and agent were on the same machine and coordinator address in agent's settings was set to non-loopback IP.

Incredibuild binaries are now sought in Path and not just Program Files.

Integrated some UnrealBuildTool performance fixes which were added in 4.7 but omitted from 4.8.

Made sure default subobject (component) properties are not reset to default on actor construction.

Made sure packages are not marked as dirty when they're being streamed in.

Minor performance optimizations for UnrealHeaderTool that shave a couple of seconds off of an invocation for a typical game project.

Moved linker serialization from UObject to UPackage to fix inaccurate UObject mem reporting.

Optimized object referencing system when collecting garbage while streaming.

Profiler will now load all frames, previously the last frame was ignored.

Quadrupled trunc length for callstack lines when forming the human readable string for windows callstacks.

Removed some redundant calls from FPaths::MakeStandardFilename to make it faster.

Rendering thread callstacks are once again correctly printed to the log for non-editor builds.

Save to default config no longer writes out duplicate entries.

Smoke test added to ensure platform consistency on opening files for append, and ability to seek said file handles.

The TAttribute no longer allows you to directly compare another TAttribute for equality. They've been deprecated, and corrected to only allow comparison against literal values instead of comparison attributes, which was causing implicit construction of attributes when comparing against a literal. There's a new IdenticalTo() function on TAttribute which can actually compare two attributes to see if they are really the same.

When bAutoCompleteWhenLoadingCompletes is false in the MoviePlayer, the movie correctly continues playing until prompted to stop after loading completes.

When queueing new async packages, async loading code will also look for existing packages in loaded packages to process to prevent infinite streaming times.

New: Added "Zip Up Project" button under File -> Package Project to grab necessary project files and package into a zip. For easily sending the project to other people excluding unnecessary files. Smart Resizing for Transform Details UI: ​​ The vector and rotator widgets now support automatically rendering in a more compact mode as the details panel shrinks, making it possible to edit properties over a wider range of widths.

Rotator UI Consistency: Rotators now display everywhere in a consistent order as XYZ, rather than being displayed as XYZ in the level editor but as Pitch, Yaw, Roll (YZX order) in Blueprints. In a Blueprint: In the level editor: All existing content is automatically updated and will work as expected, but you may notice wires crossing that didn't cross before since the order has changed. As a refresher (this information is also displayed in the tooltips): X is the roll value (rotation about the X axis, typically the forward vector, e.g. tilting your head sideways). Y is the pitch value (rotation about the Y axis, typically the right vector, e.g. looking up/down). Z is the yaw value (rotation about the Z axis, typically the up vector, e.g. turning to face left/right).

New: "Add Auto Connect To Server" option to the advanced Play In Editor options, defaulting to old value of true. If set to false it will launch multiple clients but they won't connect to each other, which is useful for UI testing.

New: Added "No to All", "Yes to All" and "Cancel" options to the "Failed to Merge Bones" dialog when importing skeletal meshes to avoid having to dismiss large a large amount of windows.

New: Added "Save All" button to Visual Logger tool.

New: Added a check to determine whether plugins are compatible when opening a content only project. This is needed because a content only project will not attempt to build incompatible plugins later, users can now choose to disable them.

New: Added a support URL to plugins so that it is easy for users to know how to contact the creators of plugins for support.

New: Added file modified date and file size to map file asset tool tips. Allows sorting by these values in column view mode.

New: Added SkeletalMesh Resource Size in content browser.

New: Added support for multi-line text in the Note actor's text field.

New: Added support for positioning and always centering standalone play windows. Fields are added under Level Editor - Play advanced settings to position the standalone play window and turn always centering on and off.

New: Added the option to display the current Unreal Engine's version number in the project badge. This feature can be enabled in the Miscellaneous category inside of the Editor Preferences.

New: All integer property types are now supported in details panels instead of only int32 properties.

New: Allows play in editor windows to always be displayed on top of other windows, enabled/disabled under Level Editor - Play advanced settings.

New: Clarified the use of Server Game Options and Command Line Options in the tooltips for the Level Editor - Play settings.

New: Enabled engine/game plugin switch in plugin wizard. (Contributed by szyszq, pull request 1145.)

New: FBX importing detection has changed. If you have animated curves, it will detect as Skeletal Mesh even if you don't have deformer. This is so that it is easier to import animation for rigid bodies.

New: "Light Types” show menu: "Lighting Components" -> “Ambient Occlusion” affects both DFAO and SSAO now. Added "Screen Space Ambient Occlusion" show flag under ”'Lighting Features”.

New: Made the Blueprint Editor viewport camera speed a per-project editor user setting, which is saved between sessions.

New: Major optimizations to the BSP building process and BSP Undo.

New: Moved Plugins menu from Windows to Settings/Configuration.

New: Optimizations to setting the material or its texture transform on a BSP surface.

New: Placed cameras can now be looked through and piloted more quickly by using the camera dropdown in the level editor viewport.

New: Added hooks to Material Editor for plugin support. (Contributed by bradgrantham, pull request 1168.)

New: Removed the close button from the Convert Project modal dialog, as it was returning an undefined reason code (and was not necessary as there was already a Cancel button).

New: Removed the SaveBrushAsCollision command and its bindings, as the builder brush is no longer a user-facing concept.

New: Renamed the editor preference "Automatically Hot Reload New Classes" to "Automatically Compile Newly Added C++ Classes" to convey that it implies a compile.

New: Text FrontendFilter now tries to match with components of the path name, as well as the asset name itself.

New: The "Maximum Texture Size" property now yields an error dialog when attempting to change it for non-power-of-two textures which do not have a padded Power of Two Mode.

New: The RenderToTexture Blueprint toolset now has its own set of options for EXR exporting and does not require interfacing with the 'High Resolution Screenshot" dialogue box.

New: Users can now edit PlayerStateClass and SpectatorClass for a game mode via the Project Settings menu.

New: The green flash on tutorials will not return in future sessions once the tutorial is started. It is no longer necessary to dismiss the tutorial manually or complete it.

New: When building the plugin category tree, plugins are now also added to their parent category until we reach the root, so that all plugins can be searched from the root level.

New: When using "-List" command with UnrealPak, the files will now be printed out in the order they appear in the pak.

Actor Merging tool now correctly assigns user specified lightmap channel to a merged mesh.

Actors generated by 'Hierarchical LOD' system can no longer be transformed using Details panel.

Added an ensure to the main frame to indicate when it is being incorrectly loaded in a -game build.

Added an option to not use MikkTSpace tangent generation for static mesh importing.

Added error message if a material expression parameter name is too long.

All PIE world objects are now marked pending kill when exiting a play in editor session to break any references that could prevent garbage collecting the PIE world.

Attempting to enter greater than the maximum allowed number of FName characters into a name property will now show an error message in the text box in a details panel instead of crashing.

Changed common and divisions of 360 rotation grid snap values.

Changed Plugin Creator to allow plugins to be created in subdirectories.

Decals now drag and drop properly when dropped on top of meshes.

Disabled Plugin Creator plugin in content only projects as it currently won't generate projects/compile any plugins that are created.

Ensured that dependencies on missing plugins can be removed from the .uproject file when loading the editor.

Ensured that Plugin Browser displays correct results after adding a new plugin.

Fix for crash while trying to hide the Tick property category within a class.

Fixed "Multiple Values" being committed to property text blocks when they lose focus or when the user presses enter.

Fixed a crash executing source control commands with the Subversion source control provider.

Fixed a crash that could occur during a Play In Editor session with two or more players, using multiple processes, and having the editor multiplayer mode set to "Play as Client".

Fixed a crash when a level that has a Matinee Actor is unloaded at runtime.

Fixed a crash when changing a struct that was being used by an open Data Table editor.

Fixed a crash when dragging junk text from an external program into the graph editor.

Fixed a crash when immediately closing Visual Studio after opening a source file via the editor.

Fixed a crash when importing multiple objects with the same name at the same time when one of them is an FBX file.

Fixed a crash which could occur when attempting to open a map in the content browser that is currently loaded in the world composition browser.

Fixed an issue where selecting a surface with no actor selected did not bring up the details panel specialization for the surface properties.

Fixed an issue where some of the shape textures in engine/content did not have textures.

Fixed BSP selected surface rendering in Geometry Mode.

Fixed camera roll being applied to level viewport cameras after ejecting from the player in a Play in Viewport session.

Fixed crash accessing the engine when attempting to play a slate sound after the engine has been shut down.

Fixed crash converting texture sample to parameter when MipValue is set to "Level" or "Bias".

Fixed crash copy and pasting material function call nodes while live preview is disabled.

Fixed crash ending Play in Editor if transactions made before starting PIE were undone while PIE was running.

Fixed crash in visual logger when you run the editor with an invalid .uproject.

Fixed crash when reimporting a mesh while editing collision in the static mesh editor.

Fixed duplicated brush actors not appearing in game.

Fixed editor viewports not remembering maximized state after shutting down in immersive mode.

Fixed error where during Mesh Paint mode using the Remove button would only remove the Vertex Colours from the first LOD level.

Fixed existing collision not being restored if there is no collision in the FBX file when importing over existing Static Meshes.

Fixed FBX import failure caused by incorrect import factory attempting to handle incoming assets.

Fixed geometry surface alignment tools for BSPs.

Fixed issue where BSP surface texture transforms could break when rebuilding geometry if their parent brush had been rotated about more than one axis.

Fixed issue where BSP surface transforms could get broken when applying them to geometry surfaces which are out of sync with the owner Brush (because Auto Build BSP is disabled).

Fixed issue where cancelling unsaved packages dialog when launching resulted in the Launch button permanently disabled.

Fixed issue where creating a child of an anim blueprint would result in a regular blueprint being created. Also fixed a similar issue with GameplayAbilityBlueprints.

Fixed issue where the AssetImportData for an asset was being lost when loaded.

Fixed issue where warnings during PIE were not being announced via a notification at the end of a PIE session.

Fixed issue with EyeDropper tool returning incorrect colour due to lack of gamma-correction.

Fixed issue with selection box rendering in the Curve Editor.

Fixed issues with redirector fixup, so that redirectors are deleted cleanly and referencing map packages are correctly fixed up. In addition, fixed an issue where sometimes it was necessary to perform redirector fixup twice.

Fixed issues with the Delete Assets dialog so that the operation is always performed cleanly where possible, and not erroneously requiring a "Force Delete" operation.

Fixed issues with the geometry Optimize operation so that it always works correctly, without sometimes first requiring a Triangulate operation.

Fixed lights not being hidden when changing the editor visibility via the World Outliner.

Fixed manually entered rotations in the editor sometimes not resulting in the correct object rotation (mainly when editing Pitch). Component transform editing now makes sure to only edit the single component (Yaw, Pitch, or Roll) that has been changed, and makes sure Quat<->Rotation conversion does not mess with the end result.

Fixed manually entered rotations in the editor sometimes not resulting in the correct object rotation (mainly when editing Pitch). Component transform editing now makes sure to only edit the single component (Yaw, Pitch, or Roll) that has been changed, and makes sure Quat<->Rotation conversion does not mess with the end result.

Fixed Matinee Editor Preview Viewport FOV lagging by a frame. (Esp. noticeable during cuts between cameras of different FOVs)

Fixed menus so that they set the widget to focus upon activation to the actual content widget, rather than the wrapper. This fixes issues with the Ctrl+Tab file selection shortcut.

Fixed mirror transforms on BSP / Volumes.

Fixed missing engine controls overlay for mac and linux in the lower-left part of the viewport.

Fixed numeric math expression input when using a combination of units in unit-based numeric entry boxes.

Fixed Paper2D JSON files no longer importing as Paper2D assets.

Fixed rare crash in Visual Logger during shutdown of engine.

Fixed rare editor crashes caused by proxy updates happening after proxy destruction.

Fixed rendering issue with the Collision Analyzer window when opened from a non-editor build via the console.

Fixed rendering of graph node popups (for example, dropdown boxes) in graph editors. They are now rendered and sized at 100% scale, regardless of the zoom of the graph itself.

Fixed some users being unable to create blueprinted components without visual studio installed.

Fixed Tag and Tag Query Editor windows on Mac. These windows were parented wrongly on Mac and couldn't be clicked.

Fixed Undo in Geometry Mode so that the geometry selection state is correctly restored.

Fixes to Visual Logger tool, to fix how we use this tool only with keyboard.

If you import a Skeletal Mesh with scale 0 of bone for reference pose, it will print warning.

Improved Data Table handling of User Defined Enums: The Data Table editor UI will now show you the friendly name of the enums in its grid panel (matching what the property panel shows). The Data Table import will now fallback to trying to import using a friendly name if no matching enum entry was found for the given name.

Improved instructions for what to do after creating new plugins with the wizard.

Improved performance when importing thousands of mesh sections from one FBX file.

Improved the localization support of the class wizard dialogs.

Made StartPIEGameInstance virtual to allow for game-specific PIE code.

New game windows now default to being positioned centered on the screen.

Optimizations to histogram graphs from Visual Logger tool.

Optimized pasting of actors into levels that contain a large number of actors.

Option to enable Hierarchical LOD is now more discoverable and can be found in 'World Settings' under the LODSystem category.

Performance improvements to OpenEXR exporter.

Placement mode can now correctly place new actors at locations occupied by foliage meshes.

Fixed small but annoying typos in ContentWrangleCommandlet.

Fixed Animation Sequence 'Reimport With new Source' context action.

Fixed issue with Animation Sequence reimport not respecting 'Default Sample Rate' flag set by the import UI.

Reduced ULevel::BuildStreamingData editor hitches from 600ms to 30ms.

Removed the map check warning "has simple collision but is being scaled non-uniformly - collision creation will fail" as a collision shape is created regardless of the fact that an object is non-uniformly scaled.

Renamed "Tick" category in UActorComponent to "Component Tick" and Actor tick to "Actor Tick" to differentiate between the two when they are both shown in a details panel.

Resizing a viewport no longer flushes texture streaming, causing a hitch.

Stopped ensure being triggered when scaling a skeletal mesh to 0.

Textures are no longer compressed for auto-saves to reduce the time it takes to save.

The color picker no longer assumes a straight inverse gamma conversion from colors sampled on the screen using the eye dropper. This change makes it so sRGB is the assumed space all colors are sampled in, making sampling colors from Photoshop bring in the identical version of the color converted into linear space, which when transformed back into sRGB space will be the same color you saw in photoshop. FColor and FLinearColors can now default to sRGB space using a UPROPERTY meta tag of sRGB=true (or false), you can force a specific default checking of the sRGB checkbox. Several places in UMG now force this default since sRGB is the space UMG will be rendered in (on PC). Additional work will be needed on Mac where the final rendering space is gamma 2.2.

The editor now properly saves out array elements to the ini files.

The Far View Plane setting for level editor viewports is now saved between sessions.

The Scalability state is now saved back to the same .ini file that it was loaded from, so that launching the editor doesn't reset Scalability settings set by the game.

There is now no longer a max limit to the number of static mesh sections that can be generated when importing meshes. The previous limit was 64 sections.

Updated Material Preview Mesh properties to include Adjacency Info.

Content Browser

New: Improved the behavior of Ctrl+B in the Content Browser and Persona. Ctrl+B in the Content Browser will now invoke the "Show in Folder View" command to allow you to easily sync to the actual location of an asset in the cases where you're viewing it via a search or a collection. Ctrl+B in the Persona animation sequence browser will now invoke the "Find in Content Browser" command. Ctrl+B will no longer do anything when Persona has no asset available for a given edit mode.

New: The "Move Folder Here" operation can now be aborted if there are a large number of assets within.

Auto reimporter now uses MD5 hashing to ensure that benign reimporting does not happen when only the timestamp has changed.

Can now use the "Show Developers Folder" option in the save/load dialogs.

Fixed an issue in which cancelling the attempted delete of read only files would still remove the asset from the Content Browser.

Fixed being able to rename or delete some read-only types in the Content Browser.

Fixed Content Browser drag-and-drop so that 