หากคุณต้องการสร้างประสบการณ์ที่มีสถานที่แตกต่างกันหลายแห่ง เช่น โลกแฟนตาซีที่มีเมืองหลายแห่ง ปราสาท ดันเจี้ยน และป่าใหญ่ คุณสามารถใช้ TeleportService เพื่อเปิดใช้งานให้ผู้ใช้สามารถเทเลพอร์ตระหว่างสถานที่ในจักรวาล เซิร์ฟเวอร์ หรือแม้แต่ไปยังประสบการณ์อื่น
ตั้งค่าการเทเลพอร์ต
เพื่อเปิดใช้งานการเทเลพอร์ตในประสบการณ์ของคุณ, ใช้ TeleportService:TeleportAsync() . วิธีการรับประกันสามพารามิเตอร์:
- The PlaceId สำหรับผู้ใช้ที่จะเทเลพอร์ตไป
- คอลเลกชันที่มีตัวอย่าง Player ที่แทนที่ผู้ใช้เพื่อเทเลพอร์ต
- ตัวอย่างไม่บังคับ TeleportOptions ที่มีคุณสมบัติกำหนดเองสำหรับการเรียก TeleportAsync()
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 1234 -- แทนที่ด้วยรหัสสถานที่ของคุณเองlocal playerToTeleport = Players:GetPlayers()[1] -- รับผู้ใช้คนแรกในประสบการณ์TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)
หากต้องการใช้มาตรการป้องกันข้อผิดพลาดในการตั้งค่าการเทเลพอร์ต ดูวิธีการจัดการ การเทเลพอร์ตที่ล้มเหลว
เปิดใช้งานการเทเลพอร์ตประสบการณ์ข้าม
เพื่อวัตถุประสงค์ด้านความปลอดภัย การเทเลพอร์ตผู้ใช้จากประสบการณ์ของคุณไปยังประสบการณ์อื่นที่เป็นเจ้าของโดยคนอื่น หรือวิธีกลับกัน จะล้มเหลวโดยค่าเริ่มต้นเพื่อเปิดใช้งานการเทเลพอร์ตประสบการณ์ระหว่างกัน เปิด การตั้งค่าเกม > ความปลอดภัย และเปิดใช้งาน อนุญาตให้มีการเทเลพอร์ตของบุคคลที่สาม บน Studio
สร้างหน้าจอเทเลพอร์ตที่กําหนดเอง
เมื่อผู้ใช้กระตุ้นการเทเลพอร์ตพวกเขาจะเห็นหน้าจอการโหลด Roblox มาตรฐานในขณะที่รอให้สถานที่ใหม่โหลดเสร็จคุณสามารถเพิ่มหน้าจอเทเลพอร์ตที่กำหนดเองเพื่อปรับปรุงการดื่มสำหรับผู้ใช้โดยการโทร TeleportService:SetTeleportGui() บนไคลเอนต์และผ่าน ScreenGui ก่อนที่จะเทเลพอร์ตผู้ใช้ตัวอย่างต่อไปนี้ตั้งค่า ScreenGui ที่กำหนดเองไว้ใน ReplicatedStorage เป็นหน้าจอโหลดเมื่อเกิดการเทเลพอร์ตมันไม่ได้รันสคริปต์ใดๆ ภายใน ScreenGui
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
ปรับแต่งตัวเลือกการเทเลพอร์ต
คุณสามารถปรับแต่งการเทเลพอร์ตได้ เช่น การเทเลพอร์ตผู้ใช้ไปยังเซิร์ฟเวอร์เฉพาะ และ ส่งข้อมูลผู้ใช้พร้อมกับการเทเลพอร์ต โดยการตั้งค่าตัวอย่าง TeleportOptions และส่งมันไปยังวิธี TeleportService:TeleportAsync()
เทเลพอร์ตไปยังเซิร์ฟเวอร์เฉพาะ
เพื่อเทเลพอร์ตผู้ใช้ไปยังเซิร์ฟเวอร์เฉพาะ ตั้งเซิร์ฟเวอร์เป้าหมายโดยใช้ TeleportOptions และส่งมันไปยังวิธี TeleportService:TeleportAsync()หากคุณไม่ระบุเซิร์ฟเวอร์ ผู้ใช้จะถูกเทเลพอร์ตไปยังเซิร์ฟเวอร์สาธารณะที่จับคู่ข้อมูลของผู้ใช้รายแรกในรายการถูกใช้เพื่อจับคู่กับเซิร์ฟเวอร์สาธารณะนั้น
เพื่อเทเลพอร์ตผู้ใช้ไปยังเซิร์ฟเวอร์สาธารณะเฉพาะ ตั้งค่าคุณสมบัติ TeleportOptions.ServerInstanceId เป็นรหัสตัวอย่างที่ถูกต้องซึ่งเป็นรหัสระบุเฉพาะสำหรับเซิร์ฟเวอร์สาธารณะ
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
เพื่อเทเลพอร์ตผู้ใช้ไปยังเซิร์ฟเวอร์สำรองเฉพาะ ตั้งค่า TeleportOptions.ReservedServerAccessCode ที่ถูกต้องซึ่งเป็นรหัสที่ไม่ซ้ำกันสำหรับการเข้าสู่เซิร์ฟเวอร์สำรอง
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
เพื่อเทเลพอร์ตผู้ใช้ไปยังเซิร์ฟเวอร์สำรองใหม่ ตั้ง TeleportOptions.ShouldReserveServer เป็นจริง
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ShouldReserveServer = true
ส่งข้อมูลผู้ใช้พร้อมกับการเทเลพอร์ต
เทเลพอร์ตผู้ใช้ระหว่างสถานที่จะลบข้อมูลท้องถิ่นใดๆ ที่เกี่ยวข้องกับผู้ใช้นั้นคุณสามารถใช้วิธีต่อไปนี้เพื่อจัดการความยั่งยืนของข้อมูลระหว่างสถานที่
หากประสบการณ์ของคุณใช้ข้อมูลผู้ใช้แบบ ปลอดภัย เช่นเงินในประสบการณ์หรือสินค้าคงคลัง, ให้ใช้ คลังข้อมูล หรือ หน่วยความจำ เพื่อเก็บข้อมูลจากสถานที่หนึ่งไปยังอีกสถานที่หนึ่ง
เพื่อส่งข้อมูลพื้นฐาน ไม่ปลอดภัย จากสถานที่หนึ่งไปยังอีกสถานที่หนึ่ง โทร TeleportOptions:SetTeleportData() ก่อนส่งมันให้ TeleportAsync()
local teleportData = {randomNumber = RNG:NextInteger(1, 100),}local teleportOptions = Instance.new("TeleportOptions")teleportOptions:SetTeleportData(teleportData)
เพื่อรับข้อมูลทั้งหมดของผู้ใช้ที่มาจากการเทเลพอร์ตบนเซิร์ฟเวอร์ ให้ใช้ฟังก์ชัน Player:GetJoinData() ซึ่งจะคืนสารบัญที่รวมถึงข้อมูลที่เกี่ยวข้องกับผู้ใช้
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)
เพื่อดึงข้อมูลเทเลพอร์ตเฉพาะในไคลเอนต์ คุณสามารถใช้ TeleportService:GetLocalPlayerTeleportData()
จัดการการเทเลพอร์ตที่ล้มเหลว
เช่นเดียวกับการโทร API ที่เกี่ยวข้องกับคำขอเครือข่าย เทเลพอร์ตอาจล้มเหลวและโยนข้อผิดพลาดห่อพวกเขาในการโทรที่ป้องกัน ( pcall() )ความล้มเหลวบางอย่างได้รับประโยชน์จากการลองอีกครั้ง โดยเฉพาะอย่างยิ่งความล้มเหลวที่เกี่ยวข้องกับเซิร์ฟเวอร์สำรอง ดังนั้นเราขอแนะนำให้ลองอีกครั้งหลายครั้งในความล้มเหลว
แม้ว่าการโทรจะสําเร็จและเริ่มการเทเลพอร์ตก็ยังสามารถล้มเหลวในช่วงเวลาสุดท้ายโดยไม่โยนข้อผิดพลาดและทิ้งผู้ใช้ไว้ในเซิร์ฟเวอร์เมื่อเกิดเหตุนี้ขึ้น จะกระตุ้นให้เกิดเหตุการณ์ TeleportService.TeleportInitFailed
ตัวอย่างต่อไปนี้ ModuleScript กำหนดฟังก์ชัน SafeTeleport เพื่อเทเลพอร์ตผู้ใช้ในการโทรคุ้มครองด้วยโลจิสติกการเรียกคืนนอกจากนี้ยังมีฟังก์ชัน handleFailedTeleport ในการจัดการกับสถานการณ์ที่การโทรเรียกประสบความสำเร็จ แต่การเทเลพอร์ตไม่เกิดขึ้น
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 -- กำหนดผลลัพธ์ของการโทรออกนอกลูปเพื่อให้สามารถรายงานผลลัพธ์ได้ในภายหลัง
repeat
success, result = pcall(function()
return TeleportService:TeleportAsync(placeId, players, options) -- เทเลพอร์ตผู้ใช้ในการโทรคุ้มครองเพื่อป้องกันข้อผิดพลาด
end)
attemptIndex += 1
if not success then
task.wait(RETRY_DELAY)
end
until success or attemptIndex == ATTEMPT_LIMIT -- หยุดพยายามเทเลพอร์ตถ้าการโทรเรียกประสบความสำเร็จ หรือถ้าขีดจํากัดการลองใหม่ถูกถึงแล้ว
if not success then
warn(result) -- พิมพ์เหตุผลความล้มเหลวเพื่อออก
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
-- หากการเทเลพอร์ตไม่ถูกต้อง รายงานข้อผิดพลาดแทนที่จะพยายามอีกครั้ง
error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
ฟังก์ชัน SafeTeleport ได้รับอาร์กิวเมนต์เดียวกับฟังก์ชัน TeleportAsync()คุณสามารถใช้ต่อไปนี้ ModuleScript ด้วยฟังก์ชัน SafeTeleport เพื่อดําเนินการเทเลพอร์ตจากทุกที่ในประสบการณ์ของคุณเพื่อลดการเทเลพอร์ตที่ล้มเหลว
local Players = game:GetService("Players")local ServerScriptService = game:GetService("ServerScriptService")local SafeTeleport = require(ServerScriptService.SafeTeleport)local TARGET_PLACE_ID = 1818 -- แทนที่ด้วยรหัสสถานที่ของคุณเองlocal playerToTeleport = Players:GetPlayers()[1] -- รับผู้ใช้แรกในเกมSafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)