เกมหลายเกมมีการแบ่งออกเป็นหลาย สถานที่ เช่นโลกแฟนตาซีที่มีเมือง ปราสาท ดันเจี้ยน และป่าอันกว้างใหญ่ ใช้ TeleportService เพื่อโทรจิตผู้ใช้ระหว่างสถานที่ ไปยังเซิร์ฟเวอร์ที่แตกต่างกัน หรือแม้แต่ไปสู่เกมอื่น
โทรจิตผู้เล่น
ในการโทรจิตผู้เล่น ใช้ TeleportService:TeleportAsync() วิธีการนี้รับพารามิเตอร์สามตัว:
- PlaceId สำหรับผู้ใช้ที่จะโทรจิตไป
- อาร์เรย์ที่มี Player อินสแตนซ์ที่คุณต้องการโทรจิต
- อินสแตนซ์ TeleportOptions ที่เลือกใช้ซึ่งมีคุณสมบัติเพิ่มเติมสำหรับการเรียก TeleportAsync()
local Players = game:GetService("Players")local TeleportService = game:GetService("TeleportService")local TARGET_PLACE_ID = 12345678901234 -- เปลี่ยนเป็นสถานที่ของคุณเองlocal playerToTeleport = Players:GetPlayers()[1] -- รับผู้ใช้คนแรกในเกมTeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport})
เพื่อให้ได้ผู้เล่นที่เหมาะสมในการโทรจิต คุณอาจใช้เหตุการณ์ BasePart.Touched หรือ ProximityPrompt.Triggered เพื่อรับผู้เล่นเฉพาะตัว จากนั้นคุณสามารถตรวจสอบว่าผู้เล่นเป็นส่วนหนึ่งของทีม (Player.Team) หรือพรรค (Player.PartyId) สุดท้ายคุณสามารถใช้ Team:GetPlayers() หรือ SocialService:GetPlayersByPartyId() หากคุณต้องการโทรจิตกลุ่มทั้งหมดแทนเฉพาะบุคคล
กำหนดค่าการโทรจิตที่ปลอดภัย
การตั้งค่าทั้งสามจัดการความปลอดภัยในการโทรจิต
| การตั้งค่า | คำอธิบาย |
|---|---|
| (แดชบอร์ดผู้สร้าง) ผู้ชม > การตั้งค่าการเข้าถึง > การควบคุมการเข้าถึงสำหรับสถานที่ | ควบคุมว่าผู้เล่นสามารถเข้าร่วมสถานที่ใดๆ ในเกมของคุณหรือจะต้องเข้าร่วม สถานที่เริ่มต้น ก่อน |
| (แดชบอร์ดผู้สร้าง) สถานที่ > การเข้าถึง > การควบคุมการเข้าถึงโดยตรง | แทนที่การตั้งค่าการควบคุมการเข้าถึงระดับเกมของคุณสำหรับสถานที่ที่ไม่ใช่สถานที่เริ่มต้น |
| (สตูดิโอ) ไฟล์ > การตั้งค่าประสบการณ์ > ความปลอดภัย > อนุญาตให้มีการโทรจิตจากบุคคลที่สาม | ควบคุมการโทรจิตจากเกมของคุณไปยัง เกมที่คุณไม่ได้เป็นเจ้าของ คุณสามารถปิดการตั้งค่านี้และยังโทรจิตผู้เล่นระหว่างเกมที่เผยแพร่ซึ่งคุณเป็นเจ้าของ |
การควบคุมการเข้าถึงสำหรับสถานที่ ควบคุมการโทรจิตของผู้เล่น เข้าสู่ เกมของคุณและเป็นการตั้งค่าที่สำคัญที่สุดในการป้องกันการทุจริตที่อิงจากการโทรจิต

