คุณสมบัติ Workspace.SignalBehavior ควบคุมว่าตัวจัดการเหตุการณ์จะถูกยิงทันทีหรือถูกเลื่อนออกไปเราแนะนำตัวเลือก Enum.SignalBehavior.Deferred ซึ่งช่วยปรับปรุงประสิทธิภาพและความถูกต้องของเครื่องยนต์ตัวจัดการเหตุการณ์สำหรับเหตุการณ์ที่ถูกเลื่อนออกไป จะถูกดำเนินการต่อที่จุดเลื่อนใหม่ พร้อมกับตัวจัดการเหตุการณ์ใหม่ใดๆ
ไดอะแกรมต่อไปนี้เปรียบเทียบพฤติกรรมการเหตุการณ์ Immediate และพฤติกรรมการเหตุการณ์ Deferred
- ด้วยพฤติกรรม Immediate หากเหตุการณ์กระตุ้นเหตุการณ์อื่น ตัวจัดการเหตุการณ์ที่สองจะเรียกใช้ทันที
- ด้วยพฤติกรรม Deferred ครั้งที่สองจะถูกเพิ่มลงในด้านหลังของคิวและทำงานในภายหลัง
เวลาทั้งหมดที่ใช้ไม่เปลี่ยนแปลง แต่การสั่งซื้อแตกต่างกัน

การ "กลับเข้า" ป้องกันไม่ให้เหตุการณ์ยิงกันอย่างต่อเนื่องเมื่อถึงความลึกที่กำหนด ขีดจํากัดปัจจุบันสําหรับสิ่งนี้คือ 10
ผลประโยชน์จากอีเวนต์ที่เลื่อนออกไป
พฤติกรรม Immediate มีข้อเสียบางอย่างสำหรับทุกตัวอย่างที่เพิ่มลงในเกมของคุณ คุณสมบัติที่เปลี่ยนแปลง หรือการกระตุ้นอื่นๆ ที่เรียกใช้ เครื่องยนต์จะต้องรันโค้ด Luau ก่อนที่จะเกิดอะไรขึ้น
- เพื่อเปลี่ยน 1,000 คุณสมบัติ 1,000 บรรทัดของโค้ดอาจต้องทำงานหลังจากแต่ละการเปลี่ยนแปลง
- ข้อบกพร่องที่แปลกและยากต่อการวินิจฉัยสามารถเกิดขึ้นได้ เช่น การยกเลิกการยิงอีเวนต์ก่อนที่จะเพิ่มบางอย่าง
- ระบบที่สำคัญต่อประสิทธิภาพสามารถยิงเหตุการณ์ที่ต้องการให้พวกเขาย้อนกลับและไปยัง Luau
- ตัวจัดการอีเวนต์สามารถทำการเปลี่ยนแปลงต่อสถานที่หรือเรียกการเหตุการณ์อื่นใดเมื่อใดก็ได้ที่อีเวนต์ถูกยิง
- อีเวนต์สามารถยิงหลายครั้งแม้จะซ้ำกันก็ตาม เช่น การเปลี่ยนแปลงคุณสมบัติสองครั้ง
โดยมีส่วนหนึ่งเฉพาะของวงจรชีวิตของเครื่องยนต์ที่ Luau สามารถทำงานได้ เครื่องยนต์สามารถได้รับประสิทธิภาพที่ดีขึ้นโดยใช้หลายสมมติฐาน:
- ระบบที่สำคัญต่อประสิทธิภาพไม่จำเป็นต้องยอมแพ้ต่อ Luau ซึ่งนำไปสู่การเพิ่มประสิทธิภาพ
- เว้นแต่เครื่องยนต์เองจะเปลี่ยนแปลงมันแล้ว สถานที่จะไม่เปลี่ยนแปลงนอกจุดเลื่อนต่อไป
จุดเลื่อนต่อไป
หลังจากถูกเลื่อนออกไปแล้ว ตัวจัดการอีเวนต์จะถูกดำเนินต่อที่จุดเลื่อนใหม่ต่อไป ขณะนี้ชุดจุดเลื่อนใหม่รวมถึง:
- การประมวลผลการป้อนข้อมูล (ดำเนินการต่อเมื่อมีการป้อนข้อมูลที่จะประมวลผล ดู UserInputService )
- สคริปต์รอดำเนินการต่อที่มีอยู่แล้ว เช่น wait() , spawn() และ delay()
รูปแบบโค้ดที่ได้รับผลกระทบทั่วไป
ด้วยเหตุการณ์ระยะไกล ตัวอย่างต่อไปนี้จะหยุดทำงานอย่างถูกต้องหรือมีพฤติกรรมที่แตกต่างกันเล็กน้อย; พวกเขาพึ่งพาการดำเนินการต่อไปทันทีที่เหตุการณ์ถูกระงับ
กระตุ้นและจับเหตุการณ์ระหว่างการดำเนินการกลาง
ในตัวอย่างนี้ false จะถูกส่งคืนเสมอเมื่อเหตุการณ์ถูกเลื่อนออกไปเนื่องจากคอลเลกชันไม่ได้รันเพื่อทำงานอย่างถูกต้อง กระทู้จะต้องส่งจนกว่าจะมีการยิงอีเวนต์อย่างน้อยที่สุด
local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- ทําให้เหตุการณ์ `event` เกิดขึ้น
return success
ฟังการเกิดครั้งแรกของอีเวนต์
connection = event:Connect(function ()
connection:Disconnect()
-- ทำอะไรบางอย่าง
end)
เมื่อเปิดใช้งานการดําเนินการแบบล่าช้าสําหรับอีเวนต์แล้ว การเรียกใช้ตัวจัดการอีเวนต์หลายรายการสามารถถูกจัดลําดับก่อนที่คุณจะแยกตัวออกจากอีเวนต์เรียก Disconnect() ทิ้งการเรียกใช้ตัวจัดการอีเวนต์ที่รอดำเนินการทั้งหมด—พฤติกรรมเดียวกันที่มีอยู่สำหรับอีเวนต์ทันที
หรือใช้ Once() เป็นวิธีที่สะดวกกว่าในการเชื่อมต่อกับอีเวนต์ที่คุณต้องการเพียงการเรียกครั้งแรกเท่านั้น
อีเวนต์ที่เปลี่ยนเชื้อสายหรือคุณสมบัติ
อีเวนต์ที่ถูกเลื่อนออกไปทำให้เกิดอีเวนต์ที่จัดการการเปลี่ยนแปลงในต้นกำเนิดหรือคุณสมบัติที่จะยิงหลังจากที่ต้นกำเนิดหรือคุณสมบัติเปลี่ยนแปลง:
local part = Instance.new("Part", workspace)
local function onPartDestroying()
print("In signal:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()
เนื่องจาก Destroy() ทำงานทันทีหลังจากสคริปต์ที่เรียกมันให้ผลผลิตแล้ว อินสแตนซ์ถูกทำลายแล้วในเวลา onPartDestroying() ที่เรียกสำหรับตัวอย่างเพิ่มเติมดูที่ Instance.Destroying