Knowledge Base
HomeProductsCommunityReviewsSocial
Old Knowledge Base
Old Knowledge Base
  • Knowledge Base
    • Getting to know us
  • Where to Buy
    • Become a Sponsor
    • Heathen License Agreement
  • General
    • ๐Ÿ”ŽTable of Contents
    • ๐ŸคฉGetting Started
      • Indie Check List
      • Sourcing Resources
        • ๐Ÿง™โ€โ™‚๏ธCommunity
        • ๐Ÿงžโ€โ™‚๏ธManaged Services
        • ๐Ÿ“ฃMarketing
        • ๐ŸงชTesting
    • ๐ŸงžTips and Tricks
      • Fundamentals
        • Development Phases
      • Unity
        • Package Manager Installs
          • Missing asset after update
        • Unity Release Version
      • Unreal
        • Unity to Unreal
        • Quick Start
    • ๐Ÿ“Design
      • โ˜๏ธQuick Start
      • ๐ŸฅพBootstraping
      • ๐Ÿค‘Monetization
        • What not to do
        • Models
          • Free
          • Free to Play
          • Pay to Play
          • Pay to Win
          • Play to Earn
        • Tools
          • ๐Ÿ˜กArtificial Scarcity
          • ๐Ÿค‘Bundles
          • ๐Ÿค”Community Marketplace
          • ๐Ÿค‘Expansions
          • ๐Ÿ˜กFear of Missing Out (FOMO)
          • ๐Ÿ˜กGatcha Mechanics
          • ๐Ÿค”Microtransactions (MTX)
          • ๐Ÿ˜กNFT
            • ๐Ÿ˜กBlockchain
          • ๐Ÿค”No Spend Cap
          • ๐Ÿ˜กPremium Currency
          • ๐Ÿค”Season
          • ๐Ÿค‘Subscription
          • ๐Ÿ˜กSurprise Mechanics
      • ๐ŸŽฎMultiplayer
        • Networking Tools
        • Terminology
      • ๐ŸคนMulti-Scene Architecture
      • ๐ŸŒProject Architecture
      • ๐Ÿ˜ŠPlayer Motivation
    • ๐Ÿ—๏ธDevelopment
      • โ˜๏ธQuick Start
      • โ˜Ž๏ธCallbacks & Delegates
      • โ”Conditional Compilation
      • ๐ŸชณDebugging
      • ๐ŸšงDevOps
        • โ˜•Team Collaboration
        • ๐Ÿ›‚Git Control & Unity
      • โ‰๏ธError Handling
        • System Dialog
        • Reporting
      • ๐ŸคฏIntelliSense
      • ๐ŸชถLambda Expressions
      • ๐Ÿคนโ€โ™€๏ธMulti Platform Projects
      • ๐Ÿ“‘Namespace and Using
      • ๐ŸŽฎUnity's "New" Input System
      • ๐Ÿ”ผUpdating Visual Studio and C#
      • ๐Ÿ’กVisual Scripting
    • โš ๏ธPublishers
    • ๐ŸงชTesting
      • ๐Ÿ‘‹Introduction
      • โœ๏ธWriting Formal Tests
    • ๐Ÿง™โ€โ™‚๏ธCommunity
      • โ˜๏ธQuick Start
    • ๐Ÿ“ฃMarketing
      • โ˜๏ธQuick Start
      • ๐Ÿ“ŒTips and Tactics
      • ๐Ÿค“Market Research
    • ๐Ÿ“†Release
    • ๐Ÿ—บ๏ธLive
  • Steam
    • โ˜๏ธQuick Start
    • ๐Ÿ†Achievements
    • ๐ŸŒณBranches
    • ๐Ÿ—ฃ๏ธCommunity Hub
    • โฌ†๏ธUploading to Steam
    • โ˜๏ธCloud Save
    • ๐Ÿ†”CSteamID
    • ๐Ÿ”ŽDiscovery Queue
    • ๐Ÿ•น๏ธDownloadable Content
    • ๐ŸšซEarly Access
    • ๐Ÿ–ฑ๏ธInput
    • ๐Ÿ“ฆInventory
      • ๐Ÿ”จCrafting System
      • ๐Ÿ› ๏ธItem Definition Tools
      • ๐Ÿ’ธMicrotransactions
      • ๐ŸŽPromo Items
    • ๐ŸšขLaunch
    • ๐Ÿฅ‡Leaderboards
      • ๐Ÿ—ฃ๏ธAdvanced Profiles
    • ๐ŸŽฎMultiplayer
      • โ˜๏ธGetting Started
      • ๐ŸงชDev and Test
      • ๐Ÿง‘โ€โš–๏ธAuthentication
      • ๐Ÿ›‹๏ธLobby
      • ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘Matchmaking
      • ๐Ÿง‘โ€๐Ÿ”งRich Presence
      • ๐Ÿ’ฌRoom Systems
      • ๐Ÿ’Steam Game Server
        • ๐Ÿ‘ทBuilds
        • โš™๏ธConfiguration
        • ๐Ÿ“‹Server Browser
        • ๐ŸงSetup Linux
      • ๐Ÿ—ฃ๏ธTerminology
    • ๐ŸคนMulti-Platform Project
    • ๐ŸงชPlaytest
    • ๐Ÿ›‹๏ธRemote Play
    • ๐Ÿ‘€Reviews
    • ๐ŸƒRunning a Build
    • ๐Ÿ’ถSales
    • โญStats
    • ๐Ÿ”‘Steam API Key
    • ๐Ÿ“ƒsteam_appid.txt
    • ๐Ÿ–ฅ๏ธSteam Deck
    • โš™๏ธSteamworks
    • ๐ŸคฏStore Page
    • ๐Ÿ› ๏ธWorkshop
      • Creating an Item
      • In-Game Browser
      • Subscribed Items
    • ๐Ÿง‘โ€๐ŸซUser Information
      • Unity User Tools
      • Unreal User Tools
    • ๐Ÿ—ฃ๏ธVoice
  • Toolkit for Steamworks
    • Introduction
    • Maintenance Cycle
    • F.A.Q
    • Unity
      • โš ๏ธKnown Issues
      • Unity Asset Refund Policy
      • Installation
        • Networking Integrations
      • Getting Started
      • Debugging
      • Learning
      • API Extensions
        • App.Client
        • App.Server
        • App.Web
        • Authentication
        • BigPicture.Client
        • Clans.Client
        • Friends.Client
        • Input.Client
        • Inventory.Client
        • Leaderboards.Client
        • Matchmaking.Client
        • Overlay.Client
        • Parties.Client
        • RemotePlay.Client
        • RemoteStorage.Client
        • Screenshots.Client
        • StatsAndAchievements.Client
        • StatsAndAchievements.Server
        • User.Client
        • UserGeneratedContent.Client
        • Utilities
        • Utilities.Client
        • Voice.Client
      • Objects
        • Classes
          • Achievement Data
          • Achievement Object
          • App Data
          • Authentication Session
          • Authentication Ticket
          • Avg Rate Stat
          • Chat Room
          • Clan Chat Msg
          • Clan Data
          • Currency
          • Data Model
          • DLC Data
          • Downloadable Content Object
          • Favorite Game
          • Float Stat
          • Game Data
          • Input Action
          • Input Action Data
          • Input Action Set
          • Input Action Set Data
          • Input Action Set Layer
          • Input Action Update
          • Input Controller Data
          • Int Stat
          • Inventory Result
          • Item Data
          • Item Definition
          • Item Detail
          • Leaderboard Data
          • Leaderboard Entry
          • Leaderboard Object
          • Lobby Chat Msg
          • Lobby Data
          • Lobby Game Server
          • Lobby Member Data
          • Party Beacon Details
          • Rank Change
          • Remote Storage File
          • Stat Data
          • Steam Game Server Configuration
          • UGC Query
          • User Data
          • Steam Settings
            • Colors
            • Game Client
              • Inventory Settings
            • Game Server
          • User Leave Data
          • Workshop Item
          • Workshop Item Data
          • Workshop Item Data Create Status
          • Workshop Item Key Value Tag
          • Workshop Item Preview File
        • Components
          • Friend Manager
          • Game Server Browser Manager
          • Input Action Event
          • Input Action Glyph
          • Input Action Name
          • Inventory Manager
          • Item Shopping Cart Manager
          • Leaderboard Manager
          • Leaderboard User Entry
          • Overlay Manager
          • Steam Game Server Events
          • Steam Input Manager
          • Steamworks Event Triggers
          • UGC Query Manager
          • Voice Recorder
          • Voice Stream
        • Enums
          • Friend Dialog
          • Inventory Item Type
          • Language Codes
          • Overlay Dialog
          • Sample Rate Method
          • Valve Price Categories
        • Prefabs
          • ๐Ÿ“ฆClan Chat
          • ๐Ÿ“ฆClan List
          • ๐Ÿ“ฆClan Member Count
          • ๐Ÿ“ฆFriend Avatar
          • ๐Ÿ“ฆFriend Groups
          • ๐Ÿ“ฆFriend List
          • ๐Ÿ“ฆFriend Name
          • ๐Ÿ“ฆFriend Profile
          • ๐Ÿ“ฆSelectable Friend ID
        • Programming Tools
          • IChatMessage
          • ILeaderboardEntryDisplay
          • IUserProfile
          • IWorkshopBrowserItemTemplate
          • LobbyMemberSlot
          • User Invite Button
        • UI Components
          • Chat Auto Join
          • Chat Stream
          • Clan Chat Director
          • Clan Chat Member Counter
          • Clan Chat Member List
          • Clan List
          • Clan Profile
          • Friend Group
          • Friend Groups Display
          • Friend Invite Dropdown
          • Friend List
          • Friend Profile
            • Image Field
            • Message Options
            • Text Field
          • Input Action Glyph
          • Input Action Name
          • Leaderboard Entry UI Record
          • Leaderboard UI List
          • Lobby Chat Director
          • Lobby Member Slot
          • Lobby Manager
          • Party Lobby Control
          • Quick Match Lobby Control
          • Rich Presence Reader
          • Rich Presence Setter
          • Set Achievement Description
          • Set Achievement Icon
          • Set Achievement Name
          • Set User Avatar
          • Set User Id Input Field
          • Set User Id Label
          • Set User Name
          • Toggle Event Helper
          • Workshop Browser Simple Item Record
      • Legacy
        • Troubleshooting
        • Getting Started
          • GameObject Initialization
          • ScriptableObject Initialization
          • API Initialization
        • Build Upload Tool
        • Debugging Tools
          • Testing
        • Components
          • Steamworks Behaviour
          • Steamworks Creator
          • Steam System Events
    • Unreal
      • What's New!
      • Installation
      • Getting Started
      • Updating Steamworks SDK
      • Packaging
      • Game Instance
      • Sockets Net Driver
      • Online Subsystem
      • Data Assets
        • Achievement
        • Downloadable Content
        • Inventory Item
        • Leaderboard
        • Stat
      • Widgets
        • BP_FriendsListDisplay
        • BP_FriendsListEntry
        • BP_FriendsListGroup
        • BP_SteamAvatarImage
        • BP_SteamUserName
      • Blueprint Nodes
        • Functions
          • ๐Ÿ”ตAdd Favorite Game
          • ๐Ÿ”ตAdd History Game
          • ๐Ÿ”ตAdd Promo Item
          • ๐Ÿ”ตAdd Request Lobby List Filter
          • ๐Ÿ”ตAdvertise Game
          • ๐Ÿ”ตAssociate with Clan
          • ๐Ÿ”ตAttach Leaderboard UGC
          • ๐Ÿ”ตBegin Auth Session
          • ๐Ÿ”ตCancel Auth Ticket
          • ๐Ÿ”ตCheck Result Steam ID
          • ๐Ÿ”ตClear All Key Values
          • ๐Ÿ”ตClear Achievement
          • ๐Ÿ”ตClear Rich Presence
          • ๐Ÿ”ตClient Initialize
          • ๐Ÿ”ตClient Run Callbacks
          • ๐Ÿ”ตClient Should Restart
          • ๐Ÿ”ตCompue New Player Compatibility
          • ๐Ÿ”ตConsume Item
          • ๐Ÿ”ตCreate Lobby
          • ๐Ÿ”ตDecompress Voice
          • ๐Ÿ”ตDelete Lobby Data
          • ๐Ÿ”ตDeserialize Result
          • ๐Ÿ”ตDestroy Result
          • ๐Ÿ”ตDownload Leaderboard Entries
          • ๐Ÿ”ตDownload Leaderboard Entries for Users
          • ๐Ÿ”ตEnd Auth Session
          • ๐Ÿ”ตExchange Items
          • ๐Ÿ”ตFind Leaderboard
          • ๐Ÿ”ตFind or Create Leaderboard
          • ๐Ÿ“‚Game Server Browser
            • ๐Ÿ”ตPing Server
            • ๐Ÿ”ตPlayer Details
            • ๐Ÿ”ตRequest Server List
            • ๐Ÿ”ตServer Rules
          • ๐Ÿ”ตGenerate Items
          • ๐Ÿ”ตGet Achievement
          • ๐Ÿ”ตGet Achievement by Index
          • ๐Ÿ”ตGet Achievement Icon
          • ๐Ÿ”ตGet Achievement Is Achieved
          • ๐Ÿ”ตGet All Items
          • ๐Ÿ”ตGet App Build ID
          • ๐Ÿ”ตGet App Id
          • ๐Ÿ”ตGet App Owner
          • ๐Ÿ”ตGet Auth Session Ticket
          • ๐Ÿ”ตGet Auth Ticket for Web API
          • ๐Ÿ”ตGet Available Game Languages
          • ๐Ÿ”ตGet Available Voice
          • ๐Ÿ”ตGet Coplay Friends
          • ๐Ÿ”ตGet Current Beta Name
          • ๐Ÿ”ตGet Current Game Language
          • ๐Ÿ”ตGet DLC Count
          • ๐Ÿ”ตGet DLC Data By Index
          • ๐Ÿ”ตGet DLC Download Progress
          • ๐Ÿ”ตGet Earliest Purchase
          • ๐Ÿ”ตGet Favorite Game
          • ๐Ÿ”ตGet Friends
          • ๐Ÿ”ตGet Friend Coplay Game
          • ๐Ÿ”ตGet Friend Coplay Time
          • ๐Ÿ”ตGet Friend Count from Source
          • ๐Ÿ”ตGet Friend Game Played
          • ๐Ÿ”ตGet Friend Groups
          • ๐Ÿ”ตGet Friend Group Members
          • ๐Ÿ”ตGet Friend Group Name
          • ๐Ÿ”ตGet Friend Persona Name
          • ๐Ÿ”ตGet Followed
          • ๐Ÿ”ตGet Installed Depots
          • ๐Ÿ”ตGet Item Definition Properties
          • ๐Ÿ”ตGet Item Price
          • ๐Ÿ”ตGet Items with Price
          • ๐Ÿ”ตGet Items by ID
          • ๐Ÿ”ตGet Launch Command Line
          • ๐Ÿ”ตGet Launch Query Param
          • ๐Ÿ”ตGet Leaderboard Display Type
          • ๐Ÿ”ตGet Leaderboard Entry Count
          • ๐Ÿ”ตGet Leaderboard Name
          • ๐Ÿ”ตGet Leaderboard Sort Method
          • ๐Ÿ”ตGet Lobby Chat Entry
          • ๐Ÿ”ตGet Lobby Data
          • ๐Ÿ”ตGet Lobby Data by Index
          • ๐Ÿ”ตGet Lobby Game Server
          • ๐Ÿ”ตGet Lobby Members
          • ๐Ÿ”ตGet Lobby Member by Index
          • ๐Ÿ”ตGet Lobby Member Data
          • ๐Ÿ”ตGet Lobby Member Limit
          • ๐Ÿ”ตGet Lobby Owner
          • ๐Ÿ”ตGet Most Achieved Achievement Info
          • ๐Ÿ”ตGet My Steam Avatar
          • ๐Ÿ”ตGet My Steam ID
          • ๐Ÿ”ตGet My Steam Level
          • ๐Ÿ”ตGet Num Items with Price
          • ๐Ÿ”ตGet Persona Name
          • ๐Ÿ”ตGet Persona State
          • ๐Ÿ”ตGet Player Nickname
          • ๐Ÿ”ตGet Public IP
          • ๐Ÿ”ตGet Result Item Property
          • ๐Ÿ”ตGet Result Items
          • ๐Ÿ”ตGet Result Status
          • ๐Ÿ”ตGet Result Timestamp
          • ๐Ÿ”ตGet Stat
          • ๐Ÿ”ตGet Steam ID
          • ๐Ÿ”ตGet User Achievement
          • ๐Ÿ”ตGet User Float Stat
          • ๐Ÿ”ตGet User Int Stat
          • ๐Ÿ”ตGet User Restrictions
          • ๐Ÿ”ตGet Rich Presence
          • ๐Ÿ”ตGet User Rich Presence
          • ๐Ÿ”ตGet User Rich Presence Key by Index
          • ๐Ÿ”ตGet User Steam Avatar
          • ๐Ÿ”ตGet Voice
          • ๐Ÿ”ตGet Voice Optimal Sample Rate
          • ๐Ÿ”ตGrant Promo Items
          • ๐Ÿ”ตHas Friend
          • ๐Ÿ”ตId is Me
          • ๐Ÿ”ตId is Valid
          • ๐Ÿ”ตIndicate Achievement Progress
          • ๐Ÿ”ตInstall DLC
          • ๐Ÿ”ตInvite User To Game
          • ๐Ÿ”ตInvite User to Lobby
          • ๐Ÿ”ตInitialize
          • ๐Ÿ”ตIs App Installed
          • ๐Ÿ”ตIs Behind NAT
          • ๐Ÿ”ตIs Cybercafe
          • ๐Ÿ”ตIs DLC Installed
          • ๐Ÿ”ตIs Lobby Owner
          • ๐Ÿ”ตIs Low Violence
          • ๐Ÿ”ตIs Phone Identifying
          • ๐Ÿ”ตIs Phone Requiring Verification
          • ๐Ÿ”ตIs Phone Verified
          • ๐Ÿ”ตIs Steam Initialized
          • ๐Ÿ”ตIs Subscribed
          • ๐Ÿ”ตIs Subscribed App
          • ๐Ÿ”ตIs Subscribed from Family Sharing
          • ๐Ÿ”ตIs Subscribed from Free Weekend
          • ๐Ÿ”ตIs Timed Trial
          • ๐Ÿ”ตIs Two Factor Enabled
          • ๐Ÿ”ตIs VAC Banned
          • ๐Ÿ”ตJoin Lobby
          • ๐Ÿ”ตLeave Lobby
          • ๐Ÿ”ตLoad Item Definitions
          • ๐Ÿ”ตLogged On
          • ๐Ÿ”ตLog Off
          • ๐Ÿ”ตLog On
          • ๐Ÿ”ตLog On Anonymous
          • ๐Ÿ”ตMark Content Corrupt
          • ๐Ÿ”ตQuick Match
          • ๐Ÿ”ตRemove Favorite Game
          • ๐Ÿ”ตRemove History Game
          • ๐Ÿ”ตRemove Property
          • ๐Ÿ”ตReply to Friend Message
          • ๐Ÿ”ตRequest Current Stats
          • ๐Ÿ”ตRequest Eligible Promo Item Definitions IDs
          • ๐Ÿ”ตRequest Friend Rich Presence
          • ๐Ÿ”ตRequest Lobby Data
          • ๐Ÿ”ตRequest Lobby List
          • ๐Ÿ”ตRequest Prices
          • ๐Ÿ”ตRequest Store Auth URL
          • ๐Ÿ”ตRequest User Group Status
          • ๐Ÿ”ตRequest User Information
          • ๐Ÿ”ตRequest User Stats
          • ๐Ÿ”ตReset All Stats
          • ๐Ÿ”ตRun Callbacks
          • ๐Ÿ”ตSecure
          • ๐Ÿ”ตSend Lobby Chat
          • ๐Ÿ”ตSerialize Result
          • ๐Ÿ”ตSet Achievement
          • ๐Ÿ”ตSet Advertise Server Active
          • ๐Ÿ”ตSet Bot Player Count
          • ๐Ÿ”ตSet Dedicated Server
          • ๐Ÿ”ตSet Description
          • ๐Ÿ”ตSet Game Data
          • ๐Ÿ”ตSet Game Tags
          • ๐Ÿ”ตSet In-Game Voice Speaking
          • ๐Ÿ”ตSet Key Value
          • ๐Ÿ”ตSet Map Name
          • ๐Ÿ”ตSet Listen for Friends Messages
          • ๐Ÿ”ตSet Lobby Data
          • ๐Ÿ”ตSet Lobby Game Server
          • ๐Ÿ”ตSet Lobby Joinable
          • ๐Ÿ”ตSet Lobby Member Data
          • ๐Ÿ”ตSet Lobby Member Limit
          • ๐Ÿ”ตSet Lobby Owner
          • ๐Ÿ”ตSet Lobby Type
          • ๐Ÿ”ตSet Max Player Count
          • ๐Ÿ”ตSet Mod Directory Name
          • ๐Ÿ”ตSet Name
          • ๐Ÿ”ตSet Password Protected
          • ๐Ÿ”ตSet Persona Name
          • ๐Ÿ”ตSet Played with User
          • ๐Ÿ”ตSet Product
          • ๐Ÿ”ตSet Property
          • ๐Ÿ”ตSet Region
          • ๐Ÿ”ตSet Rich Presence
          • ๐Ÿ”ตSet Stats
          • ๐Ÿ”ตSet Spectator Name
          • ๐Ÿ”ตSet Spectator Port
          • ๐Ÿ”ตSet User Achievement
          • ๐Ÿ”ตSet User Float Stat
          • ๐Ÿ”ตSet User Int Stat
          • ๐Ÿ”ตShutdown
          • ๐Ÿ”ตStart Purchase
          • ๐Ÿ”ตStart Update Property
          • ๐Ÿ”ตStart Voice Recording
          • ๐Ÿ”ตSteam ID Tools
          • ๐Ÿ”ตStop Voice Recording
          • ๐Ÿ”ตStore Stats
          • ๐Ÿ”ตStore User Stats
          • ๐Ÿ”ตSubmit Update Property
          • ๐Ÿ”ตTransfer Item Quantity
          • ๐Ÿ”ตTrigger Item Drop
          • ๐Ÿ”ตUninstall DLC
          • ๐Ÿ”ตUpdate Avg Rate Stat
          • ๐Ÿ”ตUpdate User Avg Rate Stat
          • ๐Ÿ”ตUpload Leaderboard Score
          • ๐Ÿ”ตUser Has License for App
          • ๐Ÿ”ตWas Restart Requested
        • Events
          • ๐Ÿ”ปDlc Installed
          • ๐Ÿ”ปFriend Chat Msg
          • ๐Ÿ”ปFriend Rich Presence Update
          • ๐Ÿ”ปGame Overlay Activated
          • ๐Ÿ”ปInventory Item Definition Update
          • ๐Ÿ”ปInventory Results Ready
          • ๐Ÿ”ปLobby Chat Msg
          • ๐Ÿ”ปLobby Chat Update
          • ๐Ÿ”ปLobby Data Update
          • ๐Ÿ”ปLobby Game Created
          • ๐Ÿ”ปLobby Join Requested
          • ๐Ÿ”ปMicro Txn Authorization Response
          • ๐Ÿ”ปPersona State Change
          • ๐Ÿ”ปRich Presence Join Requested
          • ๐Ÿ”ปServers Connected
          • ๐Ÿ”ปServer Connect Failure
          • ๐Ÿ”ปServer Disconnected
          • ๐Ÿ”ปTicket for Web API Response
        • Types
          • ๐ŸŸฉAchievement Status
          • ๐ŸŸฉAuth Ticket Data
          • ๐ŸŸฉChat Entry
          • ๐ŸŸฉDecompress Voice Result
          • ๐ŸŸฉFloat Stat
          • ๐ŸŸฉGame Server Item Wrapper
          • ๐ŸŸฉGame Server Player Details Wrapper
          • ๐ŸŸฉGlobal Achievement Status
          • ๐ŸŸฉItem Count
          • ๐ŸŸฉItem Detail
          • ๐ŸŸฉItem Detail With Properties
          • ๐ŸŸฉItem Price
          • ๐ŸŸฉItem With Price
          • ๐ŸŸฉInt Stat
          • ๐ŸŸฉKey Value Pair
          • ๐ŸŸฉLeaderboard Entry
          • ๐ŸŸฉLobby Data
          • ๐ŸŸฉLobby Game Server
          • ๐ŸŸฉServer Achievement Status
          • ๐ŸŸฉServer Stat Float Value
          • ๐ŸŸฉServer Stat Int Value
          • ๐ŸŸฉUser Achievement Status
          • ๐ŸŸฉVoice Result
          • ๐ŸŸฉVoice Available Result
        • Enumerators
          • ๐ŸŸจUEBeginAuthSessionResult
          • ๐ŸŸจUEChatRoomEnterResponse
          • ๐ŸŸจUEFriendFlags
          • ๐ŸŸจUEChatEntryType
          • ๐ŸŸจUEChatMemberStateChange
          • ๐ŸŸจUELeaderboardDataRequest
          • ๐ŸŸจUELeaderboardDisplayType
          • ๐ŸŸจUELeaderboardSortMethod
          • ๐ŸŸจUELobbyComparison
          • ๐ŸŸจUELobbyDistanceFilter
          • ๐ŸŸจUELobbyType
          • ๐ŸŸจUEResult
          • ๐ŸŸจUESteamCurrencyCode
          • ๐ŸŸจUEServerMode
          • ๐ŸŸจUEUserHasLicenseForAppResult
          • ๐ŸŸจUEVoiceResult
      • C++
  • Toolkit for Physics
    • Unity
      • Installation
      • Core Features
        • Ballistics Tools
        • Buoyancy Tools
        • Force Effect Framework
        • Physics Data extended
        • Verlet Integration
      • Sample Scenes
        • Fantasy Style Ballistic Simulation
        • (3D) Deterministic Bounce Prediction
        • (2D) Deterministic Bounce Prediction
        • 1 Buoyancy Example
        • 1 Force Effect Fields
        • 2 Spherical Gravity
        • 3 Multi-body Gravity
        • 1 Verlet Spring Simple Transforms
        • 2 Verlet Spring Skinned Mesh
      • API
        • Ballistics
        • Buoyancy
        • Force Effects
        • Maths
        • Mesh Tools
      • Components
        • Ballistic Aim
        • Ballistic Path Line Render
        • Ballistic Path Follow
        • Buoyant Body
        • Buoyant Body Drag
        • Constant Acceleration
        • Constant Angular Velocity
        • Constant Linear Velocity
        • Force Effect Source
          • Force Effect Direction
          • Force Effect Field
        • Force Effect Reciever
        • Physics Data
        • Surface Tool
        • Trick Shot
        • Trick Shot Line
        • Verlet Spring
      • Objects
        • Force Effect
          • Attract Effect
          • Gravity Effect
          • Repulse Effect
          • Suspend Effect
          • Tractor Effect
          • Wind Effect
        • Point Volume
        • Verlet Hierarchy
        • Verlet Hierarchy Settings
        • Verlet Particle
      • Enums
        • Calculation Mode
  • Toolkit for UI & UX
    • Introduction
    • Unity
      • Installation
      • Learning
        • Sample Scenes
          • Command Parser Example
          • Cursor System Scene
          • Drag and Drop (Behaviours)
          • Drag and Drop (Inventory Example)
          • Drag and Drop (Spell Bar Example)
          • Log Sample Scene
          • Screenshot Sample Scene
        • Core Concepts
          • Command System
          • Cursor System
          • Drag and Drop System
          • Interaction Tools
          • Logging & Feedback
          • Scene Tools
          • Selection System
          • Tooltip System
          • Window System
        • uGUI Extras
          • Key Collection
          • Ligature Tools
          • Tree View Collection
      • API
        • Cursors
        • Json
        • Log
        • Scenes
        • Screenshot
        • Selection
        • Trello
        • Windows
      • Components
        • Action Hold
        • Border Handle
        • Button Cursor State
        • Change Cursor Default State
        • Command Director
        • Cursor Animator
        • Drag Item
        • Drop Container
        • Key Hold
        • Mouse Over Cursor State
        • Move Handle
        • Play On Click
        • Play On Demand
        • Play On Down
        • Play On Enter
        • Play On Exit
        • Play On Up
        • Pointer Hold
        • Scenes Manager
        • Selectable Object
        • Selection Manager
        • Tooltip Trigger
        • Tooltip Window Controller
        • Window
        • Window Clamping Bounds
        • Window Focus Change Event Data
      • Objects
        • Command Data
        • Command Library
        • Cursor Animation
        • Cursor State
        • DragAndDropItemChangeData
        • LogData
      • Enums
        • Clear Drop Behaviour
        • Drag Effect
        • Drag End Behaviours
        • Grab Handle
        • Mask Mode
        • Recieve Mode
        • Window Snap To Location
  • More Heathen Tools
    • ๐ŸŽจArt Assets
      • Breakable
        • Wood Props
          • Installation
    • โš™๏ธSystem Core
      • Installation
      • Learning
        • Asset Developers
      • Command Line
      • Game Events
      • Scriptable Tags
      • Scriptable Variables
      • Heathen Behaviour
      • Heathen UI Behaviour
    • ๐Ÿ“‹Tips for Asset Developers
      • Editor Coroutines
      • Package Manger in C#
      • Session State Values
  • Codex
    • Introduction
      • Article Design Guide
        • Evolution
          • Early Period
          • Middle Period
          • Late Period
      • Codex Organization
    • Irish
      • Folklore
        • Introduction
        • Characters
          • Dรฉithe
            • Cacht
            • Lugh
            • Dag Dia
              • Donn
              • Nuada
              • Ogma
            • Mother?
              • Banba
                • Appearance
                • Name
              • ร‰rui
                • Appearance
                • Name
              • Fรณdla
                • Appearance
                • Name
            • Father ?
              • ร‰thur Mac Cuill
              • Cรฉthur Mac Grรฉine
              • Tรฉthur Mac Cecht
        • Concepts
          • Binding Tablet
          • Druids
          • Sociaty
          • Patron Gods
          • Bile
          • Time
        • Food
          • Elderberry Capers
          • Elderberry Wine
          • Mead
        • Peoples
          • Fomรณire
          • Research Note
            • Hunter Gathers
            • Neolithic Farmers
            • Bronze Age
        • Locations
          • Lughmhagh
          • Temair
            • Name
      • Research
        • Historical Backdrop
        • Disambiguation
          • Banshee
          • Celt
          • Gods and Goddesses
          • Lebor Gabรกla ร‰renn
          • Milesians
          • Mother Goddess
          • Sovereignty Goddess
          • The Morrรญgan
          • Triple Persona
          • Tuatha Dรฉ
          • Wicker Man Sacrafice
        • Links
          • Social Factors
          • Lugh
            • Name
          • Ogma
          • Astronomy
          • Time
        • Sources
        • WIP
          • Artefacts
          • Beings
            • Cannon
              • Belgae
              • Fomorians
              • Sรญog
              • Tuatha Dรฉ Danann
            • Derivative
              • Milesians
              • Muintir Nemid
          • Characters
            • Cannon
            • Derivative
          • Concepts
          • Events
          • Languages
          • Music
          • Places
          • Sources
          • Stories
          • Styles
