在地点之间传送

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

如果您想要在许多不同地点上构建体验,例如一个幻想世界中的多个城镇、城堡、地牢和庞大森林,您可以使用 TeleportService 来启用用户在宇宙中、服务器或甚至到另一个体验之间的传送。

设置传送

要在您的体验中启用传送,请使用 TeleportService: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 加载屏幕,因为他们等待新位置加载。您可以通过在客户端上调用 Class.TeleportService:Set


local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportGui = ReplicatedStorage.TeleportGui
TeleportService:SetTeleportGui(teleportGui)

自定义传送选项

您可以通过设置 Class.TeleportOptions 实例并将其交给 Class.TeleportService:TeleportAsync() 方法来自定义传送,例如 TeleportOptions 和 2> 将用户数据与传送发送到服务器端2> 。

正在传送到特定服务器

要将用户传送到特定服务器,请使用 TeleportOptions 将目标服务器设置为目标,并通过 TeleportService:TeleportAsync() 方法传递给 Class.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 设置为 true。


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = true

与传送一起发送用户数据

将用户从一个地方传送到另一个地方会丢弃该用户的任何本地数据。您可以使用以下方法来处理数据在不同地点之间的持久性。


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 函数,用于在保护调用中传送用户,并且一个 1> HandleFailedTeleport1> 函


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)