Wiele gier jest podzielonych na wiele miejsc, takich jak fantastyczny świat z miastami, zamkami, lochami i rozległym lasem. Użyj TeleportService, aby teleportować użytkowników między miejscami, do różnych serwerów, a nawet do innych gier.
Teleportuj graczy
Aby teleportować graczy, użyj TeleportService:TeleportAsync(). Ta metoda akceptuje trzy parametry:
- PlaceId, do którego użytkownicy mają być teleportowani.
- Tablica zawierająca instancje Player, które chcesz teleportować.
- Opcjonalna instancja TeleportOptions, która zawiera niestandardowe właściwości dla wywołania TeleportAsync().
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 12345678901234 -- zamień na swój własny
local playerToTeleport = Players:GetPlayers()[1] -- pobierz pierwszego użytkownika w grze
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport})Aby uzyskać odpowiednich graczy do teleportacji, możesz użyć zdarzenia BasePart.Touched lub ProximityPrompt.Triggered, aby uzyskać pojedynczego Player. Następnie możesz sprawdzić, czy gracz jest częścią drużyny (Player.Team) lub partii (Player.PartyId). W końcu możesz użyć Team:GetPlayers() lub SocialService:GetPlayersByPartyId(), jeśli chcesz teleportować całą grupę, a nie tylko pojedynczego gracza.
Skonfiguruj bezpieczną teleportację
Trzy ustawienia zarządzają bezpieczeństwem teleportacji.
| Ustawienie | Opis |
|---|---|
| (Pulpit twórcy) Publiczność > Ustawienia dostępu > Kontrola dostępu dla miejsc | Kontroluje, czy gracze mogą dołączać do dowolnego miejsca w twojej grze, czy muszą najpierw dołączyć do miejsca startowego. |
| (Pulpit twórcy) Miejsce > Dostęp > Bezpośrednia kontrola dostępu | Nadpisuje ustawienie Kontrola dostępu dla miejsc na poziomie gry dla miejsca, które nie jest miejscem startowym. |
| (Studio) Plik > Ustawienia doświadczenia > Bezpieczeństwo > Zezwól na teleportacje zewnętrzne | Kontroluje teleportacje z twojej gry do gier, których nie posiadasz. Możesz pozostawić to ustawienie wyłączone i nadal teleportować graczy między opublikowanymi grami, które posiadasz. |
Kontrola dostępu dla miejsc kontroluje teleportację graczy do twojej gry i jest najważniejszym ustawieniem zapobiegającym exploitom opartym na teleportacji.

