Unreal Engine 4.6 Released!

4.6 Release Notes

Unreal Engine 4.6 arrives with a slew of lighting and material improvements, support for capturing and playing back network demos, and huge updates to animation workflows, including root motion blending and multi-montage support! The new Mobile Preview rendering mode lets you edit your scene just as it would appear on a mobile device. UI creation with Unreal Motion Graphics has been greatly enhanced, and you can now place interactive UI widgets right into 3D scenes. We’ve also continued improvements to mobile and console platforms in 4.6, along with hundreds of other features and bug fixes.

release includes 88 great changes that were submitted from Unreal Engine’s amazing community of developers. We would like to extend our gratitude to the contributors below:

alexSilkin, alwei, yaakuro, EverNewJoy, joelriendeau, jstasiak, slonopotamus, TheCodez, MyDigitalLife, mordentral, KazumasaOhashi, leobenaducci, piinecone, Salamanderrake, stephenwhittle, jedlickat, kylawl.

Epic has made recent account changes to provide an age-appropriate experience for players, developers, and creators of all ages. If you don’t see your name credited here for code that you have contributed, please log into your Epic account and ensure that you have updated your account information so that we can include you for future releases. If you need additional assistance, please reach out to Support.

Major New Features
Experimental: 3D Unreal Motion Graphics UI

UI widgets can now be attached to components and displayed in the 3D scene!


  • To use feature, simply add a new “Widget Component” to your actor and assign a Widget asset to it. feature is still considered experimental but we’ll be improving it and adding more features soon.

  • Your UI will be rendered to an offscreen target, then mapped to a 3D quad attached to your actor. Input is supported too, so if your game displays a mouse cursor the user will be able to click on buttons and perform other interactions.

  • You can configure rendering settings for your 3D widget in the Widget Component’s details view. Don’t forget to set the “Draw Size” – that controls the size of the render target the UI will be rendered to.

Static Lighting from Emissive Materials

Emissive materials can now directly illuminate surrounding objects!

  • Turn on using the new “Use Emissive For Static Lighting” option on shadow-casting components with Mobility set to “Static”. When enabled, Lightmass generates baked direct lighting from emissive texture sources.

  • Note: is a fast but limited version of emissive lighting. Only direct lighting is computed but build time is not affected. It is best used in scenes that have other light sources.

Static Lighting on Foliage

Precomputed lighting and shadows are now supported on foliage objects and instanced meshes! allows for very efficient rendering in scenes with Stationary or Static lights.


Static lighting is appropriate for medium sized levels but does not scale up to huge scenes in build times or memory requirements. Be sure to use very small lightmap resolutions on meshes that will be instanced many times.

Demo Recording (Network Replay Capture)

allows you to save an “instant replay” of your gameplay! It captures your game’s network stream to a “demo” file that you can play back later or share with others. You can even use time-warping to slow down your game or fast-forward through it quickly.


Demo recording works automatically with any Unreal Engine game that is networking-enabled.

  • To start recording, use the console command “DemoRec <replay name>

  • To play back a previously recorded game, use the console command “DemoPlay <replay name>

  • Try using the slow-motion and fast-forward features! Use the console command “Demo.TimeDilation <multiplier>”. For example, to play back at half speed use “Demo.TimeDilation 0.5”.

  • The ShooterGame sample has been updated with built-in support for browsing saved replays using the new “Demos” in-game menu. Check it out! (Note that you still have to use “DemoRec” to save a replay, first.)

Experimental: Mobile Preview in Editor

You can now preview what your scene will look like on mobile devices directly in the editor viewport! Shaders will emulate the look and feature set of OpenGL ES2, and you can switch back and forth seamlessly.


  • You have to enable Feature Level Preview under the Experimental section of Editor Preferences.

  • On the main editor toolbar, click Settings -> Feature Level Preview -> ES2.

Experimental: Web Browser UI Widget

Host web pages right inside your game or editor tools using the new Web Browser UI widget.

  • The new Web Browser widget for Slate (SWebBrowser)can be used to easily navigate to interactive web pages and display them as part of your UI. It’s powered by an embedded Chromium web framework (CEF3). feature is currently experimental and only supported on Windows platform.

Steam Online Sessions in Blueprints
Unreal now supports hosting, discovering and joining online sessions through Blueprint scripting!

  • We’ve added new Blueprint nodes for hosting, joining, leaving, and finding online sessions, including both Steam and Local Area Network (LAN) sessions

  • Here are the new nodes:

    • Create Session: Hosts a session that can be discovered over the network.

    • Find Sessions: Searches the network for sessions available to join.

    • Join Session: Joins a session that was found with Find Sessions.

    • Destroy Session: Leaves a session that was previously created or joined.

New Material System Features
Materials with Many Textures

  • Materials can use up to 128 unique textures by making use of new ‘shared’ texture samplers. These are set on a TextureSample node by setting the SamplerSource property. Previously, you could only use up to 13 textures.

  • is a really important improvement for layered materials like terrain, high quality character materials, and more advanced forward shading materials.

  • DirectX 11 and consoles support 128 textures at once, but the OpenGL rendering path (on Windows or Mac) is still limited to 13 textures per material. Shaders will fail to compile for GL if they exceed limit.

Real-time Preview of Scalar and Vector Parameter default values

  • You can now change the default value of any scalar or vector parameter and see the result instantly in all 3D viewports.

  • is especially useful for Material Functions that implement layers, as you can see the results of a tweak to the layer on all the materials in the scene that use that function. You can also right click to quickly convert constants to parameters for easy tweaking, then convert them back when you’re done.

Expose Parameters from Material Functions

  • Material Instance parameters are now supported in functions. makes it really easy to expose parameters to material instances. brings functions to feature parity with materials, the same node graphs can be used in either. The only exceptions are the function input and output nodes which are inherently function-only.

  • Note that parameters within a material are set by name, so if you have two parameters named ‘wetness’ in different functions referenced by that material, they will both be overridden with the same value in the Material Instance. can be used intentionally but if you don’t want to share the parameter, give it a unique name.

Animation: Play Multiple Montages

Until now you could only play one Montage at a time on a Skeletal Mesh. Now you can play as many as you would like!

Here’s how it works:

  • Animations are now organized into groups. You can play a single montage per group. Want to be able to play another montage at the same time? Simply create a new group for it.

  • We’ve centralized Slots and Groups creation into a new ‘Anim Slot Manager’ tab inside of Persona (see below).

  • There’s a new drop-down UI to select valid slots. You know longer have to type in animation slot names by hand.

  • When playing a Networked Root Motion Montage, you are still limited to just one montage at a time.

  • New Montage assets and Slot nodes start out with a single ‘Default Slot’ so they’re immediately functional

Anim Slot Manager

  • The ‘Anim Slot Manager’ is where you will manage your Slot and Group names. It displays hierarchical view, and lets you make changes.

  • Groups and Slots are saved in the Skeleton asset, so all AnimBlueprints and AnimMontages from the same family use the same settings.

  • A convenient ‘Save’ button was added to manager, so you don’t have to be surprised when the editor asks you to save the Skeleton asset when you make a change.

  • When clicking on a Slot name, the context menu will also allow you to move it to a different group:

Editing Slots on Montage Tracks

  • Here is the view of the Montage Editor. Note the Combo Box at the right of the track. will list all of the available Slots for that track.

  • ​If you need to create new a new Slot or a new Group name, the Magnifying Glass will take you to the Anim Slot Manager:

  • The Status Bar on top will tell you which Group the Montage belongs to. is determined by the first Track’s Slot.

  • ​If you have multiple Slots, the Status Bar will also tell you if there are any issues with the setup. For example, if you mix and match Slots that belong to different groups, the little warning sign appears, and you can hover over it to see more about the problem.

Editing Slots in Animation Blueprints

  • In the AnimGraph, a “Slot” node will display its Slot and Group names:

  • With the node selected, over in the Details panel you can see the same options as in the Montage Track view:

  • From here. you can use the combo box to pick an existing Slot name and the Magnifying Glass to open the Anim Slot Manager.

  • Additional notes:

    • is backwards compatible with previous setups. You shouldn’t notice any changes other than your existing Slots being part of a ‘Default Group’.

    • The ‘Anim Slot Manager’ does not let you rename or delete Slot/Groups yet, will be added at a later date.

    • The Montage Blueprint and C++ API has been enhanced to take Montage asset references. is how you can control different montages playing at the same time. For an example, check out the updated “Set Play Rate” function.

Root Motion from Everything

Unreal Engine now supports blended root motion from multiple animations!

  • We’ve added different modes for handling root motion with Animation Blueprints. The mode can be set via the “Root Motion Mode” drop down on the Anim Blueprint Editor. Code can also modify setting at run-time if dynamic behaviour is required.

  • The options are as follows:

    • No Root Motion Extraction - Root motion is left as is (applied to the root bone).

    • Ignore Root Motion - Root motion is extracted (and removed from the root bone), but not applied to the character.

    • Root Motion from Everything - New method of handling root motion (explained below).

    • **Root Motion from Montages Only **- is the original root motion behaviour (and the default for all new blueprints).

Setting up root motion on assets:

  • There is a new “Enable Root Motion” setting in your Anim Sequence. replaces the older “Enable Root Motion Translation” and “Enable Root Motion Rotation” options that used to be in the AnimMontage (they will automatically be updated when loaded.)

  • NOTE: The original settings on AnimMontage still exist and have not yet been flagged as deprecated. is intentional as it helps us correctly propagate them to their animation sequences. They are no longer editable from Persona and no one should be writing code that reads/writes to them.

Root Motion from Everything:

  • Each animation asset (sequence, blendspace, montage etc) that contributes to the final character pose has its root motion extracted (if it has been set as containing root motion). Each piece of extracted root motion is blended based on the weight of the source assets contribution to the pose.

  • For example: In the above graph the root motion of Jog_Loop_Fwd_RM and Jog_Loop_Right_RM would each be blended together with a weight of 0.5. The resulting animation in case is a character running diagonally forwards and right across a map.

  • Note: The original system (now labelled “Root Motion from Montages Only”) was designed with network games in mind, which is the reason for its more restricted functionality. Because “Root Motion from Everything” is designed to be complete unrestricted, we recommend using it only in games where animation isn’t replicated over the network.

Animation: “Humanoid Rig” Quick Select

  • A new feature in Persona has been added to select the Humanoid Rig that is built into the engine. rig is commonly used for animations you’ll find on the Unreal Engine Marketplace.

New Blueprint Editor Menus

We’ve redesigned how Blueprint editor’s right-click menu works to provide more accurate and relevant results.

  • As usual, drag off from a node to show a context menu with nodes that pertain directly to that type of node. You can configure feature using new options Blueprint editor’s preferences:

Larger 3D Worlds

The maximum size of an individual world has been increased to approximately 20 kilometers across. Also, we now support 3D world origin shifting (instead of only 2D shifting.)

  • is defined by the ‘WORLD_MAX’ constant in C++ code. It was increased by a factor of four (from approximately 5 km.)

  • Remember, you can create worlds as large as you want by connecting multiple worlds together using Unreal Engine’s World Composition feature!

Faster Packaging and Cooking

Packaging or cooking content from within the editor is now faster than ever!

  • When cooking from within the editor, we no longer need to invoke a new process. means that assets loaded in the editor can be cooked directly from memory which speeds up processing significantly.

  • is enabled by default, but you can switch back to using the old system using the “Disable Cook in Editor” preference if needed.

Navigation Mesh Streaming**

Unreal Engine can now stream sections of precomputed navigation data in or out of memory on the fly.

  • You can save static navigation mesh data into different sub-levels and the engine will stream data with that level

  • By default, any part of your navigation mesh that intersects with a navigation volume will be saved into the same sub-level where that volume was placed

