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).