Teleportacja między miejscami

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Jeśli chcesz stworzyć doświadczenie z wieloma odrębnymi miejscami, takimi jak świat fantazji z wieloma miastami, zamkami, kryjówkami i rozległym lasem, możesz użyć TeleportService, aby umożliwić użytkownikom teleportowanie się między miejscami w wszechświecie, serwerach lub nawet innym doświadczeniem.

Ustaw teleportację

Aby włączyć teleportację w swoim doświadczeniu, użyj TeleportService:TeleportAsync(). Metoda akceptuje trzy parametry:

  • The PlaceId dla użytkowników, do których mają teleportować się.
  • Matryca zawierająca instancje Player reprezentujące użytkowników do teleportować się.
  • Opcjonalna instancja TeleportOptions, która zawiera niestandardowe właściwości dla wezwania TeleportAsync().

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 1234 -- zastąp własnym ID miejsca
local playerToTeleport = Players:GetPlayers()[1] -- zdobądź pierwszego użytkownika w doświadczeniu
TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Jeśli chcesz podjąć środki ostrożności dotyczące błędów podczas konfigurowania teleportacji, zobacz, jak poradzić sobie z nieudanymi teleportami.

Włącz teleportację między doświadczeniami

Ze względów bezpieczeństwa teleportowanie użytkownika z twojego doświadczenia do innego doświadczenia należącego do innych lub w drugą stronę nie powodzi się domyślnie.Aby włączyć teleportację między doświadczeniami, otwórz Ustawienia gry > Bezpieczeństwo i włącz Pozwolenie na teleportację stron trzecich w Studio.

Twórz niestandardowe ekrany teleportacji

Kiedy użytkownik uruchamia teleportować się, widzi standardowy ekran ładowania Roblox, czekając na załadowanie nowego miejsca.Możesz dodać niestandardowy ekran teleportacji, aby poprawić zanurzenie dla użytkowników, wywołując TeleportService:SetTeleportGui() na klientzie i przechodząc przez ScreenGui przed teleportacją użytkownika.Poniższy przykład ustawia niestandardową ScreenGui położoną w ReplicatedStorage jako ekran ładowania, gdy wystąpi teleportacja.Nie uruchamia żadnych skryptów wewnątrz ScreenGui.


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

Dostosuj opcje teleportacji

Możesz dostosować teleportacje, takie jak teleportowanie użytkowników na określony serwer i wysyłanie danych użytkownika wraz z teleportami , ustawiając instancję i przekazując ją metodzie >.

Teleportuj się do konkretnych serwerów

Aby przenieść użytkowników na określone serwery, ustaw celowy serwer za pomocą TeleportOptions i przekaż go metodzie TeleportService:TeleportAsync().Jeśli nie określisz serwera, użytkownicy są teleportowani na publiczny serwer matchmade.Informacje o pierwszym użytkowniku na liście są używane do dopasowania do tego publicznego serwera.

Aby teleportować użytkowników na określony publiczny serwer, ustaw właściwość TeleportOptions.ServerInstanceId jako ważną identyfikator instancji, który jest unikalnym identyfikatorem dla publicznego serwera.


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

Aby przenieść użytkowników na określony zarezerwowany serwer, ustaw prawidłowy TeleportOptions.ReservedServerAccessCode, który jest unikalnym kodem do wpisania na zarezerwowany serwer.


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

Wyślij dane 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.


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 teleportacyjne na klientzie, możesz użyć TeleportService:GetLocalPlayerTeleportData().

Ręczne nieudane teleporty

Podobnie jak każde wezwanie API, które wiąże się z żądaniami sieciowymi, teleporty mogą zawieść i wywołać błąd.Owiń je w chronione wezwania (pcall()).Niektóre awarie korzystają z prób ponownych, szczególnie te dotyczące zarezerwowanych serwerów, więc zalecamy wypróbowanie pewnej liczby razy na awariach.

Nawet jeśli wezwanie powiedzie się i teleport zostanie uruchomiony, nadal może zawieść w ostatniej chwili bez wystąpienia błędu i pozostawienia użytkownika na serwerze.Kiedy tak się stanie, uruchamia to wydarzenie TeleportService.TeleportInitFailed.

Poniższy przykład ModuleScript definiuje funkcję SafeTeleport teleportującą użytkownika w bezpiecznym wezwaniu z logiką próby ponownej.Posiada również funkcję handleFailedTeleport do radzenia sobie z sytuacjami, w których wezwanie zakończyło się sukcesem, ale teleport nie występować.


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 -- określ wyniki wezwania poza pędem tak, aby wyniki mogły zostać zgłoszone później
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- teleportuj użytkownika w bezpiecznym wezwaniu, 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 zakończyło się sukcesem, lub osiągnięto limit ponownych prób
if not success then
warn(result) -- wydrukuj powód awarii 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łowe, zgłoś błąd zamiast próbować 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 TeleportAsync().Możesz użyć następującego ModuleScript z funkcją SafeTeleport do wykonywania teleportów z dowolnego miejsca w swoim doświadczeniu, aby zmniejszyć nieudane teleporty.


local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local SafeTeleport = require(ServerScriptService.SafeTeleport)
local TARGET_PLACE_ID = 1818 -- zastąp własnym ID miejsca
local playerToTeleport = Players:GetPlayers()[1] -- zdobądź pierwszego użytkownika w gra
SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)