Unreal C++ Programming**
Simplified Class Declarations

  • You now define and use “normal” C++ constructors for your classes. You can use parameterless constructors too now!

  • You no longer need to supply a category for your properties to expose them to the editor or Blueprints. You’ll get a default category now.

  • FPostContructInitializeProperties is deprecated. It’s replaced by FObjectInitializer, and you only have to specify it when you actually need it

  • “GENERATED_BODY” no longer resets your protection level to “public”. It will preserve your settings.

  • Please use the new “GENERATED_BODY” specifier instead of “GENERATED_UCLASS_BODY”. It enables many of these new improvements!

Simplified Casting

  • Easily cast between Unreal classes using the improved Cast() function. You can even cast between interfaces and classes. We also now support using dynamic_cast to cast between Unreal types, if you prefer that.

Other C++ Improvements

  • New support for C++ 11 lambdas with delegates (see below), as well as the new TFunction class (lightweight lambda wrapper)

  • We’re getting rid of TSubobjectPtr. It was confusing and weird. Just use normal pointers to your sub-objects now!

  • We no longer need to synthesize “dummy” UObjects if you only have structs and enums in your source file

UI: Game Controller Support

You can now navigate between UI elements using a joystick!

  • By default you can use the arrow keys, directional pad or left joystick to navigate. You can still use Tab or Shift+Tab as well. works with both Slate and Unreal Motion Graphics.

  • We’ve unified the concept of “Keyboard Focus” and “Controller Focus” into “User Focus”. Changing user focus will affect all controllers and keyboards for that user.

UI: Composite Fonts

Slate and UMG now support font families and composite fonts. These allow you to create fonts that are actually made up of multiple sub-fonts, and each font can be used for different ranges of characters. is really useful for displaying localized text.

Font Assets

  • The font asset type has been updated to support embedding a composite font along with its associated TTF or OTF font file data.

  • Font assets now support two caching methods; “Runtime” which is the new composite font way, or “Offline” which is the older pre-computed font atlas way. You can easily switch between the two in the font editor, providing a simple way to convert existing font assets without having to replace them.

  • Creating a new font asset will now default to creating an empty composite font, and you’re also able to create a composite font asset by importing a TTF or OTF file into the Content Browser.

Font Editor

  • The font editor has been updated to allow you to create composite font assets.

  • A composite font will always contain a default font family, and may also contain any number of sub-font families that should be used for a given range of characters. Each font family is itself made up of any number of fonts that can be named based on their style.

  • At runtime we pick the most suitable font to use for each character based on the fonts available in the font family for that character range.

  • As you can see in the preview above, the Japanese text falls within the character ranges of the Japanese font family, and so is drawn using Source Han Sans rather than Roboto. Fonts in a sub-font family are preferably chosen by name match, as in the case of Regular, Bold, and Light, however can also fallback to matching based on the attributes of the default font, as is the case of Bold Italic (it automatically chose the Bold Japanese font because the font contained the Bold attribute, and was the best match).

Fonts in Unreal Motion Graphics (UMG)

  • The old interface in UMG that let you specify a TTF or OTF file from disk has been removed, and replaced with an asset picker that lets you choose a composite font asset, and then pick a font from the default font family.

  • None of your existing file based font settings will be lost, however going forwards you must use font assets with UMG.

  • UMG currently only supports “Runtime” cached font assets.

Fonts in Slate

  • Any existing font code in C++ based Slate style sets will still work, however you might want to consider updating your style sets to take advantage of composite fonts.

  • We recommend using FStandaloneCompositeFont rather than font assets when dealing with composite fonts in C++ Slate code.

  • is because font objects contained within Slate style sets are not visible to the garbage collector. Using a font asset directly would require an external reference to be maintained yourself, using something like FGCObject.

Fonts in Canvas

  • Canvas supports both types of font asset caching, however is to improve the localization support for some of our tools.

  • We do not recommend using Canvas for new game UIs, and would suggest using UMG instead.

Learning Resources

  • New Content Example Maps! You can find the Content Examples project, and many other learning-focused projects, in the new Learn Tab in the Unreal Engine Launcher!

    • Unreal Motion Graphics

    • Media Framework (Video Playback)

    • Skin Rendering (Subsurface Materials)


In-Editor Help

  • Fixed a problem with window focus in Skeletal Editor Walkthrough tutorial

API Documentation

  • New: Added some basic documentation to the stats system.

  • Fix comments for ProjectileMovement substepping.

  • Fix comment on Pawn::PossessedBy().

  • Improved documentation for ACharacter::Landed() / OnLanded() indicating that movement mode is still “falling” during time, and pointing out alternate OnMovementModeChanged() event.

  • Added link for FString docs. Documented ESearchCase, ESearchDir.

  • Add or fix class descriptions for multiple framework classes.

  • Added comments/docs for FNavAgentProperties and FMovementProperties.

  • Improved docs for FVector, FVector2D.

  • Added/improved comments for ENetMode, EVariableReplication and linked to online doc pages.

  • Cleaned up comments in Object.h (skeleton definitions for core object module).

    • Added links to actual source files. Lots of times intellisense/VA will take you to the less helpful skeleton file rather than the actual source file.

  • FTransform class comments expanded to include description of how transformations are applied and composed. Similar changes to KismetMathLibrary::ComposeTransforms() as well.

  • Documentation for quaternions, explaining order of composition during multiplication.

Important Changes

Please be aware of these important changes when updating projects to the 4.6 release.

  • Blueprint variables now have to be marked public/editable to be accessible from other blueprints.

  • GENERATED_BODY replaces GENERATED_UCLASS_BODY and provides additional UObject improvements. More changes are planned for GENERATED_BODY with the 4.7 release and users with existing code may wish to delay switching existing classes until then.

  • TSubobjectPtr<> has been deprecated, along with all public subobject properties which will be made private in the 4.7 release. Going forward, classes should be designed so that all subobject properties are private and can only only be accessed through public Get*() functions.

  • FObjectInitializer now replaces PostConstructInitializeProperties.

