Teletransporte entre locais

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Se você quiser construir uma experiência com muitos locais distintos, como um mundo de fantasia com várias cidades, castelos, masmorras e uma floresta vasta, você pode usar TeleportService para habilitar os usuários a se teletransportarem entre locais em um universo, servidores ou até mesmo para outra experiência.

Configurar teletransporte

Para habilitar a teleportação em sua experiência, use TeleportService:TeleportAsync(). O método aceita três parâmetros:

  • O PlaceId para os usuários se teletransportarem.
  • Um array que contém as instâncias Player que representam os usuários para se teleportar.
  • Uma instância opcional TeleportOptions que contém propriedades personalizadas para a chamada TeleportAsync().

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 1234 -- substitua com o seu próprio ID de local
local playerToTeleport = Players:GetPlayers()[1] -- obter o primeiro usuário na experiência
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Se você quiser tomar precauções de manipulação de erros ao configurar a teleportação, veja como manusear falhas de teletransporte.

Ativar teletransporte de experiência cruzada

Para fins de segurança, teletransportar um usuário da sua experiência para outra experiência de propriedade de outros ou vice-versa falha por padrão.Para habilitar a teleportação de experiência cruzada, abra Configurações do Jogo > Segurança e ative Permitir Teletransportes de Terceiros no Studio.

Criar telas de teleporte personalizadas

Quando um usuário ativa um teleportar, ele vê a tela de carregamento padrão do Roblox enquanto aguarda que o novo local carregue.Você pode adicionar uma tela de teleporte personalizada para melhorar a imersão para os usuários ao chamar TeleportService:SetTeleportGui() no cliente e passar pelo ScreenGui para usar antes de teletransportar o usuário.O seguinte exemplo define um personalizado ScreenGui localizado em ReplicatedStorage como a tela de carregamento quando um teletransporte ocorre.Não executa nenhum script dentro do ScreenGui.


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

Personalizar opções de teletransporte

Você pode personalizar teletransportes, como teletransportar usuários para um servidor específico e enviar dados de usuário junto com teletransportes , definindo a instância TeleportOptions e passando-a para o método TeleportService:TeleportAsync().

Teletransportar para servidores específicos

Para teletransportar usuários para servidores específicos, defina o servidor alvo usando TeleportOptions e passe-o para o método TeleportService:TeleportAsync().Se você não especificar um servidor, os usuários são teletransportados para um servidor público matchmade.A informação do primeiro usuário na lista é usada para fazer matchmaking com esse servidor público.

Para teletransportar usuários para um servidor público específico, defina a propriedade TeleportOptions.ServerInstanceId como um ID de instância válido, que é um identificador exclusivo para um servidor público.


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ServerInstanceId = targetServerId

Para teletransportar usuários para um servidor reservado específico, defina um código válido TeleportOptions.ReservedServerAccessCode, que é um código único para entrar em um servidor reservado.


local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = reservedServerCode

Para teletransportar usuários para um novo servidor reservado, defina TeleportOptions.ShouldReserveServer para verdadeiro.


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

Envie dados do usuário junto com teletransportes

Teletransportar um usuário entre locais descarta quaisquer dados locais associados a esse usuário.Você pode usar as seguintes abordagens para lidar com a persistência de dados entre locais.


local teleportData = {
randomNumber = RNG:NextInteger(1, 100),
}
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions:SetTeleportData(teleportData)

Para obter todos os dados de um usuário que chega de um teletransporte no servidor, use a função Player:GetJoinData(), que retorna um dicionário que inclui os dados associados ao usuário.


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)

Para recuperar apenas os dados de teletransporte no cliente, você pode usar TeleportService:GetLocalPlayerTeleportData().

Lidar com teletransportes falhos

Como qualquer chamada de API que envolve solicitações de rede, teletransportes podem falhar e lançar um erro.Envolva-os em chamadas protegidas ( pcall() ).Alguns falhas se beneficiam de tentativas de novo, especialmente aquelas envolvendo servidores reservados, então recomendamos tentar novamente algum número de vezes em falhas.

Mesmo que uma chamada tenha sucesso e o teletransporte se inicie, ainda pode falhar no último momento sem lançar um erro e deixar o usuário no servidor.Quando isso acontece, gera o evento TeleportService.TeleportInitFailed.

O seguinte exemplo ModuleScript define uma função SafeTeleport para teletransportar o usuário em uma chamada protegida com lógica de tentativa novamente.Também tem uma função handleFailedTeleport para lidar com situações em que a chamada foi bem-sucedida, mas o teletransporte não ocorrer.


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 -- defina os resultados da chamada fora do loop para que os resultados possam ser relatados mais tarde
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teletransportar o usuário em uma chamada protegida para evitar erros
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- pare de tentar se teletransportar se a chamada tiver sido bem-sucedida ou se o limite de reutilização for atingido
if not success then
warn(result) -- imprimir o motivo do erro para saída
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
-- se o teletransporte for inválido, relate o erro ao invés de tentar novamente
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport

A função SafeTeleport recebe os mesmos argumentos da função TeleportAsync().Você pode usar o seguinte ModuleScript com a função SafeTeleport para realizar teletransportes de qualquer lugar em sua experiência para reduzir falhas de teletransporte.


local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local TARGET_PLACE_ID = 1818 -- substitua com o seu próprio ID de local
local playerToTeleport = Players:GetPlayers()[1] -- obter o primeiro usuário no jogo
SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)