Teletransportarse entre lugares

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Si quieres crear una experiencia con muchos lugares distintos, como un mundo de fantasía con múltiples ciudades, castillos, mazmorras y un vasto bosque, puedes usar TeleportService para habilitar a los usuarios a teletransportarse entre lugares en un universo, servidores o incluso a otra experiencia.

Configurar la teletransportación

Para habilitar la teletransportación en tu experiencia, usa TeleportService:TeleportAsync(). El método acepta tres parámetros:

  • El PlaceId para que los usuarios se teletransporten.
  • Un array que contiene las instancias Player que representan a los usuarios para teletransportación.
  • Una instancia opcional TeleportOptions que contiene propiedades personalizadas para la llamada TeleportAsync().

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 1234 -- reemplazar con tu propia identificación de lugar
local playerToTeleport = Players:GetPlayers()[1] -- obtener al primer usuario en la experiencia
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Si quieres tomar precauciones de manejo de errores al configurar la teletransportación, vea cómo manejar fallos de teletransportación.

Habilitar la teletransportación de experiencia cruzada

Con fines de seguridad, teletransportar a un usuario de tu experiencia a otra experiencia propiedad de otros, o viceversa, falla por defecto.Para habilitar la teletransportación de experiencia cruzada, abra Configuración del juego > Seguridad y habilite Permitir teletransportes de terceros en Studio.

Crear pantallas de teletransporte personalizadas

Cuando un usuario activa un teletransportación, ve la pantalla de carga estándar de Roblox mientras espera a que se cargue el nuevo lugar.Puedes agregar una pantalla de teletransporte personalizada para mejorar la inmersión para los usuarios llamando TeleportService:SetTeleportGui() al cliente y pasando por el ScreenGui antes de teletransportar al usuario.El siguiente ejemplo establece una pantalla personalizada ScreenGui ubicada en ReplicatedStorage como pantalla de carga cuando ocurre un teletransporte.No ejecuta ningún script dentro del ScreenGui .


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

Personalizar opciones de teletransporte

Puedes personalizar teletransportaciones, como teletransportar usuarios a un servidor específico y enviar datos de usuario junto con teletransportes , al configurar la instancia TeleportOptions y pasarla al método TeleportService:TeleportAsync().

Teletransportarse a servidores específicos

Para teletransportar a los usuarios a servidores específicos, establece el servidor objetivo usando TeleportOptions y pásalo al método TeleportService:TeleportAsync().Si no especifica un servidor, los usuarios se teletransportan a un servidor público emparejado.La información del primer usuario en la lista se usa para emparejar con ese servidor público.

Para teletransportar a los usuarios a un servidor público específico, establece la propiedad TeleportOptions.ServerInstanceId como una ID de instancia válida, que es un identificador único para un servidor público.


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

Para teletransportar a los usuarios a un servidor reservado específico, establece un código válido TeleportOptions.ReservedServerAccessCode, que es un código único para ingresar a un servidor reservado.


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

Para teletransportar a los usuarios a un nuevo servidor reservado, establece TeleportOptions.ShouldReserveServer en verdadero.


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

Envía datos de usuario junto con teletransportes

Teletransportar a un usuario entre lugares descarta cualquier dato local asociado con ese usuario.Puedes usar los siguientes enfoques para manejar la persistencia de datos entre lugares.


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

Para obtener todos los datos de un usuario que llega desde un teletransporte en el servidor, use la función Player:GetJoinData(), que devuelve un diccionario que incluye los datos asociados al usuario.


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 solo los datos de teletransporte en el cliente, puedes usar TeleportService:GetLocalPlayerTeleportData().

Manear teletransportes fallidos

Al igual que cualquier llamada de API que involucre solicitudes de red, los telepuertos pueden fallar y lanzar un error.Envuélvelos en llamadas protegidas ( pcall() ).Algunos fallos se benefician de los intentos de nuevo, particularmente los que involucran servidores reservados, por lo que recomendamos repetir una cierta cantidad de veces en los fallos.

Incluso si una llamada tiene éxito y se inicia el teletransporte, aún puede fallar en el último momento sin lanzar un error y dejar al usuario en el servidor.Cuando esto sucede, se activa el evento TeleportService.TeleportInitFailed.

El siguiente ejemplo ModuleScript define una función SafeTeleport para teletransportar al usuario en una llamada protegida con lógica de reintentar.También tiene una función handleFailedTeleport para tratar situaciones en las que la llamada tuvo éxito, pero el teletransporte no producirse.


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 los resultados de la llamada fuera del bucle para que los resultados se puedan informar más tarde
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teletransportar al usuario en una llamada protegida para evitar errores
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- dejar de intentar teletransportarse si la llamada tuvo éxito, o si se ha alcanzado el límite de reintentos
if not success then
warn(result) -- imprimir la razón de fallo para la salida
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
-- si el teletransporte no es no válido, informe del error en lugar de volver a intentarlo
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport

La función SafeTeleport recibe los mismos argumentos que la función TeleportAsync() .Puedes usar el siguiente ModuleScript con la función SafeTeleport para realizar teletransportes desde cualquier lugar de tu experiencia para reducir los teletransportes fallidos.


local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local TARGET_PLACE_ID = 1818 -- reemplazar con tu propia identificación de lugar
local playerToTeleport = Players:GetPlayers()[1] -- obtener al primer usuario en el juego
SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)