Release Notes

  • New: Animation Preview Mesh

    • You can use context menu in Persona’s Asset Browser to select a specific mesh to preview the asset

    • is useful when you have many different meshes per skeleton, but you only want to preview a set of assets with a specific mesh

  • New: Improved Animation Record Feature. Now you can click Record to capture animations up to ten minutes long. Press stop when you’re finished recording.

  • New: Added the option to specify an import-time transform to apply to static meshes, skeletal meshes and animations.

  • New: Added new check box for toggling display of skeleton retargeting options in Persona

  • New: Persona now automatically selects recently newly added sockets in the viewport.

  • New: When opening a derived animation blueprint the asset override editor will open automatically.

  • New: Relative and proportional linking added to elements in a montage to keep them linked to the segment they relate to.

  • New: Trigger weight threshold for notifies exposed in details panel.

  • New: Changed “Layered Blend per Bone” node to start with 2 pose pins by default and added an “Add Pin” button

  • Changed ‘Create’ menu names of Blendspaces to be consistent with other parts of the editor.

  • No longer leave extra space at the end of anim segments in open montages making the animation freeze after a reimport.

  • Fixed crash on “Reset All” in Rig Asset

  • Fixed crash when saving retarget base pose when cloth exists

  • Fixed retargeting crash when multiple meshes exists per skeleton

  • Fix for compression data in animations being missing if the skeleton GUID didn’t match the cached GUID in the animation.

  • Fix for where skeleton would get dirtied on load when opening in Persona (was caused by the setting of the preview mesh).

  • Fix Montage root motion preview in Persona.

  • Fixed an with retargeting when bones are missing.

  • StateMachine : Fixed an with entry state is always active in the first frame. Now it should activate appropriate state.

  • Fixed AnimNotify State crash when Blueprint derived AnimNotify is being compiled.

  • Fixed display of slot name on a slot node (Would show none even when a slot name had been selected)

  • Fixed a crash when retargeting skeleton that has different order with target skeleton.

  • Fixed animation retargeting crash when preview mesh is missing.

  • Fixed a crash in AnimationBlueprints when a transform bone node in parent space was used on a root bone.(I had t

  • Fixed potential quaternion normalization assert on long bone chains when using Mesh Space blend per weight.


  • New: Added config setting to control audio volume when app is unfocused

  • Fixed where interior volume would pop to target value instead of ramping in over time.


  • New: The map performance in editor test will now wait for the shaders to finish compiling before capturing the data.

  • New: Added support for parsing non-versioned build numbers to FEngineVersionSupport.FromString

    • To allow for these non-versioned build numbers to be parsed, pass bAllowNoVersion=true as a parameter (optional, defaults to false)

    • Non-versioned build numbers consist of a branch name and changelist number in the form ++depot+UE4-ProductName-CL-12345678

  • New: Added -archivemetadata option to BuildCookRun to copy build.properties files to archived build destination. Useful for tracking what changelist was used to make a build.

  • Internationalization smoke tests are disabled as a work around to the editor appearing in Japanese when an unsupported culture is selected for the editor UI.

  • Fixed an that was causing BuildCookRun automation to default the cultures to stage to English despite configuration.

  • Staging a culture now properly stages the necessary parent cultures.

  • Fixed a duplicated comment in the code.

  • Refactored the map editor performance test so that it’s more efficiently grabbing and storing the editor performance data.


  • New: Switching between Component and Graph modes will reselect previously selected items in the modes.

  • New: Can replace missing property nodes with local variables by right clicking.

  • New: More detailed and accurate compiler profiling results. Also added an option to the Blueprint editor preferences for turning on additional details in the Compiler Results tab. Turning on will result in a detailed, hierarchical summary of event timings for the Blueprint that was just compiled.

  • New: Blueprint variables now have to be marked public/editable to be accessible from other blueprints.

  • New: Orthographic view options have been added to the Blueprint editor preview in Components mode.

  • New: Added an error tolerance input to “Equal” function node for vector/rotator types.

    • pin defaults to a small epsilon value that helps to ensure equality when values don’t exactly match due to floating-point precision errors that can arise during processing.

  • New: Boolean select nodes now display True/False for their pins.

  • New: Added keywords to Set/GetActorLocation, AddActorWorld/LocalOffset and AddLocal/WorldOffset.

  • New: Exposed text-related functions on TextRenderActor

  • New: Double clicking on variable get/set nodes that have a rep notify graph will jump to the graph.

  • New: Renaming SaveCachedPose nodes will now automatically update any UseCachedPose nodes referencing it.

  • New: Can right click on any get/set variable node to replace with another variable.

  • New: Object pin connections will now auto-generate a conversion node when going into a class input pin.

  • New: Can double click on Blueprint compiler error logs to jump to the offending node.

  • New: “AutoCreateRef” is handled in UK2Node_CallFunction::ExpandNode. The additional variable is created in local scope.

  • New: New Blueprint compiler option to jump to error-producing nodes (on compile).

  • New: Added new events that GameInstance Blueprints can handle: NetworkError and TravelError.

    • You can use these events to gracefully handle these errors, for example, by displaying a custom message to the user.

  • New: Interface message nodes can now be used for pure/const functions.

  • New: Can now use cast nodes to convert from an interface pin to an explicit object type.

  • New: New save-on-compile option that will automatically save Blueprints as you work on them.

  • New: GetAllActorsOfClass nodes now change their output type according to the class you pick.

  • New: Can now create blueprints from vert-painted meshes in the world (painted vertex data is copied over).

  • New: Reinstance Only When Necessary:

    • Added mechanism to distinguish if instances of recompiled BPGC must be reinstanced or not during recompilation (e.g. adding a new function or variable)

    • When not needed, we skip reinstancing after compilation, which cuts out significant time from the compilation process

  • New: For the new blueprint menu system, user can now specify a node’s category/name/tooltip directly in GetMenuActions().

  • New: New Blueprint editor preference setting that can be used to toggle on/off the “Target” of the Blueprint context menu.

  • New: Can now toggle cast nodes to have execution pins or not (allows casts to be used in anim graphs). NOTE: the cast could still fail and return an invalid object.

  • New: Users can now hook into the Blueprint editor and provide their own hot-key commands (through FBlueprintEditorModule::GetsSharedBlueprintEditorCommands).

  • Reduced the wastage on the graph clipping guard band from half the size of the graph each edge to quarter. is intended to make the clipping more aggressive ideally with no visual difference to make it more performant.

  • Minor fix to prevent the documentation tooltip from moving when you try to click on a link in composite nodes.

  • Fix for with namelist values not syncing first value to the pin. If the initial value does not match the pin value, the pin value gets synchronized to the value displayed in the UI.

  • Curve graph min and max are now preserved during blueprint changing/saving.

  • Math Expression graphs are now read only.

  • Fixed crash when compiling Animation Blueprint while animation Property Matrix was open.

  • Pins can no longer be added/removed from boolean select nodes.

  • Crash fix for placing math expression nodes in macro graphs

  • Actor Blueprints will correctly open the first time in Components Mode and subsequently in Defaults if data only

  • Propagation of default rotation transform values during live editing.

  • Prevent copy/duplicate of component nodes not marked as BlueprintSpawnable.

  • Excessive compile times due to chained child classes during reinstancing.

  • Do not allow unsafe functions to be placed in a construction script.

  • Removed a redundant node construction pass on Blueprint graph panel updates. Cuts panel update time roughly in half.

  • Don’t mark Blueprint packages dirty on streaming async loads.

  • Added a delegate to hook up any nodes that require to be notified when input action or axis mappings change, so they can refresh the Blueprint action database

  • Moved the error message for Array functions to the bottom of the node.

  • Any latent action nodes derived from BaseAsyncTask are now supported in macros.

  • We now support making FText an exposed on spawn parameter.

  • The default output pin on switch nodes now shows as an exec pin, not an output pin

  • UEdGraphSchema_K2::GetFriendlySignitureName spelling corrected to be GetFriendlySignatureName

  • Cleanup tooltips for blueprint nodes whose comments contain @param entries

  • Add some clipping for connections in blueprints in an attempt to address performance issues on large graphs.

  • Changed some Blueprint compiler errors to make them more understandable.

  • Fixed erroneous “Failed to load Super / Parent” linker warnings when recompiling Blueprints on load

  • Blueprint nodes in the “online” category will now use the correct online subsystem instance corresponding to the Play In Editor window in which they run.

  • Changed logic for hiding the target pin on a pure node to take into account the compatibility of the BP and the function, allowing pure functions on an incompatible target to be callable when dropped from the palette

  • Adjust style of ‘parent class’ hyperlink and add some more padding between it and the search box

  • SpawnActorFromClass uses the original tooltips for properties marked “ExposeOnSpawn”.

  • Only copy the “advanced view” state of pins when reconstructing nodes if users can edit the advanced state. Otherwise changes to metadata advanced pin state don’t get propagated.

  • Crash when modifying data layout of instanced UserDefinedStruct

  • Crash while compiling blueprint after editing construction script

  • Crash occurs when making a new blueprint after deleting one with the same name.

  • Crash when duplicating BP based on object, with single member variable of struct type.

  • UberGraphPersistentFrame code can be disabled by setting USE_UBER_GRAPH_PERSISTENT_FRAME define false. The UberGraphPersistentFrame is used for skipping reinstancing when the class has not structurally changed.

  • UserDefinedStruct - properties won’t be (unnecessarily) reloaded by linker

  • Static Function have WorldContext parameter only when it’s necessary

  • ExpandNode functions don’t check if it’s called during full compilation. The function should be called only when necessary.

  • Fix for a rare crash that would happen when compiling a Blueprint with a ChildActorComponent.

  • Can no longer create a BSP Brush Blueprints.

  • Can no longer reference BSP Brushes in level blueprints.

  • Fix for crash cooking maps with blueprints that change atmosphere parameters in the construction script

  • Fix for crash that would occur when a node type was deleted from code (and there were Blueprints that used that node).

  • Fix for a crash that would occur when the member referenced by a CallOnMember node was deleted.

  • Fix for crash that involved variable/function nodes not being able to find the referenced variable/function.


  • New: Lambda support in delegates and slate

    • Delegates gain CreateLambda and BindLambda.

    • Slate gains Attribute_Lambda and Event_Lambda.

    • Supports variable capture, but avoid capturing TSharedRef/Ptr as you can easily cause reference loops.

  • New: TFunction and TFunctionRef.

    • TFunction acts like std::function, allowing lambdas to be passed around and owned.

    • TFunctionRef acts like a non-owning std::function, and should only be used for efficiently passing lambdas to non-template functions which only want to invoke the lambda at the call site, not take ownership of it.

  • New: New debugger visualizer for TOptional.

  • New: If you have two projects with the same name in engine directory tree UBT will warn you about it.

  • New: Added ability to use long package names with the -map flag when cooking.

  • New: There is a new feature that is calling StartupModule method during engine initialization. To use it just set bIsAutoStartupModule = true in module rules constructor.

  • New: Added option to limit number of jobs to UBT.

  • Add module generated include directory to ShouldExportClassesForModule in UHT.

  • New: Added script integration helpers to UObject system.

  • Documented TArray methods.

  • New: Now WIDECHAR FString and FName classes don’t create temporary objects during comparison with ANSI char.

  • New: Added FMath::GetReflectionVector(Direction, SurfaceNormal) for calculation of ray bouncing.

  • New: Now the category isn’t required for UPROPERTIES. If not present it is set to class name it was defined.

  • New: Splitted out DB access classes to separate module and added SQLiteSupport module which allows you to easy integrate SQLite into Engine.

  • New: GameName redirects can be added dynamically.

  • New: A Pak file can now be constructed with UnrealPak.exe by specifying a directory to build.

  • New: Can now specify to compress or encrypt all files in a Pak file when running UnrealPak.exe via the commandline.

  • New: FPakFile can now be initialized from an existing Archive rather than only by filename.

  • New: Plugins can have config files now.

  • New: Efficient construction and appending of TArrays of different types.

    • A TArray of one type can now be constructed from or appended to a TArray of another type, if the types are assignable.

    • The implementation will do the copy as efficiently as it can work out, e.g. appending a TArray to a TArray will memcpy the elements.

    • The new TIsBitwiseConstrictuble trait can specialized for your types if the types can be memcpy’d in way.

  • New: Stats

    • Added better mechanism for flushing the stats messages, should reduce the amount of the stat packets, will also reduce the memory usage, improve performance, will happen only once per frame

  • New: Stats

    • Added command ‘stat toggledebug’ - toggles tracking the most memory expensive stats

  • New: Moved STAT_FindObject(Fast) to STATGROUP_ObjectVerbose which is disabled by default, should improve memory usage.

  • New: Added explicit flush for stats after startup the rendering thread to improve memory usage

  • New: New console commands

    • Added a command “Obj MemSub -class=[classname] -cull=[no of kb]” that prints memory stats for all objects of the specified class, is inclusive stats, includes all subobjects.

    • Added an option " -class=[classname]" to “Obj Mem” command, which tries to narrow results to the specified class.

  • New: Internationalization data presets can now be selected from a limited number of presets in order to minimize the amount of ICU data packaged for products.

  • New: Added preallocating memory to TMaps

  • New: Moved STAT_FindObject(Fast) to STATGROUP_ObjectVerbose which is disabled by default, should improve memory usage

  • New: Implemented GetAllocationSize() for FMallocAnsi

  • New: Variadic template implementations of C++ delegates

  • Deprecated TArray::FindMatch as it was doing the same as TArray::IndexOfByPredicate.

  • UHT was generating bad function declarations while passed by const reference parameters.

  • Fix a use-after-free bug in FInternationalization.

  • Change module load order to ensure that SlateRHIRenderer can shutdown without crashing.

  • Added more transparency what set a console variable the last time (cvar name in the console shows it)

  • Changed console variable Set() behavior: Each Set should specify a priority, order no longer matters if the priority is higher (solved a lot of corner cases), might need some iterations.

  • UE4 project Win32 editor builds was still allowed by UBT, which is not supported. Fixed.

  • Fix retrieving the host name from the workspace and infinite loop when discovering unspecified Perforce setting.

  • Fix for static initialization order of debug visualizer delegates

  • Fixed non-safe threading calls to the SlowTask system which was causing cooker crashes.

  • Fix for available sessions not getting updated in UFE due to FDateTime::UTCNow / FDateTime::Now mismatch

  • Generated code fix for UFunctions which take enum classes as parameters.

  • Better error message when using an IInterface* is used as a property, suggesting the use of TScriptInterface instead.

  • Operator new/delete overrides added for platforms supporting noexcept().

  • Fixed crash caused by ICU break iterators persisting beyond ICU shutdown

  • Fixed a mistake in an error message pointing the user to the wrong ini file.

  • Fix HeaderParser so it no longer removes valid uses of “*”, " * ", etc from within comments when generating tooltips. Only asterisks from the beginning of lines following only whitespace are removed.

    • For example: “A * B” within a java-doc comment used to become “A B”.

  • Add version of LerpStable() that works with floats, not just doubles as before.

  • Performance: only add prerequisite to tick function if that function itself can tick.

  • Fixed stats crash on iOS

  • Added missing SendSeekMessage to the Seek for the writable FStreamingNetworkFileHandle.

  • Fixed converting stats to csv

  • SetStoredValue/GetStoredValue uses platform specific implementation (fixed regression)

  • Stats - Fixed a crash when the verbose group contains non-cycle stats, also fixes an with the missing data

  • Fixed an with copying tick function references

  • UObject

    • Made code thread-safe when TRACK_BULKDATA_USE is set to 1

  • Text localization resources can now be loaded from directories using hyphenated culture names, rather than only those using underscores.

  • ICU memory usage has been greatly improved by caching data files once when needed.

  • Localization data now falls back on parent culture data based on language, script, and region combinations.

    • Language_Script_Region, Language_Region, Language_Script, Language

  • Localization data for Simplified Chinese has been renamed from “zh-Hans-CN” to “zh-CN” to conform to conventions.

  • The DLL search paths now include all game, plugin and engine folders. Module DLLs in different output folders can now implictly link against each other without requiring a specific startup order.

  • Fixed bad comments regarding SIZE_T

  • Fixed in parsing DEPRECATED macro by UHT when deprecating classes and structs.

  • Fixed unnecessary full rebuilds on case insensitive file systems.

  • Fixed syntax error in TMultiMap::MultiFindPointer.

  • Moved delegates referencing UObjects from FCoreDelegates to FCoreUObjectDelegates.

  • Disabled deprecation warnings in all code generated by UnrealHeaderTool

  • Fixed minor TBasePlayerControllerIterator code inconsistency

  • Removed various unused C++ macros from header files

  • Speed up to UnrealPak when scanning files added to a pak file.

  • New: Use perfect forwarding for task graph, plus some lambda work for shadow rendering.

  • ICU data has been relocated from Content/Localization to Content/Internationalization.

  • Test builds now have asserts enabled if shipping builds also have them enabled.

  • Improve error message when running UnrealHeaderTool fails (showing a human-readable version of the error code)

  • Removed unused bChangesTopology member from FPropertyChangedEvent and removed most uses, in preparation for deprecating the three-argument constructor

Editor and Tools

  • New: Expand Action/Axis mappings when clicking + buttons to add a new one

  • New: Output Log window now saves what you typed in between sessions (like the in-game console did)

  • New: Added a new “2D Pixels” Texture Group, intended for non-scaled, non-mipmapped, non-filtered textures in 2D Games.

  • New: You can now create new assets right from the Asset Picker that appears when choosing an asset to use. The menu combo box now contains “New asset” entries where appropriate.

  • New: The main “Window” menu has been reorganized for improved usability!

    • Sectioned and labeled based on the current editor

    • Experimental tools have their own section

    • Undo History has been moved to the Edit menu

  • New: The context menus in Content Browser have been reorganized for improved usability!

    • The “Details” option has been replaced with an “Edit” option for all assets

    • Source Control options have moved to a sub-menu to reduce size

    • Less common asset actions have been moved to a sub-menu

    • Imported assets all have options for reimporting, locating, and opening the original source. These work even when multiple imported assets of different types are selected.

  • New: Mesh merging tool supports mirrored meshes

  • New: Component visualizers can now override DrawVisualizationHUD to do 2D visualizations as well.

  • New: Class Viewer (and Picker) will now display UMG, Blutility, and GameplayAbility Blueprints (both loaded and unloaded)

  • New: Experimental iterative cooking: Including support for ini changes and DDC version changes invalidating cooked content. (Added “-iterate” command-line option for editor)

  • New: Packaged games on Windows now include an executable in the root directory which will install any missing prerequisites before running the game.

    • Content-only games can now customize their application icon using the packaging settings dialog in the editor.

  • New: UE4 prerequisites installers now support Windows XP, Windows Vista, and 32bit Windows 7.

  • New: Project settings now have the option to mark a project for chunk generation when packaging. Supports PS4 PlayGo, Xbox Streaming Install, etc.

  • New: Adding a curve linear color struct that can be added as a property and edited in details panel.

    • Integrated from PR #529 by inside

  • New: Added pre-compile event for editor tools.

    • Added callback in Persona to clean up running blueprint notify states before a recompile.

  • New: PkgInfo -export -simple now supports sorting.

  • Multi-Line text properties: Enter now commits the change. Shift+Enter is required to enter a new line.

  • FBX import error for rigid meshes updated to show correct parameter

  • Added back the current file display to the FBX import UI

  • Re-added ability to import only animation from a skeletal mesh FBX file

  • Fixed auto-wrapped text in the tutorials list never growing again if it was shrunk

  • Made the Super Search appear as an overlay rather than be its own window to address an where the active IME context was being deactivated

  • Cook on the fly stability fixes and performance improvements.

  • FLevelEditorViewportClient::GetWorld now returns the correct World when in Simulate mode.

  • The x64 UE4 Prerequisites installer will now install vcomp100.dll

  • UE4 Prerequisites 64bit installer will now warn users when run on a 32bit OS

  • UE4 64bit prerequisites installer will now install vcomp100.dll

  • UE4 prerequisites installers will now check for Windows Installer v4.5

  • Fixed an where the level save-as functionality would fail to delete the asset you are saving over.

  • The Asset registry no longer prematurely reports that it is done discovering assets.

  • Fixed a bug preventing one Play In Editor instance from traveling to a new map when connecting to a host in another Play In Editor instance.

  • Fixed a bug that was causing different Play In Editor instances to use the same online subsystem instance.

  • Fix loctext key collision that broke mobility combo button tooltips

  • Fix typo in MapCheck_Message_SimulatePhyNoSimpleCollision message

  • Fixed a crash typing in the output log when a PIE window is open

  • Fixed keyboard focus issues in the editor when a modal window is open

  • Fixed importing SpeedTree files attempting to generate lightmap UV’s instead of using the ones from the SpeedTree file

  • Fixed alpha values not appearing by default in the color picker

  • Fixed the download link for Visual 2013

  • Fixed a crash when deleting level assets from the content browser

  • Fixed the FTransform details panel customization swapping roll and yaw values.

  • Fixed the Auto-Generate Lightmap UVs setting in the FBX importer being ignored

  • Fixed a crash when blueprints attempt to recompile and refresh a details panel when the details panel is in the middle of an operation

  • Fixed the startup movie player keeping Slate widgets alive when no movie was playing

  • Fixed orthographic viewports defaulting to lit

  • Added proper material picker to BSP surfaces

  • Optimisation for setting unique actor names on multiple objects

  • Fixed some maps not being properly included in the packaging process

  • Fixed with roles command line not being passed to the game when executing the game via UAT

  • Fixed initial map not being set correctly when utilizing the Launch On or Cook in Editor features

  • Fixed multi-second hitch on BSP operations when map has navigation system enabled

  • Fixed case where foliage could be painted with a wrong scale

  • Fixed an editor crash caused by handling the key down event while some parts of the editor are already initialized, but GEditor is still NULL.

  • UnrealSwarm during pushing files to the client machine treated optional files as required and caused errors sometimes. Fixed.

  • Fixed “Failed to find object ‘Class None’.” warning during some tutorials.

  • Various improvements to make the editor network usability easier to understand

  • PIE client/server window position/size tries to remain within the confines of the desktop area

  • Multiprocess PIE(viewport) client can now connect to a server.

  • Fixed Behavior Tree Editor crashing on selecting a service node

  • DataTable - UObjects are handled properly while reconstructing.

  • MallocProfiler2: Added support for files larger than 4.0GB

  • UnrealBuildTool is automatically built when generating project files using the shell extensions for the first time.

  • Change the CycleTransformGizmoCoordSystem default key equivalent on Mac OS X to Ctrl+~ as Cmd+~ is already used by OS X for window cycling.

  • The texture compression type, TC_EditorIcon now appears as TC_UserInterface2D

  • UFactory::ValidGameNames removed.

  • Exposed ProjectHasCodeFiles, GenerateBasicSourceCode, GetCurrentProjectModules and DetermineModuleIncludePath from GameProjectGenerationModule.

  • Improved feedback when an internationalization archive fails to load during localization resource generation.


  • New: Landscape holes are now supported on mobile platforms (OpenGL ES2)

  • New: We now support importing height maps that don’t match the landscape dimensions. (It will be padded/clipped to fit automatically)

  • Fixed missing Foliage and Landscape tooltips

  • Fix foliage tool crashes when using the reapply tool with Z offset and fixed erase density and reapply density features.

  • Fixed cases where World Composition map doesn’t work properly when traveled to from another map while in Play mode

  • Fixed an ensure warning when using the foliage mode select tool on an InstancedStaticMesh created in a blueprint.

  • Fix spline component bounds for the case of having no splines (was world 0,0,0 before)

  • Fix Landscape Ramp tool corruption if the bounds of the ramp go outside the landscape bounds

  • Fix “Dragging ‘New Landscape’ Rotation Z slider does not update real-time”

Material Editor

  • New: The “Custom” material node now works with TextureObject (removed old “Custom Texture” node as it’s no longer needed.)

  • Make sure materials created from textures don’t end up with overlapping expressions

  • Prevent Const material parameter values from crashing


  • Section bars no longer move small amounts when the user clicks near them.

  • Fixed causing Persona hover previews to not update, showing a still frame from the animation.

Scene Outliner

  • Fixed scene outliner actor counter not reporting accurate actor counts

Static Mesh Editor

  • New: Creating new static mesh collision enables collision view (if not already enabled)

Source Control

  • Fix a memory corruption bug when using source control to revert assets.

  • On Mac OS X you can actually open the File > Connect to source control… dialog while a modal window is open, which should also be modal otherwise it won’t display.


  • New: UMG: Designer now supports multi selection

  • New: UMG: You can now open a Widget directly by double-clicking its entry in the Palette view

  • New: UMG: Added “Edit Blueprint” to right click menus for custom widgets throughout the UI

  • New: UMG: You can now provide a helpful description for a Widget Blueprint in its Blueprint Properties. will show up as the tooltip for the widget in the Content Browser and Palette.

  • New: Added the ability to toggle text wrapping in a UMG multi-line text block. Auto-wrap is enabled by default.

  • New: Icons for the various play in editor models have been updated to a more consistent style.

  • New: Added a tooltip to show multi-line descriptions in the source control history.

  • New: Adding a Play Sound function to User Widgets.

  • New: Added a missing setting on a matinee actor to allow the game HUD to be hidden.

  • Fixed not being able to animate some Slate color properties in UMG UI editor.

  • Fixed Auto-Key working in UMG when no animation has been created.

  • Fixed not being able to save UMG widget blueprints in when a widget was used with an animation.

  • Fixed aliasing on UMG selection highlights.

  • Fixed UMG widgets clipping outside of viewports.

  • Fix for By the book not working in simple profiles.

  • Updated icons for the various play in editor modes. additional update.

  • Missing class icons in some windows will use the “default” object icon again

  • Project Launcher UI is now robust enough to handle variant list corruption.

  • Fix for launched game sessions not showing up in the session manager.

  • Changed the default configuration for new launch profiles to be development.

  • Making all the getters/setters on UWidget use “GetCachedWidget” instead of messing with “MyWidget” directly.

  • Making Sort work on TPanelChildren.

  • Fixed crash on destruction of Slate material brush

  • Converted SWidget::RenderTransform into a TOptional for performance reasons.

  • Fixed not being able to exit immersive mode once entering it.

  • Fixed where Cultures to Stage in Project Packaging Settings would sometimes not save to file when changed.


  • New: Expose ParticleSystemComponent OnSystemFinished delegate to blueprints

  • ULevelBase has been eliminated.

  • New: Added support for tutorials to be able to focus on some tabs in asset editors.

  • New: Added code to pass VertexColor in material CanvasTileItem to rendering code so parameter can be used with materials rendered using CanvasTileItem

  • New: GameViewportClient::Tick is now virtual

  • New: UGameUserSettings::ApplyNonResolutionSettings is now virtual.

  • New: All AZERTY keys can now be represented by EKeys and bound to action/axis mappings, directly to input components, and through blueprint interfaces.

    • EKeys::Underscore and now map to the keys where the underscore or is the unshifted value (as on an AZERTY keyboard), Hyphen and Apostrophe respectively should be used instead.

  • New: UPrimitiveComponent::SetCullDistance is now callable from blueprints as Set Max Draw Distance

  • New: GameMode properties MinRespawnDelay, NumPlayers, NumTravellingPlayers, NumSpectators, and NumBots made blueprint readable. MinRespawnDelay also editable from GameMode defaults.

  • New: GameInstance initialization and shutdown improvements

    • Make UGameInstance::Init execute for both PIE and Standalone

    • Redirect current UGameInstance::Init to ::InitializeStandalone and ::InitPie to InitializePIE, both of which are now non-virtual.

    • Add UGameInstance::Shutdown to allow execution of behaviour on shut down of the game instance (analogous to EndPlay for EndPlayInEditor and Quit on Actors)

    • Expose blueprint implementable events for Init and Shutdown.

  • New: Added reference bone pose overrides to FSkeletalMeshMerge.

    • FSkeletalMeshMerge::DoMerge() now takes an optional array of FPoseOverride structures.

    • FPoseOverride specifies the bone to override in the merged mesh with the corresponding bone in a specified source mesh.

    • allows more flexibility in building the merged skeleton from source meshes with differing reference skeletons.

  • New: Added ENGINE_API to ACameraActor, allowing it to be derived from in game projects.

  • New: Added Vector functions: ProjectOnToNormal(), VectorPlaneProject()

  • New: Change ProjectileMovementComponent::ComputeMoveDelta() to use ComputeVelocity() rather than ComputeAcceleration() to update the position.

    • allows custom implementations of changes in velocity to directly affect the simulation, without the need to also compute the acceleration.

  • New: Exposed various flipbook asset methods to Blueprints.

  • New: Added map check warning for sprite and flipbook components that use non two sided materials.

  • New: Improved comments/tooltips for BreakHitResult in the editor. Add ‘Time’ value to the output.

  • New: Add static FName for “DefaultProjectile” collision profile.

  • New: Added constructor for FWalkableSlopeOverride that takes both editable properties.

  • New: Added SetWalkableSlopeOverride() to PrimitiveComponent and FBodyInstance to make it easier to set up overrides, and to be able to change it at runtime in blueprints.

  • New: Better AirControl support, allowing movement towards potentially unwalkable surfaces but still restricting boost so you can’t wall climb.

    • allows players to dodge towards vertical walls more effectively, and also steer laterally down unwalkable slopes rather than taking away all air control in these cases.

    • HandleSlopeBoosting() now prevents upward boosts no matter the incoming velocity. We used to only limit it if moving upwards, but you can deflect upwards when moving horizontally or downward, which bypassed that check.

    • HandleSlopeBoosting() used to send the player straight down if hitting the side of a step. has been removed since is now checked in falling movement.

  • New: AITestSuite module has been created to facilitate unit-testing-like testing of AI code.

  • New: ProjectileMovementComponent: friction when bouncing has a new optional behavior. Fixed sliding/rolling code and exposed more related variables.

    • New projectile friction mode when bouncing modifies friction based on the normal force from impact (higher when perpendicular, lower when glancing). Enable ‘bBounceAngleAffectsFriction’ to turn on new behavior.

    • Default friction behavior when bouncing remains the same as before.

    • Added ‘bIsSliding’ to indicate if the projectile is sliding/rolling, and fixed behavior with multiple impacts between frames. Fixes friction behaving inconsistently depending on the framerate.

  • New: Fixes to projectile movement uses of friction, and improvements to behavior when sliding along a surface, to remove variance under different timesteps and to apply consistent friction.

    • Sliding movement now considers the acceleration (in any direction, not just gravity) and handles it in a new function: HandleSliding().

    • Friction is applied correctly when movement is parallel to and impacting a surface (“sliding”).

  • New: Add enum controlling MovementComponent plane constraint / axis-locking behavior. Modes are: custom, X, Y, Z, and an option to use the global physics axis setting.

    • The option to use the global physics setting makes it easier to keep multiple blueprints using the same plane constraints.

  • New: Fixed FVector::Parallel() and added FVector::Orthogonal().

    • Add FVector::Orthogonal() for determining if two normals are orthogonal / perpendicular within a tolerance.

    • FVector::Coplanar() now takes a threshold for controlling the parallel test.

    • Add THRESH_NORMALS_ARE_ORTHOGONAL for orthogonality test.

    • Rename THRESH_VECTORS_ARE_PARALLEL to THRESH_NORMALS_ARE_PARALLEL, and change the meaning to the cosine of the angle we compare to.

    • Fix FVector::Parallel() reporting false for parallel vectors pointing in opposite directions. Use FVector::Coincident() if you care about the direction.

  • New: Improvements to Blackboards’s Blueprint interface

    • GetBlackboardValueAsRotator and SetBlackboardValueAsRotator have been exposed

    • A single function for clearing Blackboard’s key value has been added

  • New: Vehicles can now perform RVO avoidance

  • New: Fixed updating bounds of NavRelevantComponents after moving owning actor in editor

  • Fixed broken camera rotation when ending pie. Camera should now remain where it was at time of ending.

  • Added code to fixup incorrect 's in Documentation actor link field.

  • Added code to replace \ with ./ in documentation actor links

  • Revised code that checks validity of links in a documentation actor.

  • Fixed clicking on Document links in documentation actor opening 2 pages

  • Fix a use-after-free bug in USkeletalMeshComponent.

  • HitBox hit tests now work correctly on laptops with touchscreens.

  • Changed ‘FGameplayAbilityTargetData_SingleTargetHit::GetEndPoint()’ to return ‘HitResult.Location’ instead of ‘HitResult.ImpactPoint’.

  • Fixed ‘FGameplayAbilityTargetData_ActorArray::GetOrigin()’ to return the correct rotation.

  • ‘GameplayAbilityTargetActor’ now checks the ability’s Avatar when deciding it’s net relevancy.

  • Blueprint added components that have native defined subcomponents are now properly registered during reconstruction.

  • World teardown now occurs in GameEngine::PreExit instead of HandleExitCommand.

    • SlateApplication shutdown now occurs after Engine and App PreExit

  • Don’t display events that are not valid for Emitters in blueprint context menus.

  • Fixed calculation in DrawDebugCylinder flagged on UDN which was doing float math with integers which resulted in incorrect behavior.

  • Don’t call SetIsReplicated in constructor, just set bIsReplicates directly

  • SSpinBox no longer teleports the cursor to a random position on the screen.

  • Fixed mouse input being a frame late.

  • Synthetic slate mouse moves no longer caused erroneous tool tips to appear.

  • Fix issues (particularly on Mac) seen when moving mouse out of the viewport while holding left mouse button down when using the mouse as touch.

  • Fix where the mobility of parent/child actors could end up out of sync with one another.

  • Actor ReplicatedComponents array is now properly updated and kept in sync with OwnedComponents

  • Correct issues with calling order of cleanup functions for components

    • BeginDestroy calls ExecuteUnregisterEvents before OnComponentDestroyed

    • UninitializeComponent now gets called from DestroyComponent

    • InitializeComponent will be called by RegisterComponentWithWorld if its Owner Actor is initialized

    • SceneComponent now overrides OnComponentDestroyed instead of DestroyComponent to do ScopedMovementStack and Detachment ensuring UninitializeComponent is consistently called before UnregisterComponent

  • Fixed actors with native root component moving to 0,0,0 when undoing a transaction when it also has certain types of blueprint added components

  • Fixed issues where GetMousePosition returned true when mouse was outside the viewport.

  • FSkeletalMeshMerge will now merge vertex colors, if vertex colors are used in one more of of the source meshes.

  • Fixed memory leak in FPhysicsScene2D

  • Removed incorrect bWillEverBeLit=false in 2D sprite render scene proxies

  • Fix path following in CharacterMovementComponent, so that it turns more quickly and considers current velocity when trying to reach destination speed.

    • Restored “bRequestedMoveUseAcceleration” which can be set to false to disable acceleration and use requested pathfinding velocity directly (instant turning).

  • APlayerController::PostProcessInput() uses IsLookInputIgnored() virtual rather than reading IgnoreLookInput variable directly.

  • Fixes to projectile movement uses of friction, and improvements to behavior when sliding along a surface, to remove variance under different timesteps and to apply consistent friction.

    • Sliding movement now considers the acceleration (in any direction, not just gravity) and handles it in a new function: HandleSliding().

    • Friction is applied correctly when movement is parallel to and impacting a surface (“sliding”).

  • MovementComponent auto registration of tick function moved to OnRegister() rather than InitializeComponent().

  • ProjectileMovementComponent velocity initialization moved to OnRegister() from InitializeComponent().

  • Avoid updating the PhysicsVolume in MovementComponent::SetUpdatedComponent() if executing during registration, it will occur as part of UpdateOverlaps() in registration anyway.

  • CharacterMovementComponent::SetUpdatedComponent() makes sure the OnComponentBeginOverlap delegate is added uniquely.

  • Fixed AHUD::GetCoordinateOffset() returning uninitialized FVector2D when there is no local player.

  • CharacterMovement StepUp() function aborts if forward movement results in no net change in position.

    • Step downs are also limited to step up height when not walking.

    • Fixes flying Characters moving down when impacting vertical surfaces, even if movement direction was slightly upward.

    • Also reduces the worst-case number of sweeps in character movement (previously occurred when pushing into corners).

  • Removed redundant GetWorld() call in SceneComponent::GetPhysicsVolume()

  • Fixed MovementComponent::ComputeSlideVector() calculating incorrect deflection vector when the plane constraint is enabled.

    • Rather than projecting the final result onto the movement plane, the normal should first be projected onto the plane and normalized.

    • fixes cases where collision with geometry angled outside the movement plane would stop movement, rather than deflect it.

  • Don’t recalculate Character velocity when falling if there was a teleport (usually adjustment out of penetration).

  • Improve Pawn physics penetration handling when overlapping more than one object/surface.

    • Use a combined MTD result to get an adjustment that moves out of both objects.

  • MovementComponent::TwoWallAdjust() uses ComputeSlideVector() rather than an explicit vector projection.

    • Extra call to HandleSlopeBoosting() removed in CharacterMovementComponent::PhysFalling() since it’s handled by TwoWallAdjust()'s call to ComputeSlideVector() now.

  • Tweak to air control limit code, to allow pushing in to vertical surfaces so you still get the hit event. Angle surfaces that normally restrict air control still get the event due to contacts caused by gravity.

  • Fixed SceneComponent::MoveComponent() so it always fills in the out HitResult no matter the control path.

  • FHitResult default constructor initializes ‘Time’ variable to 1.0.

  • Added ‘bBlockingHit’ boolean to BreakHitResult.

  • New: Add hit result to all Actor and SceneComponent transform functions, for both C++ and Blueprints.

    • Blueprints now have a way to get the hit result of swept movement to be able to implement more complex movement without the need for C++ code.

  • CharacterMovement Falling doesn’t need to check air control before the first move, since deflection uses the non-air control velocity to deflect.

  • Fix crash in CharacterMovementComponent if setting UpdatedComponent to NULL.

  • MovementComponent::SetUpdatedComponent avoids changing physics volume and trying to unbind delegate (causing ensure) if object is pending kill.

  • Fix UpdateOverlaps() call in DetachFromParent() causing incorrect notification when called from AttachTo() and the object does not maintain world position.

  • Allow Actor.InitialLifeSpan to be edited on instances (EditAnywhere instead of EditDefaultsOnly).

  • Projectiles now behave correctly when the plane constraint is enabled.

    • Added UMovementComponent::ConstrainNormalToPlane(), which normalizes the vector after constraining its direction.

  • Fixed some BT nodes not being exposed as AIMODULE_API

  • Minor change to some of AI functions’ signature, pointers changed to references where a null value is invalid

  • Removed hard reference to AAIController from APawn

  • A fix to wrong condition being checked to determine if navigation needs to be build

  • New: Exposed UE4’s Recast integration header files (moved to public directories)

  • Renamed GetBlackboard functions available in BT nodes to GetOwnersBlackboard.

  • Fixed debug labels drawn by NavigationTestingActor being drawn for items outside of camera’s frustum

  • Fixed navmesh’s raycast not properly handling queries starting outside of navmesh. Made those result as “blocked”.

  • Marked SpawnAIFromClass BP node as unsafe for usage in Construction Script (because it is!)

  • Collision Profile: Fixed so that it doesn’t accept Trace Type as an Object Type for profile.

  • Fixed when ChildActorComponent produces “Mobility spam log” when it is inherited.

  • Special navigation area for too low spaces is now removed after applying static modifiers

  • Fixed navmesh update on geometry brush (BSP) changes

  • Fixed FPS drop on rebuilding navmesh

  • Added original key code to keyboard events and exposed AreCapsLocked from input events.

  • Major internal change to the way navmesh tiles generation is organized. No changes should be visible from user point of view.

  • AReverbVolume has been renamed to AAudioVolume.

  • FComponentInstanceDataBase no longer stored using TSharedPtr

  • FInputChord::RelationshipType renamed FInputChord::ERelationshipType

  • UDEPRECATED_SaveGameSummary deleted

  • Push To Talk removed from default Debug Exec Bindings

  • Unused UWorld::bDebugStepExecution removed.

  • Changed templates that have projectiles to use a DefaultProjectile collision preset which now exists in engine.

  • Improved documentation in GameViewportClient header.

  • FSoundParseParameters moved out of AudioComponent.h and in to ActiveSound.h

  • FKeyDetails now uses TAttribute instead of both a FName member and a Delegate member that returns a FName.

  • Slate event-routing is now more systematic, enabling better event tracking and debugging features in the future.

  • Slate event routing implementation is now more systematic, enabling better event logging and debugging in the future.

  • Spawning an Actor into a world that is being torn down is now prevented and a warning issued.

  • Media: Fixed a memory leak in the Windows media player plug-in

  • Media: Fixed incorrect handling of relative movie file paths

  • Fixed case where FlushLevelStreaming was not flushing state of all levels

  • Added documentation to Hud.h file and split some structs and such into their own files.

  • UPROPERTY removed from internal state boolean in UActorComponent

  • Validate that no components that are not owned by an Actor are added to its OwnedComponents array.

  • AController::IsInState() is now const.

  • Consolidate all CharacterMovementComponent::PhysFalling acceleration handling into GetFallingLateralAcceleration().

  • ProjectileMovementComponent.MaxSimulationIterations is no longer an advanced display property, in line with the other related settings (MaxSimulationTimeStep, bForceSubStepping).

  • Deprecated CharacterMovementComponent::AdjustUpperHemisphereImpact() and UpperImpactNormalScale.

  • Cleaned up CharacterMovementComponent to use new deprecation enable/disable macros instead of all the compiler-specific pragmas in-line.


  • New: Sockets: Added API for specifying send and receive buffer sizes on UDP/TCP socket builders

  • New: Allow game code to detect when a network demo has started playing.

  • New: Add ability to slow and speedup network demo playback speed.

  • New: Added ability to control the demo record rate.

  • New: Adding Native NetSerialize support to FastArrayReplication path.

  • Made MulticastSocket creation optional (for platforms that don’t support multicast)

  • Prevent crash when resetting achievements on those platforms that require a valid FUniqueNetId to do so.

  • Fixed crash when exiting multi-client Play-In-Editor after failing to connect to a server.

  • Fixed an when async networking loading was turned off, and a package was not fully loaded, would cause issues.

  • Fixed constructors in FVector_NetQuantize10, FVector_NetQuantize100 and FVector_NetQuantizeNormal.

  • Fixed a crash that could occur if a garbage collected objects and replication.

  • Fixed an that could cause some properties not to get replicated when an actor goes dormant.

  • Fixed the behavior of ESocketReceiveFlags::WaitAll on Windows.


  • Avoid out of bounds crash due to functions not checking against the correct max value for local talkers

    • Integrated from PR #495 by alexSilkin

  • Fixed bugs in OnlineSubsystemNull

    • LAN sessions created by OnlineSubsystemNull will now advertise the actual port used by the net driver.

      • makes testing multiplayer with multiple instances on the same computer easier since each instance will advertise a different port when hosting a session.

    • Fixed a bug where LAN sessions created by OnlineSubsystemNull would not advertise as soon as they are created.


  • New: Exposed the "GetCenterOfMass” function to Blueprints

  • New: Added center of mass visualization

  • New: Destructible components now use the async scene automatically (if the scene is enabled)

  • New: Added the option to turn sub-stepping off for async scene.

  • New: Added new physics stats and named events to help profile physx performance.

  • New: Added mass override to easily set mass without worrying about density values.

  • New: Destruction no longer needs to generate hit events to simulate impact damage.

  • New: Expose ragdoll simulation on dedicated server as project setting

  • Avoid heap allocation in single sweep and raycast queries when collision analyzer isn’t enabled.

  • Fix collision on instance indices >128 on movable InstancedStaticMeshComponents

  • Improve depenetration vector when overlapping trimesh and heightfields.

    • Previously we tried using the supplied impact normal when face index was valid, but meant we could be inside an edge and try to move along the normal, rather than away from the edge.

    • Now we just use MTD with an inflated test to get the depentration vector.

  • Improved Physics Blending

    • fixes when root bone isn’t identity.

    • fixes when physics asset root bone isn’t mesh’s root bone

    • Cleaned up code so that we don’t use static variable but local variables


  • New: Added ability to use r.MobileContentScaleFactor of 0, which means to use full native resolution on iOS and Android. is the best way to get the native resolution (1920x1080) on the iPhone 6+, instead of the full virtual resolution (2208x1242) which would just get scaled down.

  • New: Fixed a crash with ICU trying to localize an error before loading ICU data (when using -filehostip in particular)

  • New: First round of merging fixes from Shootergame certification pass. Many fixes to OSS systems.

  • Changed FLightmassProcessor::BeginRun() to always use Development builds of UnrealLightmass on Mac and Linux, same as it does on Windows.

  • Fixed AVI extension in Windows AVIWriter

  • Cancel Http Request for Android, IOS and Linux now cleans up the request objects as expected.

  • Exclude staged build directories from filelist processing when using cookonthefly. Can speed up cookonthefly boot times.

  • Fixed CreateGuid to create correctly unique Guids on all platforms. Previously on platforms other than microsoft and apple platforms it could create identical Guids if called frequently.


  • New: First pass at google play store IAP added. Further changes are incoming.

  • New: Improve Android device detection logic to detect unauthorized devices and query SDK and release versions, displaying the OS version in the device manager

  • New: Several Android toolchain updates:

    • Updated to support Android 5.0 (SDK 21 and NDK 21) - however we default to NDK 19 since compiling with NDK 21 headers generates code that will not run on devices before 5.0).

    • Implemented incremental APK generation to reduce the time spent in the final .apk file generation (when compiling or packaging).

    • Also added the ability to easily add more Java libraries without needing to update UnrealBuildTool code (just put your lib in \Build\Android\JavaLibs like we have google now in Engine\Build\Android\Java\JavaLibs)

    • Changed the APK generation code to hide the spammy output and show more useful stage progression.

  • Improve Android logging to break up log messages at newlines to deal with buffer limit.

  • Corrected JNI call (AndroidThunkCpp_IsMusicActive) to use CallBooleanMethod.

  • Removed a negative delta time fatal error (occurs on some Android devices).

  • Fixed an where you couldn’t cancel Google Play sign-in in some cases

  • Fixed errors when building games for Android in “for distribution” mode

  • Fixed looping and playback issues with Android ADPCM samples


  • New: You can now specify the minimum iOS version supported by the game as well as the which devices are supported. These settings are located in the iOS section of the Project Settings.

  • New: The mobile provision and signing certificate can now be specified via the iOS Project Settings. Selecting the Install Provision or Install Certificate buttons will install the selected item.

  • New: Enabled C++11 support on iOS

  • New: Facebook SDK for iOS upgraded to 3.16

  • New: iOS and Mac Media Player added. allows users to stream movies to slate textures in game.

  • New: Added support for iPhone6/6+ resolutions

  • New: Added Metal support for (reduced battery usage if nothing else!)

  • New: Added an on-screen message for when you run a Metal-only app on a device that doesn’t support Metal (which the App Store should disallow, but it’s still possible to get it on a non-Metal device)

  • New: Shipping and Test configurations for iOS now include the arm64 executable. will be a requirement for putting apps on the app store in February, so we wanted to give users time to get used to the increased sizes.

  • New: IPhonePackager is now used on a Mac to detect provisions and signing-certificates. starts the process of unifying the code path for both PC and Mac workflows.

  • New: Added an iOS framepacer which allows users to specify how often they sync rendering with the iOS frame ticker.

  • New: Receipts are now returned as part of the In-App Purchase payload for IOS.

  • New: Added Copy Repository functionality to iOS deploy stage of UFE.

  • New: The additional commandline args files in UFE can now be used to specify a commandline for launch on device when selecting Copy Repository as the deploy method.

  • Fixed an with xcode project generation when a sample had been renamed from the launcher. was causing an invalid scheme to be generated and causing code signing issues.

  • Fix for crash when utilizing landscape mode on iOS devices.

  • Properly parse UTC times from the mobile provision files so we can accurately detect valid provisions.

  • Updated IPhonePackager to provide a better message when the bundle identifier of the mobile provision that is installed doesn’t match the bundle identifier of the game it is being installed for.

  • Stat Macro renamed to avoid a mismatch with one from apples core animation api.

  • dSYM files can now be generated when deploying to iOS from Xcode.


  • New: Added methods to allow stack walking in HTML5.

  • New: Update Emscripten SDK to 1.25

  • New: Enabled ICU (International Components for Unicode) for HTML5.

  • Fixes for Launch On for HTML5 and Chrome.

  • Fixed key repeat not working in HTML5.

  • Python exe used by HTML5 is now read from emscripten config file. When missing environment variable PYTHON is used, if empty then PATH is searched.


  • New: Implemented transparent windows

  • Core 3.2 GL profile is now sufficient for running Linux tools (previously compatibility features were used)

  • Fix for not being able to start modular dedicated server due to (bogus) version mismatch of its modules.

  • Fix for multiple instances of a dedicated server stomping on each other’s logs

  • Fix linking to libraries located in paths with spaces.

  • Added some missing platform specific functionality for Linux.

  • Fix for connectivity issues on Debian due to its address hack.

  • Added (unsupported) third-party libraries for Linux on ARM.

  • Added files needed to compile for Linux on ARM (unsupported)

  • UBT will refuse to use clang 3.4 and gcc.


  • New: Fully implement support for Mac OS X’s fullscreen mode.

    • Fullscreen mode on OS X now allows you to specify the resolution rather than always taking the displays current resolution.

  • New: Added support for customizing splash screen and icons for Mac in project preferences

  • New: Added support for GameStop version of Xbox 360 controller on Mac

  • New: Native look of window close/miniaturize/zoom buttons on OS X 10.10 Yosemite

  • Disable OpenGL workarounds no longer required on Yosemite, though they will still be used on Mavericks.

    • Combined depth-stencil clears & depth-fetch-during-depth-test now work on AMD 7xx0 & Dxx0 GPUs.

    • On Intel cards we no longer need to flush changes to the blend state, significantly improving performance on those GPUs.

  • Fix broken skeletal mesh rendering on Nvidia cards under Yosemite.

    • rebinds the SRV whenever the underlying buffer is modified which should not have a performance impact.

  • Fix crash reporting under Yosemite due to a bad interaction between our operator-new override & a system library.

  • Amend launching processes on OS X to report failures rather than crashing.

  • Stop titled windows on Mac OS X wandering down the screen when repeatedly entering & exiting fullscreen mode.

  • Fix crash on taking high-res screenshots on OS X.

  • Invert keydown/keyup message handling order on Mac OS X so that Slate gets the to process the message before the OS.

    • Ensures that viewports always get key-down & key-up pairs & that we don’t accidentally activate menu key-equivalents.

  • Fix the Window menu on Mac OS X not being properly populated.

  • Rewrite separate game thread event dispatching on Mac OS X to use a custom run-loop source and avoid several potential deadlock risks.

  • Fix OS X system modal dialog input by setting a flag in MacApplication to indicate that a system modal dialog is active.

  • Rather than cancelling OS quit requests on OS X and then quitting behind Cocoa’s back, use the proper deferral mechanism so that we have Cocoa wait for the separate game thread to exit before it tears the application down.

    • UE4 applications shouldn’t cancel shutdown, restart or logout requests anymore.

  • Stop windows from reappearing on OS X after they’ve been closed.

  • Properly escape the command-line arguments when launching games for Play-as-Client so that they open in the correct display mode.

  • On OS X when a UE4 application loses focus push modal windows down to the normal window level, restore them on gaining focus, so that they don’t float over other applications.

  • Fix reporting of crashed application name on OS X when launching the editor without a project and ensure’s causing hangs in crashed applications.

  • Fix some faulty FMacWindow event order assumptions to ensure correct behaviour when opening windows.

  • Copy the crash video if there is one into the crash report folder on OS X.

  • Fixed some issues with windows rearranging their order on editor deactivation

  • Fixed handling of text dragged to editor widgets from other apps

  • Fixed menu and tooltip animation issues caused by setting their initial position incorrectly

  • Fixed a problem with Window menu contents not updating when enabling or disabling items in editor’s experimental settings

  • Fixed a problem with editor freezing when opening menus from menu bar

  • Fixed a problem with source control login dialog showing behind other windows

  • Matinee will now save movies with correct .mov extension instead of .avi

  • Fixed a crash in tutorial editor’s widget picker

  • Use Less CPU when in Background editor option will now reduce CPU usage after fast switching to different user

  • Fixed some issues with sub-menus not populating correctly

  • BINARY: Don’t activate the Launcher on Mac when the editor starts if it’s already running, but hidden

  • Fixed a freeze on quitting the editor with Cmd+W on Mac

  • Pressing W/E keys while using trackpad no longer changes active widget mode in editor’s viewport

  • Fixed a problem with openFile: spawning another process if called with invalid params

  • Updated engine code to compile correctly with OS X 10.10 SDK, added SDK detection to MacToolChain

  • Specify explicit window levels for the different types of window in the editor on OS X, so that modal/tooltip/menu windows are on top, then parented or utility windows, then normal windows at the bottom.

