อีเวนต์และคอลเลกชันที่สามารถผูกได้

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

BindableEvent และ BindableFunction วัตถุช่วยให้คุณผูกพฤติกรรมระหว่างสคริปต์ ในด้านเดียวกัน ของขอบเขต ไคลเอนต์-เซิร์ฟเวอร์ และสื่อสารผลลัพธ์ที่ต้องการโดยเฉพาะสำหรับการดำเนินการในประสบการณ์

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

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

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

อีเวนต์ที่สามารถผูกได้

วัตถุ BindableEvent ช่วยให้สามารถเปิดใช้งานเหตุการณ์ที่กําหนดเองผ่านการสื่อสารแบบเอนกประสงค์หนึ่งทางระหว่างสคริปต์

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

เพื่อสร้างใหม่ BindableEvent โดยใช้หน้าต่าง Explorer ใน Studio:

  1. เลื่อนเมาส์ไปเหนือภาชนะที่คุณต้องการใส่ BindableEventเราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อสารระหว่างสคริปต์ไคลเอนต์
  2. คลิกที่ปุ่ม ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และใส่ตัวอย่าง BindableEvent 3. เปลี่ยนชื่อตัวอย่างเป็น TestBindableEvent

หลังจากที่คุณสร้าง BindableEvent แล้วเชื่อมต่อฟังก์ชันกับอีเวนต์ Event ในสคริปต์เดียวและจากนั้น Fire() อีเวนต์จากสคริปต์อื่น

การเชื่อมต่ออีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
-- อินสแตนซ์
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- เชื่อมฟังก์ชันไม่ระบุตัวตนกับอีเวนต์
bindableEvent.Event:Connect(function(data)
print(data) --> รอบเริ่มแล้ว!
end)
การยิงอีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
-- อินสแตนซ์
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- การจับเหตุการณ์ที่สามารถเผาไหม้ได้
bindableEvent:Fire("Round started!")

คอลเลกชันการโทรกลับที่กำหนดเอง

วัตถุ BindableFunction สามารถรองรับการสื่อสารแบบสองทางแบบเรียลไทม์ระหว่างสคริปต์คุณสามารถใช้มันเพื่อกำหนดฟังก์ชันการโทรกลับที่กําหนดเองและเรียกมันโดยตรงโดยการโทร BindableFunction:Invoke()รหัสที่เรียกฟังก์ชัน ให้ผล จนกว่าจะพบคำตอบสำหรับคอลเลกชันที่ตรงกันและคอลเลกชันจะได้รับอาร์กิวเมนต์ที่คุณส่งไปยัง Invoke()หาก callback ไม่ถูกตั้งค่า สคริปที่เรียกใช้มันจะไม่ดำเนินการต่อ

เพื่อสร้างใหม่ BindableFunction โดยใช้หน้าต่าง Explorer ใน Studio:

  1. เลื่อนเมาส์ไปเหนือภาชนะที่คุณต้องการใส่ BindableFunctionเราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อสารระหว่างสคริปต์ไคลเอนต์
  2. คลิกที่ปุ่ม ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และใส่ตัวอย่าง ฟังก์ชันที่สามารถผูกได้ 3. เปลี่ยนชื่อตัวอย่างเป็น TestBindableFunction

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

การเชื่อมต่อการโทรกลับ

local ServerScriptService = game:GetService("ServerScriptService")
-- รับการอ้างอิงถึงฟังก์ชันที่ผูกได้
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- ฟังก์ชันการโทรกลับ
local function addTwoNumbers(a, b)
return a + b
end
-- ตั้งฟังก์ชันเป็น callback ของฟังก์ชันที่ผูกได้
bindableFunction.OnInvoke = addTwoNumbers
การเรียกกิจกรรม

local ServerScriptService = game:GetService("ServerScriptService")
-- รับการอ้างอิงถึงฟังก์ชันที่ผูกได้
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- เรียกฟังก์ชัน callback และค่าผลลัพธ์ที่ส่งคืน
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

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

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

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

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

การเชื่อมต่ออีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> สตริง
end
end
-- เชื่อมฟังก์ชันกับอีเวนต์
bindableEvent.Event:Connect(onEventFire)
การยิงอีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- คีย์
bindableEvent:Fire({
[workspace.Baseplate] = true
})

การจัดเรียงดัชนีตาราง

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

การเชื่อมต่ออีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = ดาบ
--> 2 = โบ
--> CharName = นักล่ามังกร Diva
--> CharClass = โจร
end
end
-- เชื่อมฟังก์ชันกับอีเวนต์
bindableEvent.Event:Connect(onEventFire)
การยิงอีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- ตารางที่จัดเรียงตามตัวเลข
local inventoryData = {
"Sword", "Bow"
}
-- ตารางสารานุกรม
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- เหตุการณ์ไฟด้วยตารางที่มีดัชนีอย่างสม่ำเสมอ
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

รหัสตาราง

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

การเชื่อมต่อการโทรกลับ

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- ฟังก์ชันการโทรกลับ
local function returnTable(passedTable)
-- อินพุตตาระบุตัวตนบนการเรียกใช้
print(tostring(passedTable)) --> ตาราง: 0x48eb7aead27563d9
return passedTable
end
-- ตั้งฟังก์ชันเป็น callback ของฟังก์ชันที่ผูกได้
bindableFunction.OnInvoke = returnTable
การเรียกกิจกรรม

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

ตารางเมตา

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

การเชื่อมต่ออีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["ชื่อ"] = "MyTruck"}
end
-- เชื่อมฟังก์ชันกับอีเวนต์
bindableEvent.Event:Connect(onEvent)
การยิงอีเวนต์

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- เหตุการณ์ไฟด้วยตารางที่รวมถึงตารางเมตาเทเบิล
bindableEvent:Fire(truck)