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

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

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

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

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

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

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

อ้างอิงด่วน

ตารางต่อไปนี้ทำหน้าที่เป็นการอ้างอิงด่วนสำหรับวิธีการใช้ 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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
การยิงเหตุการณ์ - สคริปต์

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote event
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote function
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")
-- รับการอ้างอิงไปยังอินสแตนซ์ remote function
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 และสื่อสารจาก เซิร์ฟเวอร์ไปยังไคลเอนต์

ข้อจำกัดพารามิเตอร์

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

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

หาก ดัชนี ใด ๆ ของตารางที่ส่งไปเป็นประเภทที่ไม่ใช่สตริง เช่น Instance, userdata หรือ function 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("Hello world!")
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 เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