I want to start by making it very clear that I think the marketplace team is doing great and that Stephanie Markoff has been absolutely fantastic to work with.

On September 3rd, 2014, the UE4 Marketplace was launched. I released my first asset on the marketplace on June 30th, 2015.

A lot of people come to me for advice about selling on the marketplace, as well as my thoughts and opinions on the marketplace. I have heavily experimented with the marketplace as a seller, a buyer, and an overall annoying member of the Unreal community.

I decided to post my general concerns on my blog to hopefully spark some discussion, as well as having a page to link to when someone asks me my thoughts instead of reiterating my opinions.

I am an outsider of Epic and there could be things in this writing that are just plain wrong or are terrible ideas. If so, please reach out to me and I will edit accordingly.

I love the marketplace. I love being a seller. However, a big part of me feels like the marketplace is ‘one of those random small teams’ at Epic and that the marketplace is one of Epic’s lower priorities. The marketplace staff is great, but seem resource deprived.

My issues and concerns with the marketplace are more geared toward the backend, not the frontend. A better and more automated backend would allow the support staff to help out sellers in better and faster ways. A better backend would also greatly improve the marketplace seller portal.

A pipe dream perhaps, but an added benefit of a better backend would be the support for third party marketplace tools. I have already created a proof of concept that tracks marketplace assets per user and reports the historical rating history of all tracked assets, so they can be notified when their asset rating changes. This was a proof of concept and much more can be learned about my third party marketplace proposal here:

Third-Party Marketplace Support Proposal

It is also possible for a third party to create their own frontend for the marketplace, which could potentially offer some very nice integrations with seller’s own websites. Because a third party frontend could be made, I believe this merits some consideration in allowing the public to submit pull requests for the marketplace view of the launcher without giving the public access to any critical or secure API endpoints. You can read more about this at:

Creating A Custom Marketplace Frontend

Custom Marketplace Frontend

And while on the subject of securing the marketplace API, I will link my investigations into various holes of the API I wrote some time ago. This document is now out of date and some issues have been fixed, but there are other ways to circumvent/exploit some of these API calls further.

Building a Free Marketplace Through Crowdsourcing

The following opinions are offered in no particular order:

Two Search Boxes

Two Search Boxes

Currently on the UE4 Marketplace webpage, there exists two types of search. The topmost one searches ‘the Unreal universe’ for everything except marketplace info.

The bottom one searches only for marketplace info. It is fairly easy to accidentally use the wrong search here. Instead, having just one search box and folding in marketplace results into the ‘everything Unreal’ search would be preferred.

Adding an advanced search dropdown with filters would go a long way here to not just improve the usefulness of the header search, but would allow the marketplace page to default to a ‘marketplace filter’. This would also improve the discoverability of marketplace assets when users search for things as they might find a marketplace asset more useful than a forum post of info.

Exact Searching Only

All Marketplace searching is done by exact searching only.

This really should be done with fuzzy searching or approximate string matching. This is the technical term for what the community wants.

Searching for ‘particle’ and for ‘particles’ should not lead to different and impartial results. For example, this pack:

https://www.unrealengine.com/marketplace/ft-magic-pack-01

Will not show up when using the search term ‘particles’ because its description uses the words ‘particle effects’ instead of particles.

No Seller Searching

Users have no way of searching directly for a marketplace seller. Instead they have to find an asset sold by their desired seller, then go to their seller’s page which isn’t accessible in any other way.

Seller Page Comment Boxes

Many sellers don’t even know people can leave comments on their seller pages.

Asset Images – Sizing And Cropping

Sizing and Cropping Issues

Even if a seller follows submission guidelines for images exactly as written, it is not guaranteed the Marketplace will show the right image for the right location, and it’s not guaranteed the image will be shown at the required size either. The submission guidelines for images are out of date and are meant for a much older feature and asset display layout.

Image requirements and guidelines should change so that they properly represent what customers will see. If the layout is going to stick to a responsive fluid sizing for featured items, .PSD and .PNG templates should be given to sellers to show exactly how to create their images to avoid these issues. These templates should include things like title safe areas, cropping guidelines, etc.

This issue makes the sellers look less professional and thus lowers the perceived quality of the marketplace.

Asset Images – More Sizing Issues

This issue also makes the sellers look less professional and thus lowers the percieved quality of the marketplace.

More Sizing Issues

The preview images on an asset’s page are also laid out in a responsive way, causing image cut offs and other scaling issues. There is very little respect for aspect ratios for these image previews.

The scrolling thumbnail list has all of its images at the wrong aspect ratio, regardless of the size of the browser viewport. This can make some seller art that is designed to look good as a thumbnail look horrid.

