roblox-teleport-matchmaking について
Roblox 開発者向けのテレポートとマッチメイキングのスキルです。場所間の移動、ロビーから試合への流れに加え、アクセス制御、データ受け渡し、マッチング信号、サーバー管理を解説します。
主な機能
- 01場所のアクセス制御設定
- 02TeleportOptions によるプレイヤー移動
- 03場所間での試合データ受け渡し
- 04ロビーから試合へのフロー構築
- 05マッチング信号のカスタマイズ
- 06サーバーのライフサイクルと終了処理
活用シーン
- 01キューのパーティーを予約試合サーバーへ移動
- 02試合後にプレイヤーをロビーへ戻す
- 03スキルやゲームモードでパブリックサーバーをマッチング
- 04試合設定の安全な受け渡し
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ el4cteo/ roblox-skills --skill roblox-teleport-matchmakingインストール後、Claude Code で/roblox-teleport-matchmakingを入力して読み込まれたか確認します。
詳細
テレポート、プレイス、マッチメイキング
構造
- ユニバース (体験) には、スタートプレイスとサブプレイスが含まれます。すべてのプレイスは DataStores、 MemoryStores、MessagingService、開発者製品、パスを共有します。
- 一般的なレイアウト: ロビー (スタートプレイス) → マッチプレイス (予約サーバー) → ロビーに戻る、または 個別のワールドプレイスを持つハブ。共有コードはパッケージまたは共有 Rojo ツリーに置いてください。
- プレイスのアクセス制御 (Creator Dashboard):
Fully open、Limited to same universe、またはSecure within universe only(非スタートプレイスへのサーバー起点のテレポートのみ — 進行ゲートや テストプレイスに推奨)。それ以外の場合、クライアントはユニバース内の任意の場所に自分自身をテレポートできます。
テレポート (サーバー)
--!strict
local TeleportService = game:GetService("TeleportService")
local ATTEMPTS = 5
local RETRY_DELAY = 1
local FLOOD_DELAY = 15
local function safeTeleport(placeId: number, players: { Player }, options: TeleportOptions?): (boolean, any)
local ok: boolean, result: any = false, nil
for _ = 1, ATTEMPTS do
ok, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options)
end)
if ok then
break
end
task.wait(RETRY_DELAY)
end
if not ok then
warn("Teleport failed:", result)
end
return ok, result
end
-- A teleport can still fail after TeleportAsync succeeds: retry transient failures.
TeleportService.TeleportInitFailed:Connect(function(player, teleportResult, errorMessage, placeId, options)
if teleportResult == Enum.TeleportResult.Flooded then
task.wait(FLOOD_DELAY)
elseif teleportResult == Enum.TeleportResult.Failure then
task.wait(RETRY_DELAY)
else
warn(`Invalid teleport [{teleportResult.Name}]: {errorMessage}`)
return
end
safeTeleport(placeId, { player }, options)
end)
return safeTeleport
TeleportOptions:
ShouldReserveServer = true→ 新しい 予約サーバー (プライベート、アクセスコードでのみ到達可能) — マッチ、ダンジョン、パーティに最適。ReservedServerAccessCodeとPrivateServerIdを含むTeleportAsyncResultを返します。ReservedServerAccessCode = code→ 既存の予約サーバーに参加します (ReserveServerAsync(placeId)または以前の結果から取得)。ServerInstanceId = jobId→ 特定の公開サーバー (例: 「フレンドのサーバーに参加」)。SetTeleportData(table)→ 到着時にplayer:GetJoinData().TeleportData(サーバー) またはTeleportService:GetLocalPlayerTeleportData()(クライアント) で読み取れる非セキュアなデータ。 クライアントはこれを改ざんできます: 通貨、アイテム、権限のために決して信頼しないでください — ユーザー ID または予約サーバーのPrivateServerIdをキーとする DataStores/MemoryStores を使用してください。
非推奨: Teleport、TeleportToPlaceInstance、TeleportToPrivateServer、TeleportPartyAsync、
TeleportToSpawnByName、ReserveServer → TeleportAsync + TeleportOptions / ReserveServerAsync。
プレイス間のデータ引き継ぎ
- テレポートする前にプレイヤーのデータを保存します (ProfileStore: セッションを終了する / 保存を待つ)。
- 目的地はセッションロック付きで読み込まれます (古いサーバーが解放するまで ProfileStore が再試行します)。
- マッチパラメータ (モード、マップ、チーム割り当て) については、テレポートする前に予約サーバーの
PrivateServerId(またはアクセスコード) をキーとする MemoryStore/DataStore エントリを書き込みます。 マッチサーバーは起動時にgame.PrivateServerIdを読み取り、その設定を読み込みます。 - 到着時に、
TeleportService:SetTeleportGui(gui)(クライアント、テレポート前) が遷移中も ローディング画面を表示し続けます。到着時にはReplicatedFirstのローディング画面を使用してください。
サーバータイプの検出
| サーバー | game.PrivateServerId | game.PrivateServerOwnerId |
|---|---|---|
| 公開 | "" | 0 |
予約 (ReserveServerAsync/ShouldReserveServer) | 空でない | 0 |
| プライベート (VIP) サーバー | 空でない | オーナーのユーザー ID |
ロビー → マッチの流れ
- プレイヤーはロビーでキューに入ります (パーティリーダーが招待; パーティメンバーはサーバー側に保存されます)。
- モードとレーティング別の MemoryStoreQueue / ソート済みマップでキューに入るか (
roblox-data-storesを参照)、 Roblox のマッチメイキングを使用して公開サーバーを埋めます。 - マッチが成立したら: 新しい ID をキーとするマッチ設定を MemoryStore に書き込み、
ShouldReserveServer = trueで全プレイヤーをTeleportAsyncし、返されたPrivateServerId↔ マッチ ID のマッピングを保存します。 - マッチサーバー: 予定されたプレイヤーを待ち (タイムアウト付き)、ラウンドを実行し、結果を保存し、全員を
ロビープレイス (公開サーバー、または
ServerInstanceId経由でパーティのロビー) にテレポートで戻します。
Roblox マッチメイキング (参加するプレイヤーがどのサーバーに割り当てられるか)
デフォルトのマッチメイキングでは、対象となる公開サーバーをシグナル (フレンド、レイテンシ、言語、年齢層、 占有率など) によってスコアリングし、重み付けされた合計が最も高いものを選択します。Creator Hub ではプレイスごとにカスタマイズできます:
- Roblox のシグナルの重みを調整する、または カスタム属性 に基づく カスタムシグナル を追加する:
- プレイヤー属性: DataStore に保存された値 (例:
PlayerElo)。マッチメイキング設定で構成します。 - サーバー属性: 実行時に
MatchmakingService:SetServerAttribute(name, value)で設定します (例:GameMode、ServerLevel)。テストにはInitializeServerAttributesForStudioを使用します。
- プレイヤー属性: DataStore に保存された値 (例:
- 適用する前にモックサーバーに対してスコアをプレビューし、その後プレイスに構成を適用します。 スキルベースの公開サーバーにはこれを使用し、正確なチーム構成が必要な場合は予約サーバーを使用します。
サーバーのライフサイクル
- シャットダウン時のセーブには
game:BindToClose、サーバーを識別するにはgame.JobId、アップデート後の ソフトシャットダウン (Open Cloud の:restartServersまたは「Restart servers for updates」) はプレイヤーを新しいサーバーにテレポートします。 - サーバーブラウザー: 各サーバーは
{ jobId, players, mode }を MemoryStore のソート済みマップ (TTL) にハートビート送信します —roblox-data-storesを参照してください。
関連スキル
roblox-data-stores (セッションロック、MemoryStore キュー)、roblox-security (アクセス制御)、
roblox-game-systems (ラウンドループ)、roblox-open-cloud (サーバーの再起動)。
コメント
Markdown 対応