Troubleshooting
Quick diagnoses for the most common UOS pain points. Each section starts with the symptom and walks through the cause + fix.
SteamAPI_Init returns false
Symptom: UOS Steam Subsystem -> Is Steam Initialized stays false.
Causes
- -Steam isn't running. Start the Steam client; SteamAPI_Init talks to the Steam process via shared memory.
- -Missing
steam_appid.txtnext to the editor / packaged executable. SetbAutoWriteSteamAppIdFile = truein Project Settings; UOS writes it automatically. - -Wrong AppID. App 480 (Spacewar) is fine for testing but you must own it on the running Steam account.
SteamWorks API: AppID 0in logs = config not loaded. - -Steam restart needed. After changing the appid file, restart Steam (not just the editor) - it caches the app launch context.
EOS Is Platform Ready stays false
Symptom: every EOS subsystem call no-ops.
Causes
- -Empty credentials in Project Settings. The Product / Sandbox / Deployment / Client ID + Secret are all required.
- -Wrong sandbox / deployment. The deployment must belong to the sandbox; the sandbox must belong to the product.
- -PIE init disabled. Add
EOSPlatformFlags = 2(LOADING_IN_EDITOR) if you want EOS up while running PIE. - -EOSSDK module not packaged. Confirm
EOSSDKis listed underPrivateDependencyModuleNamesin your project's Build.cs (UOS already declares it for itself, but a packaged shipping target needs the SDK in dependencies of the game module too if you call it directly).
My callbacks never fire
Symptom: you call something, the request issues, but the result event never comes back.
Causes
- -No tick pump.
UOS Steam SubsystemticksSteamAPI_RunCallbacksandUOS EOS SubsystemticksEOS_Platform_Tick. Both areFTickableGameObjects. If you have something pausing ticks (like customSetGamePausedwith all tickables frozen), no async results surface. OverrideIsTickableWhenPausedremains true on UOS subsystems but check for any blanket pause logic. - -Subsystem destroyed mid-flight. UOS uses
TWeakObjectPtrto bridge callbacks to the game thread - if the GameInstance shut down before the result arrived, the callback no-ops. Verify by triggering the call when the subsystem is alive and waiting at least one tick. - -Wrong delegate binding. EOS notifications return a NotificationId; if you don't store it, the unbinder runs on Deinit but Steam callbacks won't arrive for events you registered for. Re-check that
Bind Eventran before the action.
Lobby search returns 0 results
EOS
- -BucketId mismatch. The lobby was created with
BucketId = "A"but you're searching"B". Bucket IDs are exact-match. - -Permission level. Only
PublicAdvertisedlobbies are returned by attribute / bucket search.InviteOnlyandJoinViaPresencelobbies are invisible. - -Attributes private. If you set
bPublic = falseon a lobby attribute, it isn't indexed. Make filter attributes public. - -Wrong sandbox. Lobbies are scoped to a sandbox / deployment. Two clients on different sandboxes don't see each other.
Steam
- -Filter mismatch.
Add Lobby String Filteruses string-comparison on the lobby data key. Verify the key isSet Lobby Data'd on the host before searching. - -Distance filter too tight. Default is
Default. TryWorldwidewhile debugging.
Anti-cheat won't initialize
Symptom: Begin Session returns false on the client.
- -No EAC bootstrapper. The runtime API is only half the story. Your packaged build must launch via
EasyAntiCheat_x64.exewith a per-title certificate from Epic. - -Unsigned executable. EAC validates code signatures; a debug-built unsigned binary fails to begin a protected session.
- -Title not registered. EAC requires per-title config in the Epic Dev Portal even for sandbox runs.
- -Server side missing.
UOSEOSAntiCheatServerSubsystem -> Begin Sessionon the server complements the client; without it, client integrity events have nowhere to land.
Voice doesn't come through
- -Send disabled. UOS RTC defaults to
bUnmuted = false. Toggle withUOS EOS RTC Audio Subsystem -> Update Sending. - -Wrong device.
Get Input Devices->Set Input Deviceif the user has multiple mics. - -Token expired. Participant tokens have an expiry. Re-mint via your backend on rejoin.
Workshop upload fails partway
- -Content folder too big. Steam has size limits per item; check the SteamCmd dashboard.
- -Preview not provided.
Set Item Previewis required beforeSubmit Item Updatefor items the user expects to be visible. - -Permissions. The item visibility flag (defaults to community) determines whether your account can publish it.
Dedicated server doesn't show in browser
- -Mode mismatch.
NoAuthentication= LAN-only;AuthenticationAndSecure= public + VAC. - -Ports blocked.
GamePort+QueryPortmust be reachable from the master server. - -No
SetMapName. Some browsers filter out servers without a map. - -Not logged on. Bind
OnLoggedOn- the server is invisible until that event fires.
Plugin doesn't compile
- -Wrong Dist version. The Dist for UE 5.6 won't link against UE 5.5. Use the matching folder.
- -Missing Steamworks third-party. Some custom UE source builds strip
Engine/Source/ThirdParty/Steamworks/. Restore from Epic's public source. - -Blueprint-only project. UOS contains C++ modules; convert to a C++ project (add one empty C++ class once).
Where are the logs?
UOS routes its log to UE's LogUOS category. To make it verbose:
[Core.Log] LogUOS=Verbose
in Config/DefaultEngine.ini. Steam SDK warnings come through Steam's own log (visible in the Output Log under LogSteamShared when the OSS plugin is loaded).
Note
Still stuck? Capture the full Output Log starting from
UOS entries onward and share it - 90% of UOS issues diagnose from a 100-line slice of that log.