Powered by GitBook
On this page
  • Introduction
  • Key Concepts
  • Lobby?
  • Types
  • Members
  • Metadata
  • Chat
  • Invite to Lobby
  • Unity Examples
  • Getting Started
  • Working with Lobbies
  • Player Join / Leave
  • Others Join / Leave
  • Invited to Lobby
  • Metadata
  • Get the Lobby
  • Create a Lobby
  • Find and Join Lobbies
  • Using Lobby Chat
  • Notify "Connect to network"
  • Go from Lobby to Network Session
  • Unreal Examples
  • Player Join / Leave
  • Others Join / Leave
  • Invited to Lobby
  • Metadata
  • Create Lobby
  • Find and Join Lobbies
  • Using Lobby Chat
  • Notify "Connect to network"
  1. Steam
  2. Multiplayer

Lobby

Understanding what a Steam lobby is and is not, getting started with Steam Lobby

PreviousAuthenticationNextMatchmaking

Last updated 10 months ago

Like what you're seeing?

Support us as a and get instant access to all our assets, exclusive tools and assets, escalated support and issue tracking and our gratitude. These articles are made possible by our ... become a sponsor today!

Introduction

While Steam Lobby is not a true multiplayer feature ... it is in reality nothing but a chat room with metadata ... even called "Chat" on Valve's backend. It is nonetheless most commonly used for player parties and session matchmaking for we have listed it under the Multiplayer guides section.

