BindableEvent และ BindableFunction วัตถุที่ให้คุณผูกพฤติกรรมระหว่างสคริปต์ ในด้านเดียวกัน ของเขต 0>เซิร์ฟเวอร์-คลายเคลื่อน0> และสื่อสารผลลัพธ์ที่ต้
การใช้งานที่พบบ่อยที่สุดสำหรับเหตุการณ์ที่ผูกได้คือสำหรับเหตุการณ์ที่มีโครงสร้างรอบ โดยมีเหตุการณ์ "เริ่มต้น" ที่ช่วยให้ผู้อื่นสามารถเริ่มตัวนับเวลาและแสดงตารางอ
เนื่องจากพวกเขาจัดการกิจกรรมระหว่างสคริปต์ดังนั้นเหตุการณ์ที่ผูกได้จึงมักใช้ในเซิร์ฟเวอร์ แต่คุณสามารถใช้ได้บนเครื่องคลังของคุณเช่นกัน
ขึ้นอยู่กับวิธีที่ประสบการณ์ของคุณทำงานได้ผูกได้เหตุการณ์สามารถช่วยให้คุณโค้ดของคุณเป็นแบบโมดูลได้มากขึ้น แต่ สคริปต์โมดูล เป็นตัวเลือกที่ดีกว่าสำ
เหตุการณ์ที่ผูกได้
วัตถุ BindableEvent ช่วยให้เหตุการณ์ที่กำหนดเองผ่านการสื่อสารแบบเหนือกาลเวลาระหว่างสคริปต์
เมื่อคุณยิง BindableEvent ผ่านวิธีการ Fire() จะไม่ได้ผลิตผล และตัวเป้าหมายรับข้อมูลผ่านข้อจํากัดบาง
เพื่อสร้าง BindableEvent ใหม่โดยใช้หน้าต่าง Explorer ใน Studio:
- วางเมาส์ในคอนเทนเนอร์ที่คุณต้องการใส่ BindableEvent ใน เราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อสารระห
- คลิกปุ่ม ⊕ ที่ปรากฏขึ้นทางด้านขวาของชื่อคอนเทนเนอร์และใส่ อินสแตนซ์BindableEvent 3. เปลี่ยนชื่อตัวอินสแตนซ์เป็น TestBindableEvent
หลังจากที่คุณได้สร้าง BindableEvent แล้ว เชื่อมต่อฟังก์ชันไปยังเหตุการณ์ Event ในสคริปต์เดียวแล้วจากนั้น Class.BindableEvent:Fire()|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 ใหม่โดยใช้หน้าต่าง Explorer ใน Studio:
- วางเมาส์ในคอนเทนเนอร์ที่คุณต้องการใส่ BindableFunction ของคุณ เราแนะนำให้ใช้ ServerScriptService สำหรับการสื่อสารระหว่างสคริปต์เซิร์ฟเวอร์และ ReplicatedStorage สำหรับการสื่อส
- คลิกปุ่ม ⊕ ที่ปรากฏขึ้นทางด้านขวาของชื่อคอนเทนเนอร์และใส่ BindableFunction อินสแตนซ์
- เปลี่ยนชื่อตัวอย่างให้เป็น TestBindableFunction
เมื่อคุณสร้าง BindableFunction แล้ว คุณสามารถเชื่อมต่อกับ OnInvoke คอลลีแบ็กของมันในสคริปต์เดียว จากนั้น Invoke() ฟังก์ชันคอลลีจากสคริปต์อื่น
การโทรกลับ
local ServerScriptService = game:GetService("ServerScriptService")
-- รับค่าอ้างอิงไปยัง関数ที่ผูกได้
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- คุณสมบัติการโทรกลับ
local function addTwoNumbers(a, b)
return a + b
end
-- ตั้งค่าฟังก์ชันเป็นคืนของฟังก์ชัน
bindableFunction.OnInvoke = addTwoNumbers
การเรียกอีเวนต์
local ServerScriptService = game:GetService("ServerScriptService")-- รับค่าอ้างอิงไปยัง関数ที่ผูกได้local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- เรียกใช้งานตัวเรียกและส่งค่ากลับlocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
ข้อจํากัดของตัวอาร์กิวเมนต์
เมื่อคุณยิง BindableEvent หรือเรียก BindableFunction คุณจะส่งอาร์กวิตที่คุณส่งกับเหตุการณ์หรือไปยังคุณสมบัติฟังก์ชัน คุณ
ดัชนีที่ไม่ใช่ตัวอักษร
หากมี ดัชนี ของตารางที่ผ่านมาเป็นของไม่สตริง เช่น Instanceuserdata หรือ 1>ฟังก์ชัน1> โรบ็อกจะแปลงดัชนีเหล่านี้เป็นสตริงโดยอัตโนมัติ
การเชื่อมต่อเหตุการณ์
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 = ผู้ชนะมังกร
--> 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)
ตัวตรรจุตาราง
ตารางที่ผ่านเป็นตัวอ้างเพื่อผูกกับเหตุการณ์และคืนข้อมูลที่เป็นไปได้จะถูกคัดลอก หมายถึงพวกเขาจะไม่เท่ากับกับสิ่งที่มีอยู่เมื่อยิงเหตุการณ์หรือเรีย
การโทรกลับ
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- คุณสมบัติการโทรกลับ
local function returnTable(passedTable)
-- การสร้างตารางอิงเมื่อเรียก
print(tostring(passedTable)) --> ตาราง: 0x48eb7aead27563d9
return passedTable
end
-- ตั้งค่าฟังก์ชันเป็นคืนของฟังก์ชัน
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 ส่วนหนึ่ง
การเชื่อมต่อเหตุการณ์
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)