Nếu bạn muốn xây dựng một trải nghiệm với nhiều nơi khác nhau, chẳng hạn như một thế giới tưởng tượng với nhiều thị trấn, lâu đài, pháo đài và một khu rừng rộng lớn, bạn có thể sử dụng TeleportService để bật kích hoạt người dùng để dịch chuyển giữa các nơi trong một vũ trụ, máy chủ hoặc thậm chí đến một trải nghiệm khác.
Thiết lập dịch chuyển
Để bật khả năng dịch chuyển trong trải nghiệm của bạn, hãy sử dụng TeleportService:TeleportAsync() . Phương pháp nhận ba tham số:
- The PlaceId cho người dùng để dịch chuyển đến.
- Một mảng chứa các Player đại diện cho người dùng để dịch chuyển
- Một ví dụ tùy chọn TeleportOptions có chứa các thuộc tính tùy chỉnh cho cuộc gọi TeleportAsync().
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- thay thế bằng ID nơi của riêng bạnlocal playerToTeleport = Players:GetPlayers()[1] -- nhận người dùng đầu tiên trong trải nghiệmTeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
Nếu bạn muốn thực hiện các biện pháp phòng ngừa xử lý lỗi khi thiết lập dịch chuyển, hãy xem cách xử lý lỗi dịch chuyển thất bại.
Bật khả năng dịch chuyển kinh nghiệm chéo
Vì mục đích bảo mật, dịch chuyển người dùng từ trải nghiệm của bạn sang trải nghiệm khác thuộc sở hữu của người khác, hoặc ngược lại, thất bại theo mặc định.Để bật khả năng dịch chuyển trải nghiệm chéo, mở Cài đặt trò chơi > Bảo mật và bật Cho phép dịch chuyển bên thứ ba trên Studio.
Tạo màn hình teleport tùy chỉnh
Khi người dùng kích hoạt một lần dịch chuyển, họ nhìn thấy màn hình tải tiêu chuẩn của Roblox khi chờ đợi nơi mới tải xong.Bạn có thể thêm một màn hình dịch chuyển tùy chỉnh để cải thiện sự thâm nhập cho người dùng bằng cách gọi TeleportService:SetTeleportGui() trên máy khách và thông qua ScreenGui để sử dụng trước khi dịch chuyển người dùng.Ví dụ sau đây thiết lập một đoạn tùy chỉnh ScreenGui được đặt ở ReplicatedStorage như màn hình tải khi một cuộc dịch chuyển xảy ra.Nó không chạy bất kỳ kịch bản nào bên trong ScreenGui .
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
Tùy chỉnh lựa chọn dịch chuyển
Bạn có thể tùy chỉnh dịch chuyển, chẳng hạn như dịch chuyển người dùng đến một máy chủ cụ thể và gửi dữ liệu người dùng cùng với dịch chuyển , bằng cách thiết lập instance TeleportOptions và chuyển nó đến phương pháp TeleportService:TeleportAsync().
Dịch chuyển đến các máy chủ cụ thể
Để dịch chuyển người dùng đến các máy chủ cụ thể, hãy cài đặt máy chủ mục tiêu bằng cách sử dụng TeleportOptions và chuyển nó cho phương pháp TeleportService:TeleportAsync().Nếu bạn không xác định một máy chủ, người dùng sẽ được dịch chuyển vào một máy chủ công cộng được tạo ra.Thông tin của người dùng đầu tiên trong danh sách được sử dụng để kết hợp với máy chủ công cộng đó.
Để dịch chuyển người dùng sang một máy chủ công cộng cụ thể, hãy đặt thuộc tính TeleportOptions.ServerInstanceId như một ID máy chủ hợp lệ, đó là một nhận dạng duy nhất cho một máy chủ công cộng.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
Để dịch chuyển người dùng đến một máy chủ dự trữ cụ thể, hãy cài đặt một mã hợp lệ TeleportOptions.ReservedServerAccessCode, đó là một mã duy nhất để nhập vào máy chủ dự trữ.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
Để dịch chuyển người dùng sang một máy chủ dự trữ mới, hãy đặt TeleportOptions.ShouldReserveServer thành true.
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ShouldReserveServer = true
Gửi dữ liệu người dùng cùng với dịch chuyển
Dịch chuyển một người dùng giữa các nơi loại bỏ bất kỳ dữ liệu địa phương nào liên quan đến người dùng đó.Bạn có thể sử dụng các tiếp cận sau đây để xử lý sự bền vững dữ liệu giữa các vị trí.
Nếu trải nghiệm của bạn sử dụng dữ liệu người dùng an toàn như tiền tệ trong trải nghiệm hoặc kho hàng, hãy triển khai kho lưu trữ dữ liệu hoặc kho bộ nhớ để duy trì dữ liệu từ nơi này sang địa điểm.
Để gửi dữ liệu cơ bản không an toàn từ nơi này sang địa điểm, hãy gọi TeleportOptions:SetTeleportData() trước khi chuyển nó cho TeleportAsync() .
local teleportData = {randomNumber = RNG:NextInteger(1, 100),}local teleportOptions = Instance.new("TeleportOptions")teleportOptions:SetTeleportData(teleportData)
Để lấy tất cả dữ liệu của một người dùng đến từ một cuộc dịch chuyển trên máy chủ, hãy sử dụng chức năng Player:GetJoinData(), trả về một bảng từ điển bao gồm dữ liệu liên quan đến người dùng.
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)
Để lấy chỉ dữ liệu dịch chuyển trên client, bạn có thể sử dụng TeleportService:GetLocalPlayerTeleportData() .
Xử lý dịch chuyển thất bại
Giống như bất kỳ cuộc gọi API nào liên quan đến yêu cầu mạng, dịch chuyển có thể thất bại và ném lỗi.Bọc chúng trong các cuộc gọi được bảo vệ ( pcall() ).Một số thất bại có lợi từ các lần thử lại, đặc biệt là những thất bại liên quan đến các máy chủ dự trữ, vì vậy chúng tôi khuyên bạn nên thử lại một số lần trên các thất bại.
Ngay cả khi cuộc gọi thành công và khởi động dịch chuyển, nó vẫn có thể thất bại vào phút cuối mà không ném lỗi và rời người dùng trên máy chủ.Khi điều này xảy ra, nó kích hoạt sự kiện TeleportService.TeleportInitFailed.
Ví dụ sau đây ModuleScript định nghĩa một chức năng SafeTeleport để dịch chuyển người dùng trong cuộc gọi bảo vệ với logic tái thử.Nó cũng có chức năng handleFailedTeleport để xử lý các tình huống mà cuộc gọi thành công, nhưng việc dịch chuyển không xảy ra.
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 -- xác định kết quả pcall bên ngoài vòng lặp để kết quả có thể được báo cáo sau này
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- dịch chuyển người dùng trong cuộc gọi bảo vệ để ngăn chặn lỗi
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- dừng cố gắng dịch chuyển nếu cuộc gọi thành công, hoặc nếu giới hạn thử lại đã được đạt đến
if not success then
warn(result) -- in lý do lỗi để xuất
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
-- nếu dịch chuyển không hợp lệ, báo cáo lỗi thay vì thử lại
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
Chức năng SafeTeleport nhận các tham số tương tự như chức năng TeleportAsync() .Bạn có thể sử dụng các thẻ sau ModuleScript với chức năng SafeTeleport để thực hiện dịch chuyển từ bất kỳ nơi nào trong trải nghiệm của bạn để giảm số lần dịch chuyển thất bại.
local Players = game:GetService("Players")local ServerScriptService = game:GetService("ServerScriptService")local SafeTeleport = require(ServerScriptService.SafeTeleport)local TARGET_PLACE_ID = 1818 -- thay thế bằng ID nơi của riêng bạnlocal playerToTeleport = Players:GetPlayers()[1] -- nhận người dùng đầu tiên trong trò chơiSafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)