The ‘big’ preview image is also not aspect ratio constrained, however this is less of an issue as with this layout it would be much harder to keep the original aspect ratio. However, one huge improvement is that the whole ‘Buy’ button area can be more responsive than it currently is. When the viewport shrinks to the point where the preview image far exceeds the its original width aspect ratio, the Supported Platforms, Supported Engine Versions, Share, and Buy button can become vertically stacked in one column instead of two. This would potentially allow the block to become less tall and to be moved up a bit, so that the ‘big’ preview image doesn’t need to be as tall, thus better preserving the aspect ratio.

However

Although this may contradict a bit with what I just wrote, Epic does do this when you squish the page real small. When it gets to this size though, the text is shrunk so much that now the opposite problem occurs where now so much space is wasted. Here, the gray box could still be stacked vertically as is shown here, but also to the right of the above info when at this size. There is plenty of width here to have them side by side while shortening this section as a whole. Also, while things are already being shrunk so small, why not make the ‘big’ image shorter to once again preserve aspect ratio?

Bandwidth Issues

Asset Images – Crazy Bandwidth

Bandwidth Issues

Every single asset image here is actually the full 1920x1080 image being scaled down. This greatly slows down page load speeds and puts more load on the web servers. When a seller submits a marketplace image, your backend should automatically generate thumbnails of those images for displaying in situations like this. Users often download far more image data than they ever need. This is even more significant in the already resource hogging launcher, where simply browsing the marketplace or even accidentally loading the launcher can be painfully slow or in some cases incredibly expensive on metered connections.

After browsing 10 assets, without even flipping through any images, I quickly went through 50MB of data. This is simply ridiculous.

No HTTP/2 Support

Because the marketplace frontend serving web server does not support HTTP/2, which currently every major browser including mobile supports, even more bandwidth is being consumed as well as webserver resources. The marketplace team removed real-time sales data with the reason of ‘the servers couldn’t keep up’, which is infuriating because it seems that there is no effort to rectify this.

Moving to HTTP/2 would mean that users do not have to issue a request for every single JavaScript file and web image. The number of requests needed per marketplace page load is huge.

Depending on how the launcher was created, it could also be possible to switch to HTTP/2 as well. This would be a factor in helping remove the launcher’s ‘slugishness’.

Painful Navigation

Category Navigation

There are a lot of marketplace assets, which is great. Having categories is great. The UX problem with categories and marketplace navigation is that it is hard to go back to them if you’re several pages deep within the marketplace. A sticky header would be a very welcome addition.

Launcher

The launcher already has an excellent header on each of its marketplace pages. It just needs to be ‘sticky’ and not scroll with the page.

The Vault can get easily out of hand with a large number of assets. Categories for the vault would also be helpful.

Library

One user’s forum thread suggestion regarding the library organization.

Finding Library Updates

Finding library updates can be annoying. Click for reference.

Others feel the same way one year ago.

The Most Annoying Back Button

Back Button

When browsing the marketplace tab in the launcher, you are given this ‘Back’ button on any asset page. This is the only time a Back button is displayed and it should always go back a page in the marketplace. Instead, this ‘Back’ button provokes a launcher wide back action and makes navigation infuriating. For example, say you are looking at an asset but want to check out your library to see if you already have something similar. You decide you do so you go back to the marketplace section. Remember there is no ‘Back’ button unless you are on the Marketplace tab, so you have to click the Marketplace tab on the left. You then click the back button to go back to a category or search page, but suddenly you end up right back in your library. This behavior even exists across major tabs.

Click here for a video example of this painful behavior.

No Shopping Cart

Currently there is no shopping cart feature of the marketplace. I’m aware one is coming soon however after two years of constant requests.

Shopping Cart

Honestly I don’t care about having a shopping cart, but the community would yell at me if I didn’t bring it up. Someone did bring up a good point that is absolutely worth mentioning however:

If you are not American and are buying assets in something other than USD, buying assets one at a time is more expensive due to currency conversion fees. For example, if you’re buying two things for 5 EUR, your bank / payment processor will charge you 5 EUR + fee + 5 EUR + fee, as opposed to 10 EUR + fee.

Filters, Listings, Top Charts, All Missing

Features like being able to filter for price, ratings and engine versions, sub categories and more advanced listing views, and top charts are all things that people expect from a marketplace.

These things do not inhibit discovery, they increase it. When a user has to go through a bunch of assets they aren’t interested in for either price constraints, low ratings, file size limits, or simply just too old, it prevents the assets they would buy from being easily visible and no one wins.

Top charts reward sellers with top tier content with more visibility, promotes competition based on quality, and does not freeze out new sellers if done properly. Top charts should be time constrained, i.e. Past Week, so that a product with a really fantastic launch but zero sustained sales doesn’t lock a place in the chart.

Top Paid and Top Grossing also improve the perceived quality of assets across the entire marketplace. Higher quality assets naturally sell better, and if they are listed on top lists, people can easily find the more premium assets instead of rummaging, buying, regretting, and telling others how they got a bad asset and no longer trust quality of the marketplace.

