Si quieres construir una experiencia con muchos lugares distintos, como un mundo de fantasía con múltiples pueblos, castillos, mazmorras y un vasto bosque, puedes usar TeleportService para permitir a los usuarios teletransportarse entre lugares en un universo, servidores o incluso a otra experiencia.
Configurando 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.
- Una matriz que contiene las Player instancias que representan a los usuarios para teletransportación.
- Una instancia TeleportOptions opcional 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 propio ID de lugarlocal playerToTeleport = Players:GetPlayers()[1] -- consigue el primer usuario en la experienciaTeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
Si desea tener cuidado con los errores de manejo al configurar la teletransportación, consulte Manejo de teletransportes fallidos .
Habilitar teletransportación de experiencia cruzada
Por razones de seguridad, teletransportar a un usuario de tu experiencia a otra experiencia propiedad de otros, o viceversa, falla de forma predeterminada. Para habilitar la teletransportación entre experiencias, abre Configuración del juego > Seguridad y habilita Permitir teletransportes de terceros en Studio.
Creación de pantallas de teletransporte personalizadas
Cuando un usuario activa un teletransportación, ven la pantalla de carga estándar de Roblox mientras esperan que se cargue el nuevo lugar. Puede agregar una pantalla de teletransporte personalizada para mejorar la inmersión para los usuarios llamando TeleportService:SetTeleportGui() en el cliente y pasando por el ScreenGui para usar antes de teletransportar al usuario. El siguiente ejemplo establece un ScreenGui personalizado ubicado en ReplicatedStorage como la 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.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
Personalizar Opciones de Teletransporte
Puede personalizar los teletransportes, como teletransportar usuarios a un servidor específico y enviar datos de usuarios junto con teletransportes, configurando la instancia TeleportOptions y pasándola al método TeleportService:TeleportAsync().
Teletransportarse a servidores específicos
Para teletransportar usuarios a servidores específicos, configure el servidor de destino usando TeleportOptions y passelo al TeleportService:TeleportAsync() método. Si no especifica un servidor, los usuarios se teletransportan a un servidor público hecho a juego. La información del primer usuario en la lista se usa para hacer coincidir con ese servidor público.
Para teletransportar usuarios a un servidor público específico, establezca la propiedad TeleportOptions.ServerInstanceId como un ID de instancia válido, que es un identificador único para un servidor público.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
Para teletransportar usuarios a un servidor reservado específico, establezca un TeleportOptions.ReservedServerAccessCode válido, que es un código único para ingresar a un servidor reservado.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
Para teletransportar usuarios a un nuevo servidor reservado, pon TeleportOptions.ShouldReserveServer en true.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ShouldReserveServer = true
Enviando datos del usuario junto con teletransportes
Teletransportar a un usuario entre lugares descarta cualquier dato local asociado con ese usuario. Puede usar los siguientes enfoques para manejar la persistencia de datos entre lugares.
Si tu experiencia utiliza datos de usuario seguros como moneda o inventario en la experiencia, implemente almacenes de datos o almacenes de memoria para mantener los datos de lugar en lugar.
Para enviar datos básicos no seguros de un lugar a otro, llame a TeleportOptions:SetTeleportData() antes de pasarlo a TeleportAsync().
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 de un teletransporte en el servidor, use la función Player:GetJoinData(), que devuelve un diccionario que incluye los datos asociados con el 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, puede usar TeleportService:GetLocalPlayerTeleportData() .
Manejo de teletransportes fallidos
Como cualquier llamada de API que involucre solicitudes de red, los teletransportes pueden fallar y generar un error. Incluso si una llamada tiene éxito e inicia el teletransporte, aún puede fallar en el último momento sin generar un error y dejar al usuario en el servidor. Cuando esto sucede, desencadena TeleportService.TeleportInitFailed .
Envuelve los teletransportes en una llamada protegida (pcall() ) y vuelve a intentarlo si falla. El siguiente ejemplo ModuleScript define una función SafeTeleport para teletransportar al usuario en una llamada protegida y una función handleFailedTeleport para volver a intentar los teletransportes fallidos que son solapas únicas y dejan caer las inválidas que pueden tener errores en el código.
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 -- define los resultados de pcall fuera del bucle para que los resultados puedan ser reportados 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 -- deja de intentar teletransportarte si la llamada tuvo éxito o si se ha alcanzado el límite de intentos
if not success then
warn(result) -- imprima la razón del 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, reporte el error en lugar de 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 la 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 propio ID de lugarlocal playerToTeleport = Players:GetPlayers()[1] -- consigue el primer usuario en el juegoSafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)