Unreal Engine 4.13 Release Notes

Choose your OS:

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

What’s New

Unreal Engine 4.13 has arrived! In this version you'll find numerous improvements across the board.

Many new rendering features have been added, such as mesh decals, Blueprint drawing to render targets, GPU morph targets, refraction improvements and high quality, optimized noise functions are now available to materials. Shadow map caching allows for more shadow-casting dynamic lights in a scene than ever before!

Sequencer, our new non-linear cinematic editor, has been updated with a slew of new features for high-end cinematography. Live recording from gameplay has been significantly improved. Also, you can now transfer shots and animations back and forth from external applications. You can see these features in our Siggraph Real-time Live! 2016 demonstration
.

Alembic support allows you to import complex and interesting vertex animations. And the new Physical Animation Component lets your characters respond realistically to physical forces by driving their skeletal animation through motors.

For mobile developers, dynamic shadows have been optimized, full-precision materials are supported, and custom post-processing is now possible. OpenGL ES 3.1 can now be used on Android, and binary shader caching will improve your iteration times.

VR games can now use capsule shadows, and stereo instancing has been optimized. Oh, and check out the new VR Template Project! It's a great example of how to use motion controllers to interact and navigate in your VR game.

Want to build your levels while in VR? Unreal's VR Editor has been improved with support for mesh and foliage painting, a new transform gizmo, and VR color picking. Finally, you now can instantly play your game right from VR! You can turn on "Enable VR Editing" in the Experimental section of your Editor Preferences.

Record transforms in world space when actor is attached but not recorded.

New: Shadow Map Caching for Movable Lights

When a point or spot light is not moving, we can store off the shadow map for that light and reuse it next frame. This is now done automatically and makes shadow casting movable point and spot lights much more affordable in games where the environment is often not moving.

The above image shows 33 dynamic shadow-casting point lights, with very minimal overhead:

Note that it still costs 2ms to render the contributions of the 33 point lights, which can be optimized in other ways but is not affected by this change.

Memory used by the cache can be seen under ‘Stat ShadowRendering’ and was 25.6Mb in this scene.

Max memory used by the cache can be controlled with ‘r.Shadow.WholeSceneShadowCacheMb’

Limitations

By default, caching can only happen when:

Primitives have mobility set to Static or Stationary

Materials used do not use World Position Offset

Light is point or spot, shadow casting, and mobility set to Movable but not currently moving

Materials that use an animating Tessellation or Pixel Depth Offset can cause artifacts as their shadow depths are cached.

New: Voronoi Noise Materials

We’ve added a new Voronoi noise option available for the Noise material node. Voronoi noise, also sometimes called Worley or Cellular noise, is can be useful for procedural material creation.

Voronoi noise can be used to generate patterns for familiar physical materials such as marble, as seen on the statue below.

This example uses a Voronoi noise with a technique called ‘gradient mapping’ to achieve a marble look.

From Left to Right:

1) Standard Voronoi Noise, 1 octave

2) Voronoi with "Gradient" noise added to input position, set to 0.05

3) Gradient noise multiplied by 0.3 before adding to Voronoi input position

4) Using result of step 3 as texture coordinates for a random tiling texture

The Voronoi noise has four quality levels, with decreasing grid artifacts at the higher levels at the cost of significantly increased shading time.

Also, performance has been improved for several of the Noise Material Node features, with more detailed description of the performance tradeoffs in the function selection tooltips. Most of these can be slow for runtime use, so baking the results into a texture is encouraged.

New: Blueprint Drawing to Render Targets

Blueprint functions can now be used to draw materials into render targets. This enables a huge variety of game-specific rendering effects to be implemented without having to modify source code.

This is a fluid surface simulation implemented entirely in Blueprint and Material graphs. Characters and projectiles can push the fluid around!

Above shows a simple heightfield painter made entirely in Blueprint, by accumulating a height value at projectile impacts.

The new Blueprint function Draw Material to Render Target draws a quad filling the destination render target with the Emissive Color input in the material.

Upon starting the game, Begin Play is called and the render target is filled with blue. You can then right-click on the render target and save it as a static Texture which can be compressed.

For more advanced drawing to a render target, use Begin Draw Canvas to Render Target and End Draw Canvas to Render Target. These allow multiple draws to a subset of the render target efficiently, as well as font drawing methods through the Canvas object.

Being able to render off-screen from blueprint enables a ton of rendering features to be implemented quickly without a graphics programmer. It's also very easy to tank the GPU by doing a lot of pixel shader work with many passes to large render targets. These draw calls show up after typing 'ProfileGPU' in the debug console (under the WorldTick event)

Limitations

You cannot draw to a render target that is being sampled as a texture by the material you specify. Either use alpha blending to modify a render target in-place, or ping-pong between two different render targets.

Only the Emissive Color and Opacity outputs of the material are valid when drawing to a render target, lighting is not supported and nodes like WorldPosition may have unexpected values.

Emissive Color is clamped to be positive by default, but you can output negative values by enabling the material property ‘AllowNegativeEmissiveColor’

Check out the BlueprintRenderToTarget map in the ContentExamples project for working examples!

New: Alembic Importer for Vertex Animation (Experimental)

Alembic animation import is now supported! Alembic allows for complex animations to be authored offline, then rendered in real-time inside UE4! This feature is still considered experimental, but please try it out and send us feedback.

We allow importing Alembic caches in different ways:

Static Mesh. A single frame from the Alembic animation will be imported as a static mesh asset (no animation.)

Geometry Cache. This is a new type of animation asset that allows playback of vertex-varying sequences. The imported Alembic animation will be played back as a flipbook of frames. Performance will scale with your mesh’s complexity and may not be optimal in all cases

Skeletal Mesh. This is the most efficient way to play back an Alembic animation, as long as the vertex count doesn’t change. During import, your animation sequence will be compressed using a PCA scheme, in which common poses (bases) are extracted and weighted to compose the original animation during playback time. The percentage or fixed number of bases used can be set during import to tweak the level of compression

New: Mesh Preview Scenes

New functionality has been added to setup the scene used to preview Static and Skeletal meshes.

A new Preview Scene Settings panel has been added to the Static Mesh and Skeletal Mesh editors. Here, you can setup multiple profiles (scenes) to preview your meshes, and the profiles allow for changing:

New: Mesh Decals

The new Mesh Decals feature lets you efficiently splat materials on top of your static meshes, effectively allowing you to smoothly layer different materials on top of one another. You can think of it as a second mesh that sits above the underlying geometry’s profile with it’s own topology and materials.

The above pillars are each created as base mesh overlayed with a single detailed break mesh, as shown in the wireframe below. The left pillar is using a mesh decal to allow smoothly blended color, normals and roughness. The right-most pillar is a masked material, just for comparison.

Unlike deferred decals there is no projection involved, so a typical decal mesh which is tightly coupled to the underlying surface may need to include a surface offset in the material. Also, be careful if you have LODs where the mesh decal geometry would interpenetrate the LOD mesh.

New: Widget Interaction Component

Using the widget interaction component, you can now simulate hardware input events with widget components in the world.

You can attach it like a laser pointer to any object in the world to interact with widgets; there are also some other options available for more customized behavior. When standard input comes to the player controller, you’ll instruct the interaction component to simulate a particular hardware input such as Left Mouse Down/Up over whatever widget the user happens to be hovering at that time.

For users who were previously relying on clicking directly on Widget Components in the world using the mouse, that path is no longer supported. Users will need to attach an Interaction Component (In Mouse Mode) to their player, then forward input to the Interaction Component when the player receives it.

New: VR Project Template

We’ve added a new project template designed for Virtual Reality on desktop and console.

To access this, simply choose the new VR option in the New Project template selection window.

This Blueprint project has settings that are optimized to run in VR up to 90 frames per second. To support different types of controllers the template includes two methods of locomotion, split into two distinct Pawn Blueprints. The first is designed for gamepads while the second supports motion controllers. When using motion controllers, you can teleport to different locations and grab and throw objects. A C++ version of this template will follow in a future update. Also, mobile VR templates will be coming later too.

New: Custom Post-Process for Mobile

Custom Post-Process materials now can be used on Mobile devices! Here is a "TV Static" effect displayed using the mobile renderer.

This feature requires the "Mobile HDR" option to be enabled in your Project Settings

New: Physical Animation Component (Experimental)

The component allows you to set motor strengths directly, as well as using pre-configured physical animation profiles which can be created and edited inside PhAT. The new "Physical Animation Profiles" feature in PhAT provide a powerful way to customize character physics in different game contexts, as well as fine tune it for special animations.

You can create and edit different profiles within the PhAT tool, and then change between them easily at runtime. Check out the new "Apply Physical Animation Profile" and “Apply Physical Animation Settings” functions in Blueprints, which allow you to to change physical animation behavior dynamically.

New: Procedural Mesh Slicing

There is a new utility in Procedural Mesh Component which will ‘slice’ a Procedural Mesh at runtime using a plane.

After slicing, we support adding ‘capping’ geometry, and creating a second Procedural Mesh Component for the ‘other half’ if desired.

Also, Procedural Mesh now supports simple collision, so physics simulation can be enabled! Finally, we added a utility to copy data from a Static Mesh to a Procedural Mesh (‘Allow CPU Access’ flag must be set on the Static Mesh for this to work in cooked builds.)

New: Mesh Painting in VR

You can now paint on textures and mesh vertices in using the VR Editor.

This allows you to use motion controllers to paint on static meshes while immersed in VR. To use this feature, open the "Modes" window in VR, then click the “Mesh Paint” tab. Now simply select an object in the world, then aim and pull your trigger to paint! Pressure sensitivity is supported on your controller’s trigger, and you can hold the ‘Modifier’ button to erase instead of paint.

New: Foliage Painting in VR

In this release, you can use motion controllers to spray down foliage instances while in VR.

Select a foliage type, aim your laser and pull the trigger to paint foliage! You can hold the modifier button to erase foliage. Pressure sensitivity on the trigger is supported. Additionally, the Foliage Editor has been improved to be a bit more functional while in VR, although some features, lasso tool and select tool, are still unavailable.

New: Color Picker in VR

The Color Picker window is now available in VR, so you can change color properties on lights and other Actors in your level. You can also use the Color Picker to select colors for Vertex Painting and Texture Painting in VR.

New: Play from VR Editor

To easily prototype your project it is now possible to play your game in VR from within the VR Editor. Press the "Play" button on the quick menu to start playing in VR! To instantly go back to the VR Editor, hold the Grip buttons on both controllers and squeeze both trigger buttons.

New: Improved VR Transform Gizmo

The VR Editor’s transform gizmo has been improved with better usability and new features!

Translating and rotating objects feels much more natural, and you can now uniformly scale objects or translate them along a single 2D plane in VR. We’ll continue to make improvements to VR gizmos in future releases.

New: VR Editor Flashlight

Using the Quick Menu, you can now add a flashlight to your controller, to light up dark parts of your scene or see how light interacts with different Materials.

New: Screenshots from VR Editor

You can now take screenshots right from VR!

New: Automatic Entry to VR Editing Mode

You can now enter and leave VR editing mode when the VR editor is enabled without having to use the VR button or escape manually! As long as the editor is in the foreground, when you wear the headset, you will automatically enter VR editing mode; when you remove the headset, you will leave it.

There is a setting under VR in the Experimental section of Editor Settings that will allow you to turn off auto-entry if you prefer.

New: Sequencer Import/Export

Sequencer can now import and export CMX EDL files for interchange with non-linear editing packages.

The above shot shows a sequence that was exported to Adobe Premiere Pro. Each shot in a sequence will be written to a separate movie file which is referenced by the EDL file. Any sequencing changes made in Premiere can then be imported back into UE4’s Sequencer!

Sequencer’s ability to export HDR data in OpenEXR files has been expanded to give the user a choice of the color gamut used to encode the HDR data.

Finally, Sequencer now supports importing FBX animation directly to an object or track. You can also export animated tracks to FBX!

New: Sequencer Burn-ins on Renders

When rendering out your movie sequence, you can now configure a "Burn-in" for the exported images. This is very useful in dailies for identifying and tracking shots.

