เหตุการณ์ระยะไกลและการเรียกกลับ

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

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

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

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

แตกต่างจาก เหตุการณ์ที่สามารถผูกได้ ซึ่งมีการใช้งานที่จำกัดมากกว่า กรณีการใช้งานสำหรับเหตุการณ์และฟังก์ชันระยะไกลมีมากเกินกว่าจะระบุได้:

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

อ้างอิงด่วน

ตารางต่อไปนี้ทำหน้าที่เป็นการอ้างอิงด่วนสำหรับวิธีการใช้ RemoteEvents และ RemoteFunctions เพื่อสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์

ไคลเอนต์ → เซิร์ฟเวอร์
ไคลเอนต์RemoteEvent:FireServer(args)
เซิร์ฟเวอร์RemoteEvent.OnServerEvent:Connect(function(player, args))
เซิร์ฟเวอร์ → ไคลเอนต์
เซิร์ฟเวอร์RemoteEvent:FireClient(player, args)
ไคลเอนต์RemoteEvent.OnClientEvent:Connect(function(args))
เซิร์ฟเวอร์ → ไคลเอนต์ทั้งหมด
เซิร์ฟเวอร์RemoteEvent:FireAllClients(args)
ไคลเอนต์RemoteEvent.OnClientEvent:Connect(function(args))

เหตุการณ์ระยะไกล

วัตถุ RemoteEvent ช่วยให้การสื่อสารแบบไม่ซิงโครนัสและแบบทางเดียวข้ามขอบเขตของไคลเอนต์และเซิร์ฟเวอร์โดยไม่ต้องรอการตอบกลับ

ในการสร้าง RemoteEvent ใหม่ผ่านหน้าต่าง Explorer ใน Studio:

  1. เลื่อนเมาส์ไปที่คอนเทนเนอร์ที่คุณต้องการแทรก RemoteEvent เพื่อให้แน่ใจว่าทั้งเซิร์ฟเวอร์และไคลเอนต์สามารถเข้าถึงได้ จะต้องอยู่ในที่ที่ทั้งสองฝ่ายสามารถมองเห็นได้ เช่น ReplicatedStorage แม้ว่าบางกรณีอาจเหมาะสมที่จะเก็บไว้ใน Workspace หรือภายใน Tool
  2. คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และแทรกอินสแตนซ์ RemoteEvent
  3. เปลี่ยนชื่ออินสแตนซ์เพื่ออธิบายวัตถุประสงค์ของมัน

เมื่อคุณสร้าง RemoteEvent แล้ว มันสามารถช่วยให้การสื่อสารแบบทางเดียวจาก ไคลเอนต์ไปยังเซิร์ฟเวอร์, จาก เซิร์ฟเวอร์ไปยังไคลเอนต์, หรือจาก เซิร์ฟเวอร์ไปยังไคลเอนต์ทั้งหมด

ไคลเอนต์ → เซิร์ฟเวอร์
เซิร์ฟเวอร์ → ไคลเอนต์
เซิร์ฟเวอร์ → ไคลเอนต์ทั้งหมด

ไคลเอนต์ → เซิร์ฟเวอร์

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

ไคลเอนต์RemoteEvent:FireServer(args)
เซิร์ฟเวอร์RemoteEvent.OnServerEvent:Connect(function(player, args))

สคริปต์ Script ต่อไปนี้เชื่อมต่อฟังก์ชันตัวจัดการเหตุการณ์กับ OnServerEvent ที่สร้าง Part ใหม่บนเซิร์ฟเวอร์ สคริปต์ LocalScript ที่เกี่ยวข้องจะเรียก FireServer() บนอินสแตนซ์ RemoteEvent ด้วย Color และ Position ที่ต้องการสำหรับชิ้นส่วน

การเชื่อมต่อเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " ได้เรียกใช้ RemoteEvent")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnServerEvent:Connect(onCreatePart)
การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- เรียกเหตุการณ์ระยะไกลและส่งอาร์กิวเมนต์เพิ่มเติม
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))

เซิร์ฟเวอร์ → ไคลเอนต์

คุณสามารถใช้ Script เพื่อกระตุ้นเหตุการณ์บน ไคลเอนต์ โดยเรียกใช้วิธี FireClient() บน RemoteEvent อาร์กิวเมนต์แรกสำหรับ FireClient() คือวัตถุ Player ของไคลเอนต์ที่คุณต้องการให้ตอบสนองต่อเหตุการณ์ และอาร์กิวเมนต์เพิ่มเติมจะถูกส่งไปยังไคลเอนต์พร้อมกับ ข้อจำกัด บางประการ โปรดทราบว่าตัวจัดการเหตุการณ์ไม่จำเป็นต้องรวมวัตถุ Player ไว้เป็นอาร์กิวเมนต์แรกเพราะคุณสามารถกำหนดผู้เล่นบนไคลเอนต์ด้วย Players.LocalPlayer