Literally every marketplace that has achieved maturity has these features. The Epic Marketplace has shown very little perceived growth in terms of systems and infrastructure. This would be a huge correction to that perception. Only a momentary glance at the forums is enough to know how people are frustrated with the lack of marketplace development.

Guidelines Inconsistent And Sometimes Just Wrong

First, there are two separate set of guidelines:

  1. The Main Web Portal Guidelines

  2. Forum Submission Guidelines

While similar, these guidelines are not identical. There should only be one master set of guidelines.

The guidelines are often vague or very specific, and then their enforcement is also variable. This leads the community to think the marketplace staff is not a cohesive team but a group of people who clock in and clock out and do what they want. Every bad asset that gets through that clearly violates the guidelines and every vague rejection notice that doesn’t cite anything specific amplifies this problem.

I believe writing a more formal and more detailed submission guideline would solve a lot of this ambiguity for both reviewers and the community. You can see my effort to do so here: http://ue4.style

Epic staff often replies ‘thanks for your feedback’ and ‘we are making changes to address concerns’ but here is an example of a guideline and submission issue that’s been around for literally years now.

Guideline Error

Layout Quirks

Navigating the UE4 web marketplace, you’re bound to find a few quirks. Like this one. First, the recommend list is showing a list of assets by the seller who’s seller’s page I’m on. A bit redundant. Also, notice the extra padding for no reason?

Every little quirk again lowers the perceived quality of the marketplace as a whole.

Layout Quirks

Hide or At Least Obfuscate Seller Contact Info

Email Addresses

Marketplace seller emails are listed in an easily parsed form. This means marketplace seller emails are subject to spam bots that work by bots that scrape webpages for email addresses.

Hiding them completely for users who do not own the item is one suggestion from the community. Alternatively, another suggestion is obfuscating them if you don’t own them. The simple act of writing the shown email above as ‘tihomirvfx at gmail dot com’ cuts down on spam bots massively.

I’ve advocated this for a long time now. Found a forum post by someone else created two months ago on the marketplace seller only section of the forums also concerned about this.

Note: If you change your seller support email on file, you have to tell the marketplace staff to update your assets as due to the next topic, its manually copy pasted by marketplace staff.

Contact And Support A Manual ‘Hack’

Instead of making contact and support details for assets a first class citizen in the data backend, they are tacked on to the end of ‘Technical Details’ by simply adding an ‘h1’ tag to make it appear as if its own section.

The fact that the contact and support fields are not proper members of asset data irks me a bit. It makes me feel like sellers supporting their assets is not really a concern for the higher-ups at Epic as they won’t allocate the backend guy to rectify this, and instead have the marketplace staff perform more tedious and error prone manual work.

Contact And Support

Duplication of Data

The launcher and the website share API endpoints, and often the same data. What I find curious is that even though Slate has a Rich Text widget, the launcher has to pull down technical details in a different way. Another small thing that by itself doesn’t really matter, but when looked at alongside the bandwidth issues, sluggishness of the marketplace, and the ton of manual work the marketplace staff has to do behind the scenes; it adds to the feeling that the higher-ups at Epic treat the marketplace as a low priority item and as long as it works, don’t put too much effort to improve it. Again, this may not actually be the case, but this is what it feels like.

Technical Technical Technical

Feature Regression, Not Improvement

Touching more on things that make the marketplace feel like a low priority for Epic executives is the fact that sometimes great features get removed.

One great thing about the marketplace was the real-time sales data available on the marketplace dashboard. That has been removed and now the sales report only updates every 24 hours, meaning you can’t see today’s sales until tomorrow.

Waiting 24 hours to see sales isn’t too much a big deal for me, but the fact that this nicety was removed instead of expanded on has angered many sellers and is just more salt in the wound that is the marketplace seller’s shared frustration over the lack of marketplace development. More analytics is something many sellers have requested, and instead we get data removed.

The reasoning for this is that the real-time sales reports were putting too much of a strain on the marketplace backend servers.

Marketplace Seller only forum thread regarding this.

This again feels like the result of the marketplace asset count increasing but remaining a low priority system for Epic. There are many possible optimization points (see some of the previous issues) that can be done on the frontend to free up a ton of resources for just browsing, many which the community has been requesting for over two years. If feedback is being listened to, why has development slowed to the point of actually going backwards?

Again, there are probably other reasons surrounding this situation, but it feels like Epic is starving the marketplace of resources.

Analytics

Another issue contributing to the ‘low priority’ feeling is the lack of analytics. This can only be solved with marketplace development and has been an issue for sellers since launch and is rarely discussed by Epic.

Currently the list of available analytics regarding assets for sellers on the seller portal is:

  • Number of units sold

