Updating UE4's Steam SDK
May 24, 2017 Update:
Epic's 4.16 version of UE4 has had its Steam SDK upgraded to v1.39. This is still one version short of the latest SDK (v1.40) at the time of this writing but its significantly more recent. They even added SteamController fixes.
I'm not sure how relevant the original post is now.
Original Post:
This document serves as a guide for updating the Steam SDK used by Unreal Engine 4. At the time of this writing, Unreal Engine 4 uses version v1.32 which is over a year old. Please note that you should only need to update the Steam SDK if you need newer features of the Steam platform, such as better Steam Controller support.
Due to vast changes with the Steam Controller API, if you are using UE4 4.11 or older, you will need to drop in a replacement for the SteamController
plugin as Epic's implementation is outdated and will not compile with newer Steam SDKs. I have provided a suitable replacement here.
This guide was written using UE4 4.10. If using a later version, many steps here are subject to change and/or irrelevance.
Requirements
- Unreal Engine 4 compiled from source code
- Access to the lastest Steamworks SDK
- Download from the Steamworks Portal
- At the time of this writing, the latest version is v1.36
Determining Your Current Version
You may not need to update if Epic updates the SDK after this post is written. Before trying yo update, you should determine your current version of the Steam SDK you are already using and consider if you need to update at all.
Navigate to your Engine\Source\ThirdParty\Steamworks
folder and you should see a subfolder named something like of Steamv132
. This folder name is indicative of the Steam SDK version you are running. At the time of this writing, UE4 4.11 uses version v1.32, and the current version of the Steam SDK is v1.36. If you find your Steam SDK is out of date and would like to update, please follow the rest of this guide.
Updating the SDK
Extracting The New Version
In addition to the SDK source files you will extract, you will also need to update the Engine's Steamworks binaries.
Extracting Source Files
Create a folder in this Engine\Source\ThirdParty\Steamworks
folder named SteamvXXX
where XXX
is the version you are updating to without the .
punctionation mark. Be sure to include any letter suffixes. For example, when installing version v1.36, the folder you would create would be named Steamv136
. If installing v1.35a, name the folder Steamv135a
.
Download the latest version of the Steamworks SDK from the Steamworks backend page, and extract the contents of the archive into the folder you created above. This should leave you with an sdk
folder inside your SteamvXXX
folder.
This will provide UE4 with the source files needed to be built against this version of the Steamworks SDK.
Updating Steamworks Binaries
Create a new folder in Engine\Binaries\ThirdParty\Steamworks
named the same as you did in the previous steps, for example, Steamv136
. Within this folder, create folders named Linux
, Win32
, and Win64
.
SDK Supplied Binaries
For Windows 64-bit binaries, navigate to the folder sdk\redistributable_bin\win64\
inside the Steamworks SDK version that you downloaded and copy all the files within to your Engine's Engine\Binaries\ThirdParty\Steamworks\SteamvXXX\Win64
.
For Windows 32-bit binaries, navigate to the folder sdk\redistributable_bin\
inside the Steamworks SDK version that you downloaded and copy the steam_api.dll
and steam_api.lib
files to your Engine's Engine\Binaries\ThirdParty\Steamworks\SteamvXXX\Win32
.
For Linux binaries, navigate to the folder sdk\redistributable_bin\linux64
inside the Steamworks SDK version that you downloaded and copy all the files within to your Engine's Engine\Binaries\ThirdParty\Steamworks\SteamvXXX\Linux
. Please note that now your servers must be running on 64-bit operating systems. If you are going to run on 32-bit systems, use the files in sdk\redistributable_bin\linux32
instead.
Windows Server Redistributable Binaries
You will need to grab the Steamworks SDK Redistributables as well using the SteamCMD tool and place these binaries in the folders we created. Grabbing these redistributables requires the use of the SteamCMD tool. If you don't do this step, the Unreal Cooker will fail when trying to cook your projects.
Download the SteamCmd tool from Valve's CDN and extract it to an easy to get to folder, such as a folder named steamcmd
on your desktop.
Once extracted, you will need to get a command prompt in this folder. The easiest way to do this is to hold Shift then right-click in the empty space of the folder in Windows Explorer, then choose Open Command Prompt Here
.
Simply run steamcmd.exe
using the command prompt. SteamCMD will automatically update and install itself. After it is done installing, you should be left with the Steam shell.
Steam>
Once at this shell, run the following commands:
login anonymous
app_update 1007
exit
This will cause SteamCMD to download the Steamworks SDK Redistributables. Once this is done, you can close the command prompt. The process should look something like this:
Once that is done, navigate to the steamapps\common\Steamworks SDK Redist\
folder inside the steamcmd
folder you created. In this folder you will see a few files. These are the Steamworks SDK Redistributable files you will need to copy into your engine build.
Similar to above, copy the 64-bit binaries into your Engine's Engine\Binaries\ThirdParty\Steamworks\SteamvXXX\Win64
folder and copy the 32-bit binaries into your Engine's Engine\Binaries\ThirdParty\Steamworks\SteamvXXX\Win32
folder.
The files ending in _64
are 64-bit, the others are 32-bit.
Your final Engine\Binaries\ThirdParty\Steamworks\SteamvXXX
Windows platform folders should look something like:
Update UE4's Steamworks SDK References
Steamworks.build.cs
Inside the Engine\Source\ThirdParty\Steamworks
folder there lies a Steamworks.build.cs
file. We will need to make a change inside this file to tell UE4 to use the newer version of the Steam SDK rather than the current one.
Near the top of the file, you should see lines that read similar to:
/** Mark the current version of the Steam SDK */
string SteamVersion = "v132";
Change the version here to the version you are installing, for example, if you are installing v1.36, your updated Steamworks.build.cs
file should read:
/** Mark the current version of the Steam SDK */
string SteamVersion = "v136";
SteamController.cpp
Open Engine\Plugins\Runtime\Steam\SteamController\Source\SteamController\Private\SteamController.cpp
.
Similar to the last step, near the top of the file you should see a line of code defining the Steam SDK Version. Change it to match your target SDK. For example, if installing v1.36:
/** Name of the current Steam SDK version in use (matches directory name) */
#define STEAM_SDK_VER TEXT("Steamv136")
OnlineSubsystemSteamPrivatePCH.h
Open Engine\Source\Runtime\Online\OnlineSubsystemSteam\Private\OnlineSubsystemSteamPrivatePCH.h
.
Near the top, look for the STEAM_SDK_VER
defines and change them to your target SDK. Using v1.36 as an example:
/** Compile Steam SDK version in use */
#define STEAM_SDK_VER TEXT("1.36")
/** Path of the current Steam SDK version in use */
#define STEAM_SDK_VER_PATH TEXT("Steamv136")
UEBuildConfiguration.cs
Open Engine\Source\Programs\UnrealBuildTool\Configuration\UEBuildConfiguration.cs
.
Around line 242 you should see a function called PostReset
and within that a SteamVersion
reference. Update this to match your target version. Using v1.36 as an example:
/// <summary>
/// Function to call to after reset default data.
/// </summary>
public static void PostReset()
{
// Configuration overrides.
string SteamVersion = "Steamv136";
// ...
}
LinuxPlatform.Automation.cs
Open Engine\Source\Programs\AutomationTool\Linux\LinuxPlatform.Automation.cs
.
Around line 53, you should see another SteamVersion
reference. Update this to match your target version. Using v1.36 as an example:
// assume that we always have to deploy Steam (FIXME: should be automatic - UEPLAT-807)
{
string SteamVersion = "Steamv136";
// ...
}
MacPlatform.Automation.cs
Open Engine\Source\Programs\AutomationTool\Mac\MacPlatform.Automation.cs
.
Around line 130, you will see a long line of code that contains a directory path containing the Steam version. Update this path to match your target version. Using v1.36 as an example:
if (Params.bUsesSteam)
{
SC.StageFiles(StagedFileType.NonUFS, CombinePaths(SC.LocalRoot, "Engine/Source/ThirdParty/Steamworks/Steamv135a/sdk/redistributable_bin/osx32"), "libsteam_api.dylib", false, null, CombinePaths(AppBundlePath, "Contents/MacOS"), true);
}
Compiling With the New Steamworks SDK
Provided that no breaking API changes were made, these are all the changes required to update the Steamworks SDK. You should be able to regenerate your Engine solution, compile your projects, and run game builds with Steam loading your new SDK version without issue.
At the time of this writing however, if you are performing an update from v1.32 to a newer version on 4.11 or older, you will encounter many errors related to the SteamController
module. The Steamworks SDK introduced breaking changes to the Steam Controller API after version v1.32 so Epic's provided plugin will fail to compile. If you are encountering these errors, please follow the next section.
Updating Epic's SteamController Plugin
At the time of this writing, UE4 4.11 and older provide an outdated implementation of the Steam Controller API in their SteamController
plugin. In order to fix this issue when updating the Steamworks SDK, I have written a replacement plugin the SteamController
module.
This section may become irrelevant if Epic ever updates their implementation.
Downloading the SteamController Plugin Replacement
I have made my SteamController Plugin replacement available at a repo on my GitHub. Simply download this repo as a .zip.
This serves as a full drop-in replacement, so first you will need to delete your pre-existing SteamController plugin. To do this, navigate to your Engine's Engine\Plugins\Runtime\Steam\SteamController
and delete everything inside.
Once the pre-existing plugin is deleted, extract the contents of the replacement's Engine\Plugins\Runtime\Steam\SteamController
into this folder.
This replacement plugin is set to use Steamworks SDK v1.36. If you are not using v1.36, you will need to repeat the SteamController.cpp
edit detailed above.
You should be able to regenerate your project files and compile as usual. Your Engine and game projects should now all be running the version of the Steamworks SDK you've updated to and initialize correctly.