مُنسق الأحداث هو إطار عمل قوي يمكّنك من بناء أحداث ومشاهد حية عبر الخوادم على تسلسل منظم من الإجراءات والمحفزات. بشكل أكثر تحديدًا، يساعدك هذا الوحدة في:
- بناء حدث أو مشهد على إطار عمل منظم من خلال تكوينات مجدولة للصوت، والرسوم المتحركة، والتغييرات.
- الانتقال بين مشاهد متعددة عبر خوادم متعددة، مما يزامن الرسوم المتحركة المعقدة والمرئيات مع جدول زمني.
- البحث خلال حدث ومعاينة اللعبة لأغراض الاختبار والتطوير.
لقد تم اختبار هذا الإطار في أحداث Roblox مثل حفلات Twenty One Pilots و24kGoldn، بالإضافة إلى العديد من الألعاب ذات الزيارات العالية.
لرؤية مُنسق الأحداث في العمل داخل مكان قابل للتعديل، تحقق من قالب الحفل في Roblox Studio. هذا القالب هو نقطة انطلاق شاملة للمطورين لإنشاء أحداث/حفلات والتعرف على الميزات والمكونات المختلفة المعنية.

استخدام الوحدة
التثبيت
لاستخدام إطار مُنسق الأحداث في لعبة:
من قائمة نافذة في الاستوديو أو شريط أدوات علامة التبويب الرئيسية، افتح صندوق الأدوات واختر علامة التبويب متجر المبدعين.

تأكد من تحديد فرز النماذج، ثم انقر على زر عرض الكل لفئة الفئات.

ابحث وانقر على بلاطة الحزم.
ابحث عن وحدة مُنسق الأحداث وانقر عليها، أو اسحبها وأفلتها في العرض ثلاثي الأبعاد.

في نافذة المستكشف، انقل نموذج مُنسق الأحداث بالكامل إلى ServerScriptService. عند تشغيل اللعبة، سيبدأ تشغيل الوحدة.
أوضاع الإطار
وضع الاستبدال
الوضع الافتراضي للإطار هو وضع الاستبدال حيث تقوم بتصميم مشاهد فريدة المشاهد عن طريق وضع أشياء ثلاثية الأبعاد، تضاريس، خصائص الإضاءة، تأثيرات بيئية، وأشياء واجهة المستخدم في مجلد البيئة الخاص بتلك المشهد. عندما يتم تحميل مشهد، يتم توزيع تلك الأشياء والخصائص في Workspace وTerrain وLighting، مستبدلة الأشياء/الخصائص الموجودة لتشكيل مساحة مستنسخة.
وضع الإدراج
وضع إطار بديل هو وضع الإدراج حيث تقوم بتصميم مشاهد فريدة المشاهد مع منطق البرمجة لتدفقها/أحداثها، ولكن الإطار لن يدمر الأشياء ثلاثية الأبعاد الموجودة، التضاريس، خصائص الإضاءة، تأثيرات بيئية، وأشياء واجهة المستخدم من أجل استنساخ الأصول/الخصائص من مجلد البيئة الخاص بالمشهد عند التحميل.
لتمكين وضع الإدراج:
داخل نموذج مُنسق الأحداث الذي وضعته في ServerScriptService، قم بالتنقيب وحدد قيمة Inline داخل مجلد ReplicatedStorage.

في نافذة الخصائص، قم بتفعيل خانة القيمة.

إنشاء المشاهد
المشهد هو في الأساس جزء من حدث شامل أو مشهد ملفوف في سلسلة من المجلدات. يحتوي كل مشهد على منطق برمجي يحدد تدفقه/أحداثه، ويمكن أن يخزن المشهد أشياء ثلاثية الأبعاد، تضاريس، خصائص الإضاءة، تأثيرات بيئية، وأشياء واجهة المستخدم الخاصة به.
للبدء بسرعة، يمكنك العثور على مشهد فارغ داخل المجلد الرئيسي للوحدة:
قم بتوسيع مجلد مُنسق الأحداث وابحث عن مجلد BlankScene.

انقل أو انسخ مجلد BlankScene بالكامل إلى ReplicatedStorage.

طول الوقت
يجب أن يحتوي كل مشهد على طول الوقت، بالثواني، يحدد مدته — تمامًا كما أن للفيلم أو الحفل مدة محددة. يتم تعريف طول الوقت كخاصية عددية attribute في مجلد المشهد باسم TimeLength والتي يمكنك تعيينها مباشرة في الاستوديو أو برمجيًا من خلال Instance:SetAttribute().


