INDIE INDEX

レベル:開発者向け

Steam のロビーとマッチメイキングを作る手順|ロビーの作成・検索・参加

公開 2026-10-21更新 2026-10-21Steam(Steamworks Partner Program / Steam Direct)

Steam のピアツーピアのマッチメイキングは、Steam のバックエンドサーバー上にあるチャットルームのようなロビーを土台にしていて、関数は `ISteamMatchmaking` にまとまっています。1つのロビーは、最大250人までのユーザーを収容できます。

このページの目次
  1. ロビーを土台にしたマッチメイキング
  2. マッチメイキングの流れ
  3. ロビーを検索する
  4. ロビーを作る
  5. ロビーに参加する
  6. ロビーのデータを持たせる
  7. ロビーの中で通信する
  8. フレンドの招待とロビー
  9. ロビーを出る
  10. 情報源

ロビーを土台にしたマッチメイキング

Steam のピアツーピアのマッチメイキングは、ロビーの概念に基づいて構築されています。ロビーはチャットルームのように、Steam のバックエンドサーバー上に存在します。ユーザーは、新しいロビーの作成、ロビーとデータの関連付け、そのデータに基づいたロビーの検索、ロビーへの参加、ロビーで他のユーザーとの情報共有等を行うことができます。

1つのロビーは最大250人までのユーザーを収容することができます。ほとんどのゲームでは、ロビーにいるユーザー数は2~16人です。スキルベースのマッチメイキングは、このシステムを土台にして構築されています。

Steam のピアツーピアマッチメイキング API は、ユーザーが一緒にプレイする相手を探すための関数セットです。マッチメイキング関数はすべて ISteamMatchmaking に含まれます。ロビーは、ユーザーやゲームサーバーと同じように、1つの SteamID で識別されます。

Steam で選べる機能の全体はSteam で実装が要る仕様に、1台のゲームを遠くのフレンドと遊ぶ機能は遠くのフレンドと遊ぶ機能の設定と試し方にあります。

マッチメイキングの流れ

一緒にプレイするグループを作成する一般的なモデルは、次の順です。

  1. ユーザーが、ゲーム内でマルチプレイヤーでのプレイとマルチプレイヤーの種類(ルール、シナリオ等)を選択します。
  2. ロビー検索 API を使って、ゲームがルールのセットに類似性のあるロビーを検索します。
  3. ロビーが見つかると、ゲームはそのロビーに参加します。ロビーが見つからない場合、新しいロビーが作成されます。
  4. ゲームを開始するのに十分なプレイヤーが集まるまで、ユーザーはロビーで待機します。
  5. ロビーメンバーの間で、プレイしたいキャラクターやユーザーごとの設定等のデータが通信されます。ロビーで定めるべきルール(たとえば、あるキャラクターをプレイできるのは1人のみ等)がある場合、ロビー所有者のみが決定権を持ちます。
  6. ロビーと関連したユーザーインターフェイスが存在することがあります。存在する場合は、ロビーメンバー同士のチャットメッセージ送信にロビーデータ通信機能を使えます。ボイスデータも送信できますが、その際は Steam ネットワーキング API の使用が必要です。
  7. ゲーム開始の準備ができると、すべてのユーザーはゲームサーバーに参加するか、ホストになるよう選出されたユーザーに接続し、その後ロビーを退出します。
  8. すべてのユーザーがロビーを出ると、そのロビーは自動的に破棄されます。

ロビーを検索する

ロビーを検索するには、ISteamMatchmaking::RequestLobbyList を呼び出します。この関数は非同期で、リクエストの状態を追跡する SteamAPICall_t ハンドルを返します。ユーザーの Steam バックエンドの接続状況によりますが、この呼び出しには300ミリ秒から5秒かかり、タイムアウトは20秒です。一度に存在できるアクティブなロビー検索は一つだけで、新しく開始された場合、古いリクエストはキャンセルされます。

