如果您想要在許多不同地點上構建體驗,例如在多個城鎮、城堡、地城和廣闊森林中設置的幻想世界,您可以使用 TeleportService 來啟用用戶在宇宙中、伺服器或其他體驗之間的傳輸。
設定傳送
要在您的體驗啟用傳送,請使用 TeleportService:TeleportAsync() 。方法接受三個參數:
- 用戶可以傳送到的 PlaceId。
- 一個包含 Player 實例代表用戶要傳送的地點。
- 一個可選的 TeleportOptions 實例,包含自訂屬性於 TeleportAsync() 呼叫。
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- 用自己的地方 ID 取代local playerToTeleport = Players:GetPlayers()[1] -- 獲得體驗中的第一個用戶TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
如果您想在設置傳送時避免發生錯誤時,請參閱處理傳送失敗。
啟用震驚體驗傳送
為了安全目的,將用戶從您的體驗傳送到其他人的體驗,或者從其他方向,會以預設方式失敗。要啟用遊戲體驗傳播,請打開 遊戲設定 > 安全 並啟用 允許第三方傳輸 在 Studio 上。
建立自訂傳送屏幕
當使用者啟動傳送時,他們會看到標準的 Roblox 載入畫面,因為他們正在等待新位置載入。您可以在客戶端上呼叫
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
自訂傳送選項
您可以通過設置 傳送用戶到特定服務器 和 與傳送用戶資料一起傳送 來自訂傳送,例如 TeleportOptions 和 1> 傳送用戶資料以及傳送1> 。
正在傳送至特定服務器
要將用戶傳送到特定服務器,請使用 TeleportOptions 並將其傳递給 TeleportService:TeleportAsync() 方法。如果未指定服務伺服器,用戶將被傳送到公共服務伺服器。列表中的第一個用戶將被用來匹配到該公共服務伺服器。
要將用戶傳送到特定的公服伺服器,將 TeleportOptions.ServerInstanceId 屬性設為有效的實例 ID,這是公服伺服器的獨一標識。
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
要將用戶傳送到特定的保留伺服器,設置有效的 TeleportOptions.ReservedServerAccessCode,這是進入保留伺服器的獨一代碼。
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
要將用戶傳送到新的保留伺服器,將 TeleportOptions.ShouldReserveServer 設為真。
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() 函數,其返回包含用戶與傳送器關聯的資料。
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local joinData = player:GetJoinData()
local teleportData = joinData.TeleportData
local randomNumber = teleportData.randomNumber
print(player.Name .. "joined with the number" .. randomNumber)
end
Players.PlayerAdded:Connect(onPlayerAdded)
要取回客戶端上的傳送資料,您可以使用 TeleportService:GetLocalPlayerTeleportData()。
處理失敗的傳送
與網路請求相關的任何 API 呼叫,都可能發生延遲並且發生錯誤。即使呼叫成功並且傳送開始,它還是可以在最後一刻發生失敗,並且將使用者傳送到服務伺服器。當發生此情況時,會啟動 TeleportService.TeleportInitFailed 。
將傳輸包圍在保護的呼叫( pcall() )中,並在失敗時重試。下一個範例 ModuleScript 定義了一個 SafeTeleport 函數,用於傳輸用戶在保護呼叫中傳輸,並且是否失敗的重
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(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
SafeTeleport 函數接受相同的參數,作為 TeleportAsync() 函數的輸入。您可以使用 ModuleScript 與 1>SafeTeleport1> 函數來執行從任何地方在您體驗中執行的傳送,以減少失敗的傳送。
local Players = game:GetService("Players")local ServerScriptService = game:GetService("ServerScriptService")local SafeTeleport = require(ServerScriptService.SafeTeleport)local TARGET_PLACE_ID = 1818 -- 用自己的地方 ID 取代local playerToTeleport = Players:GetPlayers()[1] -- 取得遊戲中的第一個用戶SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)