PlayStation 4

  • New: Initial support for SN-DBS distributed build system. Will be used for compiling for PS4 if SN-DBS is installed and Incredibuild isn’t available/enabled.

  • New: Added BC4 texture support.

  • New: Added PS4 compatible .natvis for Visual debug visualizers. Copy Extras\VisualStudioDebugging\PS4UE4.natvis to SCE\orbis-debugger

  • New: Project Settings for PS4 (in the editor) now exposes various compile time options for each project. RazorCPU support, GPU Debugger support, etc.

  • Fix for FWeakObjectPtr visualizer not working due to .natvis not supporting multiple types in one visualizer

  • Fix for random on screen corruption when GBufferFormat is set to high precision.

  • Final round of fixes from the Shootergame certification pass. Fixes various issues with async tasks from OSS calls.

  • Fix bug causing corrupt dynamic cubemap reflection captures.

  • Fixes a UFE crash when powering off the PS4 running the launched build from UFE.

  • Fixes VSI detection and project generation on system which only have VS2013 installed.

  • Fix potential GPU hangs on PS4 when command buffer exceeds 4MB.

  • Fix incorrect array slice / mip based clears for non-cmask 2d textures.

Xbox One

  • New: Geometry shaders now use on-chip memory. saves bandwidth and speeds up the GPU when geometry shaders are used.

  • Fixed a memory leak in the DirectX state cache.

  • Remove dependency on June 2010 DirectX install for Xbox One builds.

  • Removed non-breaking spaces from some code so that it can be compiled on Japanese Windows.

  • Removed use of SHAPE for the XAudio2 device used by the movie streamer, as it was interfering with third party audio.

  • Fixed a memory leak in the DirectX state cache.

  • Fixed a potential use-after-free when creating Live sessions

  • Fixed a potential crash when attempting to join a Live session after the host has disconnected.

  • Fixed some potential crashes in the Live online subsystem due to uncaught exceptions.


  • New: Scene captures that update every frame now benefit from occlusion queries

  • New: Added “Self Shadow Only” setting to components (e.g. for 1st person self shadowing weapon without casting a shadow onto the world)

  • New: You can now configure Ambient Occlusion’s static amount in your project settings for better performance when not using baked lighting

  • New: Improved visual quality of Subsurface Scattering (less artifacts on half res upsample, more crisp non subsurface)

  • New: Added ‘r.ProfileGPU.Root’, which can be used to filter the hierarchy to a specified root

  • New: RHI.MaximumFrameLatency for setting the number of frames that can be queued for render on DX11

  • New: “Visualize HDR” view mode now shows Histogram bucket as color

  • New: New project setting that exposes D-Buffer requirements for your game

  • New: Added support for setting show flags for Scene Capture actors. Now it is possible to disable things like dynamic shadowing or translucency for Scene Captures, and can be adjusted individually for different Scene Capture actors.

  • New: Added a new CVar in the scalability ini r.EmitterSpawnRateScale. is applied as a global scale on the spawn rate of all emitters that have bApplyGlobalSpawnRateScale set to true in their spawn module. bApplyGlobalSpawnRateScale defaults to true.

  • New: Distance Field AO optimizations

    • Objects with no distance field representation (character) no longer receive DFAO, that was causing a huge amount of interpolation cost

    • Background is stenciled out from interpolation splat pass

    • Surface cache resources are allocated based on worst case of the current resolution, saves memory and prevents overflow

  • New: Skylight captures are now also updated when reflection captures are updated.

  • New: GPU emitters now support event spawning.

  • New: Added an updatable texture to easily allow writing to textures every frame.

  • New: Forward LifeTime parameter to LineBatcher when drawing Cylinders

  • New: SlopeMask: material function used to mask the slope of a mesh, useful for terrain texturing and adding snow to the top of objects.

  • New: MatLayerBlend_OverrideOpacity: Material layer function to override opacity

  • New: MatLayerBlend_ModulateSpecular: Material layer function to modulate specularity attribute.

  • New: VectorDisplacement: Added material function for using vector displacements rendered in xNormal

  • New: SplineThicken: added new input for overriding the UVs used to generate the round normal. is useful for having multiple cylinders on one sheet when doing hair.

  • New: Added support for ddx/ddy functions on Metal shaders

  • New: Fixed where changes to UPrimitiveComponent::bRenderInMainPass had no effect. Replaced property with SetRenderInMainPass function.

  • New: Added cvar override ‘r.SceneCaptureResizeMethod’ to prevent scene capture render targets from being clamped in game mode.

  • New: SetOcclusionTint and SetMinOcclusion BP functions for skylight components

    • SetCastShadows is now accessible to skylight components

  • New: De-emphasized connectors in the material editor are drawn much brighter, increases visibility with comment backgrounds

  • New: MatLayerBlend_TenLayerBlend: is a node that should make working with material layers more straight forward. is a fixed function node that supports blending of a maximum of 10 layers. If you do not use a layer input or mask the compiler will optimize it out.

  • New: Added OcclusionTint, MinOcclusion to sky light for DFAO artistic controls

  • New: Renamed new cvars, now ‘r.Shaders.Optimize’ and ‘r.Shaders.KeepDebugInfo’

  • New: added filtered option to the SceneTextures for PostprocessInput0…6, doesn’t work on OpenGL yet

  • New: exposing new PostProcessMaterial location to replace the tonemapper, is the base for upcoming postprocess changes

  • New: D-buffer approach for decals exposed as a project setting.

  • Allowed setting null textures in OpenGLRHI to match D3D & fixed a number of crash bugs.

  • Avoid accessing a destructed RHI in OpenGLTexture & SlateRHIResourceManager to prevent crashes on shutdown.

  • Fix for GSystemResolution not being setup in time for some objects being created resulting in UTextureRenderTarget2D’s having a size of 0,0.

  • Persistent level is always registered for texture streaming in the Editor.

  • Landscape correctly registers all dependent textures for streaming.

  • Flowmap material function: added support for disabling mip map adjustment, allows the function to be used in world position offset or displacement

  • Fixed corruption on particles

  • Fixed objects not rendered in the main pass still affecting motion blur

  • Fixed scene captures on mobile projects

  • Black lightmaps are now tossed even when a skylight is absent

  • Fixed translucent subsurface lighting

  • Fixed editor primitive depth testing with GetDynamicMeshElements

  • Disabled DFAO interpolation depth testing due to artifacts Fixed skylight crash when building lighting with no specified cubemap

  • Fixed rare GPU hang from DFAO

  • Fixed Screenspace Subsurface Scattering when used in splitscreen

  • Improved subsurface profile quality (fewer artifacts due to the half resolution upsample)

  • Fixed the case where a single float was provided as the subsurface color in a material

  • Lightmass material properties are clamped to valid ranges before exporting, prevents light explosions with photon mapping

  • Material inputs are clamped to valid ranges at the source. Adds a few ALUs but improves cross-platform compatibility and consistency.

  • Fixed DiffuseColor input still being used when exporting translucent materials to lightmass

  • Optimized the histogram shader, especially for AMD GPUs and high resolutions

  • Fog inscattering exponent is no longer clamped to 1

  • Shadow passes are now implemented properly with GetDynamicMeshElements

    • Previously was reusing meshes from the main view, but meshes in the shadow view might not be visible from the main view

  • Fixed a bug that made normal mapped mesh particles not work properly with scaling the meshes.

  • Minor parallel rendering fixes. Improved constructors for Xbox RHI. delete comments and cruft. Turn off parallel shadows. Flush before reflection capture on all platforms.

  • Fix stencil clear bug for shadows and parallel rendering

  • Fixed togglerhithread

  • Fixed shader recompilation

  • Minor parallel rendering fixes; make sure bypass is latched right away for RHI thread and don’t clear stencil on PS4 if we don’t have a write address

  • Fixed a bug that made mesh emitters continue to render in wireframe after switching to wireframe and back.

  • Parallel rendering - fixed two serious race conditions on the PS4 and XB1 that resulted in GPU hangs etc

  • OpacityMask and Masked materials now work correctly when using material attributes.

  • Added UFunction redirects for SetIntensity in Light and SkyLight components. function was previously named SetBrightness.

  • Fixed windowed fullscreen modes so that you can specify resolutions less than the native desktop without causing the window to appear incorrectly in the corner of the screen

  • Fixes for several crashes when using the null RHI

  • Fixed a gamma correction in mobile preview modes where slate items would be rendered incorrectly

  • Changed FPrimitiveSceneProxy::GetScene() to return a reference rather than a pointer

  • Fixed bug where velocity map rendering was not working correctly with RHI Thread. was causing motion blur to be exagerated.

  • Fixed improper use of BUF_VOLATILE in the skincache. The lifetime of a BUF_VOLATILE is a single frame.

  • Fixed UTextureDynamic2D to have a useful static creation function.

  • Significant particle optimization from Pull Request #284

  • Fixed a few problems with PSA_Velocity and PSA_AwayFromCenter in conjunction with use of the initial rotation module.

  • Added geometry and current time to ISlateViewport Tick function

  • Hide irrelevant collision-related properties from Billboard and MaterialBillboard components

  • XboxOne In-progress work on deferred contexts

  • Remove xbox from PC version of split d3d11rhi

  • Parallel rendering - turned on RHI thread by default for platforms that support it

  • Split Xbox RHI off. Deffered contexts for XB1, parallel velocity rendering fixed and reenabled.RHIThread on by default on platforms that support it.

  • Updated world aligned material functions to use shared texture samplers.

  • GitHub pull request #68, simple interface for third party occlusion solutions

  • Removed DEC_* macros from drawing events

  • Fixed crash when launching certain projects either in editor or game.

  • Removed r.UseDiffuseSpecularMaterialInput (not usually used, and prevented some GBuffer optimizations)

  • Fixed objects not rendering in the main pass still affect motion blur

  • Fixed the 1 pixel black border which can show up in screenshots when certain post process are enabled

  • Improved streaming strategy for textures using their component’s mobility settings

  • Fixed TexelFactor calculation for landscape heightmap texture. Improves heightmap texture streaming

  • Metal now supports Shader Resource View parameters

  • Metal now running as feature level ES 3.1

  • Moved around some cross-compile source files

  • Replaced hlslcc*.exe with CrossCompilerTool.exe

  • OpenGL backend for the shader cross-compiler now resides on ShaderFormatOpenGL

  • Metal backend for the shader cross-compiler now resides on MetalShaderFormat

  • Metal shader back-end does not use the GLSL back-end anymore; added FramebufferFetchMRT() intrinsic.

  • GRHIFeatureLevel is deprecated.