Steam Matchmaking is driven primarily through the Steam Lobby feature. In a nutshell, the concept is that players will create a "lobby". You can think of this a bit like a chat room. This lobby has "metadata" associated with it which can be used to search for lobbies, filtering the results to just those the player cares about.โ€Œ

The metadata concept of Steam Lobby is where most of the functionality comes into play. The owner or "host" of a lobby can set the metadata on a lobby and anyone else can read that data, and the Steam Lobby search system can use that data to refine search results. In addition, each member within a lobby has a set of metadata associated with them. Lobby member metadata can only be set by the member it is related to and can only be read by other members of that lobby.โ€Œ

In summary lobby metadata is for stating the intent of the session or the status of the session and is accessible by everyone. Member metadata is for stating the intent of a member or the status of a member and is writable only by that member and readable only by fellow members of the same lobby.โ€Œ

You can read more about Steam's Matchmaking system in Valve's developer documentation.

Key Concepts

Lobby?

The first and most important thing to understand is that a lobby is not a network feature or concept. That is being in a lobby does not require a network connection, a network connection does not require a lobby. Lobby and Networking are two completely independent concepts.

Please do not confuse a lobby with anything to do with a network or network connection.

Types

The following explains; as clearly as Steam documentation allows, the available lobby types and when and how you might use them.

  • Private

    Classified as a "Normal" lobby by Steam.

    The only way to join a private lobby is to be invited to it via the Lobby.InvitePlayer feature. This can be useful in coop games when your player wants to play with a specific friend but doesn't want to be bothered by requests to join or public searches.

    This lobby will not appear in searches, it will not appear on the user's friends list or rich presence data.

  • Friends Only

    Classified as a "Normal" lobby by Steam.

    This lobby can only be joined by friends of the owner or by people directly invited to it. This lobby does appear on the user's friends list but does not appear in lobby lists or searches. This is useful when the player wants friends to be able to drop in / out but doesn't want to be bothered by random players.

  • Public

    Classified as a "Normal" lobby by Steam.

    This is the typical lobby you will see used in most games. It's the classic "Matchmaking" lobby that appears on the user's friends list and can be searched for and joined by any matching player.

  • Invisible

    This is the lobby type that Valve/Steam allows a user to be a member of 2 of this type.

    This lobby is not visible in the friends list but can be searched for. That might be confusing at first read.

    A random user can search for this lobby as you would a public lobby but this lobby will not show up on the Steam Friends list hence "invisible"

