BindableEvent และ BindableFunction วัตถุช่วยให้คุณผูกพฤติกรรมระหว่างสคริปต์ ในด้านเดียวกัน ของขอบเขต ไคลเอนต์-เซิร์ฟเวอร์ และสื่อสารผลลัพธ์ที่ต้องการโดยเฉพาะสำหรับการดำเนินการในประสบการณ์
กรณีการใช้งานที่พบบ่อยที่สุดสำหรับอีเวนต์ที่สามารถผูกได้คือสำหรับประสบการณ์ที่มีโครงสร้างแบบรอบตัวอย่างเช่นคุณอาจมีเหตุการณ์ "การแข่งขันเริ่ม" ซึ่งช่วยให้สคริปต์อื่นๆ ตารางอันดับพร้อมกับเหตุการณ์ "การแข่งขันสิ้นสุด" ที่ช่วยให้สคริปต์อื่นๆ รู้ว่าจะย้ายผู้เล่นกลับไปยังล็อบบี้และแสดงผู้ชนะได้
เนื่องจากพวกเขาประสานกิจกรรมระหว่างสคริปต์, อีเวนต์ที่ผูกได้มักจะใช้บนเซิร์ฟเวอร์ แต่คุณสามารถใช้งานได้บนไคลเอนต์เช่นกัน
ขึ้นอยู่กับวิธีที่ประสบการณ์ของคุณทำงาน อีเวนต์ที่ผูกได้สามารถช่วยให้โค้ดของคุณมีความยืดหยุ่นมากขึ้น แต่ สคริปต์โมดูล มักจะเป็นทางเลือกที่ดีกว่าสำหรับสถานการณ์ที่คุณต้องแบ่งปันข้อมูลระหว่างสคริปต์คุณยังสามารถใช้เหตุการณ์ที่ผูกได้ร่วมกับสคริปต์โมดูลเพื่อให้ได้คำสั่งที่สะอาดขึ้น ตามที่ระบุไว้ใน อีเวนต์ที่กําหนดเอง
อีเวนต์ที่สามารถผูกได้
วัตถุ BindableEvent ช่วยให้สามารถเปิดใช้งานเหตุการณ์ที่กําหนดเองผ่านการสื่อสารแบบเอนกประสงค์หนึ่งทางระหว่างสคริปต์
เมื่อคุณยิง ผ่านวิธี สคริปต์การยิงจะไม่ให้ผลผลิต และฟังก์ชันเป้าหมายได้รับอาร์กิวเมนต์ที่ส่งมาด้วยข้อจํากัดบางอย่าง เช่นเดียวกับกิจกรรมทั้งหมด BindableEvents สร้างกระทู้ของฟังก์ชันที่เชื่อมต่อทั้งหมดดังนั้นแม้ว่าจะมีข้อผิดพลาดเพียงหนึ่งรายการ ผู้อื่นก็จะดำเนินการต่อไป
เพื่อสร้างใหม่ BindableEvent โดยใช้หน้าต่าง Explorer ใน Studio:
- เลื่อนเมาส์ไปเหนือภาชนะที่คุณต้องการใส่ BindableEventเราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อสารระหว่างสคริปต์ไคลเอนต์
- คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และใส่ตัวอย่าง 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:
- เลื่อนเมาส์ไปเหนือภาชนะที่คุณต้องการใส่ BindableFunctionเราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อสารระหว่างสคริปต์ไคลเอนต์
- คลิกที่ปุ่ม ⊕ ที่ปรากฏทางด้านขวาของชื่อคอนเทนเนอร์และใส่ตัวอย่าง ฟังก์ชันที่สามารถผูกได้ 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)) --> ตาราง: 0x059bcdbb2b576549local 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 = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- เหตุการณ์ไฟด้วยตารางที่รวมถึงตารางเมตาเทเบิลbindableEvent:Fire(truck)