返される結果の数は LobbyMatchList_t の呼び出し結果に含まれ、m_nLobbiesMatching は、検索条件にマッチして SteamID があるロビーの数です。ロビーの ID は、0 から m_nLobbiesMatching - 1 までを ISteamMatchmaking::GetLobbyByIndex で反復処理して取得します。指定のインデックスが無効か、ロビーが見つからなかった場合、GetLobbyByIndex は k_steamIDNil を返します。

最大で50個の結果を返すことができますが、通常は2~3個程度です。結果は、設定されたフィルターで近いものを基準に、地理的距離順に返されます。

デフォルトでは、すでに満員のロビーは返されず、距離フィルターは k_ELobbyDistanceFilterDefault(周辺)に設定されています。RequestLobbyList が返すのは、空きのあるロビー、および k_ELobbyTypePublic または k_ELobbyTypeInvisible であるロビーのみで、SetLobbyJoinable で参加可能として設定されます。

検索の前に足す絞り込み

フィルターを追加するには、RequestLobbyList を呼び出す前に、次の中から1つ以上のフィルター関数を呼び出す必要があります。RequestLobbyList を呼び出すたびに、フィルターはクリアされます。

フィルター関数 内容
AddRequestLobbyListStringFilter 文字列比較フィルターを追加します。
AddRequestLobbyListNumericalFilter 数値比較フィルターを追加します。
AddRequestLobbyListNearValueFilter 指定された値に最も近い順に結果を並べ替えます。
AddRequestLobbyListFilterSlotsAvailable 指定された数の空きスロットを持つロビーのみを返すようにフィルターを設定します。
AddRequestLobbyListDistanceFilter ロビーの検索用の物理的な距離を設定します。これは、ユーザーの IP アドレスと Steam バックエンド上の IP ロケーションマップに基づいています。
AddRequestLobbyListResultCountFilter 返すロビーの最大数を設定します。この数が小さければ小さいほど、ロビーの結果や詳細をクライアントにダウンロードする速度がより速くなります。

文字列比較フィルターと数値比較フィルターには、マッチさせるキーの名前(k_nMaxLobbyKeyLength より長くてはいけません)と、マッチさせる文字列または数字と、比較のタイプ(ELobbyComparison)を渡します。近接フィルターは、実際に値をフィルターで除外するのではなく、結果の並べ替え方法に影響するだけです。複数の近接フィルターを指定できます。

AddRequestLobbyListDistanceFilter が呼び出されなければ、k_ELobbyDistanceFilterDefault が使用され、同じまたは近隣の地域内でのマッチを探します。距離フィルターの値 ELobbyDistanceFilter は、次のとおりです。

値 内容
k_ELobbyDistanceFilterClose(0) 同じ隣接地域内のロビーのみが返されます。
k_ELobbyDistanceFilterDefault(1) 同じ地域または近接地域内のロビーのみが返されます。
k_ELobbyDistanceFilterFar(2) 多くのレイテンシー要件を持たないゲームの場合、世界の裏側と線を結び中間地点以前に入るロビーを返します。
k_ELobbyDistanceFilterWorldwide(3) フィルタなし、インドからニューヨークのロビーもマッチします。クライアント間で数秒の待ち時間が予想されます。

ロビーを作る

ユーザーが参加できる既存のロビーが見つからないときに、新しいロビーが作成されます。ISteamMatchmaking::CreateLobby を呼び出して、結果を待ちます。引数は eLobbyType と cMaxMembers です。

  • eLobbyType は、このロビーのタイプと露出です。後から SetLobbyType で変更できます。
  • cMaxMembers は、このロビーに参加できる最大プレイヤー数です。250を超えることはできません。

ELobbyType の値は、次のとおりです。

値 内容
k_ELobbyTypePrivate(0) ロビーへ参加する唯一の方法は招待からです。
k_ELobbyTypeFriendsOnly(1) フレンドと招待者は参加できますが、ロビーリストには表示されません。
k_ELobbyTypePublic(2) 検索から返されフレンドに表示されます。
k_ELobbyTypeInvisible(3) 検索で返されますが、他のフレンドには表示されません。

