เกม 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:
- เลื่อนเมาส์ไปที่โฟลเดอร์ที่คุณต้องการแทรก RemoteEvent ในการที่จะมั่นใจว่ามีการเข้าถึงทั้งเซิร์ฟเวอร์และไคลเอนต์ มันต้องอยู่ในที่ที่ทั้งสองด้านสามารถมองเห็นได้ เช่น ReplicatedStorage แม้ว่าบางกรณีอาจเหมาะสมที่จะเก็บไว้ใน Workspace หรือภายใน Tool
- คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อของโฟลเดอร์และแทรก RemoteEvent อินสแตนซ์
- เปลี่ยนชื่ออินสแตนซ์เพื่อบรรยายวัตถุประสงค์ของมัน
เมื่อคุณสร้าง 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)
การยิงเหตุการณ์ - LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- รับการอ้างอิงไปยังอินสแตนซ์ remote eventlocal 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 eventlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local countdown = 5-- ยิง RemoteEvent ทุกวินาทีจนกว่าจะหมดเวลาfor timeRemaining = -1, countdown doremoteEvent:FireAllClients(countdown - timeRemaining)task.wait(1)end
การเรียกกลับระยะไกล
วัตถุ RemoteFunction ช่วยให้การสื่อสารแบบสองทิศทางที่ซิงโครนัสข้ามขอบเขตไคลเอนต์-เซิร์ฟเวอร์ ผู้ส่งฟังก์ชันระยะไกลจะค้างรอจนกว่าจะได้รับการตอบกลับจากผู้รับ
ในการสร้าง RemoteFunction ใหม่ผ่านหน้าต่าง Explorer ใน Studio:
- เลื่อนเมาส์ไปที่โฟลเดอร์ที่คุณต้องการแทรก RemoteFunction เพื่อให้มั่นใจว่ามีการเข้าถึงทั้งเซิร์ฟเวอร์และไคลเอนต์ มันต้องอยู่ในที่ที่ทั้งสองด้านสามารถมองเห็นได้ เช่น ReplicatedStorage แม้ว่าบางกรณีอาจเหมาะสมที่จะเก็บไว้ใน Workspace หรือภายใน Tool
- คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อของโฟลเดอร์และแทรก RemoteFunction อินสแตนซ์
- เปลี่ยนชื่ออินสแตนซ์เพื่อบรรยายวัตถุประสงค์ของมัน
เมื่อคุณสร้าง 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
การเรียกเหตุการณ์ - LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- รับการอ้างอิงไปยังอินสแตนซ์ remote functionlocal 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)
การยิงเหตุการณ์ - LocalScriptlocal 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
การเรียกเหตุการณ์ - LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")local inventoryData = {"ดาบ", "คันธนู"}-- แสดงความสัมพันธ์ของตารางต้นฉบับprint(tostring(inventoryData)) --> table: 0x059bcdbb2b576549local 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)
การยิงเหตุการณ์ - LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal 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 เพราะชิ้นส่วนนั้นไม่สามารถจำลองได้สำหรับเซิร์ฟเวอร์
การยิงเหตุการณ์ - LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Workspace = game:GetService("Workspace")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- จะได้รับเป็น "nil" เพราะเซิร์ฟเวอร์ไม่รู้จักชิ้นส่วนนั้นlocal clientPart = Instance.new("Part")clientPart.Parent = WorkspaceremoteEvent:FireServer(clientPart)