New: Media Framework Overhaul

Media Framework API has been completely overhauled, with many new features! Media Framework allows you embed live video and audio into your projects, with numerous powerful features.

Playlist assets for playing multiple media sources in a row

Audio playback support has been added

Improved media file import workflow

Improved Blueprint integration

Performance improvements on several platforms

Pixel format conversion on the GPU

Support for dynamically changing video dimensions on some platforms

Android

Support for multiple audio tracks

HTTP Live Streaming (HLS) on devices supporting it (m3u8)

Playstation 4

HTTP Live Streaming (HLS)

Improved playback controls (Pause, SetRate, etc.)

Media files can be pre-cached to memory

Opening media from FArchive

Ability to play multiple videos at once (may require increased memory pool settings)

Windows

H.264 is now supported

Better support for HTTP(S) and RTSP streams

Better error handling and logging

Stability and usability improvements

Graceful handling of non-standard & unsupported codecs

Notes

Early experimental macOS/iOS support (AvfMedia plug-in)

Experimental Linux support (via VlcMedia plug-in on Github)

Experimental Video-Over-IP support (via NdiMedia plug-in on Github)

XboxOne (MfMedia) and HTML5 are not supported yet

Integration with Sequencer/Video Recording is scheduled for 4.14

PlatformMediaSource asset is not implemented yet

New: Platform SDK Updates

In every release, we update the engine to support the latest SDK releases from platform partners. Also in this release, you can remote compile iOS/tvOS projects from Windows in the binary version of UE4!

iOs/tvOS: Code projects are now supported in the Windows version of the binary version of UE4 with the Unreal Engine Launcher. (You do need a Mac somewhere to remote compile on)

macOS: Now supports Xcode8 and macOS 10.13 Sierra

iOS/tvOS: Now supports iOS10/tvOS10

Xbox One: Upgraded to August 2016 XDK

Playstation 4: Upgraded to PS4 SDK 3.508.201

Oculus Rift: Updated to the Oculus 1.6 Runtime

SteamVR: Updated to OpenVR 1.0.2

Google VR: Added Google VR (Cardboard) support for iOS

OSVR: Updated to v0.6-1194-g0c54f5e

Android: Google Play Games native C++ SDK updated to 2.1

Android: Google Play Services updated to 9.2.0

Android: Supports running on Nougat aka Android 7.0

Vulkan API: Updated SDK to 1.0.17.0 (for Android and Windows)

New: Improved Landscape Tessellation

Hardware tessellation on landscape is now much faster! Landscape will now only render hardware tessellation on the highest level-of-detail (LOD), fading out as the landscape approaches the second LOD. Subsequent LODs will no longer have tessellation enabled. This significantly improves performance of enabling tessellation for displacement or extra detail up close to the camera.

In the visualization above, the highest the LOD (white) is rendered with tessellation enabled, while the other LODs (colors) are rendered without tessellation.

New: Animation Pose Assets

We have added a new type of animation asset called a Pose Asset. This contains a set of named bone poses, which you can blend additively, in a similar manner to blend shapes for vertices.

One use for this is to support facial animation where either FACS (Facial Action Coding System) or viseme curves can drive poses. However you could use this system to create new animation by blending multiple poses.

Currently you create a Pose Asset from an Anim Sequence using Content Browser context menu or the Create Asset menu in Persona. When you create a Pose Asset, the pose names will be automatically generated. After that you can rename each pose manually, or use clipboard paste to rename all of them at once.

Poses are driven by normal animation curves. As long as they exist in the animation you can see the curve. In Persona, in order to preview a pose from a curve, you need to set the current Preview Pose Asset.

In the AnimGraph, you can use a Pose Blender Node (or Pose By Name) to output the pose based on the incoming curves.

To support this system, we have improved how we handle scale with additive blending. In the future we would like to support curves on other assets (e.g. Sound Waves) that can be used to drive Pose Assets and Morph Targets.

New: Pose Driver Animation Node (Experimental)

We have added a new Pose Driver node, which lets you drive a curve value (such as a morph target weight) based on a bone’s movement.

This uses an RBF (Radial Basis Function) to interpolate driven values based on the orientation of a target bone. You use a PoseAsset to define the target poses for the bone, and the desired curve values at each pose. This node can be used as a Pose Space Deformer, to drive corrective blend shapes based on the orientation of a bone.

New: Animation Node Pose Watching

Anim graph nodes can now be "watched" in Persona.

This allows you to see a representation of the pose being generated at any point in the anim graph dynamically. Multiple watches can be active at once allowing you to compare poses at different points and find the exact point at which any errors in your current pose are introduced. This can be very useful for debugging complex Animation Blueprints and previously would only have been achievable by connecting the node you wanted to view directly to the root node and recompiling the blueprint.

New: Improved Scene Capture

Scene Captures have been improved to be more useful with the new ‘Blueprint Drawing to Render Targets’ feature!

Opacity is now captured in alpha, which allows partial rendering in a scene capture and compositing into another scene later.

Various GBuffer attributes are now available to be captured, including depth.

Added ‘Hidden Actors’ and ‘Show Only Actors’ arrays which can be used to easily control what is rendered into a scene capture.

Game specific effects like fog of war can be implemented by rendering meshes as visibility shapes into an orthographic scene capture, and then doing image processing with Draw Material To Render Target.

New: Improved Refraction Shaders

There’s a new "Pixel Normal Offset" refraction mode which uses the vertex normal as a reference, and computes the refraction offset from how different the per-pixel normal is from the vertex normal. This is non-physical but allows refraction to be used on flat water surfaces.

Left: simple scene with no refraction

Center: default refraction method which causes an undesired constant offset for a water surface

Right: Pixel Normal Offset refraction method which distorts based on the normalmap difference

New: Texture Coordinates from Line Traces

We have added a project setting to support texture coordinate (UV) info from line traces.

The option is under Project Settings -> Physics -> Optimizations. When this is enabled, you can use the ‘Find Collision UV’ function to take a Hit Result and find the UV info for any UV channel at the point of impact. Enabling this feature does use extra memory, as a copy of UV information must be stored in CPU memory.

New: Spline Editing Improvements

Editing Spline Component defaults in the Blueprint Editor

Now it's possible to set Spline Component points in the Blueprint Editor using the standard spline visualizer editing features. New instances of the Blueprint will be created with these defaults, although these too can be overridden on a per-instance level once placed.

The "Reset to Default" context action on the spline visualizer will set an instance back to the Blueprint default. Any changes made to the Blueprint default will be propagated to any instance whose spline points have not been subsequently edited.

Numerical editing of spline points in the Details panel

Before there was no way to precisely place spline points and assign scale, roll or tangents to them. Now these properties are exposed in the Details panel for selected spline points:

New spline point properties

Spline points can now be defined with distinct arrive and leave tangents, and an arbitrary input key. The former allows for splines with discontinuities, while the latter allows for greater control of interpolation speed between points. This allows for greater versatility when designing spline paths.

In the spline visualizer, in the Spline Component details, there is an option in the context menu to allow the arrive and leave tangents to be edited separately instead of locked:

As a consequence of being able to set arbitrary input keys per point, there is now also a way to specify the input key of the Loop Position for closed splines:

If input keys or a loop position are not specified, they will default to starting at 0.0 and incrementing by 1.0 for each point, as before.

Defer spline update in Blueprints

Sometimes it's desirable to build splines procedurally in a Blueprint construction script. Previously every operation on a spline point would cause the spline to be rebuilt, but now - for optimization purposes - it's possible to specify whether the spline should be rebuilt following a spline point operation. There's also an explicit Update Spline node.

Input Spline Points to Construction Script

Sometimes it's useful to be able to hand edit a spline with the spline visualizer, and then refine them with a Blueprint construction script. An example might be a Blueprint which locks all edited points to the surface of a sphere, like this:

This is now achievable by checking the "Input Spline Points to Construction Script" property:

New: Sub Animation Blueprints

You can now share animation logic by using a ‘Sub Anim Instance’ node within your Animation Blueprint to reference another Sub Animation Blueprint. This also allows you to break up large Animation Blueprints into separate assets, for example into ‘locomotion’ and ‘physics’ parts.

Member variables of the Sub Blueprint can be exposed as input pins on the node. The Sub Animation Blueprint must use the same Skeleton as the outer Animation Blueprint.

New: Animation Curve Viewer

We removed the Skeleton Curve tab from Persona, and moved that functionality into the improved Animation Curves tab. Here you can now rename and delete curves, as well as previewing curve data.

You can see all curves that belong to current skeleton or currently active curves from preview asset. And you could also filter by specific type of curves if you only want to see active curves. Please note that we named default curve to be called "Attribute", so any animation curves will be by default attribute curves.

If you want to modify the curve value, you can either turn off Auto check box option or just type the value.

New: Sprites in UMG Widgets

You can now use Paper2D Sprites as Brush inputs for UMG and Slate Widgets. In addition to allowing users to reference UI art that may have been developed as a sprite sheet, it permits users to more efficiently render widgets on platforms where the draw call count budget is tight. Sprites that are part of the same texture atlas can be batched together in Slate, provided they all share the same layer when rendered.

New: Optimized Instanced Stereo Rendering for VR

There have been a number of improvements to instanced stereo rendering, including moving the velocity pass to use instanced stereo rendering. Multi-view support has also been enabled on the PS4, which leads to significant performance improvements when using the ISR path.

New: GPU Morph Targets

Projects can now enable calculating morph targets on the GPU on Shader Model 5 level hardware. This frees the CPU from performing those calculations:

New: Shadow Optimizations for Mobile

Optimizations have been added to the Combined Static and CSM shadow mode added in 4.12. In this mode, a stationary directional lights cast static shadows from static objects and CSM shadows for dynamic objects. In 4.13, the appropriate shader is now automatically selected based on the bounds of the dynamic objects casting CSM shadows, and there is no longer any need to manually tag each primitive that will receive combined static and CSM shadows.

New: Landscape Import Plug-ins

A new plugin API has been added for landscape file formats, allowing developers to create plugins that add support for different heightmap and weightmap file formats to landscape. The existing raw and png support has been converted to the new API. The png support in particular makes a good reference for implementing new landscape file format plugins.

New: Automation Testing for Android

The Project Launcher is now able to package and launch your project onto multiple Android devices simultaneously. The app running on each device will communicate back to your host PC over the USB cable and the will appear in the Session Frontend window.

You can then launch Automated Tests on all the devices and see the results in the Session Frontend.

New: OpenGL ES 3.1 on Android

While UE4 has long supported many OpenGL ES 3.0 and 3.1 features on Android, you can now specifically target ES 3.1 on Android. This brings feature parity with Metal and Vulkan to higher-end Android devices and gives you access to 16 texture samplers as well as improved performance through the use of uniform buffers.

You can choose to package bothe ES 2.0 and ES 3.1 shaders for the same project, and the device will chooses the best shader platform based on the device’s capabilities.

New: Mobile Packaging Wizard

We have added a Mobile Packaging Wizard to help support packaging for mobile where a minimal app without any content is uploaded to an App Store and the rest of the content is downloaded from the Cloud.

This type of packaging is common with larger games that have regular DLC updates

It also allows the user to download only the specific content required for their device, such as the texture or shader format their device needs

Wizard can be accessed from Project Launcher window as an option for new profile creation

New: Full Precision Materials on Mobile

Materials have an option to use full precision (default: medium precision) in pixel shader when used on Mobile devices. For example this helps in cases when material uses world coordinates in computations.

New: Binary Shader Caching for Android

Compiled shaders will be stored on the disk on first use and then reused on subsequent application runs.

Requires GL_OES_get_program_binary extension

Disabled by default, can be enabled only on Android devices (r.UseProgramBinaryCache=1)

New: Localized Text Formatting Improvements

Plural forms allow you to use different text based upon a numeric variable given to your text format. Plural forms may be cardinal, eg "There is 1 cat", “There are 4 cats”, or ordinal, eg) “You came 1st!”, “You came 2nd!”, etc.