หากคุณเลือก เปิดทั้งหมด ผู้เล่นสามารถเข้าร่วมสถานที่ใดๆ ในเกมของคุณผ่านการโทรจิตจากเกมใดๆ รวมถึงลิงก์ลึก การเชิญเกม การเข้าร่วมเพื่อน และอื่นๆ
นี่เป็นทางเลือกที่ดีหากเกมของคุณมีสถานที่หลายแห่งและคุณต้องการให้เพื่อนสามารถเข้าร่วมกันได้อย่างง่ายดายไม่ว่าพวกเขาจะอยู่ในสถานที่ใด หากคุณไม่เลือกตัวเลือกนี้ ผู้เล่นที่พยายามเข้าร่วมเพื่อนของตนในสถานที่ที่ไม่ใช่สถานที่เริ่มต้นจะแทนที่เข้าร่วมสถานที่เริ่มต้นของเกมของคุณ
หากคุณเลือก จำกัดเฉพาะจักรวาลเดียวกัน ผู้เล่นจะสามารถเข้าร่วมสถานที่ที่ไม่ใช่สถานที่เริ่มต้นผ่านการโทรจิตภายในเกมของคุณเท่านั้น การตั้งค่านี้อนุญาตให้มีการโทรจิตทั้งจากไคลเอนต์และเซิร์ฟเวอร์
นี่เป็นทางเลือกที่ดีหากคุณมีเกมเก่าที่คุณไม่ต้องการ เปลี่ยนไปใช้งานการโทรจิตที่ปลอดภัย
หากคุณเลือก ปลอดภัยในจักรวาลเท่านั้น ผู้เล่นสามารถเข้าร่วมสถานที่ที่ไม่ใช่สถานที่เริ่มต้นผ่านการโทรจิตที่คิดริเริ่มจากเซิร์ฟเวอร์ภายในเกมนี้เท่านั้น
นี่เป็นทางเลือกที่ดีหากเกมของคุณมีระบบความก้าวหน้าที่เข้มงวดก่อนที่ผู้เล่นจะสามารถเข้าถึงบางพื้นที่ นอกจากนี้ยังเป็นทางเลือกที่ดีหากเกมของคุณมีสถานที่ทดสอบที่ผู้เล่นไม่ควรเข้าถึงหรือสำหรับสถานที่ที่ใช้เซิร์ฟเวอร์ที่ถูกสงวนไว้เท่านั้น
เปลี่ยนไปใช้งานการโทรจิตที่ปลอดภัย
หากคุณมีเกมที่มีอยู่ที่ใช้การโทรจิตจากฝ่ายคล้ายและต้องการที่จะต้องใช้การโทรจิตที่เริ่มต้นจากเซิร์ฟเวอร์ เป้าหมายคือการย้ายตรรกะทั้งหมดของการโทรจิตออกจากสคริปต์ไคลเอนต์และไปยังสคริปต์เซิร์ฟเวอร์:
- ค้นหาทั้งหมดของสคริปต์ไคลเอนต์ที่เรียกใช้ Teleport()
- เปลี่ยนการเรียกเหล่านี้เพื่อยิง เหตุการณ์ระยะไกล แทน นอกจากนี้ คุณสามารถเปลี่ยนการเรียกเพื่อใช้ ProximityPrompts ClickDetectors หรือแม้แต่เหตุการณ์ BasePart.Touched ก็ได้
- ทำการโทรจิตใหม่ในสคริปต์เซิร์ฟเวอร์ด้วย TeleportAsync()
สร้างหน้าจอการโทรจิตที่กำหนดเอง
เมื่อผู้ใช้กระตุ้นการโทรจิต พวกเขาจะเห็นหน้าจอโหลดแบบมาตรฐานของ Roblox ขณะที่รอให้สถานที่ใหม่โหลด หากต้องการ คุณสามารถเพิ่มหน้าจอการโทรจิตที่กำหนดเองโดยการเรียก TeleportService:SetTeleportGui() บนไคลเอนต์
ตัวอย่างต่อไปนี้ตั้งค่าชุด ScreenGui ที่ปรับแต่งจาก ReplicatedStorage สคริปต์ใดๆ ภายใน ScreenGui จะ ไม่ ทำงาน
local TeleportService = game:GetService("TeleportService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportGui = ReplicatedStorage.TeleportGuiTeleportService:SetTeleportGui(teleportGui)
ปรับแต่งตัวเลือกการโทรจิต
คุณสามารถปรับแต่งการโทรจิต เช่น โทรจิตผู้ใช้ไปยังเซิร์ฟเวอร์เฉพาะ และ ส่งข้อมูลผู้ใช้ไปพร้อมกับการโทรจิต โดยการตั้งค่าอินสแตนซ์ TeleportOptions และส่งไปยังวิธีการ TeleportService:TeleportAsync()
โทรจิตไปยังเซิร์ฟเวอร์เฉพาะ
ในการโทรจิตผู้ใช้ไปยังเซิร์ฟเวอร์เฉพาะ ตั้งค่าเซิร์ฟเวอร์เป้าหมายโดยใช้ TeleportOptions และส่งไปยังวิธีการ TeleportAsync() หากคุณไม่ระบุเซิร์ฟเวอร์ ผู้ใช้จะถูกโทรจิตไปยังเซิร์ฟเวอร์สาธารณะ ข้อมูลของผู้ใช้คนแรกในรายการจะถูกใช้สำหรับการจัดการคู่
ในการโทรจิตผู้ใช้ไปยังเซิร์ฟเวอร์สาธารณะเฉพาะ ให้ตั้งค่า TeleportOptions.ServerInstanceId เป็น ID อินสแตนซ์ที่ถูกต้อง ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์สาธารณะ
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ServerInstanceId = targetServerId
ในการโทรจิตผู้ใช้ไปยังเซิร์ฟเวอร์ที่ถูกสงวนไว้เฉพาะ ตั้งค่า TeleportOptions.ReservedServerAccessCode ที่ถูกต้อง ซึ่งเป็นรหัสที่ไม่ซ้ำกันสำหรับการเข้าสู่เซิร์ฟเวอร์ที่ถูกสงวนไว้
local teleportOptions = Instance.new("TeleportOptions")teleportOptions.ReservedServerAccessCode = reservedServerCode
ในการโทรจิตผู้ใช้ไปยังเซิร์ฟเวอร์ที่ถูกสงวนใหม่ ตั้งค่า TeleportOptions.ShouldReserveServer เป็น true
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() ซึ่งคืนค่าดิกชันนารีพร้อมคีย์ 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 .. " เข้าร่วมด้วยหมายเลข " .. 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 -- ระบุผลของ pcall นอกลูปเพื่อให้ผลลัพธ์รายงานได้ทีหลัง
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(("การโทรจิตไม่ถูกต้อง [%s]: %s"):format(teleportResult.Name, errorMessage))
end
SafeTeleport(targetPlaceId, {player}, teleportOptions)
end
TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)
return SafeTeleport
ฟังก์ชัน SafeTeleport จะได้รับอาร์กิวเมนต์เดียวกันกับฟังก์ชัน TeleportAsync() คุณสามารถใช้สคริปต์ต่อไปนี้ร่วมกับฟังก์ชัน SafeTeleport เพื่อทำการโทรจิตจากทุกที่ในเกมของคุณ:
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)