เซิร์ฟเวอร์RemoteEvent:FireClient(player, args)
ไคลเอนต์RemoteEvent.OnClientEvent:Connect(function(args))

สคริปต์ LocalScript ต่อไปนี้เชื่อมต่อฟังก์ชันตัวจัดการเหตุการณ์กับเหตุการณ์ OnClientEvent สคริปต์ Script ที่เกี่ยวข้องจะฟังผู้เล่นที่เข้ามาในเซิร์ฟเวอร์และเรียก FireClient() สำหรับแต่ละคนด้วยข้อมูลที่กำหนดเอง

การเชื่อมต่อเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[ไคลเอนต์] เหตุการณ์ที่ได้รับจากผู้เล่น", player.Name)
print(maxPlayers, respawnTime)
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)
การเรียกเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ฟังผู้เล่นที่เข้ามาและส่งเหตุการณ์ระยะไกลไปยังแต่ละคน
local function onPlayerAdded(player)
print("[เซิร์ฟเวอร์] เรียกเหตุการณ์ไปยังผู้เล่น", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)

เซิร์ฟเวอร์ → ไคลเอนต์ทั้งหมด

คุณสามารถใช้ Script เพื่อกระตุ้นเหตุการณ์บนไคลเอนต์ทั้งหมดโดยเรียกใช้วิธี FireAllClients() บน RemoteEvent แตกต่างจาก FireClient() วิธี FireAllClients() ไม่ต้องการวัตถุ Player เพราะมันจะส่ง RemoteEvent ไปยังไคลเอนต์ทั้งหมด

เซิร์ฟเวอร์RemoteEvent:FireAllClients(args)
ไคลเอนต์RemoteEvent.OnClientEvent:Connect(function(args))

สคริปต์ LocalScript ต่อไปนี้เชื่อมต่อฟังก์ชันตัวจัดการเหตุการณ์กับเหตุการณ์ OnClientEvent ซึ่งแสดงเวลานับถอยหลังที่เหลือ สคริปต์ Script ที่เกี่ยวข้องจะเรียก FireAllClients() ในลูปทุก ๆ วินาทีเพื่อส่ง RemoteEvent สำหรับไคลเอนต์ทั้งหมด

การเชื่อมต่อเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
การเรียกเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงไปยังอินสแตนซ์เหตุการณ์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- เรียก RemoteEvent ทุก ๆ วินาทีจนกว่าจะหมดเวลา
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
end

การเรียกกลับระยะไกล

วัตถุ RemoteFunction ช่วยให้การสื่อสารแบบซิงโครนัสและแบบสองทางข้ามขอบเขตของไคลเอนต์และเซิร์ฟเวอร์ ผู้ส่งฟังก์ชันระยะไกลจะรอจนกว่าจะได้รับการตอบกลับจากผู้รับ

ในการสร้าง RemoteFunction ใหม่ผ่านหน้าต่าง Explorer ใน Studio:

  1. เลื่อนเมาส์ไปที่คอนเทนเนอร์ที่คุณต้องการแทรก RemoteFunction เพื่อให้แน่ใจว่าทั้งเซิร์ฟเวอร์และไคลเอนต์สามารถเข้าถึงได้ จะต้องอยู่ในที่ที่ทั้งสองฝ่ายสามารถมองเห็นได้ เช่น ReplicatedStorage แม้ว่าบางกรณีอาจเหมาะสมที่จะเก็บไว้ใน Workspace หรือภายใน Tool
  2. คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และแทรกอินสแตนซ์ RemoteFunction
  3. เปลี่ยนชื่ออินสแตนซ์เพื่ออธิบายวัตถุประสงค์ของมัน

เมื่อคุณสร้าง RemoteFunction แล้ว มันสามารถช่วยให้การสื่อสารแบบสองทางระหว่าง ไคลเอนต์และเซิร์ฟเวอร์ หรือระหว่าง เซิร์ฟเวอร์และไคลเอนต์

ไคลเอนต์ → เซิร์ฟเวอร์ → ไคลเอนต์
เซิร์ฟเวอร์ → ไคลเอนต์ → เซิร์ฟเวอร์

ไคลเอนต์ → เซิร์ฟเวอร์ → ไคลเอนต์

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