Upgrade Notes
C++ API Changes

  • UMaterialExpressionTextureSample and UMaterialExpressionTextureSampleParameter’s ConstMipValue value, and UMaterialExpressionIf’s ConstAEqualsB value were previously used verbatim. Now they are processed by the compiler, so check these values first if you notice any oddities in a material.

  • After switching to using the new “GENERATED_BODY” macro there can be redefinition compiler errors. To fix that you have to either:

    • declare the FObjectInitializer constructor in header file, or

    • delete definition of FObjectInitializer constructor from source file (if it does nothing more than default constructor).

    • You may need also to change protection level as GENERATED_BODY() macro will preserve spotted protection level, while old macro was always setting to public.

  • You may have to rename the class in your code to avoid deprecation warnings.

  • All SCOPED__DRAW_EVENT functions now omit the event color

  • Changes to the API of GetBoneLocation and GetBoneQuaternion

  • All Montage API now takes an optional Montage pointer to control different Montage assets at the same time.

  • ULevelBase has been eliminated, however, all things should have been inheriting/referencing ULevel anyways.

  • Existing usages of AReverbVolume in C++ will need to be changed to AAudioVolume

  • Changed GetBoneLocation, GetBoneQuaternion to use bone space enum instead of ints

  • AnimMontage’s bEnableRootMotionTranslation and bEnableRootMotionRotation have been combined and moved to bEnableRootMotion on AnimSequence’s. The values still exist on AnimMontages but should not be used.

    • UAnimMontage::Advance now takes a flag to specify whether root motion should be blended or not

    • UAnimSequence::ResetRootBoneForRootMotion now takes the value for ERootMotionRootLock::Type RootMotionRootLock directly instead of the owning FAnimExtractContext

  • Any API which refers to a delegate will now have a different decorated linker symbol.

    • Any code which referred to internal delegate implementation types, e.g. TBaseDelegate_NoParams, will no longer compile and should be replaced with the equivalent DECLARE_* macro.

  • RemoveFromViewport is now deprecated, use RemoveFromParent.

  • InterfaceCast has been deprecated - Cast or dynamic_cast should be used instead.

  • CopyConstructItems and RelocateItems have been deprecated.

    • Their use should be replaced with ConstructItems and RelocateConstructItems, which support construction/relocation between different types.

  • FAnimNotifyEvent StartTime deprecated - Replaced with methods GetTime() and SetTime()

    • FBranchingPoint DisplayTime deprecated - Replaced with methods GetTime() and SetTime()

    • FCompositeSection DisplayTime deprecated - Replaced with methods GetTime() and SetTime()

  • API changes (must be changed):

    • FViewport::CaptureJoystickInput(bool Capture) renamed to FViewport::SetUserFocus(bool bFocus)

      • EKeyboardFocusCause renamed to EFocusCause

      • FKeyboardFocusEvent renamed to FFocusEvent

      • FKeyboardEvent renamed to FKeyEvent

      • SWidget::OnKeyboardFocusReceived(…) use SWidget::OnFocusReceived(…)

      • SWidget::OnKeyboardFocusLost(…) use SWidget::OnFocusLost(…)

      • SWidget::OnKeyboardFocusChanging(…) use SWidget::OnFocusChanging(…)

      • SWidget::OnControllerButtonPressed(…) now routed through SWidget::OnKeyDown(…)

  • UGameInstance::InitPIE has been removed and UGameInstance::Init will be called for PIE as well as for standalone.

  • upgrade also includes minor changes to the IHeadMountedDisplayInterface. If you’ve used interface, please upgrade your implementation to conform to the new function signatures.

  • Removed GVolumeMultiplier and added an equivalent to FApp to contain the code to load the unfocused volume multiplier from config.

  • FPrimitiveSceneProxy::GetScene() now returns a reference to the FScene. Lots of code assumes the existance of a scene, so cements . Added a check() that the scene is valid when creating the proxy.

  • Instead of including Media.h, please include the interface header files that you actually use, i.e. IMediaPlayer.h and/or IMediaTrack.h

  • ApplyRequestedMove() has had params reordered and changed; it now includes Friction and Braking, and has all the “out” params at the end.

  • Some variables and functions have either been removed or renamed:

    • Removed hacky bGravityEnabled flag from various velocity and acceleration functions.

    • Deprecated old CalculateVelocity() method, renamed to ComputeVelocity() to align with the other functions in the class.

  • Deprecated CharacterMovementComponent::AdjustUpperHemisphereImpact() and UpperImpactNormalScale.

    • Implementations of AdjustUpperHemisphereImpact() should override ComputeSlideVector() instead.

  • Renamed THRESH_VECTORS_ARE_PARALLEL to THRESH_NORMALS_ARE_PARALLEL, and change the meaning to the cosine of the angle we compare to.

    • Old tolerance was very fuzzy (11.4 degrees), new tolerance is about 1 degree.

  • Modified FindAirControlImpact() to distinguish between current and lookahead time, and to take velocity and gravity. However, function might be deprecated as it is not currently used.

  • Removed hacky bGravityEnabled flag from various velocity and acceleration functions.

    • Deprecated old CalculateVelocity() method, renamed to ComputeVelocity() to align with the other functions in the class.

  • Some CharacterMovementComponent functions related to air control have been changed to allow more flexibility:

    • GetAirControl() now returns a FVector rather than float, to allow air control code to act non-uniformly (ie different laterally versus forward) if desired.

    • GetFallingLateralAcceleration()/GetAirControl() no longer do the sweep test forward in time to determine if air control should be limited.

    • LimitAirControl() now returns a FVector rather than float. The behavior is now to allow acceleration parallel to the surface in the horizontal plane, or away from the surface altogether.

    • LimitAirControl() may be called multiple times during a falling movement update.

  • Users may need to update their AI API function calls.

  • Unused parameters removed from FConfigFile::CombineFromBuffer and ProcessInputFileContents

  • FConfigFile::ProcessInputFileContents marked CORE_API so as to be callable from other modules

  • FAES marked CORE_API so as to be usable from other modules

  • All UK2Node GetMenuEntries() functions are deprecated/unused, and have been replaced by GetMenuActions().

  • Required Emscripten SDK version is now 1.25. version 1.22 will no longer work.

  • Depending on the console variable use you might see a behavior change (watch out for errors in the log). Console variable Set() now needs to specify the priority.

  • shouldn’t have been use by any project other than Fortnite.

  • Instead of ISettingsEditorModule::GetRef() use FModuleManager::GetModuleChecked(“SettingsModule”). Instead of including SettingsEditor.h include the interface headers you actually use.

  • Instead of ISettingsModule::Get() use FModuleManager::GetModulePtr(“Settings”). Instead of using FSettingsSectionDelegates assign delegates directly through the new ISettingsSection methods.

  • SWidget::RenderTransform is now a TOptional.

  • FWorkspaceMenuStructure::AssetEditorCategory has been removed and FWorkflowTabFactory::TabIcon is now an FSlateIcon (was previously an FSlateBrush)

    • To fix the category, use FAssetEditorToolkit::LocalWorkspaceCategory and set it using FTabManager::AddLocalWorkspaceMenuItem()

    • To fix the tab icon, simply use the same icon and style to create an FSlateIcon instead of an FSlateBrush

    • Any editor in the engine can be looked to for reference on these changes.


  • Existing “Equal” nodes for vector/rotator types will be assigned an error tolerance value of “0.0” on load in order to preserve previous behavior that may have been dependent on exact equality.

    • New placements of “Equal” nodes for vector/rotator types will default to the new error tolerance value, and will thus have a “NearlyEquals” type of behavior by default.

  • Users that implement their own UK2Nodes will have to port from GetMenuEntries(), and implement GetMenuActions()/GetMenuCategory()/GetNodeTitle(ENodeTitleType::MenuTitle)/GetTooltipText()/GetSignature() to see their nodes properly presented in the new Blueprint menus.


  • Any non-engine libraries which take or return delegates should be recompiled against the latest engine code to ensure they import/export the correct symbols.

  • Variadic delegates will allow binding to arbitrary numbers of arguments or functions with arbitrary arity, but the non-variadic version of delegates - still used by VS2012 - has the same limits as before if you still target that compiler.

    • Bound function arity limit == 8, bound argument limit == 4.

  • Manual construction of FPropertyChangedEvent instances should use the one-argument or two-argument form (construction of type is unlikely to occur in game code though).

  • For projects targeting languages other than English, update the Internationalization Preset settings in Project Packaging Settings in order to maintain support for you desired cultures.


  • May need to include ActiveSound.h instead of AudioComponent.h if reference FSoundParseParameters

  • Added OnFinishedPointerInput(), which gets called after event processing and before GEngine->Tick(). SViewport and FSceneViewport now uses function instead of ProcessInput() to accumulate high-precision mouse events.

  • Any C++ usages of EKeys::Underscore and EKeys:: will no longer work as expected and should be switched to EKeys::Hyphen and EKeys::Apostrophe respectively.

  • Functions Applying and Getting ComponentInstanceData now take/return FComponentInstanceDataBase* instead of a TSharedPtr

  • Any dynamically created components that were explicitly calling InitializeComponent should no longer do so as it is handled via RegisterComponent and will now assert due to InitializeComponent being called multiple times.

  • Use FVector::Coincident() if you care about the direction, for cases where FVector::Paralllel() was previously being used.

  • Function name will be updated automagically, but resaving BT assets is recommended.


  • Landscape code has been moved out of the Engine module and into its own module.

