ย้ายระหว่างสถานที่

*เนื้อหานี้แปลโดยใช้ 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 รายบุคคล จากนั้นคุณสามารถตรวจสอบได้ว่าผู้เล่นเป็นส่วนหนึ่งของทีม (Player.Team) หรือปาร์ตี้ (Player.PartyId) สุดท้ายคุณสามารถใช้ Team:GetPlayers() หรือ SocialService:GetPlayersByPartyId() หากคุณต้องการย้ายกลุ่มทั้งหมดแทนที่จะเป็นรายบุคคล

กำหนดค่าการย้ายที่ปลอดภัย

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

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

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

การควบคุมการเข้าถึงสำหรับสถานที่ใน 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

ส่งข้อมูลผู้ใช้พร้อมกับการย้าย

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

  • หากเกมของคุณใช้ข้อมูลผู้ใช้ ที่ปลอดภัย เช่น สกุลเงินในเกมหรือสินค้าคงคลัง ให้ใช้ data stores หรือ memory stores เพื่อรักษาข้อมูลจากสถานที่หนึ่งไปยังอีกสถานที่หนึ่ง

  • เพื่อส่งข้อมูล ที่ไม่ปลอดภัย พื้นฐานจากสถานที่หนึ่งไปยังอีกสถานที่หนึ่ง ให้เรียก 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 เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