多くのゲームは、町、城、ダンジョン、広大な森などの複数の プレイス に分かれています。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特定の予約サーバーにユーザーをテレポートするには、有効な TeleportOptions.ReservedServerAccessCode を設定します。これは予約サーバーに入るための一意のコードです。
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = reservedServerCode新しい予約サーバーにユーザーをテレポートするには、TeleportOptions.ShouldReserveServer を true に設定します。
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = trueテレポートと共にユーザーデータを送信する
プレイス間でユーザーをテレポートすると、そのユーザーに関連付けられたローカルデータは破棄されます。プレイス間でデータの永続性を管理するために、以下のアプローチを使用できます。
プレイス間で基本的な 非セキュア データを送信するには、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() を使用できます。
テレポートの失敗を処理する
ネットワークリクエストを伴う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 -- 結果を後で報告できるようにループの外で定義
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)