k_ELobbyTypeInvisible は、ユーザーに2つのロビー内にいてほしい場合(例:グループを一緒にマッチする場合)に使えます。1人のユーザーは通常1つ、最大2つの個別ロビーにいることができます。

呼び出し結果は成功したか否かを示し、成功した場合は LobbyCreated_t 構造体内にロビーの SteamID が返されます。その ID は、ロビーのメタデータの設定に使えます。この時点でロビーは参加済みとなり、使用できます。LobbyEnter_t コールバックも受信されます(ローカルユーザーが自身のロビーに参加するため)。

ロビー作成後に最初に行うのは、他のゲームクライアントがそのロビーを探せるように、ロビーについてのデータを設定することです。ロビーに参加できる最大プレイヤー数は、SetLobbyMemberLimit でも設定できます。250を超えることはできず、設定できるのはロビーのオーナーのみです。

ロビーに参加する

検索またはフレンドを通して適切なロビーが見つかると、ISteamMatchmaking::JoinLobby を使い、LobbyEnter_t の呼び出し結果を待ちます。ロビーの SteamID は、RequestLobbyList での検索、フレンドへの参加、または招待から取得できます。JoinLobby は LobbyDataUpdate_t コールバックをトリガーします。

LobbyEnter_t は、ロビー入室時に受け取り、この受信直後にロビーメタデータが利用可能となります。m_bLocked が true なら、招待されたユーザーのみ参加できます。ロビーへの正常な参加では、m_EChatRoomEnterResponse が k_EChatRoomEnterResponseSuccess に設定され、それ以外は k_EChatRoomEnterResponseError となります。ロビーに入ると、ロビーデータ API を使用して、ロビーについての詳細を取得し、表示内容を決定します(表示するものがある場合)。

ユーザーがロビーに参加またはロビーから退出する場合、LobbyChatUpdate_t コールバックが、オーナーを含むロビー内すべてのメンバーに送信されます。ロビー内のユーザーへの反復処理には、次の関数を使います。

  • ISteamMatchmaking::GetNumLobbyMembers:ロビー内のユーザー数を取得します。現在のユーザーが、ロビー内の他のユーザーの Steam ID を取得するには、ロビー内に居る必要があります。
  • ISteamMatchmaking::GetLobbyMemberByIndex:指定のインデックスでロビーメンバーの Steam ID を取得します。GetNumLobbyMembers を呼び出してから、これを呼び出す必要があります。

ロビー内の別のユーザーについて情報を入手するには、フレンド API を使用します。

SetLobbyJoinable で、他のプレイヤーによるロビーへの参加可否を設定できます。新規ロビーのデフォルトの設定はいつも有効です。参加が無効化されている場合、フレンドや招待されたユーザーであっても、誰も参加できません。参加が無効なロビーは、ロビー検索からは返されません。この関数が true を返すのは成功時で、ロビーのオーナーでなければ false です。

ロビーのデータを持たせる

ロビーのメタデータを使用すると、ロビーの名前、現在のマップ、ゲームモード、ゲームの現在の状態など、ロビーを自由に設定できます。ユーザーは、所属するロビーの最新データを自動的に入手します。検索結果から返されたロビーでは、ユーザーは検索した時点でのロビーデータを入手します。フレンドのロビーの場合は、ISteamMatchmaking::RequestLobbyData が呼び出され、完了するまではロビーデータを見ることはできません。

ロビーのデータに変更があると、すべてのロビーメンバーは LobbyDataUpdate_t コールバックを受け取ります。このコールバックは、RequestLobbyData の呼び出しが完了したことを知る方法と同じです。

ロビーデータの入手または設定に使える関数は、次のとおりです。ロビーデータを設定または削除できるのは、ロビーオーナーのみです。

  • ISteamMatchmaking::SetLobbyData:キーと値を設定します。キーは k_nMaxLobbyKeyLength より、値は k_cubChatMetadataMax より長くてはいけません。ロビーメンバーは、代わりに SetLobbyMemberData を使用する必要があります。
  • ISteamMatchmaking::GetLobbyData:指定されたキーと関連するメタデータを取得します。クライアントにとって既知のロビーからのメタデータのみを取得できます。
  • ISteamMatchmaking::DeleteLobbyData:メタデータのキーを削除します。