Members

Metadata

Metadata refers to data stored in the lobby or on a lobby member. Put simply it's a collection of key-value pairs where the key and value are a simple string. So you can think of it much like a

Dictionary<string, string>

The metadata stored on the lobby can be seen by anyone able to see the lobby and can be used to filter results when searching for a lobby using Steam's matchmaking system.

In contrast, metadata stored on a lobby member can only be seen by members of the lobby and is used only to share for example user configuration.

When metadata is changed the Steam API will raise the lobby data changed event ... that event will indicate what object's data changed not what data field changed so for example if the event indicates the lobby data changed you should check all the lobby metadata whereas if it indicated a members data changed you should check that members metadata.

As far as setting metadata you can use the indexers to set metadata for example if you have a Lobby in memory such as from the lobby manager.

var lobby = lobbyManager.Lobby;

Then you can set a metadata field on it such as

lobby["thisField"] = "thisValue";

Similarly if you have a LobbyMember in memory you can do the same thus

var member = lobby.Me;
member["thisField"] = "thisValue";

Chat

Invite to Lobby

You can invite friends to join a lobby you are a member of This works rather or not the friend is currently in the game. The general workflow for this process is

When User B clicks "Accept" That DOES NOT join User B to the lobby That simply notifies the game that User B has indicated they would like to join that lobby. It is up to you as a game developer to handle that event appropreatly for your game. Understand that the player could already be in a lobby, they could already be in a match, they could be in the process of exiting. The user that invited them might have invited a ton of other users and now the lobby is full, the user might have clicked Accept hours after the invite was sent ... there are SO MANY reasons why you do not just blindly join the lobby when you get that event.

