プライベートサーバーへのテレポート

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

プレイヤーをパブリックサーバー間でテレポートすることに加えて、TeleportService は特定のプレイヤーに制限されたサーバーである プライベートサーバー へのテレポートもサポートしています。テレポートできるプライベートサーバーには2種類あります:

  • 予約サーバー: 開発者が作成したサーバーで、開発者が提供する ID を介してアクセスされます。プライベートマッチ、協力セッション、または参加者を制御する必要があるシナリオに便利です。
  • VIPサーバー: プレイヤーが購入したプライベートサーバーです。TeleportOptions.VipServerId を使用して、プレイヤーが購入した VIP サーバーにルーティングします。

予約サーバーへのテレポート

予約サーバーはオンデマンドで作成されます:新しい ReservedServerId を使用した最初のテレポートがサーバーを作成し、同じ ID を再利用することで、そのサーバーへの後続のテレポートがルーティングされます。ID は HttpService:GenerateGUID(false) で生成します:

local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local TARGET_PLACE_ID = 12345678901234
-- テレポートするユーザー(例:Players:GetPlayers() またはマッチメイキンググループから)
local player1, player2 = Players:GetPlayers()[1], Players:GetPlayers()[2]
-- 予約サーバーのユニーク ID を生成
local reservedServerId = HttpService:GenerateGUID(false)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
-- 最初のテレポートがサーバーを作成
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player1, player2}, teleportOptions)

予約サーバー ID の再利用

他のプレイヤーが後で同じ予約サーバーに参加できるように、DataStoreService データストアを使用して予約サーバー ID を永続化し、セッションやサーバーをまたいで生き残るようにします。

予約サーバーを作成するサーバーで、最初のテレポートのために ID を生成し、セッションを識別するキー(例えば、ロビー ID やパーティ ID)で保存します:

local DataStoreService = game:GetService("DataStoreService")
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
local reservedServersStore = DataStoreService:GetDataStore("ReservedServers")
-- サーバー間で共有セッションを識別するキー
local sessionKey = "lobby-123"
-- 新しい ID が目的地に到着したときに予約サーバーを作成
local reservedServerId = HttpService:GenerateGUID(false)
reservedServersStore:SetAsync(sessionKey, reservedServerId)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, { player }, teleportOptions)

同じ予約サーバーにプレイヤーを送信する必要がある他のサーバーでは、同じセッションキーで ID を検索し、テレポートの TeleportOptions.ReservedServerId として設定します:

local DataStoreService = game:GetService("DataStoreService")
local TeleportService = game:GetService("TeleportService")
local reservedServersStore = DataStoreService:GetDataStore("ReservedServers")
local sessionKey = "lobby-123"
local existingId = reservedServersStore:GetAsync(sessionKey)
if existingId then
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = existingId
TeleportService:TeleportAsync(TARGET_PLACE_ID, { player }, teleportOptions)
end

VIP サーバーでは、データストアなしで目的地サーバーで VIP サーバー ID を利用できるように、TeleportOptions:SetTeleportData() を使用して各プレイヤーに添付します:

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = game.PrivateServerId
teleportOptions:SetTeleportData({ vipServerId = game.PrivateServerId })
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)

到着時に、プレイヤーの参加データからそれを読み取ります。詳細については、テレポートと共にユーザーデータを送信するを参照してください。

到着時に予約サーバーを識別する

目的地サーバーで、現在のサーバーが予約サーバーかどうかを確認します:

local isReserved = game.PrivateServerId ~= "" and game.PrivateServerOwnerId == 0

DataModel.PrivateServerId は、提供した ReservedServerId と一致し、その予約サーバーのすべてのサーバーインスタンスで一定です。DataModel.JobId は実行中のインスタンスごとにユニークで、サーバーが再起動すると変更されます。

VIP サーバーへのテレポート

VIP サーバーは、プレイヤーがゲームのページから購入できるプライベートサーバーです。プレイヤーを VIP サーバーにテレポートするには、TeleportOptions.VipServerId をターゲット VIP サーバーの DataModel.PrivateServerId に設定します。

local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 12345678901234
-- 目的地 VIP サーバーの PrivateServerId、例えばプレイヤーの
-- テレポートデータに含まれているか、データストアから読み取られたもの
local vipServerId = player:GetJoinData().TeleportData.vipServerId
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = vipServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)

TeleportOptions.VipServerId は TeleportOptions.ReservedServerId とは異なります。開発者が作成した予約サーバーには ReservedServerId を、プレイヤーが購入した VIP サーバーには VipServerId を使用します。

VIP サーバー ID は、その VIP サーバーを所有する体験にスコープされます:その体験内の任意の場所の場所 ID で使用できますが、他の体験の場所 ID では使用できません。

ルーティングフィールドを設定しないと、エンジンが目的地サーバーを選択します。プライベートサーバールーティングフィールドが設定されていないテレポートは、パブリックサーバーに着地するか、プレイヤーが最近その体験の VIP サーバーに参加した場合はその VIP サーバーに着地します。