メタデータの反復処理に使用する GetLobbyDataCount と GetLobbyDataByIndex は、通常デバッグ用にのみ使用されます。

ロビーでは、他のメンバーが次の関数を使用して更新データを受信できるように、メンバーが独自のメタデータを設定することもできます。

  • ISteamMatchmaking::SetLobbyMemberData:ローカルユーザーのためにユーザーごとのメタデータを設定します。
  • ISteamMatchmaking::GetLobbyMemberData:指定のロビー内の別のプレイヤーから、ユーザーごとのメタデータを取得します。

ロビーの中で通信する

ロビー内で情報(チャットメッセージ、ゲーム開始シグナル等)を送信するには、ISteamMatchmaking::SendLobbyChatMsg を呼び出します。これは、シンプルなバイナリメッセージをロビー内の全員に送信します。送れるのは、最大で4キロバイトのサイズのテキストまたはバイナリーデータです。

ロビーメンバーは、LobbyChatMsg_t のコールバックを Listen する必要があります。コールバックを受け取ってから、ISteamMatchmaking::GetLobbyChatEntry を使ってメッセージのコンテンツを取得できます。GetLobbyChatEntry の iChatID はほとんどの場合 LobbyChatMsg_t::m_iChatID で、メッセージデータを受けるバッファーは最大4キロバイトまでにする必要があります。

ロビーオーナーは、いつも1人います。現在のオーナーが退出すると、自動でロビー内の別のユーザーがオーナーになります。GetLobbyOwner は現在のロビーオーナーを返します。

フレンドの招待とロビー

フレンド API を使って、フレンドが待機するロビーを見つけることができます。GetFriendCount に k_EFriendFlagImmediate を渡してフレンドの数を取り、GetFriendByIndex でフレンドを順に取り、GetFriendGamePlayed で得た FriendGameInfo_t の m_steamIDLobby が有効(IsValid)なら、そのロビーに参加するか、RequestLobbyData を使用してメタデータを取得できます。

ISteamMatchmaking::InviteUserToLobby で、フレンドをロビーに招待できます。そのユーザーは、ゲームに参加するためのリンクを含むチャットダイアログを受け取ります。ユーザーがリンクをクリックすると、ゲームを起動していない場合には、次のコマンドラインによってゲームが起動します。

+connect_lobby <64-bit lobby id>

コマンドライン経由で起動されたときのポップアップ警告は、アプリに ISteamApps::GetLaunchCommandLine が実装されていると無効にできます。

ユーザーがすでにゲーム内にいる場合、ユーザーが参加を希望するロビーの Steam ID を含む ISteamFriends::GameLobbyJoinRequested_t コールバックが送信されます。これは、ユーザーがフレンドリストまたは招待からロビーに参加しようとしたときに呼び出されます。このコールバックに従うかは、ゲームが決定します。

ユーザーに、リストの中からロビーへ招待するフレンドを選択してもらいたいときは、ISteamFriends::ActivateGameOverlayInviteDialog を呼び出します。これにより、現在のロビーにフレンドを招待するためのダイアログが、Steam のゲーム内オーバーレイで表示されます。

ロビーを出る

ゲームの開始後、各ユーザーは ISteamMatchmaking::LeaveLobby でロビーを退出できます。これはクライアントサイドですぐに実行され、ロビー内の他のユーザーは LobbyChatUpdate_t コールバックによって通知されます。全員が退出すると、ロビーは自動的にバックエンドで破棄されます。

Steam ロビー内のすべてのユーザーは、Steam のバックエンドで認証されています。VAC 禁止を受けたかどうかを調べる以外には、ロビーユーザーを追加でゲームが認証する必要はありません。ユーザーが別の場所から同じアカウントでログインを試みると、以前のログインは現在のロビーから自動的に排除されます。

情報源

Steam 完全ガイドを順番に読む60本のうち43本目

このページに出た言葉

このページの内容の誤りは、問い合わせの窓口で受け付けています。