เหตุการณ์และคืนเรียกระยะไกล

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

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

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

  • 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))

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

Class.RemoteEvent วัตถุเพิ่มการสื่อสารระหว่างเครื่องคอมพิวเตอร์และเซิร์ฟเวอร์โดยไม่ต้องส่งคำตอบ

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

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

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

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

ลูกค้า → เซิร์ฟเวอร์

คุณสามารถใช้ LocalScript เพื่อเรียกเหตุการณ์บน เซิร์ฟเวอร์</

ลูกค้าRemoteEvent:FireServer(args)
เซิร์ฟเวอร์RemoteEvent.OnServerEvent:Connect(function(player, args))

ต่อไปนี้ Script เชื่อมต่อตัวจัดการเหตุการณ์ไปยัง Class

การเชื่อมต่อเหตุการณ์ - สคริปต์

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับรหัสอ้างอิงไปยังตัวอย่างเหตุการณ์รีโมท
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)
การเหยียวโหมดอีเว้นท์ - LocalScript

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

เซิร์ฟเวอร์ → ลูกค้า

คุณสามารถใช้ Class

เซิร์ฟเวอร์RemoteEvent:FireClient(player, args)
ลูกค้าRemoteEvent.OnClientEvent:Connect(function(args))

ต่อไปนี้ LocalScript เชื่อมต่อตัวจัดการเหตุการณ์ไปยังเหตุการณ์ OnClientEvent ตัวติดตาม Script จากนั้นจะฟังผู้เล่นที่เข้า

การเชื่อมต่อเหตุการณ์ - 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("[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 เพื่อเรียกเหตุการณ์ทั้งหมดในลูกค้าโดยการ

เซิร์ฟเวอร์RemoteEvent:FireAllClients(args)
ลูกค้าRemoteEvent.OnClientEvent:Connect(function(args))

ต่อไป LocalScript เชื่อมต่อตัวเร่งอีเวนต์กับเหตุการณ์ OnClientEvent ซึ่งจะสร้างเวลานับถอยหลังที่เห

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

การโทรรีโมท

วัตถุ RemoteFunction ช่วยให้การสื่อสารระหว่างเครื่องคอมพิวเตอร์-เซิร์ฟเวอร์ได้อย่างง่ายดาย ผู้รับ

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

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

เมื่อคุณได้สร้าง RemoteFunction แล้ว สามารถเพิ่มการสื่อสารระหว่าง ลูกค้าและเซิร์ฟเวอร์ หรือระหว่าง เซิร์ฟเวอร์และลูกค้า ได้

ลูกค้า → เซิร์ฟเวอร์ → ลูกค้า
เซิร์ฟเวอร์ → ลูกค้า → เซิร์ฟเวอร์

ลูกค้า → เซิร์ฟเวอร์ → ลูกค้า

คุณสามารถใช้ LocalScript เพื่อเรียกใช้ฟังก์ชันบน เซิร์ฟเว

ลูกค้าRemoteFunction:InvokeServer(args)
เซิร์ฟเวอร์RemoteFunction.OnServerInvoke = function(player, args)

ต่อไปนี้ Script จะกำหนดหน้าเรียกคืนผ่าน OnServerInvoke และกลับค่าของ Part ผ่านค่า 1> return

คําสั่งเชื่อมต่อ - สคริป

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- รับตัวอ้างไปยังรุ่นฟังก์ชันรีโมท
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
-- ตั้งค่าฟังก์ชันเป็นคืนของฟังก์ชันระยะไกล
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("The server created the requested part:", newPart)

เซิร์ฟเวอร์ → ลูกค้า → เซิร์ฟเวอร์

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

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

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

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

เมื่อคุณยิง RemoteEvent หรือเรียก RemoteFunction ใด ๆ จะส่งอาร์กุมันต์ที่คุณส่งกับเหตุการณ์หรือไปยังคันธีของฟังก์

ดัชนีที่ไม่ใช่ตัวอักษร

หากมี ดัชนี ของตารางที่ผ่านมาเป็นของชนิดไม่สตริงเช่น Instanceuserdata หรือ 1>ฟังก์ชัน1> โรบ็อกจะแปลงดัชนีเหล่านี้เป็นสตริงโดยอัตโนมัติ

การเชื่อมต่อเหตุการณ์ - LocalScript

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 remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- ฟังผู้เล่นที่เข้ามาและส่งเหตุการณ์ระยะไกลให้แต่ละ
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)

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

คุณสมบัติที่รวมอยู่ในอาร์กิวเมนต์สำหรับ RemoteEvent หรือ RemoteFunction จะ ไม่ เป็นไปได้ที่จะเรียกคุณสมบัติไปยังขอบเขต 1>คลายเคลื่

การเชื่อมต่อเหตุการณ์ - 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 = ผู้ชนะมังกร
--> CharClass = โรค
end
end
-- เชื่อมต่อฟังก์ชันไปยังเหตุการณ์
remoteEvent.OnServerEvent:Connect(onEventFire)
การเหยียวโหมดอีเว้นท์ - LocalScript

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)

ตัวตรรจุตาราง

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

คําสั่งเชื่อมต่อ - สคริป

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- คุณสมบัติการโทรกลับ
local function returnTable(player, passedTable)
-- การสร้างตารางอิงเมื่อเรียก
print(tostring(passedTable)) --> ตาราง: 0x48eb7aead27563d9
return passedTable
end
-- ตั้งค่าฟังก์ชันเป็นคืนของฟังก์ชันระยะไกล
remoteFunction.OnServerInvoke = returnTable
การเรียกเหตุการณ์ - LocalScript

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 ส่วนหนึ่ง

การเชื่อมต่อเหตุการณ์ - สคริปต์

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["ชื่อ"] = "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 ส่งค่าที่มีเฉพาะผู้ส่ง โรบ็อกซ์ไม่เคลื่อนไหวมั

การเรียกเหตุการณ์ - สคริปต์

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 remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- จะได้รับเป็น "nil" เพราะเซิร์ฟเวอร์ไม่รู้จักส่วนนี้
local clientPart = Instance.new("Part")
clientPart.Parent = workspace
remoteEvent:FireServer(clientPart)