Plural forms are specified as key->value pairs, and support any of the following keywords (as defined for your culture by the CLDR data
): zero, one, two, few, many, other. Values are an optionally quoted string that may also contain format markers.

Hangul post-positions help you deal with the grammar rules present in Korean, and will insert the correct glyph(s) based upon whether the value being inserted ends in a consonant or a vowel, eg) "사람은", “사자는”.

Hangul post-positions are specified as a list of values in the order of consonant, vowel. Values are an optionally quoted string.

Format Example: "{Arg}|hpp(은,는)"

To allow you to pass in the numeric/gender values needed for plural/gender form support, all of the FText::Format(...) family of functions now take their values as FFormatArgumentValue rather than FText. This can be implicitly constructed from any numeric type, ETextGender, or FText.

The ability to set these value types in Blueprints has been exposed using wildcard pins on the "Format Text" node:

You can also pre-compile your format pattern if you’re going to be re-using it for multiple calls to FText::Format(...). Simply create and store a FTextFormat instance and pass it as the pattern to FText::Format(...).

New: Multi-threaded Audio (Experimental)

Outside of the editor, sound cue evaluation and active wave instance determination can now run independently of the game thread. Benefits will vary per game depending on the quantity and complexity of active sound cues, however for some context, in early testing, we’ve seen a shift of approximately 1ms per frame off of the Game Thread and on to the Audio thread.

This feature is disabled by default in 4.13, but you can try it out by changing UseAudioThread to true in the [Audio] section of BaseEngine.ini.

New: Network Replay Backwards Compatibility

The replay recording feature now supports backwards compatibility. This means you can make modifications to a build, even add or remove replicated properties and then load replays on the new build that were recorded with an older build.

To test this feature out, you can simply record a replay with a certain build, change some replicated properties, and then load that same replay on a newer build!

Most of the work is handled by the low level reflection information we have for each replicated property. For custom serialized network data (UObject::NetSerialize), you can now use two new functions added to FArchive (FArchive::EngineNetVer() and FArchive::GameNetVer()) which allow you to obtain the current network version of the stream and handle old data manually.

New: Build Graph Scripting (Experimental)

BuildGraph scripts can be used to create custom sequences of UE4 build commands for build automation. Graphs are declared using an XML script using syntax similar to MSBuild, ANT or NAnt, and consist of a network of dependent nodes made up of tasks.

Some example BuildGraph scripts are stored under Engine/Build/Graph/Examples/…

New: Script for Making Installed Builds

The build process for installed UE4 distributions has been re-written using the BuildGraph scripting language, with a goal to making the process simpler and more transparent for other development teams with engine customizations. The script can be found at Engine/Build/InstalledEngineBuild.xml, and can be run by invoking AutomationTool with one of the following command lines:

Append the -listonly option to view a list of available options for customizing the build process.

New: TSets as Unreal Properties

TSets can now be used as a UPROPERTY for the purposes of automatic serialization, garbage collection, ini settings, and editing via the details panel (limited to entering as a string (i.e. "(1,2,3)")). Similar to TMap, TSet properties do not yet work as replicated members, nor can they be used in Blueprints.

Release Notes

AI

New: Added two appropriately named functions to the AI Perception Component

The functions for "Get Currently Perceived Actors" and “Get Known Perceived Actors” have replaced the ambiguously named “Get Perceived Actors”.

Debugging Tools

New: Added detailed config for gameplay debugger's categories in Project Settings. Each can now define category slot, default state and input bindings. This will be moved to user settings section in a future release.

New: Added logging of the current Move ID to Pathfollowing Component's vlog snapshot.

New: Added the number of morph targets to the Skeletal Mesh Content Browser info.

New: Added option for parent bone space to Get the Socket Transform.

New: Added the ability to use the spacebar as a shortcut to play/pause animation playback in Persona.

New: Added spherical constraints to the Anim Dynamics animation node.

New: Animation curve import options:

Remove Redundant Keys: This removes redundant keys when importing a custom attribute as a curve.

Do Not Import Curve With Only Zero Values: If all of values are 0, do not import. Not having the curve value is same as 0.f.

New: Changed animation compression settings so that they are edited in a dialog instead of directly in the Details panel. This stops animation compression settings from becoming out of sync with the actual compression used.

New: Import Animation:

Renamed the Animation Name setting to Override Animation Name.

Option to add suffix for importing material curves by name. By default _mat.

New: Animation sequences can now be marked as only being required by dedicated servers when they have root motion.

Animation sequences still need to be flagged in the project cooker settings as being stripped on servers for this to have any effect.

New: Getting a Socket Transform will now prioritize the socket name over the bone name.

New: Getting a World From Context Object is safe to be used in another thread, however the behavior is slightly modified. It will not use GWorld as an alternative option.

New: Exposed source indices for transition to runtime code so we can better identify which transitions are currently running when trying to determine elapsed times for anim getter nodes.

Bugfix: Fixed a crash when opening a skeleton when its assigned preview mesh doesn’t use that skeleton.

Bugfix: Fixed a crash when a Skeletal Mesh component gets destroyed while triggering a notify.

Bugfix: Fixed a crash when adding a section to a zero length montage.

Fixed a nullptr dereference in the montage handling code and disabled the menu option to add section when zero length.

Bugfix: Fixed a crash when viewing an uncompressed animation.

Bugfix: Fixed a crash when debug drawing of some animation nodes while in PIE.

Bugfix: Fixed a crash when using undo/redo while editing the Animation Blueprints defaults.

Bugfix: There was an edge case in random sequence player where there might be an extra loop when waiting on a blend to finish. This made it impossible for a shuffle list to start with the animation that is currently playing, seemingly duplicating the animation.

Bugfix: Prevented an animation from restarting each time a new section is selected/inspected in the montage editor.

Bugfix: Updated animation initialization to now verify the mesh’s hierarchy matches with the skeleton.

Bugfix: Animation Retargeting:

Fixed an issue with Additive Blend Space/Anim Offset.

Fixed an issue for not making the package dirty.

Bugfix: Fixed a compression issue with remove linear key not working properly with additive animations.

Bugfix: Components instanced as default subobjects of and attached to components instanced by Blueprint class construction script (i.e. nested default subobjects) are no longer being included in the Level editor's components tree view, as property values on these instances currently cannot be edited properly.

Bugfix: Copy-and-paste of Actor instances from the current level to the components tree view in the Details panel will now add components that have been properly initialized.

Bugfix: Customized defaults are now fully propagated to new instances at construction time during non-Actor-based Blueprint class re-instancing.

Bugfix: Details panel in the Blueprint diff tool is correctly set to read only again so that the user cannot edit the values.

The Ed Graph Pin is no longer a UObject, this will improve load times significantly on projects with many large blueprints. Note that content does need to be resaved in order to see the improvement in load time.

New: Added Option to show warnings and errors visually on the HUD in development builds.

Controlled by Duration Of Errors And Warnings On HUD in Engine.Engine section of DefaultEngine.ini (0 = disable).

New: Split Garbage Collection cluster index and internal object flags to allow more than 8 million UObjects in editor builds.

New: When graphics driver crashes the engine will now assert so that we can send a crash report. The Crash Report Client will now attempt to initialize Slate Renderer multiple times before it gives up in which case it will send the crash report in unattended mode.

Bugfix: Fixed a crash occurring in serialization when signed paks are used with compressed packages.

Bugfix: Fixed a crash when editing UObject’s in a Map property box.

Bugfix: Fixed a crash for Automation Tool when deploying to a default PS4 devkit.

Bugfix: Fixed a crash in UHT where an "Ambiguous search" error when a delegate has an own class declared.

Updated the thread heartbeat to be killed when reporting ensures so that it doesn't get triggered when the report takes a long time to generate.

Updated the thread heartbeat to be stopped when the engine crashes to prevent it from interfering with generating crash reports.

Updated the thread heartbeat to be suspended when a message box is being displayed to fix false positives in hang detection.

Updated Media Player objects to not be added to any Garbage Collection clusters because they can load additional assets after they had PostLoad called on them and that results in Disregard For Garbage Collection assumptions being violated.

Non-backup files will no longer be deleted when cleaning up the log folder.

You can once again specify more than one ini override on the command line.

Removed a few redundant Add Referenced Objects functions to speed up Garbage Collection.

Modified crash handling code (on Windows) to handle two threads crashing at the same time properly. Previously the second crash would force the process to exit before generating the crash report.

Editor and Tools

New: Updated the "Description" field for a blueprint function to be multi-line to encourage big descriptive tooltips.

New: Added a setting to allow recording of actors in the sequence recorder that are spawned by sequencer itself.

New: Added a "Console Variables" command under the main editor Help menu.

This creates a local html page with browse and search functionality for all cvars.

New: Added a setting to invert the Y axis in editor viewports for mouse look and orbit in Project Settings.

New: Added rich tooltip support to enum combo-box entries.

New: Added support for creating a HLOD cluster from a single actor, as long as it has two or more static mesh components in it. This improves handling when including Blueprints.

New: Added track for string properties.

New: Added UI for loading and browsing multiple stats dumps from a folder in the session frontend profiler for easy comparing of perf stats.

New: Changed how materials are generated by the Hierarchical Level of Detail (HLOD) system. They are now created as material instances to reduce the overall shader count

New: During a "Play in Editor" session, automatically regain focus after user takes over mouse control. This allows the editor to continue to process hotkeys without having to click on the editor manually to regain focus.

New: Added the ability to set PNG and JPG files as a Splash Image from the Project Settings.