البيئة
يحتوي مجلد البيئة الخاص بالمشهد على كل ما يراه ويسمعه المستخدمون، بما في ذلك أشياء ثلاثية الأبعاد، تضاريس، خصائص الإضاءة وتأثيرات بيئية، وأشياء واجهة المستخدم. عندما يتم تحميل مشهد، يتم توزيع تلك الأشياء والخصائص في Workspace وTerrain وLighting، مستبدلة الأشياء/الخصائص الموجودة لتشكيل مساحة مستنسخة.
يحتوي مجلد البيئة على الحاويات التالية:
| الحاوية | الوصف |
|---|---|
| العميل | يحتوي على جميع الأصول التي يتم تحميلها عندما ينضم أي مستخدم (عميل) إلى الحدث، مثل أشياء واجهة المستخدم أو هيكل الرسوم المتحركة. |
| تولد اللاعبين | يحتوي على الأجزاء التي يظهر فيها المستخدمون عند الانضمام. أي جزء في هذا المجلد يتصرف بشكل مشابه لـ SpawnLocation. |
| الخادم | يحتوي على جميع الأصول التي يتم تحميلها عندما يتم إنشاء مشهد لأول مرة على الخادم. يُوصى بأن تذهب معظم الأصول المرئية هنا. |
| التضاريس | يحتوي على تضاريس المشهد. |
| الإضاءة | يحتوي على خصائص الإضاءة العالمية lighting properties كخصائص، بالإضافة إلى معدلات مثل التأثيرات الجوية والتأثيرات بعد المعالجة. |
الأحداث
مجلد الأحداث الخاص بالمشهد هو مجرد مكان لحفظ RemoteEvents التي تتواصل بين وحدات العميل والخادم. ليس من الضروري وضع أي شيء في هذا المجلد.
العميل
هذا السكربت ينفذ منطق المخطط على العميل.
الخادم
هذا السكربت ينفذ منطق المخطط على الخادم.
مخططات المشهد
يحدد المخطط الخاص بالمشهد ما يحدث في أي نقطة في جدول زمني المشهد. يجب عليك تعريف مخطط المشهد في كل من وحدات العميل والخادم وتضمين خطافات دورة الحياة لإدارة متى تحدث التكوينات.
خطافات دورة الحياة
تتيح لك خطافات دورة الحياة إدارة متى تحدث عمليات المشهد. عادةً ما يعمل المشهد في الإنتاج في أبسط تدفق:
قد يتم مقاطعة OnRun عند البحث:
يمكن أيضًا تكرار جميع الخطافات الثلاثة إذا تم إعادة تشغيل المشهد:
التكوينات
تحدد التكوينات الأساسية لعمليات المشهد، على سبيل المثال تشغيل الصوت في 00:32، أو جدولة رسوم متحركة لمزامنتها مع ذلك الصوت، أو جدولة حدث مشهد مثل عرض الألعاب النارية، والمزيد. تدعم كل تكوين وظائف رد نداء معينة حيث يكون المعامل الأول (self) هو مثيل التكوين.
البحث عن المشاهد
ميزة فريدة من مُنسق الأحداث هي القدرة على "البحث" حول المشاهد كما قد تبحث خلال فيديو. في وضع الاستبدال، يمكنك أيضًا التبديل بين المشاهد لمعاينة حدث متعدد المشاهد بالكامل قبل نشره للإنتاج.
البحث عن المشهد غير متاح للجميع حيث يجب ألا يتمكن المستخدمون الذين يستمتعون ببساطة بالحدث من التحكم في تدفق وقته. بدلاً من ذلك، يجب عليك منح إذن البحث بناءً على PlaceId للحدث بالإضافة إلى UserIds محددة و/أو المجموعات والأدوار داخلها.
أنشئ Script جديد داخل ServerScriptService.
الصق الكود التالي في السكربت الجديد.
Script - Set Seeking Permissionslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})املأ الجداول التالية ضمن استدعاء setSeekingPermissions كما يلي:
placeIDs قائمة مفصولة بفواصل من قيم PlaceId لدعم البحث ضمنها. userIDs قائمة مفصولة بفواصل من UserIds لأولئك الذين يمكنهم البحث ضمن الأماكن المدعومة. groups قائمة مفصولة بفواصل من الجداول، كل منها تحتوي على معرف مجموعة ومرتبة الحد الأدنى من أعضاء تلك المجموعة الذين يمكنهم البحث ضمن الأماكن المدعومة.
ملحق إدارة المشهد
ملحق مدير المشهد هو أداة مفيدة لتحميل وإلغاء تحميل المشاهد، الإضاءة، والتضاريس. ما لم تكن تستخدم وضع الإدراج، يُوصى بشدة باستخدام هذا الملحق بدلاً من وضع/تحرير كائنات وخصائص المشهد يدويًا.
لتثبيت الملحق:
من قائمة نافذة في الاستوديو أو شريط أدوات علامة التبويب الرئيسية، افتح صندوق الأدوات.
مع تحديد علامة التبويب متجر المبدعين، اختر الملحقات من القائمة المنسدلة.
في حقل البحث، اكتب مدير المشهد واضغط Enter للعثور على الملحق.