Thats it. Seriously. That is all. There are reports from sellers that their history of units sold has also been truncated, so they don’t even have numbers going back to asset release date.

Communication To Marketplace Staff

Communicating to the marketplace staff is both incredibly convenient and excruciatingly painful. After what appeared to be a ticket system failure, then having two ticket systems, then a merging of ticket systems, many requests were lost and often sellers have to ask ‘do you have a ticket for this?’ and ‘can you please check on this request for me?’.

I believe this has been getting better however, but it still can be an issue.

Also, if you ever need to ask the marketplace staff about multiple things, please take this approach for best results:

  1. Write an email per request. Meaning if you want to change your asset description and change an image, send two emails. It’s not uncommon for your request to have the first request fulfilled and the second request ignored, possibly due to how the marketplace ticketing system works.

  2. Wait at least 10 minutes between request emails. If you send two support emails too quickly, there is a chance you won’t get a confirmation email on the second request. Sometimes this results in a ticket made, other times it won’t. It’s impossible to know if this happens without asking marketplace staff or submitting a third request.

Communication From Marketplace Staff and Epic

Currently marketplace sellers are experiencing a shared frustration that is communication from the marketplace team is infrequent and inadequate.

System Failures

When something goes wrong with the marketplace system, panic ensues. When the issue is solved, most of the time the reasoning about the issue is purposely vague. Most of these communications that quickly reach the seller community happen through Discord and not through official channels.

Feedback Follow-up

When a rise of feedback occurs about negative things, it’s often to see staff members reply ‘thanks for the feedback, we are taking steps to address this.’ Months go by and when asked for a follow-up to that statement, either none is given or usually something along the lines of ‘priorities changed.’ Very few times has Epic been clear that ‘we are doing this, and we have achieved this, based on your feedback regarding this’. This creates a sort of feeling that the marketplace staff has their hands tied and while they mean well, they might be in an impossible situation where they know what issues exist and simply can’t fix them, further adding to the ‘low priority’ issue I mentioned previously.

Note: Some of these thread links are in a marketplace seller only section of the forums. The marketplace seller section of the forums, named Creators Hub, is not bustling with activity, so it’s fairly easy to keep aware of threads even if read once a week.

Examples:

Rejections

When rejecting an asset, the rejection notice from the marketplace staff can be pretty vague, unclear, or simply not given. People often report this in Discord/Slack, but there are forum threads indicating this has been a long-term problem as well.

Rejected Vagueness

Not Exhaustive

This by far isn’t every little thing I’d like to change. But its a start. Things like sellers editing their assets, changes to the rating system, seller promo codes, and more. I feel like in order to get those features however, we need to fix the current issues to have a stronger foundation to build upon.

More Opinion

I love the marketplace. It has greatly benefited me as a seller, a buyer, and as a professional freelancer. It pains me to think of the marketplace as an Epic executive ignored and low priority branch, and I hope I’m proven wrong and that this is not the case. The 30% cut from sellers hurts every month when sellers don’t see continual improvement of the system and more engaging feedback. Feedback needs to be an open two-way street for sellers to feel like the system respects them.

Dear Epic

If there is one thing I want Epic to take away from this write-up, if they read it at all, I would absolutely love to see the marketplace team be devoted more and permanent resources to further marketplace development. Empowering the marketplace team by giving them tools to remove the human element out of the marketplace processes will allow humans to spend less time dealing with sellers asking for support and more time supporting sellers by keeping a healthy marketplace and continual improvement.

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

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.

Source File Folder Creation

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.

ThirdParty Binaries Folder

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.

Steam Cmd Prompt Folder

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:

Steam Cmd

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.

Steam Cmd

Your final Engine\Binaries\ThirdParty\Steamworks\SteamvXXX Windows platform folders should look something like:

Steam Cmd

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.

This is the first step in a series of guides that will show you how to enable the OnlineSubsystemSteam module for your project. It does not cover session creation, session management, app id association, or anything specific to OnlineSubsystemSteam. These steps are the first part in enabling a Steam integration into your Unreal Engine 4 Project whether its Blueprint or C++.

Results

The result of this guide should leave you with a project that has the Steam Overlay working correctly for client builds, with Steam showing you as playing Spacewar. Spacewar is a test game on Steam that everyone owns and eases Steam development.

For Server builds, this covers how to get the server to initialize Steam correctly. This does not set up any session or server list management however.

If you already have session management working without Steam (i.e. your server browser works on LAN using OnlineSubsystemNull) then your session management logic should also work with Steam.

PLEASE NOTE: By default, Steam sessions are created using ‘Steam Presence’, what this means is that instead of using Steam’s master server list for global server searching, Steam will only return sessions within your Steam region and sometimes sessions related to the people on your friends list. If you enable Steam and are unable to see your buddy’s server that happens to be on the other side of Earth, it is not an issue with your configuration but how Epic handles Steam sessions. To correct this, please refer to my GenericPlatformTools plugin. (At the time of this writing, GenericPlatformTools documentation does not exist.)