Oculus Rift

  • The engine has been upgraded to use the 0.4.3 SDK from Oculus. Please upgrade your runtime installation by downloading the 0.4.3 runtimes from http://developer.oculus.com


  • greatly improves performance. If you have destructible components that interact with the player and you are using an async scene you will need to manually set them to be in the sync scene

  • is now off by default as destruction rarely needs and it greatly improves performance.


  • A reminder that DrawDynamicElements in subclasses of FPrimitiveSceneProxy will be deprecated in 4.7 and replaced with GetDynamicMeshElements.

  • hlslcc*.exe is now replaced by CrossCompilerTool.exe in the Engine binaries folder

  • Any code that is directly setting bRenderInMainPass must instead call SetRenderInMainPass( value ).

  • Any usage of GRHIFeatureLevel must be replaced with access to world or view’s FeatureLevel property.

  • r.UseDiffuseSpecularMaterialInput has been removed allowing us to better optimize the g-buffer layout

  • The CustomTexture node has been removed completely and any materials that were using CustomTexture with some of the workarounds that worked in some previous versions will need to be modified.

    • A Custom node will now accept a connection from a TextureObject or TextureObjectParameter node instead.

    • If you add a parameter to your Custom node named “MyTex” and connect a TextureObject node, an extra sampler parameter named “MyTexSampler” will be available inside the Custom node’s HLSL.

    • You can sample the texture with an HLSL expression such as “Texture2DSample(MyTex,MyTexSampler,UV);”


  • You may experience failure for some old bindings depending on how they were setup. Ensure your bindings are Pure, and the return types match.