انقر على أيقونة الملحق لعرض تفاصيله ثم انقر على زر تثبيت.
بمجرد تثبيت الملحق، سيظهر في علامة التبويب الملحقات في الاستوديو.
تحميل وإلغاء تحميل المشاهد
كما هو موضح في إنشاء المشاهد، يحتوي مجلد البيئة الخاص بالمشهد على كل ما يراه ويسمعه المستخدمون، بما في ذلك أشياء ثلاثية الأبعاد. يساعدك الملحق في تحميل أصول المشهد بسرعة إلى أو من مجلدات منظمة داخل مساحة العمل.
| إجراء الملحق | الوصف |
|---|---|
| تحميل العميل | إذا كانت محتويات العميل للمشهد غير محملة، ينقل مجلد البيئة/العميل إلى مجلد Workspace/مشاهد العميل. |
| تحميل الخادم | إذا كانت محتويات الخادم للمشهد غير محملة، ينقل مجلد البيئة/الخادم إلى مجلد Workspace/مشاهد الخادم. |
| إلغاء تحميل العميل | إذا كانت محتويات العميل للمشهد محملة، ينقل مجلد العميل من Workspace/مشاهد العميل مرة أخرى إلى مجلد [المشهد]/البيئة. |
| إلغاء تحميل الخادم | إذا كانت محتويات الخادم للمشهد محملة، ينقل مجلد الخادم من Workspace/مشاهد الخادم مرة أخرى إلى مجلد [المشهد]/البيئة. |
| إلغاء تحميل جميع المشاهد | ينقل كل مجلد العميل والخادم المحملين لكل مشهد مرة أخرى إلى مجلد البيئة الخاص به. |
حفظ وتحميل الإضاءة
تخزن خدمة Lighting على المستوى الأعلى جميع خصائص الإضاءة والتأثيرات المرئية لمكان ما. نظرًا لأنها خدمة على مستوى أعلى، لا يمكنك نقلها يدويًا إلى مجلد البيئة/الخادم أو البيئة/العميل لمشهد معين. بدلاً من ذلك، يمكنك استخدام الملحق لنسخ خصائصها وأطفالها إلى مجلد البيئة/الإضاءة الخاص بالمشهد.
قم بتكوين خصائص الإضاءة الخاصة بالمشهد، والتأثيرات بعد المعالجة، والتأثيرات الجوية، وصناديق السماء من خلال خدمة Lighting على المستوى الأعلى.

في نافذة ملحق مدير المشهد، انقر على حفظ الإضاءة للمشهد المطلوب.
حدد وقم بتوسيع تكوين البيئة/الإضاءة لذلك المشهد وسترى نفس خصائص الإضاءة كـ خصائص للمجلد، بالإضافة إلى أطفال مستنسخين من خدمة Lighting على المستوى الأعلى.

نسخ مستنسخة 
خصائص محفوظة بمجرد حفظ خصائص الإضاءة والأطفال لمشهد، يمكنك تحميلها بسرعة مرة أخرى إلى خدمة Lighting على المستوى الأعلى من خلال النقر على تحميل الإضاءة من نافذة الملحق.
حفظ وتحميل التضاريس
نظرًا لأن Terrain هو فئة على مستوى أعلى داخل Workspace، لا يمكنك نقل التضاريس المولدة أو المنحوتة يدويًا إلى مجلد البيئة/الخادم أو البيئة/العميل لمشهد معين. بدلاً من ذلك، يمكنك استخدام الملحق لنسخها إلى مجلد البيئة/التضاريس الخاص بالمشهد.
قم بتكوين تضاريس المشهد من خلال خدمة التضاريس على المستوى الأعلى.