Warning

Once you enable OnlineSubsystemSteam, testing your multiplayer games locally by having multiple clients run on the same machine will cause all sorts of failures as Steam is very against the idea of running multiple games under the same Steam account simultaneously. Instead, you will have to have multiple machines to test or run your game clients in isolated Virtual Machines.

If you need to test a multiplayer game locally, you should disable Steam by running -nosteam as a command argument or by switching back to OnlineSubsystemNull.

Implementation

All the changes required for basic Steam implementation are done purely in the config files of your project, namely DefaultEngine.ini. To find DefaultEngine.ini, navigate to your project’s directory then enter the Config subdirectory. You should see a list of config files including DefaultEngine.ini. Open up this file in a text editor such as (Notepad++)[https://notepad-plus-plus.org/] and make the following changes.

Look For Existing OnlineSubsystem Settings

If you are using an Epic provided template, OnlineSubsystem settings should not exist in your DefaultEngine.ini config. If you are using a project such as GenericShooter, you may have some of these settings already defined.

Look through your config file and see if you can find config sections named [OnlineSubsystem] or [OnlineSubsystemSteam]. If you see these, be sure to change these sections of the config instead of creating new sections as described in the next step.

Creating The OnlineSubSystem Settings

[OnlineSubsystem]

The first batch of settings that we need to add to DefaultEngine.ini is the [OnlineSubsystem] block of settings. These settings here tell the engine what OnlineSubsystem to use for this project. In this case, we are setting it to Steam.

[OnlineSubsystem]
PollingIntervalInMs=20
; Uncomment the following line to use the Null Subsystem
;DefaultPlatformService=Null
; Uncomment the following lines to use the Steam Subsystem
DefaultPlatformService=Steam
VoiceNotificationDelta=0.2 

If you don’t have an [OnlineSubsystem] block of settings in your config, go ahead and add this to the very top of your config. Otherwise, edit your existing block to look like the one I provided.

The ; character allows you to leave comments in config files. I have left these commented lines in so that if you would like to switch between OnlineSubsystemNull and OnlineSubsystemSteam, you can do so easily.

The VoiceNotificationDelta setting is an Epic recommended default when using Steam, however I’m not sure of the exact impact of this setting at this time.

[OnlineSubsystemSteam]

Now that we told UE4 to use the Steam Subsystem for your project, we need to configure the OnlineSubsystemSteam module. Just like the setting block above, you will need to add/set these settings in your DefaultEngine.ini file.

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
SteamAppId=480
GameServerQueryPort=27015
bRelaunchInSteam=false
GameVersion=1.0.0.0
bVACEnabled=1
bAllowP2PPacketRelay=true
P2PConnectionTimeout=90
; This is to prevent subsystem from reading other achievements that may be defined in parent .ini
Achievement_0_Id=""

These settings set various specific OnlineSubsystemSteam implementation details, such as what App ID to use, what port to listen for Steam Queries on, and achievement data. (At the time of this writing, my tutorials for the details about these settings such as Achievements is not written yet, but please check back soon.)

If you have your own Steam App ID, replace 480 above with your App ID.

[/Script/Engine.Engine]

The last batch of settings we need to add to the DefaultEngine.ini config file are very likely to already exist in your current config. Search your config for a [/Script/Engine.Engine] section as that will be where we are making our changes. If this section absolutely does not exist in your DefaultEngine.ini files, please create it.

Once you find your [/Script/Engine.Engine] config section, remove any line that contains the word NetDriverDefinitions. We will be adding our own. Leave any other line in this section intact.

These are the settings you need to apply to your [/Script/Engine.Engine]:

[/Script/Engine.Engine]
!NetDriverDefinitions=ClearArray
; Uncomment the next line if you are using the Null Subsystem
;-NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
; Uncomment the next line if you are using the Steam Subsystem
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

Once again, it is important that you remove any old NetDriverDefinitions settings and add these settings to the [/Script/Engine.Engine] block, but do not change any other settings you may have in this block. For example, if you are integrating Steam into the Vehicle Template, your final result would look like:

[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_VehicleBP",NewGameName="/Script/ProjectName")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_VehicleBP",NewGameName="/Script/ProjectName")
!NetDriverDefinitions=ClearArray
; Uncomment the next line if you are using the Null Subsystem
;-NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
; Uncomment the next line if you are using the Steam Subsystem
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

These NetDriverDefinitions tell UE4 to use the Steam networking layer instead of the raw operating system based networking layer. This is important as Steam relies on this networking layer for better session management, voice, and packet relays.

Linking The OnlineSubsystemSteam Module

This section applies to C++ projects only. If you are working on a Blueprint only project, skip down to Testing Your Steam Implementation. If you want to convert your Blueprint project to a C++ project, check out this guide.

All the changes required on the code side of your C++ project for UE4’s Steam Integration will take place in your project’s Target.cs and Build.cs files. You can find these files in your Project’s Source folder. Please note that the filenames of your Target.cs files will be named after your project name and will be different than mine here.

Project.Target.cs

Find your Project.Target.cs file in your Project’s Source folder, replacing the Project in this example filename with the name of your project.

In this file you should see a constructor function that looks like this:

public GenericShooterTarget(TargetInfo Target)
{
	Type = TargetType.Game;
    // Ensure that we compile with the Steam OSS
    UEBuildConfiguration.bCompileSteamOSS = true;
}

You’ll see that in my version I have added the last two lines in this function after Type = TargetType.Game, you’ll need to do the same. What this does is it tells the Unreal Build Tool that it needs to compile the Steam modules for this project’s build target.

ProjectServer.Target.cs

If you have dedicated server support for your project, you should also have a ProjectServer.Target.cs file. If you don’t have dedicated server support and would like to enable it, please follow the tutorial I have written here.

If you don’t need dedicated server support, simply skip this section and continue with Project.Build.cs.

The code change that we’re making here is identical to the last section, and all we’re doing is adding UEBuildConfiguration.bCompileSteamOSS = true; to our build target. The only difference is this time we’re adding it after Type = TargetType.Server; instead of Type = TargetType.Game;.

public GenericShooterServerTarget(TargetInfo Target)
{
    Type = TargetType.Server;
    // Ensure that we compile with the Steam OSS
    UEBuildConfiguration.bCompileSteamOSS = true;
}

Project.Build.cs

Within your Project’s Source folder, you should see a folder also with the name of your Project. Navigate into this folder and you should find a Project.Build.cs file. This file tells the Unreal Build Tool what modules your project depends on. We will need to add the OnlineSubsystemSteam module to its dependency list.

If you are using a C++ template or converted your Blueprint project to C++, you may already have the code needed but commented out. If so, replace that code with the code provided here.

using UnrealBuildTool;

public class GenericShooter : ModuleRules
{
	public GenericShooter(TargetInfo Target)
	{
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

        // Uncomment if you are using Slate UI
        // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
        
        // BEGIN STEAM INTEGRATION

        // Uncomment if you are using online features
        PrivateDependencyModuleNames.Add("OnlineSubsystem");
        PrivateDependencyModuleNames.Add("OnlineSubsystemNull");
        if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Linux))
        {
            if (UEBuildConfiguration.bCompileSteamOSS == true)
            {
                DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
            }
        }
        
        // END STEAM INTEGRATION
    }
}