Known Issues

  • Cannot create events in the AnimBP EventGraph for new Anim Notifies.

    • Workaround for is to reopen the editor.

  • Pawn Sensing Component is not registering sound data within hearing radius

  • Missing adb path and device serial number in Android packaged install batch file

  • Touch events too early in game startup can cause a crash on Android

  • Incorrect static lighting on InstancedStaticMeshes

  • Changing an optional Spotlight iOS icon in the project settings does not affect the packaged project

  • Cannot call Event Node for Event Dispatcher

  • InstancedStaticMesh instances fail to render on mobile devices

  • Animation retargeting adversely affects looping animations

  • Rebuilding textures will cause editor to lock up briefly while using “Launch On”

  • Media Framework controls do not work on Mac

  • Content Examples Media map is missing source video

Wow! is so awesome! Thanks again guys!

So many release notes… :eek:

Just skimmed over it for now, will have to read more later. Really appreciate all of the new features, especially all the minor usability details, looks great!

Standout for me is 128 texture sample limit increase! So awesome :smiley:

Dat UMG on 3D Objects. :cool:

Never fail to make me a little giddy, with the way you guys knock stuff out. Amazing!

Countless fixes, countless improvements…to say the least, I’m very excited for release. Great job and thank you for all of your efforts.

So many release notes… :eek:

Just skimmed over it for now, will have to read more later. Really appreciate all of the new features, especially all the minor usability details, looks great!

Standout for me is 128 texture sample limit increase! So awesome :smiley:

I have to admit that is a pretty important fix for me as well. Looking forward to trying out by making some new landscape materials!

Can’t wait to try 3D umg!

I probably understand 10 - 15% of the changes/fixed issues list, yet, I still enjoy reading through it. :slight_smile:

What a hell , once again ; you can make a book with release note only
EDIT : Thank you Epic for amazing update .

wow thats a lot of stuff, thanks Epic :slight_smile:

will there be/are there documents about the c++ changes?


Awesome!.. thanks Epic!.

Amazing update , tons of useful stuff. Sorry to jump right in with a bug report but I’m pretty desperate to get flagged. I just posted it again in the 4.6 preview thread but it has since been closed.

“Any word on a fix for AI movement responding to externally-induced movement such as “launch character” correctly for release? It was flagged a few months ago but seems to have slipped through the cracks, thanks!”

Hopefully can make it into the next release instead. There is a Unreal answer thread located here…


Where Mieszko acknowledges it as a bug but since then I haven’t been able to get a direct reply about it and it doesn’t appear to have been changed for release either.

That aside, thanks again for the amazing update!

That’s a lot of stuff, Batman! Mind blown again. I’ll have to start wearing a helmet or something.

Just did the update on 4.6. It still says preview. Confused.

Just did the update on 4.6. It still says preview. Confused.

Close down the launcher and re-open it, that should fix it. :slight_smile:

Thank you ^^

WOW!!! Feels like a dream come true:-) Epic you really get these updates out quick and the tutorials and documentation are awesome!!! By far is the best and most affordable option for Indies and Pros:-) Thanks!!!

You know its awesome when it takes about 30 minutes to read all of the notes… wow! Great work.

Trying DemoRec. Is the FPS or the Shooter game ready for DemoRec?