Workflow

The user is currently In-Game

  1. User A joins or creates a lobby

  2. User A Invites User B to join the lobby

  3. User B clicks the Accept button in the Steam Friends Chat panel (overlay)

  4. Your game client invokes the GameLobbyJoinRequest event

  5. Your game client handles the event validating the lobby and navigating to the appropriate location in the game

  6. Your game client joins the indicated lobby

The user is not In-game but does own it

  1. User A joins or creates a lobby

  2. User A Invites User B to join the lobby

  3. User B's clicks the Accept button in the Steam Friends Chat panel (overlay)

  4. Steam launches the game passing the Lobby ID in on the command line

  5. Your game client handles the event validating the lobby and navigating to the appropriate location in the game

  6. Your game client joins the indicated lobby

When the user has accepted a lobby invite the ID of the lobby will be made available to them but the lobby's data will not be updated in the local cash.

You should Request Lobby Data for the invited lobby before attempting to read any of its metadata. You can join the lobby without reading the data however if you are properly validating the lobby you will need to read its data before joining.

Unity Examples

Getting Started

Bobsi has a quick setup tutorial that goes through a basic simple setup using Heathen's Toolkit for Steamworks. The Working with Lobbies entry below goes into more details and other options you have available.

Working with Lobbies

You can work with Lobby in one of 3 main ways; (from lowest level to highest)

