This guide provides a step-by-step walkthrough of how to use the PlayFlow Lobby SDK. We’ll cover setting up, creating, managing, and joining lobbies with practical code examples. For a high-level overview of the concepts, please see the Beginner’s Guide to Lobbies.

Initial Setup (5 Minutes)

First, you need to get the Lobby Manager set up in your game.

Step 1: Configure in Dashboard

Before you write any code, set up a lobby configuration in your PlayFlow project dashboard.
  1. Go to your project’s ConfigurationLobbies tab.
  2. Create a new lobby configuration (e.g., “Default” or “Ranked”).
  3. Select the game server build and instance type this lobby will use.
  4. Save your configuration.

Step 2: Initialize the SDK

To use the lobby system, you must initialize it with a unique ID for the current player.
Add the PlayFlowLobbyManagerV2 component to a GameObject in your scene. Then, in a script, call the Initialize method.
using PlayFlow;
using UnityEngine;

public class GameInitializer : MonoBehaviour
{
    void Start()
    {
        // Use a unique ID for each player (e.g., from a login system or device ID)
        string myPlayerId = SystemInfo.deviceUniqueIdentifier;
        
        // Initialize the manager
        PlayFlowLobbyManagerV2.Instance.Initialize(myPlayerId, () => {
            Debug.Log("PlayFlow SDK is ready to use!");
        });
    }
}

Basic Lobby Actions

Once the SDK is initialized, you can start performing lobby actions.

Creating a Lobby

To create a new lobby, specify a name, the max number of players, and whether it’s private.
// Create a public lobby for 4 players
PlayFlowLobbyManagerV2.Instance.CreateLobby(
    name: "My Awesome Game Room",
    maxPlayers: 4,
    isPrivate: false,
    onSuccess: (lobby) => {
        Debug.Log($"Created public lobby! ID: {lobby.id}");
    },
    onError: (error) => Debug.LogError(error)
);

// Create a private lobby with an invite code
PlayFlowLobbyManagerV2.Instance.CreateLobby(
    name: "Friends Only",
    maxPlayers: 4,
    isPrivate: true,
    onSuccess: (lobby) => {
        Debug.Log($"Created private lobby! Share this code: {lobby.inviteCode}");
    },
    onError: (error) => Debug.LogError(error)
);

Joining a Lobby

Players can join a public lobby by its ID or a private one with an invite code.
// Join by lobby ID
string lobbyIdToJoin = "... a lobby ID from the server list ...";
PlayFlowLobbyManagerV2.Instance.JoinLobby(lobbyIdToJoin,
    onSuccess: (lobby) => Debug.Log("Joined lobby!"),
    onError: (error) => Debug.LogError(error)
);

// Join by invite code
string inviteCode = "... a code shared by a friend ...";
PlayFlowLobbyManagerV2.Instance.JoinLobbyByCode(inviteCode,
    onSuccess: (lobby) => Debug.Log("Joined private lobby via code!"),
    onError: (error) => Debug.LogError(error)
);

Listing Public Lobbies

To build a server browser, you can fetch a list of all available public lobbies.
PlayFlowLobbyManagerV2.Instance.GetAvailableLobbies(
    onSuccess: (lobbies) => {
        Debug.Log($"Found {lobbies.Count} lobbies:");
        foreach (var lobby in lobbies)
        {
            Debug.Log($"  - {lobby.name} ({lobby.currentPlayers}/{lobby.maxPlayers})");
        }
        // Now you can display this list in your UI
    },
    onError: (error) => Debug.LogError(error)
);

Managing the Match

Starting a Match

When everyone is ready, the host can start the match. This will begin the process of launching a dedicated server.
var manager = PlayFlowLobbyManagerV2.Instance;
if (manager.IsHost)
{
    manager.StartMatch(
        onSuccess: (lobby) => Debug.Log("Match starting! Waiting for server..."),
        onError: (error) => Debug.LogError(error)
    );
}

Connecting to the Server

After a match is started, all players in the lobby need to listen for the OnMatchRunning event. This event provides the IP address and port needed to connect to the game server.
void Start()
{
    // Listen for the server ready event
    PlayFlowLobbyManagerV2.Instance.Events.OnMatchRunning.AddListener(OnServerReady);
}

void OnServerReady(ConnectionInfo connectionInfo)
{
    Debug.Log($"Server is ready! Connecting to {connectionInfo.Ip}:{connectionInfo.Port}");
    
    // Use your networking library (Mirror, Netcode, FishNet, etc.) to connect here
    MyGameNetworkManager.Connect(connectionInfo.Ip, connectionInfo.Port);
}

Syncing Player Data

Use UpdatePlayerState to sync custom data for the local player, like their ready status or character choice. This data is automatically sent to all other players in the lobby.
public void SetReadyStatus(bool isReady)
{
    var myCustomData = new Dictionary<string, object>
    {
        { "ready", isReady },
        { "character", "Wizard" },
        { "skin", "blue_robe" }
    };
    
    PlayFlowLobbyManagerV2.Instance.UpdatePlayerState(myCustomData);
}
To read another player’s data, you can access the lobbyStateRealTime dictionary from the CurrentLobby object.

Host-Only Actions

Only the host of a lobby can perform sensitive actions.
  • Updating another Player’s Data: UpdateStateForPlayer(targetPlayerId, data)
  • Kicking a Player: KickPlayer(playerId)
  • Updating Lobby Settings: UpdateLobby(...)
  • Transferring Host: TransferHost(newHostId)
var manager = PlayFlowLobbyManagerV2.Instance;
if (manager.IsHost)
{
    // Example: Assign another player to the blue team
    string targetPlayerId = "...some player id...";
    var newPlayerData = new Dictionary<string, object> { { "team", "blue" } };
    manager.UpdateStateForPlayer(targetPlayerId, newPlayerData);

    // Example: Kick a player
    manager.KickPlayer(targetPlayerId);

    // Example: Change the max players
    manager.UpdateLobby(maxPlayers: 8);
}

Next Steps