في نافذة ملحق مدير المشهد، انقر على حفظ التضاريس للمشهد المطلوب.
حدد وقم بتوسيع مجلد البيئة/التضاريس لذلك المشهد وسترى كائن TerrainRegion الذي يمثل التضاريس المحفوظة.

بمجرد حفظ التضاريس لمشهد، يمكنك تحميلها بسرعة مرة أخرى إلى خدمة Terrain على المستوى الأعلى من خلال النقر على تحميل التضاريس من نافذة الملحق.
مرجع API
خطافات دورة حياة المخطط
OnSetup
تُستخدم خطافة دورة الحياة OnSetup لتهيئة الأصول والمتغيرات التي سيتم الإشارة إليها في OnRun أو OnEndScene، وإعداد الاتصالات التي من المقرر أن تستمر طوال مدة المشهد، وما إلى ذلك. تتلقى هذه الخطافة معامل timePositionObject الذي يتيح لك قراءة الوقت الحالي عند الإعداد.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Wait for assets
dummy = clientEnvironment:WaitForChild("Dummy")
print("Current time is:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
-- Access scene environment; does not apply to Inline Mode
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Current time is:", timePositionObject.Value)
endOnRun
OnRun هو خطاف دورة الحياة الرئيسي التشغيلي داخل المخطط. يجب أن يحتوي على جميع التكوينات المؤقتة للمشهد، من تشغيل الصوت أو الرسوم المتحركة إلى جدولة حدث مثل عرض الألعاب النارية.
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
endOnEndScene
تكون خطافة دورة الحياة OnEndScene مفيدة لتنظيف أي شيء متبقي في المشهد، مثل فصل الاتصالات التي تم إنشاؤها في OnSetup أو OnRun التي تبقى طوال مدة المشهد.
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endتكوينات المخطط
audio
ينشئ كائن Sound في مساحة العمل يتم تشغيله في وقت معين. يتم حذف الصوت بعد انتهاء المشهد أو بعد انتهاء تشغيل كائن Sound.
| مفتاح التكوين | الوصف |
|---|---|
| StartTime | متى يتم تشغيل الصوت بالنسبة لمدى المشهد، بالثواني. |
| SoundId | معرف الأصول للصوت الذي سيتم تشغيله. |
| OnStart | وظيفة مخصصة للتنفيذ عند بدء تشغيل الصوت. |
| OnEnd | وظيفة مخصصة للتنفيذ عند انتهاء تشغيل الصوت. |
| Volume | حجم كائن Sound؛ القيمة الافتراضية هي 0.5. |
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
endanimate
ينشئ Animation يتم تشغيله في وقت معين.
| مفتاح التكوين | الوصف |
|---|---|
| StartTime | متى يتم تشغيل الرسوم المتحركة بالنسبة لمدى المشهد، بالثواني. |
| EndTime | وقت اختياري عند انتهاء الرسوم المتحركة بالنسبة لمدى المشهد، بالثواني. |
| Rig | هيكل الرسوم المتحركة لتشغيل الرسوم المتحركة عليه. |
| AnimationId | معرف الأصول للرسوم المتحركة التي سيتم تشغيلها. |
| Speed | سرعة تشغيل الرسوم المتحركة؛ القيمة الافتراضية هي 1. |
| FadeInTime | مدة الوقت لتلاشي الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني). |
| FadeOutTime | مدة الوقت لتلاشي الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني). |
| OnStart | وظيفة مخصصة للتنفيذ عند بدء تشغيل الرسوم المتحركة. |
| OnEnd | وظيفة مخصصة للتنفيذ عند انتهاء تشغيل الرسوم المتحركة. |
| Looped | ما إذا كان يجب تكرار الرسوم المتحركة؛ القيمة الافتراضية هي false. |
| SyncToAudio | جدول يحدد ما إذا كان يجب مزامنة الرسوم المتحركة مع تكوين الصوت. يقبل المفاتيح التالية:
|
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DanceAnimation = Schema:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
FadeInTime = 0.1,
FadeOutTime = 0.3,
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("Animation playing")
end,
OnEnd = function(self)
print("Animation stopped")
end
})
endtween
ينشئ Tween قابل للتكوين يتم الحفاظ عليه في البحث وفي الانضمام الديناميكي، مما يعني أنه يمكنك ربط التغييرات في نقاط زمنية منفصلة ويجب أن تعمل كل شيء وتزامن كما هو متوقع.
| مفتاح التكوين | الوصف |
|---|---|
| StartTimes | جدول أوقات البدء بالنسبة لمدى المشهد، بالثواني. |
| Tween | جدول يحدد الكائن والخصائص التي سيتم تغييرها. يقبل المفاتيح التالية:
|
| OnStart | وظيفة مخصصة للتنفيذ عند بدء تشغيل التغيير. |
| OnHeartbeat | وظيفة مخصصة للتنفيذ في كل نبض القلب؛ تتلقى نسبة التغيير كمعامل ثانٍ. |
| OnEnd | وظيفة مخصصة للتنفيذ عند انتهاء تشغيل التغيير. |
| SyncToAudio | جدول يحدد ما إذا كان يجب مزامنة التغيير مع تكوين الصوت. يقبل المفاتيح التالية:
|
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local LightFadeOut = Schema:tween({
StartTimes = {29.884},
Tween = {
Object = game:GetService("Lighting"),
Info = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out),
Properties = {
Brightness = 0,
}
},
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTimes = {5, 7.2, 9.4, 11.6},
},
OnStart = function(self)
print("Tween playing")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween completed")
end,
})
endinterval
ينفذ وظيفة رد نداء مخصصة على مدى فترة محددة بتردد محدد، بالثواني. مفيد للأحداث المتكررة مثل الأضواء الومضية، أو نبض شدة الصوت، إلخ. أقل تردد ممكن هو 0 ثوانٍ، ولكن تقنيًا الحد الأدنى للتردد دائمًا مقيد بـ نبض القلب.
| مفتاح التكوين | الوصف |
|---|---|
| StartTime | بداية مدة الفاصل الزمني بالنسبة لمدى المشهد، بالثواني. |
| EndTime | نهاية مدة الفاصل الزمني بالنسبة لمدى المشهد، بالثواني. |
| Frequency | مدى تكرار وظيفة OnInterval، بالثواني، مع تنفيذ الأول في StartTime. |
| OnStart | وظيفة مخصصة للتنفيذ عند بدء سلسلة الفواصل الزمنية. |
| OnInterval | وظيفة مخصصة للتنفيذ في كل فاصل زمني ضمن المدة المحددة (StartTime إلى EndTime). |
| OnEnd | وظيفة مخصصة للتنفيذ عند انتهاء سلسلة الفواصل الزمنية. |
| SyncToAudio | جدول يحدد ما إذا كان يجب مزامنة مدة الفاصل الزمني مع تكوين الصوت. يقبل المفاتيح التالية:
|
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ClientTimerUpdate = Schema:interval({
Frequency = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = MainAudio
},
OnInterval = function(self)
print(MainAudio.Sound.TimePosition, MainAudio.CurrentSoundIntensityRatio)
end,
})
endschedule
مماثل لـ interval باستثناء أنه يمكنك تحديد أوقات بدء متعددة لنفس الحدث، مثل جدولة عرض الألعاب النارية مرتين في مشهد.
| مفتاح التكوين | الوصف |
|---|---|
| StartTimes | جدول أوقات البدء بالنسبة لمدى المشهد، بالثواني. |
| OnStart | وظيفة مخصصة للتنفيذ في كل وقت محدد في جدول StartTimes. |
| Skippable | قيمة منطقية تحدد ما إذا كان يمكن تخطي الحدث المجدول للمستخدمين الذين ينضمون متأخرين، أو عند البحث قبل وقت بدء مجدول. إذا تم تعيينها إلى false، ستحدث جميع أوقات بدء الأحداث المجدولة قبل وقت الانضمام/البحث في ذلك الوقت. إذا تم تعيينها إلى true، ستحدث فقط أوقات البدء المجدولة بعد الانضمام/البحث. القيمة الافتراضية هي false. |
| SyncToAudio | جدول يحدد ما إذا كان يجب مزامنة الجدول مع تكوين الصوت. يقبل المفاتيح التالية:
|
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Initialize temporary heartbeat connection
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Inform framework of connection
Schema:inform(tempConnection)
end
})
endinform
يُبلغ الإطار عن أي وحدات، أو كائنات واجهة مستخدم، أو اتصالات، إلخ. التي تم إنشاؤها في خطاف دورة الحياة OnRun، مما يضمن تنظيفها بشكل صحيح عند البحث. تشمل حالات الاستخدام:
إبلاغ الإطار عن اتصال مؤقت غير رسمي مثل RunService.Heartbeat بحيث يتم تنظيف الاتصال عند البحث إلى نقطة سابقة في مدة المشهد.
Server SchemaSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Initialize temporary heartbeat connectionlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Inform framework of connectionSchema:inform(tempConnection)end})endاستدعاء وظيفة "تنظيف" مخصصة في ModuleScript التي تقوم بتهيئة اتصال أو مرجع آخر خلال خطاف دورة الحياة OnRun.
Server Schemalocal ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))local Schema = EventSequencer.createSchema()Schema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Call "init" function in custom modulecustomModule.init()-- Call "clean" function in custom module on scene cleanupSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Initialize heartbeat connectionCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Disconnect and clear heartbeat connectionif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
الوظائف
loadScene
loadScene(sceneName: string, startTime: number ?)
يقوم بتحميل مشهد برمجيًا بواسطة sceneName ويبدأه عند startTime من بدايته. سيكون هناك "فترة سماح" مدتها 5 ثوانٍ لتحميل المشهد من الخادم قبل أن يحدث البحث ويبدأ تشغيل المشهد. هذا يعني أنه إذا استدعيت loadScene("[SceneName]", 20) في تمام الساعة 4:15:00 مساءً، سينتظر الإطار 5 ثوانٍ بالإضافة إلى 20 المطلوبة، مما يبدأ المشهد في الساعة 4:15:25 مساءً.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Figure out next scene to load when current scene finishes
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" ended; load the first scene in the concert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" ended; load the second scene in the concert
EventSequencer.loadScene("Track2")
else
-- Loop back to the pre-show scene
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
يعيد مثيل من المخطط لإنشاء منطق للمشهد.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
endseek
seek(time: number)
يبحث عن القيمة time، بالثواني، من بداية المشهد المحمل حاليًا.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
يحدد مقدار الوقت من نهاية جميع المشاهد التي يتم فيها إرسال تحذير. يمكنك اكتشاف التحذير إما من جانب العميل من خلال onSceneEndingWarningForClient أو من جانب الخادم من خلال onSceneEndingWarningForServer.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Load scene
EventSequencer.loadScene("BeautifulScene")
-- Set warning time to 5 seconds before the scene ends
EventSequencer.setSceneWarningTime(5)
-- Detect when scene is about to end
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
يمنح إذن البحث بناءً على PlaceId للحدث بالإضافة إلى UserIds محددة و/أو المجموعات والأدوار داخلها. انظر البحث والتبديل بين المشاهد لمزيد من المعلومات.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
يعيد مجلد البيئة الخاص بالمشهد الحالي من جانب العميل أو جانب الخادم، اعتمادًا على ما إذا تم استدعاؤه من سكربت مخطط العميل أو سكربت مخطط الخادم على التوالي.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Server)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
يعيد مجلد البيئة الخاص بالمشهد من جانب الخادم. على عكس getCurrentSceneEnvironment، يمكنك استدعاء هذه الوظيفة من سكربت مخطط العميل.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
يتم استدعاؤها من الخادم لمعرفة ما إذا كان المشهد يتم تحميله حاليًا.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Scene loaded")الأحداث
onSceneEndingWarningForClient
يتم تشغيله على العميل قبل أن ينتهي المشهد. الوقت الافتراضي هو 3 ثوانٍ، ولكن يمكنك تكوينه من خلال setSceneWarningTime. يمكن فقط ربط هذا الحدث في LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is about to end (client-side)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scene is about to end!")
end)onSceneEndingWarningForServer
يتم تشغيله على الخادم قبل أن ينتهي المشهد. الوقت الافتراضي هو 3 ثوانٍ، ولكن يمكنك تكوينه من خلال setSceneWarningTime. يمكن فقط ربط هذا الحدث في Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is about to end (server-side)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)onSceneLoadedForClient
يتم تشغيله على العميل عندما يبدأ المشهد. يمكن فقط ربط هذا الحدث في LocalScript.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is starting (client-side)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Scene is starting!")
end)onOrchestrationFinished
يتم تشغيله على الخادم عندما يصل المشهد إلى طوله الزمني وينتهي فعليًا. يتلقى هذا الحدث وسيط اسم السلسلة endedSceneName للمشهد الذي انتهى للتو ويمكنك ربط هذا الحدث بشكل شرطي لتحميل مشهد آخر. يمكن فقط ربطه في Script.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Figure out next scene to load when current scene finishes
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" ended; load the first scene in the concert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then-- "Track1" انتهى؛ تحميل المشهد الثاني في الحفل
EventSequencer.loadScene("Track2")
else
-- العودة إلى مشهد ما قبل العرض
EventSequencer.loadScene("PreShow")
end
end)