ไคลเอนต์RemoteFunction:InvokeServer(args)
เซิร์ฟเวอร์RemoteFunction.OnServerInvoke = function(player, args)

สคริปต์ Script ต่อไปนี้กำหนดฟังก์ชันการเรียกกลับผ่าน OnServerInvoke และส่งคืน Part ที่ร้องขอผ่านค่าที่ส่งคืน สคริปต์ LocalScript ที่เกี่ยวข้องจะเรียก InvokeServer() พร้อมอาร์กิวเมนต์เพิ่มเติมที่กำหนดสีและตำแหน่งของชิ้นส่วนที่ร้องขอ

การเชื่อมต่อการเรียกกลับ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- รับการอ้างอิงไปยังอินสแตนซ์ฟังก์ชันระยะไกล
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- ฟังก์ชันการเรียกกลับ
local function createPart(player, partColor, partPosition)
print(player.Name .. " ได้ขอชิ้นส่วนใหม่")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
return newPart
end
-- ตั้งฟังก์ชันเป็นการเรียกกลับของฟังก์ชันระยะไกล
remoteFunction.OnServerInvoke = createPart
การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงไปยังอินสแตนซ์ฟังก์ชันระยะไกล
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- ส่งสีและตำแหน่งเมื่อเรียกใช้การเรียกกลับ
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- แสดงการอ้างอิงชิ้นส่วนที่ส่งคืน
print("เซิร์ฟเวอร์ได้สร้างชิ้นส่วนที่ร้องขอ:", newPart)

เซิร์ฟเวอร์ → ไคลเอนต์ → เซิร์ฟเวอร์

คุณสามารถใช้ Script เพื่อเรียกฟังก์ชันบนไคลเอนต์โดยเรียกใช้วิธี InvokeClient() บน RemoteFunction แต่มีความเสี่ยงที่ร้ายแรงดังนี้:

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

สำหรับการกระทำที่ไม่ต้องการการสื่อสารแบบสองทาง เช่น การอัปเดต GUI ให้ใช้ RemoteEvent และสื่อสารจาก เซิร์ฟเวอร์ไปยังไคลเอนต์

การรับประกันการส่ง

แต่ละประเภทระยะไกลมีคำมั่นสัญญาที่แตกต่างกันเกี่ยวกับว่าข้อความจะมาถึงและในลำดับใด คำมั่นสัญญาเหล่านี้ใช้ได้เฉพาะกับการเชื่อมต่อเดียวในทิศทางเดียว ซึ่งหมายถึงจากเซิร์ฟเวอร์ไปยังไคลเอนต์เฉพาะหนึ่ง หรือจากไคลเอนต์เฉพาะหนึ่งไปยังเซิร์ฟเวอร์

RemoteEvents

RemoteEvents มีความเชื่อถือได้และมีลำดับ:

  • หากข้อความสูญหายในระหว่างการส่ง Roblox จะส่งข้อความซ้ำจนกว่าจะมาถึง ตราบใดที่ผู้รับยังเชื่อมต่ออยู่
  • ข้อความจะมาถึงในลำดับที่คุณส่ง รวมถึงข้ามอินสแตนซ์ RemoteEvent ที่แตกต่างกัน ตัวอย่างเช่น หากเซิร์ฟเวอร์ส่งเหตุการณ์ A จากนั้น B จากนั้น A อีกครั้งไปยังไคลเอนต์เดียวกัน ไคลเอนต์นั้นจะได้รับ A, B, A สิ่งนี้ใช้ได้ไม่ว่าคุณจะใช้ FireClient() หรือ FireAllClients()
  • หากไคลเอนต์ส่งเหตุการณ์เร็วเกินกว่าขีดจำกัด การควบคุมอัตรา เซิร์ฟเวอร์จะประมวลผลเหตุการณ์ที่เกินในภายหลังแทนที่จะทิ้งพวกมัน และพวกเขาจะรักษาลำดับของพวกเขา

ข้อความที่เชื่อถือได้และมีลำดับยังสามารถล้มเหลวในการเข้าถึงโค้ดของคุณในกรณีต่อไปนี้:

  • ไม่มีตัวจัดการเชื่อมต่ออยู่ หากไม่มีอะไรเชื่อมต่อกับ OnServerEvent หรือ OnClientEvent เมื่อข้อความมาถึง Roblox จะจัดคิวข้อความและส่งมอบในลำดับเมื่อมีการเชื่อมต่อกับตัวจัดการ คิวมีข้อจำกัดทั้งในจำนวนและหน่วยความจำ เมื่อมันเต็ม Roblox จะทิ้งข้อความเพิ่มเติมและบันทึกข้อผิดพลาด Remote event invocation ไปยังหน้าต่าง Output
  • ผู้รับตัดการเชื่อมต่อ ข้อความที่ยังไม่ได้ส่งมอบเมื่อไคลเอนต์ออกจะสูญหาย

