Quick notes on Steam AppID in Unreal (from reading OnlineSubsystemSteam.cpp, not the docs):
- Engine reads only
SteamDevAppId(ini, non-shipping builds). TheSteamAppIdini key does nothing — no code reads it. It just got copied around from old setup guides. - Shipping ignores the ini and uses the compile macro
UE_PROJECT_STEAMSHIPPINGID(defaults to0). Set it in*.Target.cs:Target.GlobalDefinitions.Add("UE_PROJECT_STEAMSHIPPINGID=<AppID>"). steam_appid.txtis written next to the exe (Binaries/Win64/, not the install root) fromSteamDevAppId, on init, and deleted on shutdown. Non-shipping only, so it only exists while the game runs.- Launched from Steam → the client’s env-var AppID wins over the file/ini. That’s why you see “Playing
” even withSteamDevAppId=480. The480only becomes your identity on a direct, non-Steam launch.
⚠️ Gotcha: Steam overlay (Shift+Tab) works in Development but is dead in a directly-launched Shipping build → you forgot UE_PROJECT_STEAMSHIPPINGID. With 0 there’s no AppID source (no relaunch-through-Steam, no steam_appid.txt, no env var) so SteamAPI_Init() never attaches. Set the macro and a direct launch relaunches through Steam → overlay + ownership work.
💡 Don’t hardcode the ID in code — Target.cs is C#, read it from the ini with ConfigCache.ReadHierarchy(...).GetInt32(...) so the AppID stays in one place. (Target.cs changes need a full rebuild, Live Coding won’t apply them.)