โทรจิตระหว่างสถานที่

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เกมหลายเกมมีการแบ่งออกเป็นหลาย สถานที่ เช่นโลกแฟนตาซีที่มีเมือง ปราสาท ดันเจี้ยน และป่าอันกว้างใหญ่ ใช้ 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() หากคุณต้องการโทรจิตกลุ่มทั้งหมดแทนเฉพาะบุคคล

กำหนดค่าการโทรจิตที่ปลอดภัย

การตั้งค่าทั้งสามจัดการความปลอดภัยในการโทรจิต

การตั้งค่าคำอธิบาย
(แดชบอร์ดผู้สร้าง) ผู้ชม > การตั้งค่าการเข้าถึง > การควบคุมการเข้าถึงสำหรับสถานที่ควบคุมว่าผู้เล่นสามารถเข้าร่วมสถานที่ใดๆ ในเกมของคุณหรือจะต้องเข้าร่วม สถานที่เริ่มต้น ก่อน
(แดชบอร์ดผู้สร้าง) สถานที่ > การเข้าถึง > การควบคุมการเข้าถึงโดยตรงแทนที่การตั้งค่าการควบคุมการเข้าถึงระดับเกมของคุณสำหรับสถานที่ที่ไม่ใช่สถานที่เริ่มต้น
(สตูดิโอ) ไฟล์ > การตั้งค่าประสบการณ์ > ความปลอดภัย > อนุญาตให้มีการโทรจิตจากบุคคลที่สามควบคุมการโทรจิตจากเกมของคุณไปยัง เกมที่คุณไม่ได้เป็นเจ้าของ คุณสามารถปิดการตั้งค่านี้และยังโทรจิตผู้เล่นระหว่างเกมที่เผยแพร่ซึ่งคุณเป็นเจ้าของ

การควบคุมการเข้าถึงสำหรับสถานที่ ควบคุมการโทรจิตของผู้เล่น เข้าสู่ เกมของคุณและเป็นการตั้งค่าที่สำคัญที่สุดในการป้องกันการทุจริตที่อิงจากการโทรจิต

การควบคุมการเข้าถึงสำหรับสถานที่บน Creator Hub

  • หากคุณเลือก เปิดทั้งหมด ผู้เล่นสามารถเข้าร่วมสถานที่ใดๆ ในเกมของคุณผ่านการโทรจิตจากเกมใดๆ รวมถึงลิงก์ลึก การเชิญเกม การเข้าร่วมเพื่อน และอื่นๆ

    นี่เป็นทางเลือกที่ดีหากเกมของคุณมีสถานที่หลายแห่งและคุณต้องการให้เพื่อนสามารถเข้าร่วมกันได้อย่างง่ายดายไม่ว่าพวกเขาจะอยู่ในสถานที่ใด หากคุณไม่เลือกตัวเลือกนี้ ผู้เล่นที่พยายามเข้าร่วมเพื่อนของตนในสถานที่ที่ไม่ใช่สถานที่เริ่มต้นจะแทนที่เข้าร่วมสถานที่เริ่มต้นของเกมของคุณ

  • หากคุณเลือก จำกัดเฉพาะจักรวาลเดียวกัน ผู้เล่นจะสามารถเข้าร่วมสถานที่ที่ไม่ใช่สถานที่เริ่มต้นผ่านการโทรจิตภายในเกมของคุณเท่านั้น การตั้งค่านี้อนุญาตให้มีการโทรจิตทั้งจากไคลเอนต์และเซิร์ฟเวอร์

    นี่เป็นทางเลือกที่ดีหากคุณมีเกมเก่าที่คุณไม่ต้องการ เปลี่ยนไปใช้งานการโทรจิตที่ปลอดภัย

  • หากคุณเลือก ปลอดภัยในจักรวาลเท่านั้น ผู้เล่นสามารถเข้าร่วมสถานที่ที่ไม่ใช่สถานที่เริ่มต้นผ่านการโทรจิตที่คิดริเริ่มจากเซิร์ฟเวอร์ภายในเกมนี้เท่านั้น

    นี่เป็นทางเลือกที่ดีหากเกมของคุณมีระบบความก้าวหน้าที่เข้มงวดก่อนที่ผู้เล่นจะสามารถเข้าถึงบางพื้นที่ นอกจากนี้ยังเป็นทางเลือกที่ดีหากเกมของคุณมีสถานที่ทดสอบที่ผู้เล่นไม่ควรเข้าถึงหรือสำหรับสถานที่ที่ใช้เซิร์ฟเวอร์ที่ถูกสงวนไว้เท่านั้น

เปลี่ยนไปใช้งานการโทรจิตที่ปลอดภัย

หากคุณมีเกมที่มีอยู่ที่ใช้การโทรจิตจากฝ่ายคล้ายและต้องการที่จะต้องใช้การโทรจิตที่เริ่มต้นจากเซิร์ฟเวอร์ เป้าหมายคือการย้ายตรรกะทั้งหมดของการโทรจิตออกจากสคริปต์ไคลเอนต์และไปยังสคริปต์เซิร์ฟเวอร์:

  1. ค้นหาทั้งหมดของสคริปต์ไคลเอนต์ที่เรียกใช้ Teleport()
  2. เปลี่ยนการเรียกเหล่านี้เพื่อยิง เหตุการณ์ระยะไกล แทน นอกจากนี้ คุณสามารถเปลี่ยนการเรียกเพื่อใช้ ProximityPrompts ClickDetectors หรือแม้แต่เหตุการณ์ BasePart.Touched ก็ได้
  3. ทำการโทรจิตใหม่ในสคริปต์เซิร์ฟเวอร์ด้วย TeleportAsync()
  4. เมื่อไม่มีการเรียก Teleport() อีกต่อไป เปลี่ยน การควบคุมการเข้าถึงสำหรับสถานที่ เป็น ปลอดภัย

สร้างหน้าจอการโทรจิตที่กำหนดเอง

เมื่อผู้ใช้กระตุ้นการโทรจิต พวกเขาจะเห็นหน้าจอโหลดแบบมาตรฐานของ Roblox ขณะที่รอให้สถานที่ใหม่โหลด หากต้องการ คุณสามารถเพิ่มหน้าจอการโทรจิตที่กำหนดเองโดยการเรียก TeleportService:SetTeleportGui() บนไคลเอนต์

ตัวอย่างต่อไปนี้ตั้งค่าชุด ScreenGui ที่ปรับแต่งจาก ReplicatedStorage สคริปต์ใดๆ ภายใน ScreenGui จะ ไม่ ทำงาน


local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportGui = ReplicatedStorage.TeleportGui
TeleportService: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)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