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.
This release includes 88 great changes that were submitted from Unreal Engine’s amazing community of developers. We would like to extend our gratitude to these contributors below:
Alex Silkin (alexSilkin), alwei, Allegorithmic, Artem V. Navrotskiy (bozaro), Cengiz Terzibas (yaakuro), Flenzine, Gigantoad, Rama (EverNewJoy), Joel Riendeau (joelriendeau), Jakub Stasiak (jstasiak), Joe Hegarty (JoeHegarty), Marat Radchenko (slonopotamus), Michael Kösel (TheCodez), Michelle12188, Marcin Polaczyk (mpolaczyk), MyDigitalLife, mordentral, KazumasaOhashi, leobenaducci, Lukasz (iniside), Nicholas Hughes (piinecone), Sebastian Köcke (byte3), Salamanderrake, Stephen Whittle (stephenwhittle), Tomas Jedlicka (jedlickat), Rick Yorgason (Skrapion), Kyle Rocha (kylawl)
Major New Features
Experimental: 3D Unreal Motion Graphics UI
UI widgets can now be attached to components and displayed in the 3D scene!
- 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.
- To use this feature, simply add a new “Widget Component” to your actor and assign a Widget asset to it. This feature is still considered experimental but we’ll be improving it and adding more features soon.
- 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 this 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: this 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! This 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)
This 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 experimental settings.
- 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). This 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.
- This 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 this 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 the all 3D viewports.
- This 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. This makes it really easy to expose parameters to material instances. This 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. This 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. This 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. This 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:
- This 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, this will be added at a later date.
- The Montage Blueprint and C++ API has been enhanced to take Montage asset references. This 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 this setting at run-time if dynamic behavior 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 - This 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. This 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. This 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 this case is a character running diagonally forwards and right across a map.
- Note: The original system (now labeled "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. This 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 this 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. This 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. This means that assets loaded in the editor can be cooked directly from memory which speeds up processing significantly.
- This 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 this 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!
- 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. This 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. This is really useful for displaying localized text.
- 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.
- 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.
- This 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 this 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.
- 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)
- New! Localization
- New! Source Control
- New! In-Game Analytics
- More Blueprint How-Tos
- Place Nodes
- Navigate the Graph
- Work with Actor Reference Variables
- Collapse Graphs
- Create Functions
- Basic Usage of Blueprints
- Connect Nodes
- More Material How-Tos
- Place Material Expressions and Functions
- Create Material Functions
- Create Material Parameters
- Use Bump Offset
- Set Up Human Skin
- Use Glow
- Use Subsurface Profiles
- Rendering Documentation Updates
- Sub-Surface Scattering
- Updates to Materials for Mobile Platforms
- UMG Documentation Updates
- 3D Widget Components
- Composite Font Support
- Fixed a problem with window focus in Skeletal Editor Walkthrough tutorial.
- 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 this 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.
For a complete list of updates, click here!