Jeśli chcesz zbudować doświadczenie z wieloma różnymi miejscami, takimi jak świat fantazji z wieloma miastami, zamkami, obiektami Dungeon i ogromnym lasem, możesz użyć TeleportService , aby umożliwić użytkownikom teleportację między miejscami w wielowym świecie, serwerami lub nawet do innym doświadczeniem.
Ustawienie teleportacji
Aby włączyć teleportację w swoim doświadczeniu, użyj TeleportService:TeleportAsync(). Metoda akceptuje trzy parametry:
- Class.DataModel.PlaceId|PlaceId dla użytkowników do teleportacji.
- Materiały w niej zawarte są w Player instancjach reprezentujących użytkowników do teleportować się.
- Opcjonalna instancja TeleportOptions, która zawiera właściwości niestandardowe dla wezwania TeleportAsync().
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- zastąp przez własny identyfikator miejscalocal playerToTeleport = Players:GetPlayers()[1] -- dostać pierwszego użytkownika w doświadczeniuTeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
Jeśli chcesz podjąć środki ostrożności przy ustawianiu teleportacji, zobacz Ustawienie teleportacji nie powiodło się.
Włączone Przekazywanie Między Doświadczeniami
Ze względów bezpieczeństwa teleportacja użytkownika z Twojego doświadczenia do innej własności lub inny sposób powoduje, że nie działa ona domyślnie. Aby włączyć teleportację między doświadczeniami, otwórz Ustawienia gry > Bezpieczeństwo i włącz Pozwól na teleportację stron trzecich w Studio.
Tworzenie niestandardowych ekranów teleportu
Kiedy użytkownik włącza teleportować się, widzi standardowy ekran ładowania Roblox, podczas gdy czeka na załadowanie nowego miejsca. Możesz dodać niestandardowy e
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
Personalizowanie Opcji Teleportacji
Możesz dostosować teleportacje, takie jak teleportowanie użytkowników na określony serwer i wysyłanie danych użytkownika wraz z teleportacjami, poprzez ustawienie instancji TeleportOptions i przesłanie jej metody 2>Class.TeleportService:TeleportAsync2>.
Teleportacja do konkretnych serwerów
Aby przenieść użytkowników na konkretne serwery, ustaw target server używając TeleportOptions i przekaż go metodzie TeleportService:TeleportAsync(). Jeśli nie określisz serwera, użytkownicy zostaną przeniesieni do publicznego serwera matchmade. Informacje pierwszego użytkownika na liście są używane do matchmaking do tego publicz
Aby przenieść użytkowników na określony publiczny serwer, ustaw właściwość TeleportOptions.ServerInstanceId jako poprawny identyfikator instancji, co jest unikalnym identyfikatorem dla serwera publicznego.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
Aby przenieść użytkowników na określony zarezerwowany serwer, ustaw ważny TeleportOptions.ReservedServerAccessCode, który jest unikalnym kodem do wpisywania zarezerwowanego serwera.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
Aby przenieść użytkowników na nowy zarezerwowany serwer, ustaw TeleportOptions.ShouldReserveServer na prawdę.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ShouldReserveServer = true
Wysyłanie danych użytkownika wraz z teleportami
Teleportowanie użytkownika między miejscami odrzuca wszelkie lokalne dane związane z tym użytkownikiem. Możesz użyć następujących podejść do zarządzania trwałości danych między miejscami.
Jeśli Twoje doświadczenie wykorzystuje bezpieczne dane użytkownika, takie jak waluta w doświadczeniu lub zapas, implementuj przechowywanie danych lub przechowywanie pamięci, aby utrzymać dane z miejsca na miejsce.
Aby wysyłować podstawowe niebezpieczne dane z miejsca do miejsce, wezwij TeleportOptions:SetTeleportData() przed wysłaniem go do TeleportAsync().
local teleportData = {randomNumber = RNG:NextInteger(1, 100),}local teleportOptions = Instance.new("TeleportOptions")teleportOptions:SetTeleportData(teleportData)
Aby uzyskać wszystkie dane użytkownika przybywające z teleportu na serwerze, użyj funkcji Player:GetJoinData(), która zwraca słownik zawierający dane związane z użytkownikiem.
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)
Aby odzyskać tylko dane teleportu na klienta, możesz użyć TeleportService:GetLocalPlayerTeleportData() .
Przyczyny niepowodzenia teleportacji
Podobnie jak każdy API, który zaangażuje wysyłanie prośb sieciowych, teleporty mogą się nie powodzić i wywołać błąd. Nawet jeśli wezwanie zakończy się i teleport zainicjuje, nadal może to nie powodzić się w ostatniej chwili bez rzucania błędem i opuścić użytkownika na serwerze. Gdy tak się stanie, to wyzwuje TeleportService.TeleportInitFailed.
Wrap teleports in a protected call ( pcall() ) and retry if it fails. The following example ModuleScript defines a SafeTeleport function to teleport the user in a protected call and a 1> HandleFailedTeleport1> function to retry failed teleports that are one-time hiccups and drops invalid ones that
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ętlem, aby wyniki mogły być zgłoszone później
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teleportuj użytkownika w chroniony wezwanie, aby zapobiec błędom
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- zatrzymaj próbę teleportacji, jeśli wezwanie było udane, lub jeśli limit prób został osiągnięty
if not success then
warn(result) -- naciśnij powodzenie błędu, aby wyjść
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 teleport jest nieprawidłowe, zgłoś błąd zamiast próbowania ponownie
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
Funkcja SafeTeleport otrzymuje te same argumenty co funkcja Class.TeleportService:TeleportAsync()|TeleportAsync() . Możesz użyć następującego Class.ModuleScript z funkcją 1>SafeTeleport1>, aby wykonać teleporty z dowolnego miejsca w swoim doświadczeniu, aby zmniejszyć niepowodzenia teleportacji.
local Players = game:GetService("Players")local ServerScriptService = game:GetService("ServerScriptService")local SafeTeleport = require(ServerScriptService.SafeTeleport)local TARGET_PLACE_ID = 1818 -- zastąp przez własny identyfikator miejscalocal playerToTeleport = Players:GetPlayers()[1] -- zdobądź pierwszego użytkownika w graSafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)