การจัดลำดับจะใช้กับเมื่อแต่ละตัวจัดการ เริ่มต้น ไม่ใช่เมื่อมันเสร็จสิ้น หากตัวจัดการหยุดชะงัก เช่น โดยการเรียก task.wait() หรือ WaitForChild() Roblox สามารถเริ่มจัดการข้อความถัดไปก่อนที่ตัวจัดการก่อนหน้านี้จะกลับมา

RemoteFunctions

RemoteFunctions ส่งการเรียกใช้และการตอบกลับอย่างเชื่อถือได้ ดังนั้น Roblox จะส่งข้อความที่สูญหายซ้ำตราบใดที่ทั้งสองฝ่ายยังเชื่อมต่ออยู่ เนื่องจาก InvokeServer() และ InvokeClient() จะหยุดชะงักจนกว่าจะได้รับการตอบกลับ เธรดเดียวไม่สามารถมีการเรียกใช้มากกว่าหนึ่งการเรียกใช้ในระหว่างการบินได้ เธรดแยกสามารถเรียกใช้พร้อมกันได้ และหากการเรียกกลับหยุดชะงัก การตอบกลับอาจกลับมาในลำดับที่แตกต่างจากที่การเรียกใช้ถูกส่ง

หากไม่มีการเรียกกลับที่กำหนดไว้ใน OnServerInvoke หรือ OnClientInvoke Roblox จะจัดคิวการเรียกใช้จนกว่าจะมีการกำหนดไว้ คิวนี้มีข้อจำกัดประเภทเดียวกันกับคิว RemoteEvent

UnreliableRemoteEvents

UnreliableRemoteEvents ไม่รับประกันการส่งหรือการจัดลำดับ พวกเขายังไม่มีความสัมพันธ์ในการจัดลำดับกับ RemoteEvents หรือ RemoteFunctions Roblox อาจทิ้งข้อความในกรณีใด ๆ ต่อไปนี้โดยไม่ส่งซ้ำ:

  • ข้อความสูญหายในระหว่างการส่ง
  • เครือข่ายมีความแออัดและข้อความรอส่งนานเกินไป
  • ข้อมูลที่ส่งมีขนาดใหญ่กว่า 1,000 ไบต์
  • ไคลเอนต์ส่งเร็วเกินกว่าขีดจำกัด การควบคุมอัตรา แตกต่างจาก RemoteEvent เซิร์ฟเวอร์จะทิ้งข้อความที่เกินแทนที่จะเลื่อนเวลา
  • ไม่มีอะไรเชื่อมต่อกับ OnServerEvent หรือ OnClientEvent เมื่อข้อความมาถึง แตกต่างจาก RemoteEvent Roblox จะทิ้งข้อความทันทีแทนที่จะจัดคิว

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

ข้อจำกัดการควบคุมอัตราและขนาด

ข้อความจากไคลเอนต์ไปยังเซิร์ฟเวอร์จะต้องอยู่ภายใต้การจำกัดอัตราที่แต่ละประเภทระยะไกลจะแบ่งปันข้ามอินสแตนซ์ทั้งหมด สำหรับขีดจำกัดปัจจุบัน ดูที่ส่วน การควบคุมอัตรา ของ RemoteEvent และขีดจำกัดข้อมูลใน UnreliableRemoteEvent

ข้อจำกัดของอาร์กิวเมนต์

เมื่อคุณเรียกใช้ RemoteEvent หรือเรียกใช้ RemoteFunction มันจะส่งต่ออาร์กิวเมนต์ใด ๆ ที่คุณส่งไปพร้อมกับเหตุการณ์หรือไปยังฟังก์ชันการเรียกกลับ ประเภทของวัตถุ Roblox ใด ๆ เช่น Enum, Instance หรืออื่น ๆ สามารถส่งได้ รวมถึงประเภท Luau เช่น ตัวเลข สตริง และบูลีน แม้ว่าคุณควรสำรวจข้อจำกัดต่อไปนี้อย่างรอบคอบ

ดัชนีที่ไม่ใช่สตริง

หากดัชนีใด ๆ ของตารางที่ส่งผ่านเป็นประเภทที่ไม่ใช่สตริง เช่น Instance, userdata หรือ ฟังก์ชัน Roblox จะเปลี่ยนดัชนีเหล่านั้นโดยอัตโนมัติเป็นสตริง