In the snippet above, the relevant code is the block between the // STEAM INTEGRATION tags. In this code, you will see that we’re adding the OnlineSubsystem, OnlineSubsystemNull, and OnlineSubsystemSteam modules to our projects dependency list.

It is important to wrap the OnlineSubsystemSteam module addition in a platform check as if you build for multiple platforms such as console or mobile, you will find that you’ll get a lot of compile and linker errors as the OnlineSubsystemSteam module is not supported on those platforms.

Re-compile Your C++ Project

Now that you have made these code changes, you will have to regenerate and recompile your project. If you are unfamiliar with this, please read Epic’s documentation on building a C++ project or read my earlier tutorial on how to convert a Blueprint project to C++.

Note About Dedicated Server Support

At the time of this writing using Unreal Engine 4.10, there is an issue with how dedicated servers for C++ projects find the Steam shared library files. If you cook and run a dedicated server after the above steps, Steam initialization may fail.

You may have to apply these Steam fixes every time you cook a new server build if your server deployments remove the resulting steamclient.so file from this fix.

Windows Dedicated Server Steam Fix

This workaround is fairly simple. To get a Windows dedicated server to properly load Steam, you need to place a copy of all the files within your Engine\Binaries\ThirdParty\Steamworks\Steamv132\Win64 folder into your Project’s Binaries\Win64 folder such as that these files are side-by-side with ProjectServer.exe.

Windows Dedicated Server Fix

Linux Dedicated Server Steam Fix

Similar to the Windows Dedicated Server fix, we need to place a Steam shared library side-by-side with our Linux server executable. This is a bit harder to do though as Epic does not provide a Linux Steam shared library, specifically steamclient.so. Because of this, we will have to grab our own copy.

The easiest way to do this is to use the SteamCMD client on a Linux host. To install SteamCMD, you can either follow the guide on Valve’s Wiki or try this condensed form:

cd ~
mkdir steamcmd
cd steamcmd
sudo apt-get install lib32stdc++6
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz
./steamcmd.sh

This will download, extract, and run the SteamCMD client. After these commands, you should be prompted with a Steam> shell.