Player Join / Leave

Your first question when managing a lobby is how to know when the user joins or leaves a lobby and what lobby it was that they joined or left. From low level to high here are the notes!

Matchmaking API

Success

void HandleLobbyEnterSuccess(LobbyEnter arg)
{
    Debug.Log("Success lobby join on lobby ID " + arg.m_ulSteamIDLobby);
}

Failure

void HandleLobbyEnterFailed(LobbyEnter arg)
{
    Debug.Log("Failed lobby join on lobby ID " + arg.m_ulSteamIDLobby);
}

Lobby

The lobby object Join method takes a callback so for example

LobbyData lobbyIWantToJoin = lobbyId;
lobbyIWantToJoin.Join((result, ioError) =>
    {
        if(!ioError) //Was their an IO error?
        {
            if (result.Response == EChatRoomEnterResponse.k_EChatRoomEnterResponseSuccess)
                ;//We are in all is well
            else
            {
                //Failed
                if (result.Response == EChatRoomEnterResponse.k_EChatRoomEnterResponseLimited)
                    ;//Failed because of a limited account
            }
        }
        else
            //Yes there was an IO error
    });

Lobby Manager

The fact that Lobby Manager filters its events to only the events that were run through it makes it much easier when driving UI elements. Most games will have 2 lobbies, 1 for the session aka "matchmaking" and 1 for a player friend group or party. The Matchmaking API events raise for any event on any lobby that the local user is a member of so if a user is in a session lobby and a party lobby the events will raise for both leaving it up to you to sort out which lobby the event goes to.

Lobby Manager only handles events for the lobby that it is "managing" so it is filtering the events down for you. Thus when the "evtEnterSuccess" triggers on your MatchmakingObject's LobbyManagaer component you know it's related to the matchmaking lobby.

Yes, you can of course use the Lobby Manager from code as much or as little as you would like. Doing so is no different than using any other Unity component from code.

Others Join / Leave

This is how do you know when some other player joins or leaves the lobby that your in. In other words, how do you know when new "peers" come in or go out of the lobby?

Matchmaking API

