Wenn du ein Erlebnis mit vielen verschiedenen Orten erstellen möchtest, wie eine Fantasiewelt mit mehreren Städten, Schlössern, Dungeons und einem riesigen Wald, kannst du TeleportService verwenden, um Benutzern zu ermöglichen, sich zwischen Orten in einem Universum, Servern oder sogar in ein anderes Erlebnis zu teleportieren.
Teleportation einrichten
Um Teleportation in deiner Erlebniszu aktivieren, verwende TeleportService:TeleportAsync(). Die Methode akzeptiert drei Parameter:
- Die PlaceId für Benutzer, zu denen sie sich teleportieren können.
- Ein Array mit den Player Instanzen, die die Benutzer zum teleportierendarstellen.
- Eine optionale TeleportOptions Instanz, die benutzerdefinierte Eigenschaften für den TeleportAsync() Anruf enthält.
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- Ersetzen durch eigene Platz-IDlocal playerToTeleport = Players:GetPlayers()[1] -- erhalte den ersten benutzer im erlebnisTeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
Wenn Sie Vorsichtsmaßnahmen zum Umgang mit Fehlern beim Aufbau von Teleportationen treffen möchten, sehen Sie, wie man fehlgeschlagene Teleports behandelt.
Cross-Erfahrungsteleportation aktivieren
Zu Sicherheitszwecken wird der Teleport eines Benutzers von deiner Erfahrung zu einer anderen Erfahrung, die von anderen gehört wird, oder umgekehrt, standardmäßig fehlgeschlagen.Um die Cross-Erfahrungs-Teleportation zu aktivieren, öffne Spieleinstellungen > Sicherheit und aktiviere Dritte-Party-Teleports zulassen auf Studio.
Erstelle benutzerdefinierte Teleport-Screens
Wenn ein Benutzer einen teleportierenauslöst, sieht er den Standard-Roblox-Ladebildschirm, während er darauf wartet, dass der neue Ort geladen wird.Du kannst einen benutzerdefinierten Teleport-Bildschirm hinzufügen, um die Immersion für Benutzer zu verbessern, indem du TeleportService:SetTeleportGui() auf dem Client ruft und durch die ScreenGui gehst, bevor du den Benutzer teleportierst.Das folgende Beispiel legt ein benutzerdefiniertes ScreenGui, das sich in ReplicatedStorage befindet, als Ladebildschirm fest, wenn ein Teleportieren stattfindet.Es führt keine Skripte innerhalb der ScreenGui aus.
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
Teleportoptionen anpassen
Du kannst Teleportationen anpassen, wie Nutzer auf einen bestimmten Server teleportieren und Benutzerdaten zusammen mit Teleports senden, indem du die Instanz einstellst und sie an die Methode übergibst.
Teleportieren zu bestimmten Servern
Um Benutzer auf bestimmte Server zu teleportieren, stelle den Zielserver mit TeleportOptions ein und übergeben Sie ihn an die TeleportService:TeleportAsync() Methode.Wenn du keinen Server angibst, werden Benutzer in einen zufällig ausgewählten öffentlichen Server teleportiert.Die Informationen des ersten Benutzers in der Liste werden verwendet, um mit diesem öffentlichen Server zu matchmake.
Um Benutzer auf einen bestimmten öffentlichen Server zu teleportieren, legen Sie die Eigenschaft TeleportOptions.ServerInstanceId als eine gültige Instanz-ID fest, die ein eindeutiger Identifikator für einen öffentlichen Server ist.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
Um Benutzer auf einen bestimmten reservierten Server zu teleportieren, legen Sie ein gültiges TeleportOptions.ReservedServerAccessCode fest, das ein eindeutiger Code zum Betreten eines reservierten Servers ist.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
Um Benutzer auf einen neuen reservierten Server zu teleportieren, stellen Sie TeleportOptions.ShouldReserveServer auf wahr ein.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ShouldReserveServer = true
Senden Sie Benutzerdaten zusammen mit Teleports
Das Teleportieren eines Benutzers zwischen Orten löscht alle lokalen Daten, die mit diesem Benutzer verbunden sind.Sie können die folgenden Ansätze verwenden, um die Datendauerhaftigkeit zwischen Orten zu verwalten.
Wenn deine Erfahrung sichere Benutzerdaten wie In-Experience-Währung oder Inventar verwendet, implementiere Datenlagern oder Speicherlagern, um Daten von Ort zu Ort zu erhalten.
Um grundlegende nicht sichere Daten von einem Ort zum anderen zu senden, rufen Sie TeleportOptions:SetTeleportData() vor der Weitergabe an TeleportAsync().
local teleportData = {randomNumber = RNG:NextInteger(1, 100),}local teleportOptions = Instance.new("TeleportOptions")teleportOptions:SetTeleportData(teleportData)
Um alle Daten eines Benutzers zu erhalten, der von einem Teleport auf dem Server kommt, verwende die Player:GetJoinData()-Funktion, die eine Diktion zurückgibt, die Daten enthält, die mit dem Benutzer verbunden sind.
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)
Um nur die Teleportdaten auf dem Client abzurufen, kannst du TeleportService:GetLocalPlayerTeleportData() verwenden.
Teleports fehlgeschlagen behandeln
Wie jede API-Anruf, der Netzwerkanfragen beinhaltet, können Teleports fehlschlagen und einen Fehler werfen.Wrappe sie in geschützte Anrufe ( pcall() ).Einige Fehler profitieren von Wiederholungen, insbesondere diejenigen, die mit reservierten Servern verbunden sind, also empfehlen wir, eine bestimmte Anzahl von Versuchen bei Fehlern durchzuführen.
Selbst wenn ein Anruf erfolgreich ist und der Teleport initiiert wird, kann er noch im letzten Moment fehlschlagen, ohne einen Fehler zu werfen und den Benutzer auf dem Server zu lassen.Wenn dies passiert, wird das Ereignis TeleportService.TeleportInitFailed ausgelöst.
Das folgende Beispiel ModuleScript definiert eine SafeTeleport Funktion, die den Benutzer in einem geschützten Anruf mit Wiederholungslogik teleportiert.Es hat auch eine handleFailedTeleport Funktion, um Situationen zu bewältigen, in denen der Anruf erfolgreich war, aber der Teleport nicht auftreten.
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 -- definieren sie die pcall-ergebnisse außerhalb der schleife, damit die ergebnisse später gemeldet werden können
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teleportiere den benutzer in einen geschützten anruf, um fehler zu vermeiden
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- stopp versuchen, zu teleportieren, wenn der anruf erfolgreich war oder wenn das wiederholungslimit erreicht wurde
if not success then
warn(result) -- drucke den fehlgrund zur ausgabe
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
-- wenn der teleport ungültig ist, melden sie den fehler anstatt erneut zu versuchen
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
Die SafeTeleport-Funktion erhält die gleichen Argumente wie die TeleportAsync()-Funktion.Du kannst die folgenden ModuleScript mit der SafeTeleport Funktion ausführen, um Teleports von überall in deiner Erfahrung durchzuführen, um gescheiterte Teleports zu reduzieren.
local Players = game:GetService("Players")local ServerScriptService = game:GetService("ServerScriptService")local SafeTeleport = require(ServerScriptService.SafeTeleport)local TARGET_PLACE_ID = 1818 -- Ersetzen durch eigene Platz-IDlocal playerToTeleport = Players:GetPlayers()[1] -- holen sie sich den ersten benutzer im spielSafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)