Jeśli wybierzesz W pełni otwarte, gracze mogą dołączać do dowolnego miejsca w twojej grze poprzez teleportacje z dowolnej gry, w tym linki głębokie, zaproszenia do gry, dołączanie do przyjaciela i inne.
To dobry wybór, jeśli twoja gra ma kilka miejsc i chcesz, aby przyjaciele mogli łatwo do siebie dołączać, niezależnie od tego, w którym miejscu się znajdują. Jeśli nie wybierzesz tej opcji, gracze, którzy próbują dołączyć do swoich przyjaciół w miejscach, które nie są miejscami startowymi, zamiast tego dołączą do miejsca startowego twojej gry.
Jeśli wybierzesz Ograniczone do tego samego uniwersum, gracze mogą dołączać do miejsc, które nie są miejscami startowymi, tylko poprzez teleportacje w ramach twoich gier. To ustawienie pozwala na teleportacje inicjowane zarówno przez klienta, jak i serwer.
To dobry wybór, jeśli masz starszą grę, którą chcesz, aby nie migracja do bezpiecznych teleportacji.
Jeśli wybierzesz Bezpieczne tylko w uniwersum, gracze mogą dołączać do miejsc, które nie są miejscami startowymi, tylko poprzez teleportacje inicjowane przez serwer w tej grze.
To dobry wybór, jeśli twoja gra ma surowy system postępu, zanim gracze będą mogli uzyskać dostęp do niektórych obszarów. To także dobry wybór, jeśli twoja gra ma miejsce testowe, do którego gracze nie powinni mieć dostępu lub dla miejsc, które wyłącznie korzystają z zarezerwowanych serwerów.
Migracja do bezpiecznych teleportacji
Jeśli masz istniejącą grę, która używa teleportacji po stronie klienta i chcesz wymusić teleportacje inicjowane przez serwer, celem jest przeniesienie całej logiki teleportacji z skryptów klienta do skryptów serwera:
- Znajdź wszystkie skrypty klienta, które wywołują Teleport().
- Zmień te wywołania, aby zamiast tego uruchamiały zdarzenia zdalne. Alternatywnie, możesz zmienić wywołania, aby używały ProximityPrompts, ClickDetectors, lub nawet po prostu zdarzenia BasePart.Touched.
- Ponownie zaimplementuj teleportację w skrypcie serwera, używając TeleportAsync().
Tworzenie niestandardowych ekranów teleportacji
Gdy użytkownik wywoła teleportację, widzi standardowy ekran ładowania Roblox, czekając na załadowanie nowego miejsca. Jeśli chcesz, możesz dodać niestandardowy ekran teleportacji, wywołując TeleportService:SetTeleportGui() po stronie klienta.
Poniższy przykład ustawia dostosowane ScreenGui z ReplicatedStorage. Jakiekolwiek skrypty w ScreenGui nie będą działać.
local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportGui = ReplicatedStorage.TeleportGui
TeleportService:SetTeleportGui(teleportGui)Dostosowywanie opcji teleportacji
Możesz dostosować teleportacje, takie jak teleportacja użytkowników do konkretnego serwera i wysyłanie danych użytkownika wraz z teleportacjami, ustawiając instancję TeleportOptions i przekazując ją do metody TeleportService:TeleportAsync().
Teleportacja do konkretnych serwerów
Aby teleportować użytkowników do konkretnych serwerów, ustaw docelowy serwer za pomocą TeleportOptions i przekaż go do metody TeleportAsync(). Jeśli nie określisz serwera, użytkownicy zostaną teleportowani do publicznego serwera; informacje o pierwszym użytkowniku na liście są używane do dopasowania.
Aby teleportować użytkowników do konkretnego publicznego serwera, ustaw właściwość TeleportOptions.ServerInstanceId jako ważny identyfikator instancji, który jest unikalnym identyfikatorem dla publicznego serwera.
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ServerInstanceId = targetServerIdAby teleportować użytkowników do konkretnego zarezerwowanego serwera, ustaw ważny TeleportOptions.ReservedServerAccessCode, który jest unikalnym kodem do wejścia na zarezerwowany serwer.
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = reservedServerCodeAby teleportować użytkowników do nowego zarezerwowanego serwera, ustaw TeleportOptions.ShouldReserveServer na true.
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = trueWysyłanie danych użytkownika wraz z teleportacjami
Teleportacja użytkownika między miejscami odrzuca wszelkie lokalne dane związane z tym użytkownikiem. Możesz użyć następujących podejść do obsługi trwałości danych między miejscami:
Jeśli twoja gra wykorzystuje bezpieczne dane użytkownika, takie jak waluta w grze lub ekwipunek, zaimplementuj sklepy danych lub sklepy pamięci, aby utrzymać dane z miejsca do miejsca.
Aby wysłać podstawowe niebezpieczne dane z miejsca do miejsca, wywołaj TeleportOptions:SetTeleportData() przed przekazaniem go do TeleportAsync(). Nie przekazuj danych zabezpieczonych tą metodą; dane są widoczne dla klienta i nie są szyfrowane.
local teleportData = {
randomNumber = RNG:NextInteger(1, 100),
}
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions:SetTeleportData(teleportData)Aby odzyskać wszystkie dane, gdy użytkownik przybywa do nowego miejsca po teleportacji, użyj funkcji Player:GetJoinData(), która zwraca słownik z kluczem TeleportData.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local joinData = player:GetJoinData()
local teleportData = joinData.TeleportData
local randomNumber = teleportData.randomNumber
print(player.Name .. " dołączył z liczbą " .. randomNumber)
end
Players.PlayerAdded:Connect(onPlayerAdded)Aby odzyskać tylko dane teleportacji po stronie klienta, możesz użyć TeleportService:GetLocalPlayerTeleportData().
Obsługa nieudanych teleportacji
Podobnie jak w przypadku każdego wywołania API, które wiąże się z żądaniami sieciowymi, teleportacje mogą się nie powieść i zgłosić błąd. Owiń je w chronione wywołania (pcall()). Niektóre niepowodzenia korzystają z ponownych prób, szczególnie te związane z zarezerwowanymi serwerami, dlatego zalecamy ponowne próby przez pewną liczbę razy w przypadku niepowodzenia.
Nawet jeśli wywołanie zakończy się sukcesem i teleportacja zostanie zainicjowana, może się ona nadal nie powieść w ostatniej chwili bez zgłaszania błędu i pozostawić użytkownika na serwerze. Gdy to się zdarzy, wywołuje to zdarzenie TeleportService.TeleportInitFailed.
Poniższy przykład ModuleScript zwraca pojedynczą funkcję SafeTeleport, która teleportuje graczy w chronionym wywołaniu z logiką ponownych prób. Ma również funkcję handleFailedTeleport, aby poradzić sobie z sytuacjami, w których wywołanie było udane, ale teleportacja się nie odbyła.
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 -- zdefiniuj wyniki pcall poza pętlą, aby wyniki mogły być zgłaszane później
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teleportuj użytkownika w chronionym wywołaniu, aby zapobiec błędom
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- przestań próbować teleportować, jeśli wywołanie zakończyło się sukcesem lub jeśli osiągnięto limit ponownych prób
if not success then
warn(result) -- wydrukuj powód niepowodzenia do wyjścia
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
-- jeśli teleportacja jest nieprawidłowa, zgłoś błąd zamiast ponawiać próbę
error(("Nieprawidłowa teleportacja [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleportFunkcja SafeTeleport przyjmuje te same argumenty, co funkcja TeleportAsync(). Możesz użyć następującego skryptu z funkcją SafeTeleport, aby przeprowadzać teleportacje z dowolnego miejsca w swojej grze:
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local PLACE_TO_TELEPORT_TO = 12345678
local function teleport(touchPart)
local playerToTeleport = game.Players:GetPlayerFromCharacter(touchPart.Parent)
if playerToTeleport then
SafeTeleport(PLACE_TO_TELEPORT_TO, {playerToTeleport})
end
end
script.Parent.Touched:Connect(teleport)