void HandleChatUpdate(LobbyChatUpdate_t arg)
{
    //Check if this is for the lobby we care about
    if(arg.m_ulSteamIDLobby == Lobby)
    {
        //Cast the chat member state to an enum for easy reading
        var state = (EChatMemberStateChange)arg.m_rgfChatMemberStateChange;
        if (state == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
            ;//arg.m_ulSteamIDUserChanged joined
        else
            ;//arg.m_ulSteamIDUserChanged left us
    }
}

Lobby object

There is no way to do this from the lobby object as the lobby object is a struct and doesn't define events.

Lobby Manager

void HandleUserJoined(UserData arg)
{
    //arg is the user that joined us
}
void HandleUserLeft(UserData arg)
{
    //arg is the user that left us
}

Invited to Lobby

Gets data about a lobby, if you have been invited to a lobby you will probably want to get data about it before attempting to join it. This can be useful when preparing the lobby UI or to confirm that the lobby is a valid lobby for the local player.

Game Lobby Join Requested Event

Command Arguments

In the event the user accepts an invite to a lobby in your game and is not currently playing your game then Steam will launch your game with the lobby ID on the command line. We have provided you with tools to make detecting this easy.

Steamworks Behaviour

Our Steamworks Behaviour script checks for this case on initialization and raises an event if found.

CommandLine

CommandLine is a tool available in the HeathenEngineering namespace. It can read common command line arguments for you including a Steam Lobby ID.

LobbyData targetLobby = CommandLine.GetSteamLobbyInvite();
if (targetLobby.IsValid)
{
    //Launched as a result of accepting a lobby invite
    //targetLobby is the lobby ID the user wants to join
}

Metadata

You often need to know when data on the lobby or a given member has changed.

Matchmaking API

void HandleDataChanged(LobbyDataUpdateEventData dataUpdated)
{
    //Is this a lobby we care about?
    if(dataUpdated.lobby == Lobby)
    {
        if(!dataUpdated.member.HasValue)
        {
            //It was lobby data that was updated
        }
        else
        {
            //It was this member that updated
            //dataUpdated.member.Value
        }
    }
}

Lobby object

This cannot be done from the Lobby object alone as it is an event and the struct doesn't have any of the events.

Lobby Manager

void HandleDataChanged(LobbyDataUpdateEventData dataUpdated)
{
    //Is this a lobby we care about?
    if(dataUpdated.lobby == Lobby)
    {
        if(!dataUpdated.member.HasValue)
        {
            //It was lobby data that was updated
        }
        else
        {
            //It was this member that updated
            //dataUpdated.member.Value
        }
    }
}

Metadata Read/Write

Writing lobby metadata data can only be done by the owner of the lobby. Metadata on the lobby is what is used when searching for a lobby and is what you would use to express configuration and settings of the session the lobby deals with. For example if you wanted to let all users know what map the session will be on then you would set a lobby metadata data field map = X.

Matchmaking API

if(Matchmaking.Client.SetlobbyData(lobby, key, value))
    ;//Steam took the request
else
    ;//Steam said no, your probably not the owner.

Lobby Data

Using the lobby object its a step easier and you have a few options

Simple indexer

myLobby["key"] = "value";
// or
var theValue = myLobby["key"];

and we have exposed several common fields as fields on the struct

//Name
myLobby.Name = "New Name"
// Is the same as
myLobby["name"] = "New Name";

//Game Version
myLobby.GameVersion = "v1.24b";
// is the same as
myLobby["z_heathenGameVersion"] = "v1.24b";

//IsReady
myLobby.IsReady = true;
// Is the same as setting heathenReady on your lobby member data
myLobby.Me["z_heathenReady"] = "true";

//IsGroup
myLobby.IsGroup = true;
// Is the same as
myLobby.SetType(ELobbyType.k_ELobbyTypeInvisbile);
myLobby["z_heathenMode"] = "Group";

Lobby Manager

The lobby manager lets you use both approaches

lobbyManager.SetLobbyData(key, value);
// or
var lobby = lobbyMannager.Lobby;
lobby["key"] = "value";

Get the Lobby

The answer differs depending on context so here are some common cases.

Lobby Manager

In all cases these tools have a field on them named Lobby that returns the lobby they are managing ... similarly you can set the lobby you want them to manage by writing a value to this field.

LobbyData lobby = lobbyManager.Lobby;
lobbyManager.Lobby = lobby_I_want_you_to_manage;

Session and Group

If you use our tools we will mark lobby's by their type ... that is we will mark the lobby as the "group" lobby when you use the Party Lobby Control and we will mark it as the "session" lobby when you use the Quick Match Lobby Control. Note you can configure the Lobby Manager to set this for you if using it. And you can set this yourself if your creating lobby manually.

To set this your self after the creation of your lobby call

//This is a group aka party lobby
lobby.IsGroup = true;

or

//This is a session lobby
lobby.IsSession = true;

Note there should only be 1 group and 1 session lobby at a time, you can then get these special use case lobbies from anywhere in code

if(LobbyData.GroupLobby(out var lobby))
{
    //We have a group and it is lobby
}
else
{
    //We do not have a group lobby
}

or

if(LobbyData.SessionLobby(out var lobby))
{
    //We have a session and it is lobby
}
else
{
    //We do not have a session
}

Look for it

Our system tracks every lobby the local user is a member of, a user cannot be a member of more than 3 lobbies and so it's trivial to just iterate over the lobbies they are a member of to choose the one you want.

foreach(var lobby in API.Matchmaking.Client.memberOfLobbies)
{
    //Test if the lobby is the right lobby
}

or if you prefer Linq (we do)

//This is how we get the session lobby for you
var lobby = API.Matchmaking.Client.memberOfLobbies.FirstOrDefault(p => p.IsSession);
if(lobby.IsValid)
{
    //We have a winner
}
else
{
    //No such lobby
}

Create a Lobby

Let's say for example you use 2 types of lobbies in your game

  • Party

    This would be where you have your player gather a group of friends together to play together i.e. a group or party as seen in MMOs, MOBA or any game with a coop feature

  • Session Lobby

    This would be where you have your players configure a gameplay session and wait for competitors to join or similar. This is the most typical use of a lobby and what drives matchmaking in your game.

Find and Join Lobbies

Aside from browsing for a lobby you can handle invites and joining of lobby invites. Inviting friends to Lobby can be done in several ways including from outside of your game via the Steam Friends list.

While In-game

While out of the game

In this case, the accepting user is not yet in the game so the Steam client will launch the game and pass as an argument on the command line the lobby connection information. It is up to you to handle this argument, navigate to the appropriate place in your game e.g. the lobby UI and then join the lobby ID indicated on that argument.

A crude example follows

LobbyData targetLobby = CommandLine.GetSteamLobbyInvite();
if(targetLobby.IsValid)
{
    //We should probably navigate to the proper place in-game first
    targetLobby.Join((result, error) =>
    {
        if(!error)
            Debug.Log("We have joined the lobby");
    });
}

Using Lobby Chat

Notify "Connect to network"

This will set the Game Server information on the lobby and can be done in a number of ways. You are required to have either a Steam ID (which a UserData is) or an IP and Port or both, when you call the SetGameServer method with no input parameters it will assume the owner of the lobby is the Listen Server.

The typical purpose of a lobby is to gather players and settle on the rules and conditions of the multiplayer session. In most cases, you will at some point want to notify players that they should connect to a particular server be that a Peer in a P2P game or a dedicated server on the net.

The lobby system provides tools for this via the SetGameServer method on the lobby

public void LobbyData.SetGameServer()

public void LobbyData.SetGameServer(CSteamID gameServerId)

public void LobbyData.SetGameServer(string address, ushort port)

public void LobbyData.SetGameServer(string address,
                                ushort port,
                                CSteamID gameServerId)

The SetGameServer method can only be called by the "Owner" of the lobby

When called Valve will record the information on the Steam Lobby metadata as shown below

All members of a lobby should upon joining the lobby register an event handler on the Lobby.evtGameServerSet event

API.Matchmaking.Client.EventLobbyGameCreated.AddListener(HandleGameServerSet);

Go from Lobby to Network Session

So your question then is how do you know when to transition from being in the lobby to starting the network session, and we can't answer that for you. This is entirely up to your game design but here are a couple of common use cases.

Lobby Full

In this case, you are simply assuming it is time to play when the lobby gets full e.g.

if(lobby.Full)
{
    //Time to start the network session
}

Players Ready

In this case, you were assuming it is time to play when the lobby is full and all players have indicated they are ready. Note this requires you to provide the players with a means to set

lobby.IsReady = true;

This sets the metadata on that user indicating it is ready to play, we use that in the following test

if(lobby.Full && lobby.AllPlayersReady)
{
    //Time to start the network session
}

Then What?

Once you know when you want to start the network session it's time to ... start the network session ... exactly what you need to do to do that depends on the networking tool you chose to use but here is the usual workflow with the code snippets relevant to Steam lobby.

First, you probably want to set the lobby joinable as false. This will prevent newcomers from joining while you transition players over to the network session. Of course, if your game supports "drop-in/drop-out" you don't want to do this ... use your judgment with regards to your design.

lobby.SetJoinable(false);

You would then have the owner do whatever it is your networking tool needs you to do to start up the network session. Don't know what that is? consult your networking tool of choice ... it is usually something like loading up the appropriate scene and using the network manager to call StartHost() or similar.

Once the network session is ready you have the owner notify the other members that it's time to connect to the network session.

lobby.SetGameServer();
//When you are connecting over SteamNetworking/Socket 
//and need the peer ID or a Steam game server ID.
CSteamID steamIdToConnectTo = lobby.GameServer.id;

Once your members connect they would typically then leave the lobby ... this is not a requirement simply typical. You do not need the lobby once you have the network session going unless, of course, you're doing the classic "Drop-In/Drop-Out" style gameplay in which case the lobby should persist for the duration of the session.

Unreal Examples

Player Join / Leave

A common question asked is how to know the user Joins or Leaves a lobby. A player will not join or leave a lobby if you do not call Join Lobby or Leave Lobby respectively so you define when this will happen.

Others Join / Leave

This is how you know when some other player joins or leaves the lobby that you are in. In other words, how do you know when new "peers" come in or go out of the lobby?

This event is executed when a user enters or exits. The event tells you the ID of the lobby that was effected, what user it was that was effected, who caused the change if that is different and what change was made.

Note that while "Kicked" is an option for state change that is an internal feature of Steam ... you cannot kick a user out of a lobby at least not with a feature built-in by Valve.

Invited to Lobby

When your player is invited to a lobby they will not have a view of that lobby's data which you may want to check before joining such as to validate that the lobby is suitable for the player's current state.

The Lobby Join Requested event is executed when the user accepts a lobby invite and is currently in-game.

If the player accepts an invite but is not currently in the game, then Steam will launch the game with the lobby ID passed in on the command line.

Above we are fetching the command line, checking it for the +connect_lobby argument and if found we parse that value to an int64 which we can use as a Lobby ID for other operations such as Requesting the Lobby Data or Joining the Lobby.

Metadata

To detect when metadata has changed on the lobby or a member of the lobby you can use the Lobby Data Update event.

This event is executed when any data changes on a lobby be it data for the lobby itself or a member of the lobby.

You can get or set data on a player's lobby member using Set Lobby Member Data

Only the members themselves can set their data but any member of the lobby can read it. This is useful for setting things such as player selection, map votes, etc.

The owner of a lobby can do the same on the lobby itself, the data on a lobby can be used to search for and filter lobbies and can be read by anyone not just members of the lobby.

Create Lobby

Creating a lobby is a simple function call, once the lobby is created you can then update its data, change its type, mark it as joinable or not, etc.

A lobby is simply an ID, all lobbies will have 1 or more members, you do not "destroy" or "close" a lobby, they simply cease to exist when there are no members in them.

1 user is always said to "own" the lobby, by default, this is the user that created it but that can be changed after e.g. the owner can set a different user as owner.

Find and Join Lobbies

To find a lobby to join you set up a request by adding filters, then making the request. When you make a request it clears the filters so you will need to set up the filters again to make a subsequent request.

In the above example, we set up a search to find a lobby where map = Some Cool Map Name

We then iterate over the results and get the Lobby by index for each.

The above is not functional but shows you the important nodes to work with. In functional logic, you would build out a more complete search filter, check the result count was greater than zero, and then handle each result as required.

For example, a quick match would simply join the first lobby found. As the Steam Lobby system is a Matchmaking query the first lobby found is the "best" lobby to join.

Using Lobby Chat

A Steam Lobby is little more than a fancy chat room, Steam API even refers to a Lobby ID as a CSteamID of type Chat. You can use a lobby as a chat room sending and receiving data messages without needing a network session. Note that this is a chat, so it's not suitable for real-time data such as Voice Streaming but can handle simple text messages or even send serialized data such as authentication tickets.

Notify "Connect to network"

This will set the Game Server information on the lobby and can be done in a number of ways. You are required to have either a Steam ID (which a UserData is) or an IP and Port or both, when you call the SetGameServer method with no input parameters it will assume the owner of the lobby is the Listen Server.

Steam provides a built-in way to notify members of a lobby when the network is ready for them to connect. This is done by the owner of the lobby calling Set Game Server or its variants.

This has several variations for Peer to Peer (where the lobby owner is the server), Steam Game Server (where the server is addressed by an ID) as well as traditional IP/Port-based connection addressing.

When the owner of the lobby calls this all members will receive the Lobby Game Created event.

This event provides the connection details for the server to all members

Every user that has joined the lobby is identified as a Each member in a lobby has its own set of metadata which all other members can read but only the member itself can set. To clarify that means you can only set your lobby member metadata but you can read everyone else's data. You cannot however read lobby member metadata if you are not a member of the lobby.

The event in question is exposed on the Lobby Manager as and in the Matchmaking API as .

To learn more check out the and articles describing the features of the lobby and lobbyMember structures.

While the developer-facing part of the Steam API calls it a "Lobby" the backend developer-facing calls it a chat, this is because in reality a "Lobby" is just a chat room. This chat room has its own metadata as noted above and each member within it has its own metadata and you can send and receive messages containing byte[] data between all members without a network connection. Our can help you get started.

Your loads first and is the place to detect command line arguments such as lobby ID.

All of the functionality of lobby is defined in the . No matter how you choose to work with Steam lobbies, it's this API that will be doing the real work. Using the Matchmaking API requires that you have a level of understanding of the underlying Steam API but it does still simplify working with the API by making it Unity-centric, handling boilerplate concepts such as the callbacks and simplifying common concepts in a Unity manager e.g. UnityEvents and Actions, simpler calls, etc..

as in the object in Steamworks Complete is a which wraps around ulong and CSteamID. Fundamentally it acts as a lobby ID and is between ulong and CSteamID meaning you can pass it along as if it were a ulong value or a CSteamID and you can assign it from a ulong value or a CSteamID. Beyond being a fancy wrapper around ulong it also has accessors and methods that make working with a specific lobby very easy. Using the lobby object you very likely won't need to touch the raw API at all.

As the name suggests . The lobby manager is the easiest way to manage a lobby and is a ... that is you can add it to a GameObject and configure it in Unity editor. The does more than simply expose Matchmaking events to the Unity editor it handles common concepts for you and makes it easier to work with a lobby through designer-friendly tools such as Bolt and other visual scripting assets.

and are raised when the local user tries and succeeds or fails respectively to enter a lobby. Both events return the LobbyEnter structure provided by Steam API.

So we do a bit more work here so we can understand if it was a success or not, and if not why not. The tells us why.

In our example above we used expression to create an anon method. This is a style choice you can learn more about and in our other articles.

Lobby manager makes this super easy. Using Lobby Manager you don't need to use any code at all if you don't want. You will see right in the inspector an and an event. These work just like the ones on Matchmaking API but of course are accessible from the Unity Editor and only raise for lobbies that were joined through this Lobby Manager.

This is actually handled via the event which is raised any time a chat event occurs ... including when members join or leave.

The handler for this event would look something like this, note the work is done in the data

As always the Lobby Manager makes it easier not just by filtering on the lobby for you but also by splitting the event into two. and invoke when someone joins or leaves respectively. These events are events meaning they hand you the of the member that joined or left.

This is the event that Valve's Steam will invoke when the user is currently in your game and accepts an invite to a lobby for your game. The event can be found on the and on the .

The event is raised when any sort of data is updated for the lobby or a member.

Lobby Manager is much like the Matchmaking API for this one and uses the method to know when any kind of data has changed.

Use the method to apply lobby data. This can only be done if the user is the owner of the lobby.

We are often asked how do you "get" the lobby your in as in once you joined or created a lobby how to do you get to its so you can use it for whatever it is you need to use it for.

or for that matter, or or any similar lobby management tool.

For more information on lobby types see Valve's documentation

See the interface for details on creating a lobby. In addition the , tools can help you create, join and manage a lobby for a specific function in your game.

In the above use case, you would attach a to your Party UI and another to your Session UI. You would configure each accordingly and each can manage its own chat and metadata features. This helps you split functionality across concepts unique to your game.

The easiest way to search for and join lobbies is through the tool. Alternatively, you can use Heathen's API.Matchmaking directly to easily search for and join lobbies.

Internally to you're game you can use the object to invite a specific player. You would have access to this object from various tools and interfaces including , and their related chat systems. When you send an invite it is up to that user to accept it and there are multiple use cases for how they might accept the invite

In this case, the accepting user is already in-game so the Game Lobby Join Invite event will be raised on the and its related interface.

Steam's Lobby system includes a simple chat system able to handle text or data. The easiest way to interact with lobby chat is via the which needs to be added to the same object as your .

You can also interact with lobby chat manually through the interface.

Each member of the lobby (other than the owner) will be notified by a callback which raises the EventLobbyGameCreated event located on the interface and exposed through the .

Hopefully, you have read the above so you understand the fundamentals of a lobby and what features it has including .

Notice in this case we do not provide any parameters to the call ... this is assuming your session will be P2P and that the owner is the host ... for more information please consult the article on .

This will cause the GameServerSet event to be triggered as noted in the entry.

When users see that event they will use the GameServer information in the lobby to know who to connect to. You have options here and which you would use depends again on your game and your design. The following code simply highlights what's available in the information you read on the field of the lobby.

Note the player is not automatically joined to the lobby, it's up to you to validate that the lobby is fit for purpose given the user and state of the game. To then navigate to an appropriate place in the game and join the lobby through the normal means of .

The Lobby Chat Msg event is executed when a chat message is received and can be used with the node to read the message

๐ŸŽฎ
๐Ÿ›‹๏ธ
LobbyMember.
Lobby Chat Director
bootstrap scene
Raw API
Matchmaking API
LobbyData object
LobbyData
struct
implicitly convertible
Lobby Manager
this is a tool for managing a lobby
Unity component
Lobby Manager
EChatRoomEnterResponce
EChatMemberStateChange
LobbyData
Quick Match Lobby Control
Party Lobby Control
https://partner.steamgames.com/doc/api/ISteamMatchmaking#typedefs
Lobby Manager
Lobby Manager
User Data
Friends
Clans
Lobby Chat Director
Lobby Manager
API.Matchmaking
API.Matchmaking
Lobby Manager
๐Ÿ”ตJoin Lobby
๐Ÿ”ตLeave Lobby
๐Ÿ”ปLobby Chat Update
๐Ÿ”ตRequest Lobby Data
๐Ÿ”ปLobby Join Requested
Join Lobby
๐Ÿ”ปLobby Data Update
๐Ÿ”ตGet Lobby Member Data
๐Ÿ”ตSet Lobby Member Data
๐Ÿ”ตGet Lobby Data
๐Ÿ”ตSet Lobby Data
๐Ÿ”ตCreate Lobby
๐Ÿ”ตAdd Request Lobby List Filter
๐Ÿ”ตRequest Lobby List
๐Ÿ”ตJoin Lobby
๐Ÿ”ตSend Lobby Chat
๐Ÿ”ปLobby Chat Msg
Get Lobby Chat Entry
๐Ÿ”ตSet Lobby Game Server
๐Ÿ”ปLobby Game Created
how to notify the other members when it's time to connect to the network
Notify "Connect to network"
GitHub Sponsor
GitHub Sponsors
LobbyMember
expression
UserData
UserData
Lobby Manager
LobbyData
LobbyGameServer
LogoMultiplayer (Steamworks Documentation)
EventLobbyEnterSuccess
EventLobbyEventFailed
EventLobbyChatUpdate
Request Lobby Data
EventLobbyDataUpdate
SetLobbyData
API.Matchmaking
EventLobbyDataUpdate
Overlay.Client
API.Overlay
Overlay Manager
Overlay Manger
anon methods
Lobby
SetGameServer
GameServer
evtDataUpdated
evtEnterSuccess
evtEnterFailed
evtUserJoined
evtUserLeft
evtDataUpdated