อีเวนต์และคอลเลกชันระยะไกล และการโทรกลับ

*เนื้อหานี้แปลโดยใช้ 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. คลิกปุ่ม ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และใส่ตัวอย่าง กิจกรรมระยะไกล 3. เปลี่ยนชื่อตัวอย่างเพื่ออธิบายวัตถุประสงค์

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

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

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

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

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

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

การเชื่อมต่ออีเวนต์ - สคริปต์

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- รับการอ้างอิงถึงตัวอย่างอีเวนต์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " fired the RemoteEvent")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
end
-- เชื่อมฟังก์ชันกับอีเวนต์
remoteEvent.OnServerEvent:Connect(onCreatePart)
การยิงอีเวนต์ - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับการอ้างอิงถึงตัวอย่างอีเวนต์ระยะไกล
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ยิงเหตุการณ์ระยะไกลและส่งอาร์กิวเมนต์เพิ่มเติม
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))

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

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

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

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

การเชื่อมต่ออีเวนต์ - สคริปท์ท้องถิ่น

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("[Client] Event received by player", 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("[Server] Firing event to player", 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 สำหรับลูกค้าทั้งหมด

การเชื่อมต่ออีเวนต์ - สคริปท์ท้องถิ่น

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
-- ยิงอีเวนต์ระยะไกลทุกวินาทีจนกว่าเวลาจะหมดลง
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
end

การโทรกลับระยะไกล

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

เพื่อสร้างใหม่ RemoteFunction ผ่านหน้าต่าง Explorer ใน Studio:

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

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

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

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

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

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

ต่อไปนี้ Script กำหนดฟังก์ชันการโทรกลับผ่าน OnServerInvoke และส่งคืนค่าที่ร้องขอ Part ผ่านค่า return ของมันสิ่งที่ตามมา 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 .. " requested a new part")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
return newPart
end
-- กำหนดฟังก์ชันเป็น callback ของฟังก์ชันระยะไกล
remoteFunction.OnServerInvoke = createPart
การเรียกกิจกรรม - สคริปท์ท้องถิ่น

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("The server created the requested part:", newPart)

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

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

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

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

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

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

ดัชนีที่ไม่ใช่ข้อความ

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

การเชื่อมต่ออีเวนต์ - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> สตริง
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)

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

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

การเชื่อมต่ออีเวนต์ - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> ไม่มี
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
--> CharClass = โจร
end
end
-- เชื่อมฟังก์ชันกับอีเวนต์
remoteEvent.OnServerEvent:Connect(onEventFire)
การยิงอีเวนต์ - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ตารางที่จัดเรียงตามตัวเลข
local inventoryData = {
"Sword", "Bow"
}
-- ตารางสารานุกรม
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)) --> ตาราง: 0x48eb7aead27563d9
return passedTable
end
-- กำหนดฟังก์ชันเป็น callback ของฟังก์ชันระยะไกล
remoteFunction.OnServerInvoke = returnTable
การเรียกกิจกรรม - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"Sword", "Bow"
}
-- ออกรหัสตารางเดิม
print(tostring(inventoryData)) --> ตาราง: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- ระบุตัวตนของตารางออกเมื่อกลับ
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

ตารางเมตา

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

การเชื่อมต่ออีเวนต์ - สคริปต์

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["ชื่อ"] = "MyTruck"}
end
-- เชื่อมฟังก์ชันกับอีเวนต์
remoteEvent.OnServerEvent:Connect(onEvent)
การยิงอีเวนต์ - สคริปท์ท้องถิ่น

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")
-- จะได้รับเป็น "ไม่มี" เนื่องจากไคลเอนต์ไม่สามารถเข้าถึง 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 เพราะส่วนไม่สามารถสําเนาได้สําหรับเซิร์ฟเวอร์

การยิงอีเวนต์ - สคริปท์ท้องถิ่น

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- จะได้รับเป็น "ไม่มี" เพราะเซิร์ฟเวอร์ไม่ทราบเกี่ยวกับส่วนนี้
local clientPart = Instance.new("Part")
clientPart.Parent = Workspace
remoteEvent:FireServer(clientPart)