การเชื่อมต่อเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnClientEvent:Connect(onEventFire)
การเรียกเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ฟังผู้เล่นที่เข้ามาและส่งเหตุการณ์ระยะไกลไปยังแต่ละคน
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[Workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)

ฟังก์ชันที่ส่งผ่าน

ฟังก์ชันที่รวมอยู่ในอาร์กิวเมนต์สำหรับ RemoteEvent หรือ RemoteFunction จะ ไม่ ถูกทำซ้ำข้ามขอบเขต ไคลเอนต์-เซิร์ฟเวอร์ ทำให้ไม่สามารถส่งฟังก์ชันได้จากระยะไกล แทนที่จะเป็นอาร์กิวเมนต์ที่ส่งไปยังด้านที่รับจะเป็น nil

การเชื่อมต่อเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> nil
end
remoteEvent.OnClientEvent:Connect(onClientEvent)
การเรียกเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("สวัสดีชาวโลก!")
end
-- เรียกเหตุการณ์ระยะไกลด้วยฟังก์ชันเป็นอาร์กิวเมนต์
remoteEvent:FireAllClients(testFunction)

การจัดทำดัชนีตาราง

หากคุณส่งตารางข้อมูล อย่าส่งตารางที่มีคีย์ตัวเลขและสตริงผสมกัน แทนที่จะส่งตารางที่ประกอบด้วย คู่คีย์-ค่า (พจนานุกรม) ทั้งหมด หรือ ดัชนีตัวเลข ทั้งหมด

การเชื่อมต่อเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(player, passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = ดาบ
--> 2 = คันธนู
--> CharName = Diva Dragonslayer
--> CharClass = Rogue
end
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnServerEvent:Connect(onEventFire)
การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ตารางที่มีดัชนีตัวเลข
local inventoryData = {
"ดาบ", "คันธนู"
}
-- ตารางพจนานุกรม
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)

เอกลักษณ์ของตาราง

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

การเชื่อมต่อการเรียกกลับ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- ฟังก์ชันการเรียกกลับ
local function returnTable(player, passedTable)
-- แสดงเอกลักษณ์ของตารางเมื่อเรียกใช้
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- ตั้งฟังก์ชันเป็นการเรียกกลับของฟังก์ชันระยะไกล
remoteFunction.OnServerInvoke = returnTable
การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"ดาบ", "คันธนู"
}
-- แสดงเอกลักษณ์ของตารางต้นฉบับ
print(tostring(inventoryData)) --> table: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- แสดงเอกลักษณ์ของตารางเมื่อส่งคืน
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

เมตาเทเบิล

หากตารางมีเมตาเทเบิล ข้อมูลทั้งหมดของเมตาเทเบิลจะหายไปในการส่ง ในตัวอย่างโค้ดต่อไปนี้ คุณสมบัติ NumWheels เป็นส่วนหนึ่งของเมตาเทเบิล Car เมื่อเซิร์ฟเวอร์ได้รับตารางต่อไปนี้ ตาราง truck จะมีคุณสมบัติ Name แต่ ไม่มี คุณสมบัติ NumWheels

การเชื่อมต่อเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> {["Name"] = "MyTruck"}
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnServerEvent:Connect(onEvent)
การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- ส่งเหตุการณ์ด้วยตารางที่รวมเมตาเทเบิล
remoteEvent:FireServer(truck)

อินสแตนซ์ที่ไม่ถูกทำซ้ำ

หาก RemoteEvent หรือ RemoteFunction ส่งค่าที่มองเห็นได้เฉพาะสำหรับผู้ส่ง Roblox จะไม่ทำซ้ำข้ามขอบเขตของไคลเอนต์และเซิร์ฟเวอร์และส่งค่า nil แทนค่า ตัวอย่างเช่น หาก Script ส่งลูกหลานของ ServerStorage ไคลเอนต์ที่ฟังเหตุการณ์จะได้รับค่า nil เพราะวัตถุที่ไม่สามารถทำซ้ำได้สำหรับไคลเอนต์

การเรียกเหตุการณ์ - สคริปต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- จะได้รับเป็น "nil" เพราะไคลเอนต์ไม่สามารถเข้าถึง ServerStorage ได้
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)

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

การเรียกเหตุการณ์ - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- จะได้รับเป็น "nil" เพราะเซิร์ฟเวอร์ไม่รู้จักชิ้นส่วนนี้
local clientPart = Instance.new("Part")
clientPart.Parent = Workspace
remoteEvent:FireServer(clientPart)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