New: Locking the mouse to a viewport is now determined by an enumerated value (Don't Lock, Lock on Capture, Lock Always) rather than a boolean.

New: Changed sRGB Preview to be the default in the Color Picker.

New: Changed Memory Profiler 2 to deselect current bar when clicking off the histogram. This allows the user to see the top level group data again.

New: Updated Interface classes to now have their own entry in the New C++ Class wizard.

New: Updated UnrealGameSync to hide *.uprojectdirs files by default in the project file selector, to discourage their selection by accident.

New: Added the ability for Resave Packages commandlet to now also rebuild asset registry paths with consistent case.

This produces much cleaner results than using the text export method (which will use the internal names for user defined structs).

New: You can now package a plugin from the plugin browser.

Select the plugin and there's a small link at the bottom of the plugin tile letting you execute the package operation for sharing your plugin.

Bugfix: Fixed a crash when renaming the current level in the Content Browser.

Bugfix: Fixed a crash with the curve editor widget if you box selected outside of the visible area.

Bugfix: Fixed a crash for exporting the current level to an OBJ file and exporting materials as images.

Bugfix: Fixed a crash for selecting a Grid Snap size with a corresponding Decimal Grid Interval Value of 0 units.

Bugfix: Fixed a crash when exporting actors with non-scene components to FBX.

Bugfix: Fixed a crash that could potentially happen when selecting a spline point in the editor after having deleted another point.

Bugfix: Fixed a crash Importing a brush, so that the brush is always validated (relinked), whether it is a static or dynamic brush.

This fixes an occasional crash when copy/pasting BSP brushes from one level to another.

Bugfix: Fixed a crash when hovering over a submenu while entering a Blueprint node comment in the Context Menu. In general, issues with opening submenus while a parent menu has focus.

Bugfix: Fixed a crash caused by repeatedly undoing and redoing a change in a level.

Bugfix: Fixed a crash for clicking the Install button multiple times when creating a new code project without a compiler installed.

Bugfix: Made a number of fixes to spline mesh collision generation:

A serious issue with DDC ID generation was fixed, in that the static mesh itself wasn't forming part of the key, hence any two splines with identical properties but different meshes would yield the same cache entry.

Fixed how different collision boxes are transformed when rebuilding physics meshes. Convex collision transforms are now correctly taken into account, and spherical and capsule collision now gets correctly translated when a scale is applied to the start or the end of the spline mesh.

Optimized physics rebuilding. A new Body Setup object is now only created when needed, otherwise it is reused.

Fixed Spline Mesh collision building so that geometry does not default to being auto-inflated in PhysX.

Bugfix: Updated Actors placed in the current viewport to no longer snap to surfaces if surface snapping is disabled.

Bugfix: Fixed an issue where compiling a parent Blueprint would sometimes result in all of its child Blueprint assets adding toast notifications that they require check out.

Bugfix: Updated the Rotator UI showing Roll/Pitch/Yaw in some places. It will always show as X/Y/Z now.

Bugfix: Improved the "Repaired Painted Vertex Colors" log message. This is now done once on levels at load in the editor, instead of for every component (massive log spam). Total load time caused by the fixup is reported.

Bugfix: Updated auto-reimport to now be disabled inside an editor running in unattended mode.

Bugfix: Fixed an issue where editing condition property value changes would not propagate to instances of template objects.

Bugfix: Updated the Fbx importer to now prevent importing a mesh with a size of zero and log a message to the user.

Bugfix: Fixed an issue where audio was being disabled after recording a movie.

Bugfix: Fixed an issue with Decal Visibility so that its behavior matches other visible actors with regard to the "Actor hidden in game" flag. This also makes it possible to animate it's visibility correctly with sequencer.

Bugfix: Updated nodes in folders to be filtered so that other unfiltered children aren’t visible.

Bugfix: Fixed an issue when parsing LOD in a Static Mesh component when importing custom properties.

Bugfix: Fixed an issue where selecting a color with the eyedropper tool would sometimes prevent the user from being able to Play in Editor.

Bugfix: Fixed an issue with a localization warning that would happen when you opened the GameMode menu.

Bugfix: Fixed a longstanding issue where sometimes BSP geometry was not correctly rebuilt after editing vertices in geometry mode.

Levels with incorrectly built geometry (due to invalid poly normals) will now issue a warning in the log upon load, and can be fixed by resaving the level.

Bugfix: Fixed a thread metadata warning in the output log when using the project launcher in the editor.

Bugfix: Fixed an issue with Actor position being set to origin after using undo.

Bugfix: Fixed an issue where the output log was prevented from remaining anchored to the bottom of the window.

Bugfix: Fixed an issue where sometimes spline components were debug rendered incorrectly when not selected in the editor.

Bugfix: Fixed an issue where the "All Classes" tab of the mode panel would not refresh when a new class was added to the project.

Bugfix: Fixed an issue where the surface properties of a BSP would erroneously persist in the details panel after the BSP was deleted.

Bugfix: Fixed an issue where the transform gizmo would prevent a user from dragging a material onto a mesh.

The JSON importer for a Data Table was appending the new data to the array rather than replacing it. It now clears the array prior to importing.

Bugfix: Fixed an issue when moving translation of the child when attached to the mirrored parent in viewport.

Bugfix: Fixed an issue when multi-selecting scaling when objects are rotated.

Bugfix: Fixed an issue where Post Process settings for blendable picker were not readable in the Details panel.

Bugfix: Fixed an issue with single player PIE so that the window position is correctly fetched and saved, even when running a dedicated server. This does not interfere with stored positions for multiple client PIE.

Bugfix: Fixed an issue where geometry operations were not undoable (eg. Material Placement).

Bugfix: Fixed an issue where foliage instances were not being included when exporting a scene to FBX.

Bugfix: Fixed an issue where the Launcher Profile settings window was not always showing all available maps for cooking.

Bugfix: Fixed the "Game Gets Mouse Control" setting in the preferences for the Level Editor to be correctly applied when Playing in Editor.

Bugfix: Fixed the names of Automation tests within the standalone Session Frontend to be displayed correctly rather than as solid white blocks.

Bugfix: Fixed UnrealGameSync to now exclude deleted files when searching for the editor target name, which was sometimes preventing the editor from launching.

Bugfix: Fixed UnrealGameSync so that syncing no longer fails if the current workspace has files open for move or add.

Bugfix: Updated structs to export as JSON when displaying them in the Data Table editor.

Bugfix: Updated the F4 debug key binding to match what is in ShowFlags.cpp.

Bugfix: Fixed importing a morph target so that it no longer imports textures and materials for a base mesh that has already been imported.

Changed the 'Merged Physics Data' flag in the Merge Actor tool to be true by default in order to match user expectation.

Disabled the Paste context menu action if a property in the Details panel is marked as "EditConst".

Updated importing assets into a level so that assets that do not come from FBX or OBJ files are no longer supported.

Improved the performance of the details panel when thousands of objects are selected.

Improved moving parent & grouped child actors so that it now does not result in deltas being applied twice.

Updated the Editor so that new windows will no longer open in between monitors when the primary monitor is not set to monitor 1.

Improved DataTable import/export.

Improved mesh vertex color painting:

Lower LODs are now automatically fixed up for instances which were created in a previous bugged version of the engine.

Since lower LODs cannot currently have their vertex colors edited, their vertex colors are always derived from LOD0.

A bug has been fixed when building lower LODs so that vertices in neighboring octree nodes are considered when looking for the nearest vertex from LOD0 which corresponds. This improves the appearance of lower LODs' vertex colors.

An issue has been fixed where static meshes with imported LODs would not have the lower LODs' override colors set when "Copy instance vertex colors to source mesh" was used.

Various crashes when using mesh paint mode have been fixed, e.g. when selecting a previously selected mesh, when deleting an asset which has an instance currently selected.

Improved MemoryAnalyser2:

Upgraded to Visual Studio 2015.

Clean up solution configurations. Only leave "Any CPU".

Switch project to build with "Any CPU" rather than "x64".

Content Browser

New: Added the ability to select a base Physical Material class when creating a new Physical Material.

Bugfix: Fixed a crash caused by the Content Browser allowing drag and drop operations to import assets while the File Picker dialog was opened.

Bugfix: Fixed a crash for an issue that could occur when a class and a folder have the same name.

Bugfix: Fixed an issue where Blueprint Actors would sometimes appear in the preview thumbnail of other assets.

Bugfix: Fixed an issue where a Skeletal Mesh asset was prevented from editing thumbnails in Thumbnail Edit Mode.

Bugfix: Fixed an issue where Material thumbnails would display an extreme close-up of the material rather than the entire preview asset.

Bugfix: Fixed an issue where there was a duplicate "Font" entry in the asset picker menu.

Bugfix: Fixed an issue with the selection of objects in the Content browser from WorldSettings.

Redirector objects are now deleted after selecting the "Fix Up" option from their right-click context menu.

Updated World thumbnails no longer cull primitives.

This is because the camera is very far away and if terrain pieces are culled, the level is not visible.

Bugfix: Fixed an issue with foliage being placed on top of Blocking Volumes.

Bugfix: Fixed a hang that could happen when changing a material which is used on a Landscape.

Bugfix: Fixed an issue causing the incorrect UV coordinates when tessellation is enabled for Landscape.

Bugfix: Fixed an issue where the Landscape flatten target grid preview is displayed on the wrong Landscape when switching landscape target.

Bugfix: Landscape "continuous" sculpting now works in multiple viewports.

Bugfix: Fixed an issue with Landscape "Layer Alphamap Type" being visible when in "New Landscape" mode even though it only affects "Import".

Bugfix: Landscape layer import can now be undone.

Bugfix: Fixed an issue where Landscape spline control point meshes were being offset if "Place Spline Meshes in Streaming Levels is ticked.

Bugfix: Fixed an issue where Navmesh generation would use Landscape simple collision issues with Landscape Holes.

Bugfix: Fixed an issue where new Landscapes would render with the material’s layer preview weights instead of using the actual (all 0) weights.

Bugfix: Fixed an issue where Landscape Splines were not able to be extended if the current level was different to the selected spline.

Bugfix: Fixed an issue that would prevent selecting Landscapes from the World Outliner while in the "new Landscape" tool.

It will now switch to editing whenever Landscape you select.

Bugfix: Added the ability for Landscape Grass Type to exclude decals by using the Receives Decals member.

If a landscape material contains both a "Layer Blend" node and other landscape nodes referencing some of the same layers (e.g. sampling a layer for grass), the landscape editor will now use the ordering from the blend node for the target layers list.

Stopped Landscapes compiling so many shader combinations.

Material Editor

Bugfix: Fixed a crash when editing text in "Libraries Category Text" field of a material function.

Bugfix: Fixed a crash when pasting a material function call node from one project to another in which it is not defined.

Bugfix: Fixed an initial hitch when dragging around in a Color Picker opened from a Material Expression node.

Bugfix: Fixed undo and redo to now work correctly when making changes to Material Functions.

Matinee

Bugfix: Fixed an issue preventing keyframes from being added when an asset browser was opened in the same window as Matinee.

New: Added support for the named "PerformanceCapture" event which, like Matinee, calls Performance Capture in the Engine to output a screenshot when the event fires.

New: Added the ability to show the Context Menu for more than one selected node.

Certain operations (ie. Lock, Active, Label) now operate on all the selected nodes.

Bugfix: Fixed a crash when right-clicking on a grouped vector keyframe in the timeline.

Bugfix: Fixed a crash which would happen sometimes when rendering a movie in a separate process.

Bugfix: End any transactions on mouse down that weren't ended cleanly.

This fixes a bug where if you drag with the left mouse button and click with the right mouse button, the transactions are left in an ambiguous state.

Bugfix: Updated the Event track to no longer fire if the playback status is stopped.

This fixes a bug where when playback is stopped and the movie scene sequence is returned to the start of playback, we don't want all the events from the last playback position to the start of playback to fire.

Bugfix: Find corresponding PIE world actor for "Actor to Record".

This fixes a bug where if you set the actor before PIE and then record, the recording does not work.

Bugfix: Fixed an issue where Skeletal Animations would evaluate one frame ahead of where they were supposed to be.

Bugfix: Fixed an issue where Transforms would not be captured if an anim recorder exists but the skeletal mesh that the anim recorder is supposed to capture doesn't exist.

This fixes the first person template character not getting recorded.

Bugfix: Fixed the countdown timer in the Sequencer Recorder to now draw in Simulate mode as well as Play.

Bugfix: Fixed dragging the leading edge of a skeletal animation section to now adjust the start offset of the animation clip.

Bugfix: Fixed an issue where the Player would stop after 60 seconds. Now assigns the player to a UPROPERTY so that it is not Garbage Collected.

Bugfix: Fixed an issue where the level visibility track would mark animated levels as dirty.

Bugfix: Updated spawnables so that they can not be deleted from the viewport.

Bugfix: Fixed an issue where Blueprint classes as spawnables were not being re-instanced correctly.

Bugfix: Fixed an issue where jitter would happen when jumping around in Sequencer.

Bugfix: Fixed an issue where Sequencer would redraw all viewport when in PIE.

Bugfix: Updated node selection so that the selected nodes now only update if they have changed.

This fixes a bug in the curve editor where undo re-selects and auto-frames.

For legacy, properties with the CPF_Interp flag can be animated in Matinee. It does not require the CPF_Edit flag as well. This makes Sequencer consistent with Matinee.

Optimized adding keys to rich curves to improve performance when recording data with the sequence recorder.

Set the times and values at once as an ordered set.

Removed curve editor visibility as a toggleable config.

It is now just a toggleable state that defaults to false.

This fixes unexpected behavior of staying in the curve editor when restarting the editor or switching to a different level sequence asset.

Renamed "Expose to Matinee" to "Expose to Cinematics" in Blueprints.

Select actors for corresponding selected keys or sections.

Set event track evaluation order to fire first.

This fixes some ambiguity and also a bug where transform tracks don't evaluate completely if the eval position is changed in the middle of evaluation.

Set relative location, rotation, scale explicitly to identity instead of calling Reset Relative Transform because we don't want overlaps to fire until after the update pass.

Improved recording indicator icon, text & timer.

VR-Editor

New: Updated foliage mode to now be fully integrated with VR Editor mode. You can paint down foliage while in VR!

New: Added World button to the Quick Select menu to allow access to the World Settings menu.

Bugfix: Fixed an issue where duplications could not be undone.

Bugfix: Updated laser double-click events to now be sent when the trigger is pressed rather than when it is released.

Bugfix: Fixed an issue where the Mesh Paint tool was not showing the Brush Preview.

Bugfix: Fixed an issue where Foliage tools were active even without the controller’s trigger being pressed.

Foliage reapply tool.

Foliage Lasso tool.

Bugfix: Fixed an issue where the laser’s hover point in the VR Editor actor wasn’t projected onto the corrected plan while rotating, translating, and scaling using gizmo.

This fix snaps the hover point to the nearest line or plane according to the transformation.

Bugfix: Fixed an issue where the brush preview was still present while using a Foliage brush and hovering on top of the UI.

Removed the "Simulate" button in the toolbar of the blueprint editor while in VR Editor mode because we currently cannot simulate in this mode.

Gameplay Framework

New: Added support for multi-jumping to Character Movement, and fixed infinite jumps when Jump Max Hold Time is set.

New: Added "Mixed" replication mode for active gameplay effects.

This will replicate active gameplay effects normally to their ability systems component's owner, but replicate a stripped down version to non-owners. This can help reduce bandwidth by as much as 2 KB per second.

New: Added max depenetration distance settings for the Character Movement Component. Added controls to throttle logging when character is stuck in geometry so it doesn't spam the log.

Depenetration settings are separated based on whether overlapping a Pawn versus other geometry, and furthermore by whether the Character is a proxy or not. Simulated proxies typically should not depenetrate a large amount because that effectively ignores the server authoritative location update.

"Stuck" logging is controlled by the console var "p.CharacterStuckWarningPeriod". Set to number of seconds between logged events, or less than zero to disable logging.

New: Added new "Load Level Instance" Blueprint node, which allows to create multiple transformed instances of a .umap without having to include in persistent level's list.

New: Added new Blueprint library math/vector functions: "Find Closest Point On Segment", “Find Closest Point On Line”, “Get Point Distance To Segment”, and “Get Point Distance To Line”.

Fixed comments on "Find Nearest Points On Line Segments".

Fixed comments on "Point Dist To Line", and renamed "Line" parameter to "Direction".

New: Added player Connect and Disconnect events to GameMode.

New: Added the ability to separate players in local multiplayer for the Keyboard and Gamepads by using the setting "Offset Player Gamepad Ids" in the Project Settings under Maps & Modes.

New: Added the ability to Get and Set the controller ID of a player controller from Blueprints.

New: Added the ability to Get and Set Tick Interval for Actor and Component primary ticks from Blueprints.

New: Updated Cheat Manager so it can now be subclassed via Blueprints and properties can be set for the Player Controller and Debug Camera Controller.

New: Exposed "Override With" and “Copy Properties” in Player State to Blueprint Children.

New: Added check to Post Actor Construction to avoid a Begin Play call on an Actor that is Pending Kill.

New: Anim Root Motion was applying too much velocity to Character Movement when framerate is low causing moves to be substepped, or when movement mode changes during root motion playback.

Added "Anim Root Motion Velocity" to the Character Movement Component to track last velocity extracted from anim root motion.

Bugfix: Fixed a crash when cancelling PIE while in the middle of a seamless travel as a client.

Bugfix: Fixed a crash in Game Session if the GameMode’s Player State Class has become null.

Bugfix: Updated Character movement to make sure the Last Update Location, Rotation, and Velocity are updated on client and server error corrections. The Force Position Update function calls Perform Movement regardless of velocity (there may be root motion or gravity effects).

Bugfix: Updated Child Actors in a sublevel to no longer lose customizations made by the owning Actor's construction script when hiding and then unhiding the level.

Bugfix: Updated Child Actors to no longer sometimes collide with objects at the origin when spawned.

Bugfix: Updated Data Assets to now correctly report their size.

Bugfix: Fixed an issue where Actor Attachment Replication was not being cleared on detachment, which would cause issues with the actor's location for clients joining in progress.

Bugfix: Fixed an issue with Model Component replication in client/server PIE if BSP has been rebuilt.

Bugfix: Updated comments on "Load Game From Slot" and “Delete Game in Slot”.

Bugfix: Fixed an issue where Mesh smoothing on clients was causing a popping briefly when crouching.

This was due to a change in 4.12 where we started smoothing from Z location rather than always zeroing it (in certain movement modes).

Bugfix: Fixed an issue where the Root Motion network connections were not clearing the Root Motion Data, which would cause clients to jitter.

Bugfix: Fixed an issue where it was not possible to stream in a sub-level whose name is a substring of another sub-level.

Bugfix: Fixed an issue where an Instanced Static Mesh Component would not keep its instances when copy-pasting in the Editor.

Bugfix: Updated the "Hidden In Game" checkbox to now be properly displayed when editing Scene Component properties.

All our "Contains NaN" tests are in fact "Is NaN or Is Infinite", which is the same as "not Is Finite", so exploited this to simplify the tests. Both NaN and +/-Inf are not finite (http://en.cppreference.com/w/cpp/numeric/math/isfinite). In the future we should rename "Contains NaN".

Learning Resources

Content Examples

New: Added TP_VirtualRealityBP to list of Blueprint templates

Localization

New: Updated the Dialogue Wave voice actor so the direction can now be localized.

Also, exported dialogue scripts now include a column that says whether they have a localized recording of that line of dialogue.

Bugfix: Improved changing the loading phase of a target in the localization dashboard to now write to the default config.

Bugfix: Fixed an issue where game targets were not being able to depend on other game targets in the Localization Dashboard.

Bugfix: Fixed Issues with gathering text from Blueprint Byte code.

Bytecode in Blueprints is very volatile, and can only be safely gathered after it's been compiled (which is not guaranteed to have happened by the time we save the package). This change avoids caching any assets that contain scripts (non-data-only Blueprints), and instead will always load them to perform a gather (which will ensure the Blueprint bytecode is up-to-date due to compile-on-load).

New: Added ability to skip over RPC parameters that have changed in replays for backwards compatibility.

New: Allow Oodle captures to be generated in shipping configurations.

New: Improved support for streaming levels in replays.

New: Created a batch file, ExtractAllArchives.bat, which can pull down Oodle captures stored in Amazon S3.

New: Created a batch file, BuildDictionary_Generic.bat, that can generate an oodle dictionary from capture files in an arbitrary location.

New: Low level network code will now notify the game of two new error types to be handled (Net Guid Mismatch or Net Checksum Failures). This kind of errors occur when there are incompatibilities in between client and server, usually because different cooked data is involved. This shouldn't occur in properly shipped builds but is good during development when the possibility to mix and match builds might happen on accident.

New: Made some Oodle trainer commandlet improvements:

Added a command line parameter to many Oodle trainer commandlet tasks for a changelist number to only process capture files from a specific changelist.

When processing Oodle capture files, the Oodle trainer commandlet will now also look recursively in subdirectories.

Refactored how the Oodle trainer commandlet processes capture files to make it easier to add new command line options for different tasks.

Added extra logging in the form of "UPendingNetGame::InitNetDriver: Sending hello: 127.0.0.1" to help diagnose connection issues.

Highly optimized replay checkpoint recording to take about 50% less time.

Improved playback quality of character movement for replays that are recorded on a client.

Keeping track of the number of actors stat (STAT_NumActors) is now more efficient.

Improved 'Too many calls to RPC' log message informativeness.

Removed unused "In Bunch" constructor.

The Oodle trainer commandlet will now only process capture files that end with the .ucap file extension.

Online

New: Added PS+ check to account privilege check.

New: Move Curl and PS4 HTTP request processing to a separate thread. HTTP manager will now start and tick HTTP requests on its own thread, removing the processing from the game thread. Hitches in HTTP requests no longer impact the game thread, and HTTP requests can be ticked more frequently by adjusting [HTTP] Http Thread Tick Rate in .ini config files.

New: Online Subsystem modules have been moved to Plugins, out of Engine/Source. Engine's dependency on OnlineSubsystem modules have been removed, in some places replaced with a new interface UOnlineEngineInterface for a small subset of features Engine requires. UOnlineEngineInterface is implemented in UOnlineEngineInterfaceImpl. FUniqueNetId and FUniqueNetIdWrapper have been promoted to a basic type in core, but they are still opaque types and must be created by online subsystems.

New: Added -port command line option for the Steam Online Subsystem.

Bugfix: Fixed a rare bug in the Build Patch Tool that would cause a manifest to not contain a chunk's information.

Bugfix: Fixed shutdown crash in HTTP request completion delegate.

The "Cancel Find Sessions" function in Online Session did not null out search result for LAN results. Future Find Session calls would fail with "search in progress".

Bugfix: Fixed crash that could occur when the Phys Scene pointer was null (the world has no Physics Scene) in the Skeletal Mesh Component’s Term Articulated function. That could happen when loading a world without fully instantiating it, such as when right-clicking a world in the context browser rather than opening the world directly.

Bugfix: Fixed crash when using very large simulation meshes for clothing - limits have been increased and it is no longer possible to import a simulation mesh that is too large.

Bugfix: Fixed a crash in sub-stepping by limiting skeletal mesh bodies to be in either the sync scene or the async scene, but not both. Simplifies a lot of code and improves performance.

Bugfix: Fixed hit events on a skeletal mesh component not respecting the AND between a skeletal mesh component and the ragdoll bodies.

Bugfix: Fixed the case where physics hit events were passing the wrong component's bone info to the hit event.

Removed call to set a frame decay constant on destructible shapes in PhysX. This was used to better settle large piles but was slower to process. PhysX can now handle this better so it is no longer necessary.

Platforms

New: Added a setting to make the game window preserve its content's aspect ratio while being resized by user. This is on by default.

New: Added support for encrypting .ini files from the Project Settings and the Project Launcher.

New: Added support for the Unreal Front End to launch to multiple devices at once.

Linux

Bugfix: Arguments passed to clang for the Linux Tool Chain now properly escape.

Mac

New: Added a command-line switch for Mac "-RedirectNSLog" that will capture the output of NS Log using an NS Pipe and write it into our log instead when not running under the debugger, thereby capturing output from underlying libraries that would otherwise be lost when outside a debugger.

New: Added more Metal statistics that track the number & memory size of id's allocated and released each frame.

New: Added more information to the engine log for, OS X version information, Mac model, CPU name, and number of virtual cores to improve our ability to reproduce bugs and report errors to Apple.

New: Added View->Enter Full Screen menu item for games on Mac.

New: Consolidate optional Metal feature support in Metal RHI for the latest versions of Apple's products.

Support native Depth-16 texture formats where available.

Use native stencil texture views for accessing the stencil component of a depth-stencil texture rather than copying the data to a temporary texture when available.

Expose support for the optional Base Vertex Index & First Instance draw call arguments on newer iOS devices that support them as well as on Mac.

Expose support for indirect draw and dispatch calls on newer iOS devices as well as on Mac.

New: Implemented rudimentary runtime debugging of Metal RHI with several different levels of complexity controlled by the new console-variable "rhi.Metal.RuntimeDebugLevel".

By default "rhi.Metal.RuntimeDebugLevel" is 0 (off) & it is compiled out for Shipping - when enabled each higher level collects more data or changes the Metal RHI behaviour to make a command-buffer failure mode debuggable at the expense of performance.

In order for this to work the number of command-buffers that may be allocated from the command-queue is also controllable via a console-variable "rhi.Metal.CommandQueueSize" which must be set prior to startup.

Bugfix: Fixed Metal's internal buffer pool to ensure the CPU and GPU are not accessing a buffer at the same time by only returning a buffer to the pool upon completion of the last command-buffer that uses it.

Bugfix: Fixed rendering of Atmospheric Fog on Metal without affecting other platforms with a minor change to the shader and by using the precise Metal intrinsics for floating point operations.

Bugfix: Fixed an issue with Screenshot and movie capture of gameplay on Mac when using Metal to render by inserting an intermediate render-target between the game and the back-buffer.

Bugfix: Fixed uninitialized Head Position from HMD tracker when tracking fails resolves a problem with A3D audio not working.

Bugfix: Fixed an issue where two different PS4RHI helper functions had the same name and signature, "handleReserveFailed", which caused unity builds to fail. The names have been changed to address this.

Smooth Frame Rate now defaults to False.

Improved checking that correct SDK is installed.

Xbox One

New: Added an example of adding rating information to a title manifest has been added to ShooterGame.

New: D3D resources can now be created directly on the Render Thread, removing frequent stalls of the RHI thread.

New: Framerate smoothing is now allowed on Xbox One. Default is set to off.

New: Oodle network traffic compression is now enabled for Xbox One.

New: Update Texture 2D can now be done directly on the render thread, removing stalls on the RHI thread.

New: Xbox One now supports the August 2016 XDK by default.

Bugfix: Fixed a crash when disconnecting controllers which only occurred if games have been built with Visual Studio 2015 Update 3.

Bugfix: Eliminated a circular dependency on Xbox One target settings that could cause settings to not load in the editor.

Bugfix: Fixed ESRAM issues that were causing some odd rendering at times (bloom would be super bright along the bottom of the screen). This fix is also a performance win in some cases.

Bugfix: Fixed an issue where in some cases a game would not launch if a localized resource value (i.e. Project ID or Description) was not set.

If these values are empty, a default value of "" will be used so that the project can run. A warning message will also be printed to the log. Make sure to set these values before shipping.

Bugfix: Fixed an issue where builds could fail if more than one version of the XDK was installed side by side.

Bugfix: Fixed an issue where composite fonts created before the release of hardware decompress support would not load correctly.

Bugfix: Fixed an issue where Product Id, Content Id, and Sandbox Id values were being read from the wrong INI when packaging.

Bugfix: Fixed an issue where streaming Install chunks would attempt to mount before completely downloaded.

This issue affected large chunks where the OS reports 100% progress before the chunk completes downloading.

Mounting now waits for the "Chunk Completed" event to be fired by the OS.

Bugfix: Fixed a memory leak of 3D textures.

Bugfix: Fixed an issue with missing GPU particles when Fast Semantics was enabled.

As a result, Fast Semantics is now the default RHI on the Xbox One for 4.13.

Bugfix: Fixed an issue where the reflection environment was appearing bright green on some maps.

Moved the Xbox One platform settings into the default INI files so they are available to the PC tools and settable in the editor.

Removed CPU/GPU sync when updating/unlocking textures.

Deferred deletion of Xbox One D3D resources moved to happen once per real frame as there were circumstances in which it could be called more than once (rendering cube map faces, etc). As a result the latency of deletion has been reduced to two frames, saving memory.

Dynamic vertex/index buffers use less memory when locking/unlocking. This is also a performance improvement in some cases.

Improved processing of system events during load.

This will allow a game to suspend earlier in the loading process.

Large memory savings when locking/updating textures as we now only allocate a linear copy of the mip/array slice that is being locked, rather than the entire texture.

Occlusion queries now use 8x less memory than in 4.12 by packing 8 queries into each 256 byte allocation.

Optimized many calls in the Xbox One D3D11 state cache.

Shaders now use less memory, as intermediate DXBC bytecode has been stripped away in all possible cases.

New: Added Composite Mode to Scene Capture 2D, which can be used to additively accumulate or composite instead of the default overwrite behavior.

Added "Capture On Movement" to Scene Capture, which can be disabled so the only source of scene capturing is a manual capture by calling Capture Scene.

New: Added the Console command "r.DumpShaderDebugWorkerCommandLine" to generate a file when dumping shaders to be able to debug using the Shader Compiler Worker's -directcompile.

New: Added support to be able to set a Canvas Render Target 2D NOT to clear to green whenever it's updated (so you can just draw pixels that have changed instead of always having to redraw everything).

New: Capsule shadows are now supported in stereo (VR).

New: Create Project Settings to optionally disable certain rendering features which cause extra shader permutations and extra shader compile time if they are not required for a given project.

Can be found under Project Settings > Rendering Overrides (Local).

If an attempt to use a disabled feature is made, a warning will be displayed.

New: For use when doing automated screenshot verification, the new console command "r.ResetViewState" will reset some state (e.g. Temporal AA index). This allows for more deterministic tests.

New: Added a new Blueprint function "Clear Render Target 2D", which is the only way to set a render target alpha directly.

Support for a directional light in the base pass, which can be shadowed either by distance field shadowmaps or a single shadow factor from the Indirect Lighting Cache.

Binding and outputting to GBuffers is disabled when using simple forward shading, along with dependencies of the GBuffers.

Specular, normal maps and the 3rd SH band of skylighting are all hardcoded off. Materials are forced fully rough.

Enabled with "r.SimpleForwardShading 1", which can be changed at runtime.

Added "r.SupportSimpleForwardShading", which determines if the necessary shaders are compiled.

Removed "r.SimpleDynamicLighting", whose functionality (unshadowed directional light in the base pass) is a subset of simple forward shading, and was unused.

Added "FreezeRendering" to the console autocomplete list.

Added "ProfileGPU" to the console autocomplete list.

Corrected a misleading help comment on "r.StaticMeshLODDistanceScale", explaining how it affects LOD calculations (it multiplies the effective distance, so larger numbers make transitions happen sooner).

Updated to d3dcompiler_47.dll offering large speed-up in shader compilation times.

Mobile Rendering

New: Added support for lighting channels on mobile.

Multiple directional lights are supported in different channels but primitives are only affected by the directional light in the first channel they have set.

Bugfix: Fixed performance regression introduced in 4.10. Compute pixel world position in vertex shader instead of doing it in pixel shader.

Mobile DoF now requires DoF type to be Gaussian otherwise DoF will be disabled.

UI

Bugfix: Fixed a regression that broke safe zone debugging features in Windows.

Bugfix: Fixed an issue in a Slate List Panel so that those with horizontal arrangement (i.e. from Slate Tile View) use the number of desired items instead of the number of actual items in order to calculate the desired size of the geometry.

This fixes the case where a Slate Tile View is contained within a Slate Scroll Box; the Slate Tile View is now allowed to expand to its full size within the Slate Scroll Box.

All textures in the UI texture group (TextureGroup_UI), should now render a lot smoother if they have mipmaps. Removed code that was forcing all UI textures to mip level 0. If this behavior was desired by anyone, you can use the cvar "r.ForceHighestMipOnUITextures" to re-enable it.

Sound Concurrency asset now has a unique icon.

Slate

New: Added input settings:

Control if the viewport locks the mouse on acquire capture.

Control if the viewport acquires capture on the application launch (first window activate).

New: Slate Remote Server (for the iOS touch input app) is now disabled by default, so we do not open up the socket unless desired by the user.

Bugfix: Fixed a crash if a Slate widget tried to refresh itself while the editor is shutting down.

Bugfix: Fixed a crash that could happen when the fallback/last resort font was missing.

Bugfix: Fixed a potential crash when shutting down Slate if the font services were shut down first.

Bugfix: Fixed regression in editable text box alignment.

Text was no longer vertically aligned center since editable text was converted to use a text layout. This vertical alignment is now handled by the outer editable text box instead.

Bugfix: Fixed some measuring issues with bi-directional text within a right-flowed document.

This could cause text to sometimes significantly under-measure and lead to wrapping issues.

Significant performance improvements when pasting a large amount of text.

Made sure the slide handle of a Slider Widget no longer gets cut off at the edges of the slider.

Slider widget will no longer consume OnKeyDown events that they do not handle.

Updated ScrollBy function on ScrollBox widget to work properly when called while the widget is animating.

UMG

New: Added ability to replace the widget the track is currently bound to. Also includes changes in Widget Blueprint Editor to send delegate to Animation Tab Summoner when switching from Graph to Designer.

New: Adding ability to animate the root (owner) widget in UMG.

Hierarchy Root adds the preview widget instead of the CDO to selected objects in widget blueprint. The properties are then migrated back to the CDO.

New: Added additional styling options for the default items that are created in the combobox, such as Font.

New: Updated playback speed so that it can now be specified when starting a UMG animation.

New: Updated the Palette in UMG to no longer display widget content coming from Engine or Developer folders, based on the same setting configured in the content browser. If you're not showing Engine content in the Content Browser, you should no longer see all the User Widgets that were added to support the VR Editor.

New: Updated the Widget Component to extend from the Mesh Component. It can now have a custom material applied to it in order to achieve cooler effects - like ignoring the depth buffer.

Users who use this option are encouraged to start with the widget components default material and work from there, as you need to start by sampling a texture parameter called Slate UI.

The widget component now offers the ability to automatically size the render target to be the desired size of the widget - note that this could go really bad if your widget's desired size is very large.

New: Added a new Slate Texture Atlas Interface that any UObject can now implement if it wishes to integrate with UMG to provide texture atlas data in a form Slate can understand and render.

For reference you can look at "Paper Sprite" which implements this interface allowing Paper 2D Sprites to be used on Slate Brushes.

New: Added meta flags for "Determines Output Type" and “Dynamic Output Param” to “Get All Widgets Of Class” in the Widget Blueprint Library, removing the need for the extra cast.

The output pin now becomes the same as the type requested.

New: Worked on better support for VR interactions with Slate widgets by introducing the Widget Interaction Component and performance improvements to the Widget Component.

Direct mouse interaction with World Space widgets in the virtual world is no longer supported. Those kinds of interactions must all use the Widget Interaction Component now.

Performance improvements - the viewport no longer arranges all 3D widgets every frame.

Widget Components now support several methods for reducing how often they redraw to help control performance, they also support manual refresh. This automatically works in tandem with the widget interaction component to request refresh whenever the widget interaction component is interacting with the widget, thus giving you a simple way to only redraw widgets that the user is hovering over them.

Bugfix: Fixed a crash when using "Use Selected asset from Content Browser" for font materials when the selected asset is not a material.

Bugfix: Fixed animation playback not playing the full length if it starts on a negative time.

Bugfix: Fixed a bug where magenta-color text added to a Widget Blueprint would turn gray when the blueprint was compiled.

Bugfix: Fixed Widget Component to render widget in the correct position when Constrain Aspect Ratio is enabled.

Bugfix: Fixed a bug where audio track from UMG doesn't play correctly in PIE.

Bugfix: Fixed "Is Hovered" on “User Widgets”. The Object Widget did not properly call the super for Mouse Enter/Mouse Leave preventing the Widget's implementation from setting the correct state.

Bugfix: Fixed the "Designer Rebuild" flag detection so that we can just refresh the slate widget without recreating the preview UObject, which causes the destruction of the details panel, and the slate widget recreation was the only part that was required.

Bugfix: Fixed an issue where the web browser widget plugin wasn't loading soon enough to be properly loaded in time if it was referenced by game content that loads in the Default stage of the pipeline, so moving it to PreDefault.

Set viewed animation to current animation after switching from Graph to Designer (This is for "No Animation Selected" showing up when switching).

Removed the "Designer Widget Tree", instead directly injecting the widget tree into the partially constructed User Widget during design time, when refreshing the preview.

This avoids updating the living class instance with a new designer tree that all new instances of the class would become biased to using.

Making the preview widget explicitly non-transactional as there's no reason to track changes to the preview, all the changes that need to be tracked should be on the template widget. This should fix the crash in the widget designer when you undo just after compiling the widget blueprint.

Changed the Input Key Selector Widget to no longer add a bogus Selected Key property to the details panel.

Updated the Slider widget to now allow the thumbsticks to also control movement of the slider when it's in edit mode, via controller input.

Widgets transferred from one Widget Blueprint to another Widget Blueprint will now allow both to render and compile correctly.

VR

New: Added a "Start in VR" project setting, which will force a project to try and start in VR mode, regardless of whether or not it has -vr specified on the commandline.

New: Added additional Motion Controller types, to allow for extension to devices that have more than just left and right trackers.

New: Added GoogleVR (Cardboard) support for iOS, updated SDK.

New: Added in "Get HMD Device Name" function to the HMD function library, which allows you to identify which plugin (e.g. Oculus Rift, SteamVR, PSVR) is currently active.

New: Added Oculus 1.6 runtime support.

New: Added fix for flickering shadows on translucent surfaces in VR.

New: Updated haptics system so that it can now take a buffer of values to playback asynchronously on devices.

New: Added PlayStation VR '2DVR' reprojection mode.

2DVR is a way to display a static image on a quad temporarily while in VR output mode. Intended for loading screens, etc.

Exposed to blueprint through Morpheus Function Library.

New: Implemented HMD Setup dialogs for PlayStation VR at startup and if the HMD is disconnected at runtime.

Navigation

New: Added a static UNavigationSystem::bStaticRuntimeNavigation flag that can be used to short-circuit dynamic navigation-related functions.

New: Added meta navigation paths handled by FMetaNavMeshPath class. They are using an array of points to define the shape of a high-level path and automatically expand traversed section into regular navmesh path during path following.

New: Pathfollowing Component now stores information that current move segment is a navigation link.

Bugfix: Fixed AITask_MoveTo being responsible for some observed navigation paths not getting released.

Bugfix: Fixed hash function for FRecastDebugPathfindingNode.

Exposed UNavigationInvokerComponent as part of ENGINE_API so that it can be spawned procedurally in C++ in game-specific code.

Animation

New: Added check to PostUpdateAnimation to highlight when game code causes it to be called recursively.

New: Added some extra logging information when a class fails to hot reload.

New: Added static version of FName::IsValidXName.

This allows you to verify name-like strings without having to convert them to an FName (and thus add them to the name table)

New: Added TArray::EmplaceAt for direct construction of array elements at a given index.

New: Added TWeakObjectPtrMapKeyFuncs as the KeyFuncs for TMaps which use TWeakObjectPtr as a key, so that the map is not invalidated when the pointer becomes stale.

New: Added Visual Studio debugger visualization of TTuples of up to 6 elements.

New: All configuration files are now scanned for an Engine section containing TaggedPropertyRedirects. This allows plugin configurations to register their own property redirects in cases where a property's name changes. Please note that this engine section will ONLY be searched for TaggedPropertyRedirects, and no other options are currently inspected for non-Engine configuration files.

New: Async Loading will no longer wait for all packages to finish serializing before calling PostLoad on packages that have already been serialized.

New: Errors are now raised when a UnrealHeaderTool markup is in a skipped preprocessor block.

New: Exposed the Key and Value typedefs for TMap and TSet.

New: FModuleManager::UnloadOrAbandonModuleWithCallback's 'abandon only' functionality has been split into its own function.

New: Garbage Collector will no longer be responsible for generating class token stream. Instead the token stream will be generated on startup or when a (Blueprint) class has finished loading.

New: Made check() calls assume the condition is true even in !DO_CHECK builds.

New: Made FFeedbackContext's Errors and Warnings list thread safe.

New: Made the TAnd, TAndValue, TOr and TOrValue metafunctions variadic.

New: Prevented FStrings being concatenated with integers, as this would concatenate a Unicode character of the value of that integer, rather than the expected decimal string representation of that integer.

New: Split inline shader registration from serialization. Serialization can happen on the async loading thread but registration should only happen on the game thread. Removed a lot of critical section locks.

New: UEngine now defines a Start() function that subclasses can use to start game related things after initialization of the engine.

This is done so that after the Init() call on UEngine, we can then perform a module load for the ELoadingPhase::PostEngineInit phase of loading, then inform the UEngine that it's time to start the game.

UGameEngine now uses the Start() phase to tell the GameInstance to Start, rather than at the base of Init(), before all modules have had a chance to load.

New: Removed the default "Toggle Pause/Play" command keybinding from BaseInput.ini and made this a customizable keybinding option in the "Editor Preferences".

New: UBT on windows will now look for existence of a "UE4CSharp.prog" file next to a C# program project, that would like to be added to the UE4.sln.

Changed function signature for FSequencer::NotifyMovieSceneDataChanged so that it takes an enum describing the type of change.

World Outliner now correctly calls ProcessEditDelete on editor modes that have asked to process delete operations

Landscape

Bugfix: Fixed Landscape class hierarchy.

LandscapeProxy is now LandscapeStreamingProxy.

A new base class has been added for both Landscape and LandscapeStreamingProxy (called LandscapeProxy).

Most code shouldn't notice the change.

Gameplay Framework

New: Added a GetEffectiveFrameRateLimit method to UGameUserSettings, to allow games to override the default behavior for things like a different limit in menus versus gameplay.

New: Added GetSquaredDistanceToBody to FBodyInstance and virtual GetSquaredDistanceToCollision to UPrimitiveComponent.

New: Added minor support to data tables to support game-specific post-import fixup of data

Added ability to mark variables in data table row structs with the meta field DataTableImportOptional, which implies the variable is not necessarily expected to be in the imported source file as a column (warnings won't be generated on import). Useful for variables that will only be populated by a post-import step in code.

Added a new method, OnPostDataImport, to FTableRowBase to allow games to provide custom parsing, fix-up, etc. of data imported into data tables.

New: Added support for UNumericProperty (int64, etc...) and doubles as allowable types in data table structures.

Note: Blueprints still can't access these types, so use is limited to C++ for now.

New: Added time spent in each hitch bucket to the FPS chart .log output and analytics output.

New: AHUD::WhiteColor, GreenColor, and RedColor have been made static const and deprecated. Use FColor::White, Green, and Red instead.

New: Made CalcSceneView and GetProjectionData in ULocalPlayer virtual.

New: Marked engine performance target cvars ECVF_Scalability so they can be adjusted via scalability buckets at runtime for games that target different framerates on different levels of hardware.

New: Scalability buckets can now have more or fewer than 4 entries, controlled by sg.[BucketName].NumLevels cvars.

New: SceneComponent AttachChildren, AttachParent, AttachSocketName are now private. Use GetAttachChildren/Parent/SocketName, AttachTo, or SetupAttachment as appropriate.

New: UActorComponent::GetWorld() marked final and inlined to optimize overhead.

New: Until now the only type used for attributes in the gameplay ability system has been floats. A new type, FGameplayAttributeData, has been added. At some point in the future, support for float based attributes will probably be removed. At that point only attributes using the FGameplayAttributeData struct or a struct derived from it will be valid attributes. Until then it is possible for projects to have both FGameplayAttributeData and float based attributes.

New: Added comment to FHitResult for ImpactPoint to explain behavior when it's penetrating.

New: Added nullptr checks to ProceduralMeshComponent's SceneProxy.

New: Added perf stat for SetHitResultFromShapeAndFaceIndex().

New: GetNetMode() optimizations.

Added IsNetMode() which is more efficient in non-editor builds when considering dedicated servers.

Wrapped in inline functions that check IsDedicatedServer() where possible.

Converted some components to use new methods.

New: AHUD::bShowHUD now defaults to true

New: Minor optimization in UGameplayTagsManager::FindTagNode() to stop taking copies of a tags children array and churning memory.

Bugfix: Crash fix when calling FAudioDevice::CreateComponent as part of shut down.

Bugfix: Fixed issue that could cause the data table reimporter to change the reimported table back to a base Data Table class instance instead of the previously imported subclass, in the event of using subclasses of Data Table.

Bugfix: Fixed overlaps being dropped from within a FScopedMoveUpdate when rotation occurs. Removed invalid assert.

Bugfix: Fixed Net relevant WorldSettings objects so they no longer inadvertently end up in the Actors array twice.

Bugfix: Fixed seamless travel so that if it chooses not to carry a GameMode over, it will now correctly create a new one.

Bugfix: Fixed the UEngine::GetAllLocalPlayerControllers function to no longer add null entries to the output PlayerList array, which was possible in some rare cases before.

Changed the code in AActor::IncrementalRegisterComponents to obey bAutoRegister for the root component rather than asserting that it is true. Note: If children components have bAutoRegister=true, they will still pull the root component into the fray and cause it to be registered first.

Converted TAutoConsoleVariables in CharacterMovementComponent to FAutoConsoleVariableRefs in (renamed) CharacterMovementCVars namespace.

Avoids need for GetValueOnGameThread() which was adding unnecessary overhead and preventing some users from easily multithreading portions of the code.

Prevented ACharacter::bNotifyJumpApex from being editable and cleaned up comments.

Reduced allocations during movement and overlap queries and when fetching shapes from physx actors.

Reduced allocations in UI Canvas items.

Reduced allocations in UObjectBase::CreateStatID(). It throws off profiling results significantly in some cases.

Worked around some of the drawbacks of Windows scheduler. This would occasionally cause hitches on quad core machines with additional load in the tick task manager.

Wrapped call from UCharacterMovementComponent::PostPhysicsTickComponent() to UpdateBasedMovement() in a FScopedMovementUpdate to accumulate moves with better perf.

Localization

New: Added the ability to version each localized string individually when loaded into the localization manager.

The single 32-bit global history has now been replaced with two 16-bit histories. One is global, and is updated whenever the culture is changed (or a LocRes file is loaded), and the other is local to each string, and is updated if the display string is changed outside of a culture update (to handle cases where the display string is changed, but the key is preserved). Changing the global history will reset all local histories.

Renamed FContext to FManifestContext to better reflect its purpose and avoid naming conflicts with other code.

Networking

New: Added support for prioritizing actors for replay recording. This feature can be used along with the per-frame recording time limit (see UDemoNetDriver::SetMaxDesiredRecordTimeMS) to improve playback quality for the important actors in the scene.

This feature is enabled by calling UDemoNetDriver::SetActorPrioritizationEnabled on the recording UDemoNetDriver.

If desired, customize the priority of actors by overriding the AActor::GetReplayPriority function. This works similarly to the AActor::GetNetPriority function for non-replay replication.

You may also override the viewer used for the priority calculation with the UDemoNetDriver::SetViewerOverride function.

New: Added the ability to limit the size of the buffer used by the in-memory replay streamer (FInMemoryNetworkReplayStreamer).

This will prevent the memory buffer that stores the replay data from growing unbounded over the course of a game. Only the most recent data will be kept, so it won't be possible to play back the replay from an earlier time that's no longer in the buffer.

To set the buffer size, call INetworkReplayStreamer::SetTimeBufferHintSeconds on an instance of FInMemoryNetworkReplayStreamer. The implementation will keep at least the most recent desired number of seconds available for playback.

New: Added the ability to pause and resume replay recording, and get the current paused state. See UDemoNetDriver::PauseRecording and UDemoNetDriver::IsRecordingPaused.

New: Added the ability to set a desired per-frame time limit for recording replays. The time is not guaranteed, but setting it can help reduce the CPU load of replay recording in exchange for potentially lower quality playback.

After the time limit is hit, additional actors that would have been recorded on the current frame will be deferred until a future frame. Since these actors are being recorded at a lower frequency, this may cause a reduction in playback quality.

To set the desired per-frame time limit, call UDemoNetDriver::SetMaxDesiredRecordTimeMS on the recording UDemoNetDriver.

This feature may be combined with replay actor prioritization (see UDemoNetDriver::SetActorPrioritizationEnabled) to record important actors at a higher frequency and maintain more playback quality.

New: Updated the FUniqueNetId of a connecting client to be passed along in the client beacons so the server can tell who is making requests.

New: Added ENGINE_API to FRepMovement, as the constructor is in a source file.

Bugfix: Fixed an issue that could cause arrays to get out of sync with the game server when using a FFastArraySerializer with predictive elements and recording a replay on the client.

Bugfix: Fixed an issue where network profiles after the first one created during an execution of the engine would have broken name and address mappings.

Bugfix: Fixed issue wherein replicated actors destroyed on the server would not always be properly destroyed on the client when used in conjunction with network dormancy and queued bunches.

Any actors that are set not to load on the client (bNetLoadOnClient = false) will be force deleted when initializing a level’s actors on a client.

Fixed misspelling in comment in NetworkVersion.h.

Corrected filename case in #include "IPAddress.h" statement.

Online

New: FQosInterface::GetDefaultRegionString() has been replaced by FQosInterface::GetRegionId(). It is just a rename of the function

New: FUniqueNetIdRepl is stored on the UNetConnection and passed into engine login functions rather than TSharedPtr as it is a more robust wrapper of the same data.

New: Added a base class UpdateManager that can coordinate patch and hotfix checks inside a game. Taking advantage of the OnlineHotfixManager class can help setup a basic infrastructure for using that class to check for hotfixes while the game is running.

New: Added an Expiration Date field to FOnlineStoreOffer. This field defaults to Unreal Max Time.

New: Added the capability for actors to temporarily pause replication of themselves over a certain channel. This can significantly reduce bandwidth costs and reduce cheating. ShooterGame has implemented an example - look for AShooterCharacter::IsReplicationPausedForConnection and AShooterCharacter::OnReplicationPausedChanged.

iOS

Linux

Updated LinuxToolChain to use the same output delegate for all of its actions when cross-compiling.

This avoids the compile and link actions being split into different batches.

Mac

New: Added a check if UnrealBuildTool.csproj exists before trying to compile it in Mac GenerateProjectFiles.sh. Fixes a problem in binary distribution where the script would show an error (but still succeed) due to missing UnrealBuildTool.csproj.

Bugfix: Fixed a bug in Kismet where a reference to an element within a TMap was being used to add a new value, which results in use-after-free as the memory is reallocated before initialising the new element.

Made bGeneratedSYMFile true by default and changed some ifs in Mac UBT code so that non-debug configs always build dSYM files on Mac, unless bGeneratedSYMFile is set to false in BuildConfiguration.xml.

Playstation 4

New: Added validation that the texture pool size is not set to automatic (-1), so it fails with a helpful error message rather than a crash attempting to allocate too much memory.

Xbox One

New: Added support for Visual Studio 2015 Update 3.

New: Added the bDisableSymbolCache to the link environment configuration to allow Xbox One builds to skip the creation of the runtime symbol cache.

Disabling the symbol cache creation will slightly decrease build times and increase available memory at runtime, but stacks will be printed without symbols.

New: Changed appWinPumpMessages so that it doesn't rely on the current thread to retrieve the dispatcher.

Changed Unreal Build Tool batch files to use MSBuild version 14 (the version that ships with Visual Studio 2015).

Ensured that UnrealBuildTool on Windows will now prioritize user settings in the My Documents folder over the one in the AppData folder, but reads both files if present. Previous behavior was to ignore the one with the older timestamp.

Updated OpenSSL Runtime Dependencies to include VS2015 and remove VS2012.

Rendering

New: Adapted GetStaticBatchElementVisibility to support changing visibility of batches with a single element (for view-dependent culling of static mesh elements).

Note: Any user-created vertex factory that implements GetStaticBatchElementVisibility will need to set bRequiresPerElementVisibility on their FMeshBatch.

New: Added ability to request a screenshot without a file name, for screenshots that won't be written to disk.

New: Added cvar r.StencilForLODDither, which is compiled into shaders and forces a full prepass when enabled. This allows r.EarlyZPass to remain changeable at runtime (when not forced to a value by features that are enabled).

New: Added cvars that can be used to force the engine to target shader model 4 instead of shader model 5 on cards from a specific vendor (r.ForceAMDToSM4, r.ForceIntelToSM4, r.ForceNvidiaToSM4).

FX

Lighting

New: Refactored shadow depth.

Shadow setup and render target allocation now happens in InitViews, and shadow depth rendering happens at one spot in the frame. This provides control over where shadow depths are rendered for things like async compute, and allows easy atlasing of shadowmaps for forward shading.

The 33Mb of shadow depth buffers in FSceneRenderTargets has been removed, and shadow depth buffers are now allocated as needed. Shadow depth memory is now unbounded which can cause Out of Video Memory in extreme cases.

A large amount of duplicated code to handle each shadow type has been combined.

Cleaner parallel rendering: no more view hacking for the shadow depth pass, no more shadow depths in the middle of translucency.

'vis ShadowDepthAtlas' or 'vis WholeSceneShadowMap' must now be used to visualize the shadow depth textures.

Optimizations

New: Added a cvar that controls unbinding of all texture resources between materials changes in the DX11 renderer (r.UnbindResourcesBetweenDrawsInDX11) to improve the readability of GPA captures, off by default as it has a minor CPU performance impact.

New: Added a scalability CVar for landscape LOD biasing (r.LandscapeLODBias), which can have a huge impact on triangle count and help low-end vertex bound GPUs.

New: Made the optimization to combine upscaling/downscaling and tonemapping optional based on the amount of upscaling that will occur.

r.Tonemapper.ScreenPercentage has been renamed to r.Tonemapper.MergeWithUpscale.Mode.

r.Tonemapper.MergeWithUpscale.Threshold is a new setting used when r.Tonemapper.MergeWithUpscale.Mode is set to 2, which indicates to only try to merge the passes if the ratio of the area before upscale/downscale to the area afterwards is greater than the threshold.

This prevents running the tonemapper on all of the target res pixels when the source res is far smaller, as that can cause it to be a loss to merge the passes.

New: Made sure that Vulkan always runs using an RHI thread.

Removed a bogus autocomplete for ShowMaterialDrawEvents, which was previously renamed r.ShowMaterialDrawEvents.

UI

Moved FSlateIcon definition to SlateCore.

Slate

New: Added FText property handle type.

Required for manipulating FText properties from a slate details customization.

FExternalDragOperation can now contain both text and file data at the same time.

This better mirrors what the OS level drag-and-drop operations are capable of, and some applications will actually give you both bits of data at the same time.

VR

New: Removed ISR's use of SV_CullDistance and now relying only on SV_ClipDistance to cut down on interpolators.

Upgrade Notes

C++ API Changes

SceneComponent AttachChildren, AttachParent, AttachSocketName are now private. Use GetAttachChildren/Parent/SocketName, AttachTo, or SetupAttachment as appropriate.

Replace uses of AHUD::WhiteColor, GreenColor, and RedColor with FColor::White, Green, and Red.

In the HTML5JavaScripteFx.js and .h files, the function signature for UE_MakeHTTPDataRequest() has changed.

With regards to localized strings, because of the change from an int32 to a uint16, 0, rather than INDEX_NONE, is now considered the "unset" value for a history.

FContext (in our internationalization manifest) has been renamed to FManifestContext to better reflect its purpose and avoid naming conflicts with other code

References to the USplineComponent members SplineInfo, SplineRotInfo and SplineScaleInfo should now be replaced by calls to GetSplinePointsPosition(), GetSplinePointsRotation() and GetSplinePointsScale(), respectively.

Overridden implementations of FComponentVisualizer::VisProxyHandleClick must now take a FEditorViewportClient instead of a FLevelEditorViewportClient as the first parameter.

Animation

Added a validation path to see if mesh hierarchy matches with the animation skeleton when initializing animation.

If you have issue with animation not playing, make sure to save the mesh correctly with the skeleton.

Additive APIs are fixed to work with it.

"Get World From Context Object" does not behave the same as in non-game thread.

This causes additive scale to save the difference of scale, which means 0 if no difference. If you're doing any math on those FTransform, it won't work correctly anymore due to 0 scale

If you have issue with animation not playing, make sure to save the mesh correctly with the skeleton.

Additive APIs are fixed to work with it.

Local Atoms has been changed to Bone Space Transforms, and Space Bases has been changed to Component Space Transforms. This includes functions that were accessing those members. The old methods have been deprecated and need to be updated to use the new functions.

Several animation related headers are no longer globally included. This means you may need to include them explicitly if you were using those classes.

Common examples are Animation/AnimInstance.h, Animation/AnimMontage.h or Animation/AnimNotifies/AnimNotifyState.h

The SkeletalMesh.h header is no longer globally included, so you may need to explicitly include it in your project.

The 'rigid' vertex array "Rigid Vertices" in Skel Mesh Chunk has been removed, all vertices are now considered 'soft' (rigid status was not used by GPU skinning). Any code dealing with vertex data will need to be updated.

FSkelMeshChunk has been removed and properties are moved into FSkelMeshSection. Any code dealing with 'chunks' will need to be updated.

Audio

In addition to class changes to support threaded sound evaluation, there are a number of patterns that are no longer viable.

It is no longer safe to reference any game state from a Sound Node. Instead game thread classes should marshall relevant data to audio thread owned structures, using "Run Command On Audio Thread" in the Audio Thread.

Automation

If you experience regressions in automated tests, they may have been ignoring ensures because they were previously classed as warnings.

Core

Code which tries to concatenate a String with an integral value should either explicitly cast to a character type if it should append a char, or changed to use something like "To String" in Lexical Conversion if it should append the string representation of that integer.

Using Throwf in FError and associated catch blocks should be replaced with a regular C++ throw call and proper exception class.

PLATFORM_COMPILER_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS has been removed. This is now expected to be 1 on all supported platforms.

PLATFORM_COMPILER_HAS_VARIADIC_TEMPLATES has been removed. This is now expected to be 1 on all supported platforms.

Specializations of Type Traits which override its "Needs Copy Constructor", “Needs Move Constructor”, “Needs Copy Assignment”, “Needs Move Assignment”, and “Needs Destructor” traits will be ignored and compiler-based traits will be used instead.

HAS_TRIVIAL_ASSIGN(T), HAS_TRIVIAL_COPY(T) and HAS_TRIVIAL_DESTRUCTOR(T) should be replaced with TIsTriviallyCopyAssignable::Value, TIsTriviallyCopyConstructible::Value and TIsTriviallyDestructible::Value respectively.

"TIsFloatType" should be replaced with “TIsFloatingPoint”.

"TIsIntegralType" should be replaced with “TIsIntegral”.

"TIsSignedIntegralType" should be replaced with “TIsSigned”.

"TIsArithmeticType" should be replaced with “TIsArithmetic”.

"TIsPointerType" should be replaced with “TIsPointer”.

"TNoDestructorType" should be replaced with “TIsTriviallyDestructible”.

Use of variables inside a DO_CHECK-only block will not compile if the check() is outside a DO_CHECK-only block. Either both or neither should be inside the block.

When "Unload Or Abandon Module With Callback" in the Module Manager would be called with a third bool argument, that argument should be removed (if the bool is 'false') or replaced by a call to “Abandon Module With Callback”, passing only the module name argument (if the bool is 'true').

You may get errors about a skipped UFUNCTION, UPROPERTY etc. when upgrading. This is an indication that these elements are not reflected and so may be an indication of a bug (e.g. a skipped UPROPERTY which is a UObject pointer will not be tracked by the garbage collector). The usage should be reviewed and fixed, perhaps by removing the markup, moving the element outside of the skipped preprocessor block or some other form of refactoring.

Editor and Tools

Make sure to rebuild the proxy meshes for all clusters.

Gameplay Framework

All Tickable Game Objects should implement the virtual "Get Tickable Game Object World" function to indicate which World they should be ticked with, otherwise they will be ticked after all Worlds as part of the set of tickable game objects that do not belong to a world.

Abilities System

Converting existing float based gameplay attributes to use the FGameplayAttributeData struct is a two step process. First, resave any assets that contain gameplay attributes. Second, replace the float variables with FGameplayAttributeData, or a game specific struct derived from it, in your code.

Online

Online Subsystem modules have been moved to Plugins and must now be included in the plugins section of your project's uproject file and must no longer be referenced via "DynamicallyLoadedModuleNames" in your project's Build.cs files. Game projects can continue to reference Online Subsystem classes as before. Any custom modifications made in Engine that reference Online Subsystem must be routed through the Online Engine Interface.

Windows

The Applocal Prerequisites Directory setting should be set to a base directory that contains files the binary files.

The Applocal Prerequisites Directory can be specified as an absolute path or relative to the engine or project directory using the variables $(EngineDir) and $(ProjectDir).

Files should be laid out within the Applocal Prerequisites Directory in the format \*.dll, where:

is the specific target platform (i.e. Win32 or Win64).

is a unique package name (i.e. UCRT or Microsoft.VC140.CRT).

Rendering

The bounding box of a Static Mesh instance no longer includes its simple collision geometry. Now, the bounding box only includes renderable geometry.

Any user-created vertex factory that implements the Get Static Batch Element Visibility function will need to set "Requires Per Element Visibility" on its Mesh Batch.

Optimizations

The console command "r.Tonemapper.ScreenPercentage" has been renamed to “r.Tonemapper.MergeWithUpscale.Mode”, and offers additional modes (see the main release notes or cvar help for more information).

Mobile Rendering

Mobile depth of field now requires Depth Of Field Method to be Gaussian. Other options will result in depth of field being disabled.