多くのゲームは、町、城、ダンジョン、広大な森などの複数のプレイスに分かれています。TeleportServiceを使用して、ユーザーをプレイス間、異なるサーバー、または他のゲームにテレポートします。
プレイヤーをテレポートする
プレイヤーをテレポートするには、TeleportService:TeleportAsync()を使用します。このメソッドは3つのパラメータを受け取ります。
- テレポート先のユーザーのためのPlaceId。
- テレポートしたいPlayerインスタンスを含む配列。
- TeleportAsync()呼び出しのためのカスタムプロパティを含むオプションのTeleportOptionsインスタンス。
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 12345678901234 -- 自分のものに置き換えてください
local playerToTeleport = Players:GetPlayers()[1] -- ゲーム内の最初のユーザーを取得
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport})適切なプレイヤーをテレポートするには、BasePart.TouchedまたはProximityPrompt.Triggeredイベントを使用して個々のPlayerを取得することができます。その後、プレイヤーがチーム(Player.Team)またはパーティ(Player.PartyId)の一部であるかを確認できます。最後に、個々のプレイヤーではなくグループ全体をテレポートしたい場合は、Team:GetPlayers()またはSocialService:GetPlayersByPartyId()を使用できます。
安全なテレポートの設定
テレポートのセキュリティを管理するための3つの設定があります。
| 設定 | 説明 |
|---|---|
| (クリエイターダッシュボード) オーディエンス > アクセス設定 > プレイスのアクセス制御 | プレイヤーがゲーム内の任意のプレイスに参加できるか、最初にスタートプレイスに参加する必要があるかを制御します。 |
| (クリエイターダッシュボード) プレイス > アクセス > 直接アクセス制御 | 非スタートプレイスのために、ゲームレベルのプレイスのアクセス制御設定をオーバーライドします。 |
| (スタジオ) ファイル > 体験設定 > セキュリティ > サードパーティのテレポートを許可 | あなたが所有していないゲームへのテレポートを制御します。この設定を無効にしても、あなたが所有する公開ゲーム間でプレイヤーをテレポートすることはできます。 |
プレイスのアクセス制御は、プレイヤーがあなたのゲームに入ることを制御し、テレポートベースの悪用を防ぐための最も重要な設定です。

