如果您想要在许多不同地点上构建体验,例如一个幻想世界中的多个城镇、城堡、地牢和庞大森林,您可以使用 TeleportService 来启用用户在宇宙中、服务器或甚至到另一个体验之间的传送。
设置传送
要在您的体验中启用传送,请使用 TeleportService:TeleportAsync() 。方法接受三个参数:
- 用户可以传送到的 PlaceId。
- 一个包含 Player 实例,代表用户要传送的。
- 一个可选的 TeleportOptions 实例,包含自定义属性于 TeleportAsync() 调用。
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- 替换您自己的地方 IDlocal 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.TeleportGuiTeleportService: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
与传送一起发送用户数据
将用户从一个地方传送到另一个地方会丢弃该用户的任何本地数据。您可以使用以下方法来处理数据在不同地点之间的持久性。
要从地方到场景发送基本 非安全 数据,请在传送到 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 函数,用于在保护调用中传送用户,并且一个 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 -- 替换您自己的地方 IDlocal playerToTeleport = Players:GetPlayers()[1] -- 获取游戏中的第一个用户SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)