場所間のテレポート

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

多くのゲームは、町、城、ダンジョン、広大な森など、複数の場所に分かれています。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 つあります。

設定説明
(クリエイターダッシュボード) オーディエンス > アクセス設定 > 場所のアクセス制御プレイヤーがゲーム内の任意の場所に参加できるか、まず開始地点に参加する必要があるかを制御します。
(クリエイターダッシュボード) 場所 > アクセス > 直接アクセス制御非開始地点のゲームレベルの 場所のアクセス制御 設定をオーバーライドします。
(スタジオ) ファイル > 体験設定 > セキュリティ > サードパーティのテレポートを許可あなたのゲームから所有していないゲームへのテレポートを制御します。この設定を無効にしたままでも、あなたが所有する公開ゲーム間でプレイヤーをテレポートできます。

場所のアクセス制御 はプレイヤーがあなたのゲームにテレポートすることを制御し、テレポートに基づく悪用を防ぐための最も重要な設定です。

クリエイターハブでの場所のアクセス制御

  • 完全にオープン を選択すると、プレイヤーは任意のゲームからのテレポートを通じてあなたのゲームの任意の場所に参加できます。これには、ディープリンク、ゲームの招待、友達への参加などが含まれます。

    これは、あなたのゲームに複数の場所があり、友達がどの場所にいても簡単に参加できるようにしたい場合に良い選択です。このオプションを選択しない場合、非開始地点で友達に参加しようとしたプレイヤーは、あなたのゲームの開始地点に参加します。

  • 同じユニバースに限定 を選択すると、プレイヤーはあなたのゲーム内のテレポートを通じてのみ非開始地点に参加できます。この設定は、クライアントおよびサーバー開始のテレポートの両方を許可します。

    これは、セキュアなテレポートに移行したくないレガシーゲームがある場合に良い選択です。

  • ユニバース内でのみセキュア を選択すると、プレイヤーはこのゲーム内でのサーバー開始のテレポートを通じてのみ非開始地点に参加できます。

    これは、プレイヤーが特定のエリアにアクセスする前に厳密な進行システムを持つゲームに良い選択です。また、プレイヤーがアクセスすべきでないテスト地点や予約サーバーを専用で使用する場所にも良い選択です。

セキュアなテレポートに移行する

クライアント側のテレポートを使用している既存のゲームがあり、サーバー開始のテレポートを必要とする場合、目標はすべてのテレポートロジックをクライアントスクリプトからサーバースクリプトに移動することです。

  1. Teleport() を呼び出すすべてのクライアントスクリプトを見つけます。
  2. これらの呼び出しをリモートイベントを発火させるように変更します。あるいは、ProximityPromptsClickDetectors、または単に BasePart.Touched イベントを使用するように変更できます。
  3. サーバースクリプトで TeleportAsync() を使用してテレポートを再実装します。
  4. もはや Teleport() の呼び出しが存在しないときに、場所のアクセス制御セキュア に変更します。

カスタムテレポート画面を作成する

ユーザーがテレポートをトリガーすると、彼らは新しい場所が読み込まれるのを待つ間、標準の 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 SafeTeleport

SafeTeleport 関数は 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)
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。