このパターンの一般的な使用例は、プレイヤーを予約サーバーから体験のルートプレースの VIP サーバーに戻すことです。予約サーバーの game.PrivateServerId はその予約 ID であり、元の VIP サーバーのものではないため、VIP サーバーの ID を予約サーバーに持ち込む必要があります。例えば、アウトバウンドテレポートの teleportData で渡すか、予約サーバー ID の再利用で示したようにデータストアに永続化します。その後、戻りのテレポートの TeleportOptions.VipServerId として設定します。

すべてのテレポートで同じ TeleportOptions.VipServerId を設定して、ゲームプレイ全体でプレイヤーを同じ VIP サーバーに留めておきます。

VIP サーバーアクセスチェック

プレイヤーは、サーバーの 友達の許可 設定、許可リスト、またはリンクコードがテレポートの瞬間にアクセスを許可している場合、VIP サーバーに参加できます。VIP サーバーの所有者はこれらの設定をいつでも変更できるため、以前はアクセスできたプレイヤーがアクセスできなくなることがあります。

プレイヤーが参加を許可されていない場合、TeleportService.TeleportInitFailed が発火し、プレイヤーはサーバーが制限されているというエラーを表示します。グループを VIP サーバーにテレポートするには、同じ TeleportOptions.VipServerId を持つ複数のプレイヤーを渡します。エンジンは接続時に各プレイヤーを独立してチェックするため、アクセス権のないプレイヤーは個別に失敗し、他のプレイヤーは通常通りテレポートします。VIP テレポートのために TeleportService.TeleportInitFailed を常に処理してください。プレイヤーが VIP サーバーを閉じたり、別のサーバーに切り替えたりする可能性もあるためです。

サーバー ID の保存と共有

TeleportAsyncResult オブジェクトは、TeleportService:TeleportAsync() によって返され、目的地に関する情報を含みます:

local result = TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)
if result then
print("目的地の PrivateServerId:", result.PrivateServerId)
end

レガシーアクセスコードからの移行

ゲームが非推奨の TeleportOptions.ReservedServerAccessCode または TeleportOptions.ShouldReserveServer を使用している場合、アクセスコードフローを GUID ベースのフローに置き換えて ReservedServerId に移行します:

  1. 置き換え ReserveServerAsync() と ReservedServerAccessCode を HttpService:GenerateGUID(false) と ReservedServerId に置き換えます。
  2. 保存 生成された GUID を、同じサーバーへの後続のテレポートで再利用できるようにします。
  3. 更新 すべての TeleportOptions の使用を、ReservedServerAccessCode または ShouldReserveServer の代わりに ReservedServerId を設定するようにします。

以前(非推奨)

-- 非推奨: ReserveServerAsync + ReservedServerAccessCode
local accessCode, privateServerId = TeleportService:ReserveServerAsync(TARGET_PLACE_ID)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = accessCode
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)

以後(現在)

local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
-- 現在: GenerateGUID + ReservedServerId
local reservedServerId = HttpService:GenerateGUID(false)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)

レガシーの ReserveServerAsync() と ReservedServerAccessCode は後方互換性のために利用可能ですが、新しい作業には推奨されません。 ReserveServerAsync() は実際にはサーバーを事前に予約するのではなく、単にランダムな GUID を生成します。 アクセスコードで作成された既存の予約サーバーは引き続き機能します。

失敗したテレポートの処理

プライベートサーバーへのテレポートは、他のネットワーク呼び出しと同様に失敗する可能性があります。pcall でラップし、必要に応じて再試行します。テレポートが開始されるが最後の瞬間に失敗した場合、TeleportService.TeleportInitFailed が発火し、元の TeleportOptions が提供されるため、同じ目的地で再試行できます。

完全な再試行実装については、メインのテレポートガイドの 失敗したテレポートの処理 を参照してください。

エンジン自体が通常のテレポートを VIP サーバーにルーティングする場合、満杯またはフラッドされたサーバーなどの VIP 特有の参加失敗は、TeleportService.TeleportInitFailed を発火させるのではなく、パブリック参加にフォールバックします。明示的な TeleportOptions.VipServerId を持つテレポートのみが、これらの失敗を再試行ハンドラーに通知します。

ベストプラクティス

  • サーバーで ID を生成します。 常にサーバーの Script から HttpService:GenerateGUID(false) を呼び出して、クライアントが予約サーバー ID を予測または制御できないようにします。
  • 予約サーバー ID を永続化します。 プレイヤーがセッションをまたいで同じ予約サーバーに再参加する必要がある場合、GUID をデータストアに保存します。
  • 正しいフィールドを使用します。 開発者が作成した予約サーバーには ReservedServerId を、プレイヤーが購入した VIP サーバーには VipServerId を使用します。同じ TeleportOptions インスタンスで両方を設定しないでください。
  • ルーティングフィールドを混在させないでください。 一度に ReservedServerId、VipServerId、または ServerInstanceId のいずれか1つのみを設定できます。複数を設定するとエラーが発生します。
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。