完全にオープンを選択すると、プレイヤーは任意のゲームからのテレポートを通じて、あなたのゲーム内の任意のプレイスに参加できます。これには、ディープリンク、ゲーム招待、友達に参加することなどが含まれます。
これは、あなたのゲームに複数のプレイスがあり、友達がどのプレイスにいても簡単に参加できるようにしたい場合に良い選択です。このオプションを選択しない場合、非スタートプレイスで友達に参加しようとするプレイヤーは、あなたのゲームのスタートプレイスに参加することになります。
同じユニバースに制限を選択すると、プレイヤーはあなたのゲーム内のテレポートを通じてのみ非スタートプレイスに参加できます。この設定は、クライアントとサーバーの両方からのテレポートを許可します。
これは、セキュアなテレポートに移行したくないレガシーゲームがある場合に良い選択です。
ユニバース内のみセキュアを選択すると、プレイヤーはこのゲーム内でサーバーから開始されたテレポートを通じてのみ非スタートプレイスに参加できます。
これは、プレイヤーが特定のエリアにアクセスする前に厳格な進行システムがあるゲームに良い選択です。また、プレイヤーがアクセスすべきでないテストプレイスがある場合や、専用サーバーのみを使用するプレイスにも良い選択です。
セキュアなテレポートに移行する
クライアント側のテレポートを使用している既存のゲームがあり、サーバーから開始されたテレポートを要求したい場合、目標はすべてのテレポートロジックをクライアントスクリプトからサーバースクリプトに移動することです。
- Teleport()を呼び出すすべてのクライアントスクリプトを見つけます。
- これらの呼び出しを、リモートイベントを発火させるように変更します。あるいは、ProximityPrompts、ClickDetectors、または単にBasePart.Touchedイベントを使用するように変更できます。
- TeleportAsync()を使用して、サーバースクリプト内でテレポートを再実装します。
カスタムテレポート画面を作成する
ユーザーがテレポートをトリガーすると、彼らは新しいプレイスがロードされるのを待つ間、標準のRobloxローディング画面が表示されます。必要に応じて、クライアントでTeleportService:SetTeleportGui()を呼び出すことでカスタムテレポート画面を追加できます。
以下の例では、ReplicatedStorageからカスタマイズされたScreenGuiを設定します。ScreenGui内のスクリプトは実行されません。
local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportGui = ReplicatedStorage.TeleportGui
TeleportService:SetTeleportGui(teleportGui)テレポートオプションをカスタマイズする
TeleportOptionsインスタンスを設定し、それをTeleportService:TeleportAsync()メソッドに渡すことで、特定のサーバーへのユーザーのテレポートや、テレポートと共にユーザーデータを送信するなどのテレポートをカスタマイズできます。
特定のサーバーにテレポートする
特定のサーバーにユーザーをテレポートするには、TeleportOptionsを使用してターゲットサーバーを設定し、それをTeleportAsync()メソッドに渡します。サーバーを指定しない場合、ユーザーは公開サーバーにテレポートされます。リスト内の最初のユーザーの情報がマッチメイキングに使用されます。
特定の公開サーバーにユーザーをテレポートするには、TeleportOptions.ServerInstanceIdプロパティを有効なインスタンスIDとして設定します。これは公開サーバーの一意の識別子です。
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ServerInstanceId = targetServerId予約サーバーにユーザーをテレポートするには、HttpService:GenerateGUID(false)を使用してGUIDを生成し、TeleportOptions.ReservedServerIdを設定します。新しいIDを使用した最初のテレポートがサーバーを作成し、その後のテレポートはそのサーバーにルーティングされます。
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 12345678901234
local reservedServerId = HttpService:GenerateGUID(false)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)VIP(プライベート)サーバーにユーザーをテレポートするには、ターゲットVIPサーバーのDataModel.PrivateServerIdにTeleportOptions.VipServerIdを設定します。
-- 目的地VIPサーバーのPrivateServerId、たとえばプレイヤーのテレポートデータに含まれている
local vipServerId = player:GetJoinData().TeleportData.vipServerId
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = vipServerId同じ体験内の別のプレイスにユーザーをテレポートする場合、同じVIPサーバーに留まるようにするには、TeleportOptions.VipServerIdをgame.PrivateServerIdに設定します。
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = game.PrivateServerId予約サーバーとVIPサーバーのテレポートパターン、サーバーIDの再利用、レガシーアクセスコードからの移行についての詳細は、プライベートサーバーへのテレポートを参照してください。
テレポートと共にユーザーデータを送信する
プレイス間でユーザーをテレポートすると、そのユーザーに関連付けられたローカルデータは破棄されます。プレイス間でデータの永続性を管理するために、以下のアプローチを使用できます。
プレイス間で基本的な非セキュアデータを送信するには、TeleportOptions:SetTeleportData()を呼び出してから、TeleportAsync()に渡します。この方法でセキュアデータを渡さないでください。データはクライアントに表示され、暗号化されていません。
local teleportData = {
randomNumber = RNG:NextInteger(1, 100),
}
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions:SetTeleportData(teleportData)ユーザーがテレポート後に新しいプレイスに到着したときにすべてのデータを取得するには、Player:GetJoinData()関数を使用します。これはTeleportDataキーを持つ辞書を返します。
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local joinData = player:GetJoinData()
local teleportData = joinData.TeleportData
local randomNumber = teleportData.randomNumber
print(player.Name .. "が番号 " .. randomNumber .. " で参加しました")
end
Players.PlayerAdded:Connect(onPlayerAdded)クライアントでテレポートデータのみを取得するには、TeleportService:GetLocalPlayerTeleportData()を使用できます。
スタジオでテレポートをテストする
スタジオのテストおよびチームテストモードで、体験を公開せずにTeleportAsync()テレポートをテストできます。テスト中にテレポートが実行されると、目的地のプレイスが新しいテストサーバーとして開かれるため、スタジオで起源と目的地のプレイスの両方をデバッグできます。サーバー検査、デバッガー(ブレークポイントを含む)、デバイスシミュレーターなどのスタジオツールは、目的地のプレイスに引き継がれます。また、ビルドやスタジオMCPサーバーでのプレイテスト自動化でもテレポートをテストできます。
既知の制限
テストと本番環境でいくつかの動作が異なります。
- PrivateServerIdおよびJobId: テストモードでは、両方とも常に空です。チームテストでは、すべてのサーバーがプライベートであるため、PrivateServerIdは決して空ではありません。公開サーバーへのテレポートでも同様です。PrivateServerIdが空かどうかを確認するコードは、チームテストと本番環境で異なる動作をします。
- ReservedServerIdとPrivateServerId: これらの値はチームテストで異なる場合がありますが、本番環境では一致します。同じ予約サーバーにより多くのプレイヤーを送信するには、元のReservedServerIdを再利用してください。目的地サーバーのPrivateServerIdではありません。
- VIPテレポート: VipServerIdを使用するテレポートは、チームテストサーバーに所有者がいないため、テストで失敗します。
- 同じ体験のみ: スタートプレイスのGameIdを共有するプレイス間でのみテレポートできます。
- サポートされていないメソッド: GetPlayerPlaceInstanceAsync()はテストで機能しません。
失敗したテレポートを処理する
ネットワークリクエストを伴うAPI呼び出しと同様に、テレポートは失敗し、エラーをスローする可能性があります。保護された呼び出し(pcall())でラップします。一部の失敗は再試行が有効であり、特に予約サーバーに関するものは再試行を推奨します。
呼び出しが成功し、テレポートが開始されても、最後の瞬間に失敗し、エラーをスローせずにユーザーをサーバーに残すことがあります。この場合、TeleportService.TeleportInitFailedイベントがトリガーされます。
以下の例のModuleScriptは、プレイヤーを保護された呼び出しでテレポートする単一のSafeTeleport関数を返します。また、呼び出しが成功したがテレポートが発生しなかった状況を処理するためのhandleFailedTeleport関数もあります。
local TeleportService = game:GetService("TeleportService")
local ATTEMPT_LIMIT = 5
local RETRY_DELAY = 1
local FLOOD_DELAY = 15
local function SafeTeleport(placeId, players, options)
local attemptIndex = 0
local success, result -- 後で結果を報告できるようにループの外でpcallの結果を定義
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- エラーを防ぐために保護された呼び出しでユーザーをテレポート
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- 呼び出しが成功した場合、または再試行制限に達した場合はテレポートを試みるのを停止
if not success then
warn(result) -- 出力に失敗理由を印刷
end
return success, result
end
local function handleFailedTeleport(player, teleportResult, errorMessage, targetPlaceId, teleportOptions)
if teleportResult == Enum.TeleportResult.Flooded then
task.wait(FLOOD_DELAY)
elseif teleportResult == Enum.TeleportResult.Failure then
task.wait(RETRY_DELAY)
else
-- テレポートが無効な場合は、再試行するのではなくエラーを報告
error(("無効なテレポート [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleportSafeTeleport関数は、TeleportAsync()関数と同じ引数を受け取ります。以下のスクリプトをSafeTeleport関数と共に使用して、ゲーム内のどこからでもテレポートを実行できます。
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local PLACE_TO_TELEPORT_TO = 12345678
local function teleport(touchPart)
local playerToTeleport = game.Players:GetPlayerFromCharacter(touchPart.Parent)
if playerToTeleport then
SafeTeleport(PLACE_TO_TELEPORT_TO, {playerToTeleport})
end
end
script.Parent.Touched:Connect(teleport)