Depending on if your Linux host is 32-bit or 64-bit, follow the appropriate section.

Linux 32-bit Steam Shared Library

At this point you already should have the 32-bit Linux Steam Shared Library required to run your game. You can close SteamCMD running the command exit.

The 32-bit Steam Shared Library, steamclient.so, is located in your ~/steamcmd/linux32 folder. Simply copy this steamclient.so file so that a copy of it exists side by side with your Project’s Linux server binary, for example, inside GenericShooter/Binaries/Linux. Your Linux dedicated server should now initialize Steam correctly.

Linux 64-bit Steam Shared Library

If your Linux host is 64-bit, a bit more work is required. The SteamCMD program only comes with a 32-bit Linux shared library by default, so you will have to force a download of the 64-bit dedicated server redistributables. To do so, you should still be in your Steam> shell. If not, simply run ./steamcmd.sh again.

In your Steam shell, run the following:

login anonymous
app_update 1007
exit

This will tell Steam to download the Steam SDK Redistributables, which includes the 64-bit Linux Steam shared library. After running the above, you can find the 64-bit Linux Steam shared library, steamclient.so, inside ~/Steam/steamapps/common/Steamworks SDK Redist/linux64/. Simply copy this steamclient.so file so that a copy of it exists side by side with your Project’s Linux server binary, for example, inside GenericShooter/Binaries/Linux. Your Linux dedicated server should now initialize Steam correctly.

Testing Your Steam Implementation

Running your project within the UE4 Editor will not load the Steam Subsystem. In order to test your Steam implementation, you will need to run your game as either a Standalone game or as a cooked WindowsNoEditor game. Once you do, Steam should allow you to use its overlay by pressing Shift+Tab and if you are using the settings I provided, it should list you as playing SpaceWar, as shown in this picture.

Steam Overlay In-Game

Long time users of Unreal Engine 4 might remember an old feature that used be in the top right of the editor that would allow you to save the last 20 seconds of your editor’s activity as an uncompressed .AVI. This recording would also auto-save on crash so that if you ever experienced a crash, you have a video recording of what caused it. You can enable it by using the -forceenablecrashtracker argument. More detailed information about this feature below.

I believe this was disabled by default around ~4.5 with the following hardcoded false:

#if UE_BUILD_DEVELOPMENT
		bCrashTrackerShouldBeEnabled =
			false && // Disable crash tracker by default for now unless someone enables it.
			!GIsDemoMode &&
			!FParse::Param( FCommandLine::Get(), TEXT("disablecrashtracker") ) &&
			!FApp::IsBenchmarking() &&
			!FPlatformMisc::IsDebuggerPresent();
#endif

The next line after this hardcoded disabling however allows you to re-enable it with a command-line argument:

bool bForceEnableCrashTracker = FParse::Param( FCommandLine::Get(), TEXT("forceenablecrashtracker") );

So by passing -forceenablecrashtracker on your editor’s command-line you can bring back this rolling 20 second video capture. I prefer to load my editor through a batch file but this will also work if you use a desktop shortcut. As long as you can add a command-line argument, you are able to launch your editor with this flag. My batch file for example runs:

start Engine\Binaries\Win64\UE4Editor.exe GenericShooter -forceenablecrashtracker

The start keyword tells Windows to simply start the editor and not wait for it, thus preventing a command prompt window from floating around. Next you’ll see the path to my editor, which here is relative. The third argument is the project I want to load, in this case GenericShooter, so that I can skip the project selection window. The last argument is what this post is about, -forceenablecrashtracker, and is the magic to restoring the rolling video capture.

Once enabled, as of 4.11 Preview 1 you will see a red circle on the top right of your editor. Clicking this will output an uncompressed .AVI and give you a notification as to where that .AVI was saved.

Red Circle

If your editor crashes, you will also see a CrashVideo.avi in your project’s Saved\Logs folder. These videos only capture Unreal Engine windows but will always be the size of your full desktop. Anything that isn’t Unreal Engine becomes filled with red. Here is an example of a frame of a recorded video of mine when running the editor in a ~2k window while on a 4k display.

Crash Video

Crash videos do not archive themselves unfortunately like logs do. If a CrashVideo.avi exists and a new crash occurs, the existing video will be erased. Manually saved videos do archive themselves by incrementing a number in the filename on each save.

After finding out accessing UE4 Marketplace data was possible, I made a pretty cool ‘custom UE4 Marketplace frontend’ that mimics the launcher version of the UE4 Marketplace but with some additions I think many people would like such as searching, sorting, and seller YouTube embedding. If you would like to download it and try it for yourself, grab it from my repo’s releases page. Full source code is available here on my GitHub. Read below to find out everything that it does (and doesn’t) do!

What Is This And How Do I Get It?

This is a standalone desktop app made with nw.js and is not meant as a replacement or patch to the UE4 launcher’s marketplace.

You can download it and try it for yourself here on my repo’s releases page. After downloading, extract it anywhere and run Marketplace.exe.

Its full source is available here on my GitHub so it can serve as a great beginning or reference if you wanted to create your own custom UE4 Marketplace frontend.

Why Was This Made?

Doing things like this on a Sunday and tackling projects I have no business in is what I call ‘relaxing’. This project has no purpose other than I wanted to see if I can do it.

There are also a lot of requests for things to be added to the marketplace launcher, such as the infamous request for adding ‘search’ behavior. I wanted to focus on knowing what it would take to add these features, so I’ve built them.

How Was This Made?

To read more about how I made this, check out my blog post on the creation process.

New Features

Price and Rating Overlays

The first thing that is immediately obvious is asset thumbnails now have their prices and rating information overlayed. Overlaying the price saves space, makes it match the web marketplace, and is easier to read. The rating information has never been shown in the launcher before and for ‘power buyers’, this is really important information.

Asset Thumbnails

Asset Sorting

You can now choose different ways to sort assets in the marketplace within their categories! The Epic launcher only does sorting by “Most Recent” and nothing else. I’ve added “Price, Name, and Ratings”.

Asset Sorting

Ownership Filtering

The Epic launcher and web marketplaces have no way of filtering owned vs. unowned items, aside from ‘the vault’. I’ve added a really easy way to filter this information. You can show all assets, assets you do not own, or the assets you do own. Note: This feature requires logging in, otherwise nothing will be listed as owned.

Ownership Filtering

Searching

That’s right folks, searching! I’ve added ‘real-time interactive’ searching, which means what is shown reflects what you are typing in the search box. This is faster than using the search on the web marketplace, and non-existent on the launcher despite the large request for it.

You can search asset names, seller names, or both.

Searching

If you’ve ever tried moving from one category to another using the launcher marketplace, you’ll know that it can be pretty annoying to go to a specific category without scrolling back to the top. I added a sticky header that puts your navigation, search, and filters within reach no matter where on the list you are.

Sticky Header

On Sale Category

The web marketplace has this but the launcher doesn’t. During the most recent sale (Cyber Monday at the time of this writing), 10 of the best selling assets were discounted but the launcher didn’t show any sign that anything special was happening. If there ever is a sale and assets are marked as On Sale, they’ll now show up in this very obvious category. Currently nothing is on sale so this category doesn’t show up.

On Sale

Seller YouTube Embedding

If you pull up details for any asset where a YouTube video link is mentioned in the asset’s description, all mentioned YouTube videos will be added to the screenshot gallery. This gives you the ability to see what an asset is truly about instantly!

On Sale

Instant Seller Searching

Often times when looking at assets on the marketplace, one of my considerations for purchasing is “what else have they made?”. You can now get an instant view of what a seller has made by clicking on their name.

Seller Searching

Asset Ratings in Detailed View

When you view the details of an asset in the launcher marketplace, no review data is listed at all. I’ve added this data to the overlays mentioned above as well as in the asset brief when viewing an asset’s details.

Rating In Details

Contact and Support Now Has a Line

Not the biggest feature, but important to note nonetheless. Have you ever noticed that the Contact and Support sections of asset descriptions are kind of inconsistent and are prone to errors? This is because the Contact and Support data is actually a hacky addition to the same data property that holds ‘Technical Details’ instead of it being treated as a proper data point for an asset. I’d really like to see ‘Contact and Support’ data folded into more proper, easier to support data properties.

All I really did here was make sure that there is a horizontal line after the ‘Contact and Support’ heading to make it more consistent, but I can’t fix every issue with this information. On some assets, such as Crumbling Ruins at the time of this writing have extra or duplicate data regarding ‘Contact and Support’, which is even visible in the launcher and web marketplaces.

Contact and Support

Missing Features

There are few features I am missing in my custom frontend. Some are feasible to add in a custom frontend, some aren’t.

Asset Comments

I saw enough parts of the API on reading, posting, editing, deleting, and voting of comments in the web JavaScript to know that full commenting functionality should definitely be feasible in a custom frontend.

Asset Purchasing

From all the marketplace API I hunted through, it looks like being able to buy assets using a custom frontend might be possible. There are various ajax calls on the web marketplace that facilitate it, but I haven’t looked into if there are any hidden requirements. I’m confident that this would be feasible though.

Using Assets

I believe the downloading of assets can only be done with a successful OAuth authentication among other data that only the Launcher has. I could be wrong, and I hope I am, but I didn’t come across anything that would facilitate downloading assets on the web marketplace at all.

Community Involvement

If you believe some of these features should make it into the launcher version of the marketplace, please let Epic know! If you want to try adding a feature to my custom frontend yourself, please fork and do so!