مُنسق الأحداث

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

مُنسق الأحداث هو إطار عمل قوي يمكّنك من بناء أحداث ومشاهد حية عبر الخوادم على تسلسل منظم من الإجراءات والمحفزات. بشكل أكثر تحديدًا، يساعدك هذا الوحدة في:

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

لقد تم اختبار هذا الإطار في أحداث Roblox مثل حفلات Twenty One Pilots و24kGoldn، بالإضافة إلى العديد من الألعاب ذات الزيارات العالية.

لرؤية مُنسق الأحداث في العمل داخل مكان قابل للتعديل، تحقق من قالب الحفل في Roblox Studio. هذا القالب هو نقطة انطلاق شاملة للمطورين لإنشاء أحداث/حفلات والتعرف على الميزات والمكونات المختلفة المعنية.

استخدام الوحدة

التثبيت

لاستخدام إطار مُنسق الأحداث في لعبة:

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

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

  3. ابحث وانقر على بلاطة الحزم.

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

  5. في نافذة المستكشف، انقل نموذج مُنسق الأحداث بالكامل إلى ServerScriptService. عند تشغيل اللعبة، سيبدأ تشغيل الوحدة.

أوضاع الإطار

وضع الاستبدال

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

وضع الإدراج

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

لتمكين وضع الإدراج:

  1. داخل نموذج مُنسق الأحداث الذي وضعته في ServerScriptService، قم بالتنقيب وحدد قيمة Inline داخل مجلد ReplicatedStorage.

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

إنشاء المشاهد

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

للبدء بسرعة، يمكنك العثور على مشهد فارغ داخل المجلد الرئيسي للوحدة:

  1. قم بتوسيع مجلد مُنسق الأحداث وابحث عن مجلد BlankScene.

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

طول الوقت

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

البيئة

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

يحتوي مجلد البيئة على الحاويات التالية:

الحاويةالوصف
العميليحتوي على جميع الأصول التي يتم تحميلها عندما ينضم أي مستخدم (عميل) إلى الحدث، مثل أشياء واجهة المستخدم أو هيكل الرسوم المتحركة.
تولد اللاعبينيحتوي على الأجزاء التي يظهر فيها المستخدمون عند الانضمام. أي جزء في هذا المجلد يتصرف بشكل مشابه لـ SpawnLocation.
الخادميحتوي على جميع الأصول التي يتم تحميلها عندما يتم إنشاء مشهد لأول مرة على الخادم. يُوصى بأن تذهب معظم الأصول المرئية هنا.
التضاريسيحتوي على تضاريس المشهد.
الإضاءةيحتوي على خصائص الإضاءة العالمية lighting properties كخصائص، بالإضافة إلى معدلات مثل التأثيرات الجوية والتأثيرات بعد المعالجة.

الأحداث

مجلد الأحداث الخاص بالمشهد هو مجرد مكان لحفظ RemoteEvents التي تتواصل بين وحدات العميل والخادم. ليس من الضروري وضع أي شيء في هذا المجلد.

العميل

هذا السكربت ينفذ منطق المخطط على العميل.

الخادم

هذا السكربت ينفذ منطق المخطط على الخادم.

مخططات المشهد

يحدد المخطط الخاص بالمشهد ما يحدث في أي نقطة في جدول زمني المشهد. يجب عليك تعريف مخطط المشهد في كل من وحدات العميل والخادم وتضمين خطافات دورة الحياة لإدارة متى تحدث التكوينات.

خطافات دورة الحياة

تتيح لك خطافات دورة الحياة إدارة متى تحدث عمليات المشهد. عادةً ما يعمل المشهد في الإنتاج في أبسط تدفق:

قد يتم مقاطعة OnRun عند البحث:

يمكن أيضًا تكرار جميع الخطافات الثلاثة إذا تم إعادة تشغيل المشهد:

التكوينات

تحدد التكوينات الأساسية لعمليات المشهد، على سبيل المثال تشغيل الصوت في 00:32، أو جدولة رسوم متحركة لمزامنتها مع ذلك الصوت، أو جدولة حدث مشهد مثل عرض الألعاب النارية، والمزيد. تدعم كل تكوين وظائف رد نداء معينة حيث يكون المعامل الأول (self) هو مثيل التكوين.

البحث عن المشاهد

ميزة فريدة من مُنسق الأحداث هي القدرة على "البحث" حول المشاهد كما قد تبحث خلال فيديو. في وضع الاستبدال، يمكنك أيضًا التبديل بين المشاهد لمعاينة حدث متعدد المشاهد بالكامل قبل نشره للإنتاج.

البحث عن المشهد غير متاح للجميع حيث يجب ألا يتمكن المستخدمون الذين يستمتعون ببساطة بالحدث من التحكم في تدفق وقته. بدلاً من ذلك، يجب عليك منح إذن البحث بناءً على PlaceId للحدث بالإضافة إلى UserIds محددة و/أو المجموعات والأدوار داخلها.

  1. أنشئ Script جديد داخل ServerScriptService.

  2. الصق الكود التالي في السكربت الجديد.

    Script - Set Seeking Permissions
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. املأ الجداول التالية ضمن استدعاء setSeekingPermissions كما يلي:

    placeIDsقائمة مفصولة بفواصل من قيم PlaceId لدعم البحث ضمنها.
    userIDsقائمة مفصولة بفواصل من UserIds لأولئك الذين يمكنهم البحث ضمن الأماكن المدعومة.
    groupsقائمة مفصولة بفواصل من الجداول، كل منها تحتوي على معرف مجموعة ومرتبة الحد الأدنى من أعضاء تلك المجموعة الذين يمكنهم البحث ضمن الأماكن المدعومة.

ملحق إدارة المشهد

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

لتثبيت الملحق:

  1. من قائمة نافذة في الاستوديو أو شريط أدوات علامة التبويب الرئيسية، افتح صندوق الأدوات.

  2. مع تحديد علامة التبويب متجر المبدعين، اختر الملحقات من القائمة المنسدلة.

  3. في حقل البحث، اكتب مدير المشهد واضغط Enter للعثور على الملحق.

  4. انقر على أيقونة الملحق لعرض تفاصيله ثم انقر على زر تثبيت.

  5. بمجرد تثبيت الملحق، سيظهر في علامة التبويب الملحقات في الاستوديو.

تحميل وإلغاء تحميل المشاهد

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

إجراء الملحقالوصف
تحميل العميلإذا كانت محتويات العميل للمشهد غير محملة، ينقل مجلد البيئة/العميل إلى مجلد Workspace/مشاهد العميل.
تحميل الخادمإذا كانت محتويات الخادم للمشهد غير محملة، ينقل مجلد البيئة/الخادم إلى مجلد Workspace/مشاهد الخادم.
إلغاء تحميل العميلإذا كانت محتويات العميل للمشهد محملة، ينقل مجلد العميل من Workspace/مشاهد العميل مرة أخرى إلى مجلد [المشهد]/البيئة.
إلغاء تحميل الخادمإذا كانت محتويات الخادم للمشهد محملة، ينقل مجلد الخادم من Workspace/مشاهد الخادم مرة أخرى إلى مجلد [المشهد]/البيئة.
إلغاء تحميل جميع المشاهدينقل كل مجلد العميل والخادم المحملين لكل مشهد مرة أخرى إلى مجلد البيئة الخاص به.

حفظ وتحميل الإضاءة

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

  1. قم بتكوين خصائص الإضاءة الخاصة بالمشهد، والتأثيرات بعد المعالجة، والتأثيرات الجوية، وصناديق السماء من خلال خدمة Lighting على المستوى الأعلى.

  2. في نافذة ملحق مدير المشهد، انقر على حفظ الإضاءة للمشهد المطلوب.

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

    نسخ مستنسخة
    خصائص محفوظة

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

حفظ وتحميل التضاريس

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

  1. قم بتكوين تضاريس المشهد من خلال خدمة التضاريس على المستوى الأعلى.

  2. في نافذة ملحق مدير المشهد، انقر على حفظ التضاريس للمشهد المطلوب.

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

    بمجرد حفظ التضاريس لمشهد، يمكنك تحميلها بسرعة مرة أخرى إلى خدمة Terrain على المستوى الأعلى من خلال النقر على تحميل التضاريس من نافذة الملحق.

مرجع API

خطافات دورة حياة المخطط

OnSetup

تُستخدم خطافة دورة الحياة OnSetup لتهيئة الأصول والمتغيرات التي سيتم الإشارة إليها في OnRun أو OnEndScene، وإعداد الاتصالات التي من المقرر أن تستمر طوال مدة المشهد، وما إلى ذلك. تتلقى هذه الخطافة معامل timePositionObject الذي يتيح لك قراءة الوقت الحالي عند الإعداد.

Client Schema
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)
end
Server Schema
local 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)
end

OnRun

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

Client Schema
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
})
end

OnEndScene

تكون خطافة دورة الحياة OnEndScene مفيدة لتنظيف أي شيء متبقي في المشهد، مثل فصل الاتصالات التي تم إنشاؤها في OnSetup أو OnRun التي تبقى طوال مدة المشهد.

Server Schema
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.
Client Schema
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
})
end

animate

ينشئ Animation يتم تشغيله في وقت معين.

مفتاح التكوين الوصف
StartTimeمتى يتم تشغيل الرسوم المتحركة بالنسبة لمدى المشهد، بالثواني.
EndTimeوقت اختياري عند انتهاء الرسوم المتحركة بالنسبة لمدى المشهد، بالثواني.
Rigهيكل الرسوم المتحركة لتشغيل الرسوم المتحركة عليه.
AnimationIdمعرف الأصول للرسوم المتحركة التي سيتم تشغيلها.
Speedسرعة تشغيل الرسوم المتحركة؛ القيمة الافتراضية هي 1.
FadeInTimeمدة الوقت لتلاشي الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني).
FadeOutTimeمدة الوقت لتلاشي الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني).
OnStartوظيفة مخصصة للتنفيذ عند بدء تشغيل الرسوم المتحركة.
OnEndوظيفة مخصصة للتنفيذ عند انتهاء تشغيل الرسوم المتحركة.
Loopedما إذا كان يجب تكرار الرسوم المتحركة؛ القيمة الافتراضية هي false.
SyncToAudioجدول يحدد ما إذا كان يجب مزامنة الرسوم المتحركة مع تكوين الصوت. يقبل المفاتيح التالية:
  • Audio – مرجع إلى تكوين الصوت.
  • StartAtAudioTime – متى يتم تشغيل الرسوم المتحركة بالنسبة لمدى الصوت.
  • EndAtAudioTime – وقت اختياري عند انتهاء الرسوم المتحركة بالنسبة لمدى الصوت.
Client Schema
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
})
end

tween

ينشئ Tween قابل للتكوين يتم الحفاظ عليه في البحث وفي الانضمام الديناميكي، مما يعني أنه يمكنك ربط التغييرات في نقاط زمنية منفصلة ويجب أن تعمل كل شيء وتزامن كما هو متوقع.

مفتاح التكوين الوصف
StartTimesجدول أوقات البدء بالنسبة لمدى المشهد، بالثواني.
Tweenجدول يحدد الكائن والخصائص التي سيتم تغييرها. يقبل المفاتيح التالية:
  • Object – الكائن الذي سيتم تغييره.
  • Info – مثيل TweenInfo للتغيير، يحدد مدته، Enum.EasingStyle، Enum.EasingDirection، إلخ.
  • Properties – خصائص الكائن والقيم المستهدفة المرتبطة بالتغيير.
OnStartوظيفة مخصصة للتنفيذ عند بدء تشغيل التغيير.
OnHeartbeatوظيفة مخصصة للتنفيذ في كل نبض القلب؛ تتلقى نسبة التغيير كمعامل ثانٍ.
OnEndوظيفة مخصصة للتنفيذ عند انتهاء تشغيل التغيير.
SyncToAudioجدول يحدد ما إذا كان يجب مزامنة التغيير مع تكوين الصوت. يقبل المفاتيح التالية:
  • Audio – مرجع إلى تكوين الصوت.
  • StartAtAudioTimes – جدول أوقات البدء يحدد متى يتم تشغيل التغيير بالنسبة لمدى الصوت.
Client Schema
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,
})
end

interval

ينفذ وظيفة رد نداء مخصصة على مدى فترة محددة بتردد محدد، بالثواني. مفيد للأحداث المتكررة مثل الأضواء الومضية، أو نبض شدة الصوت، إلخ. أقل تردد ممكن هو 0 ثوانٍ، ولكن تقنيًا الحد الأدنى للتردد دائمًا مقيد بـ نبض القلب.

مفتاح التكوين الوصف
StartTimeبداية مدة الفاصل الزمني بالنسبة لمدى المشهد، بالثواني.
EndTimeنهاية مدة الفاصل الزمني بالنسبة لمدى المشهد، بالثواني.
Frequencyمدى تكرار وظيفة OnInterval، بالثواني، مع تنفيذ الأول في StartTime.
OnStartوظيفة مخصصة للتنفيذ عند بدء سلسلة الفواصل الزمنية.
OnIntervalوظيفة مخصصة للتنفيذ في كل فاصل زمني ضمن المدة المحددة (StartTime إلى EndTime).
OnEndوظيفة مخصصة للتنفيذ عند انتهاء سلسلة الفواصل الزمنية.
SyncToAudioجدول يحدد ما إذا كان يجب مزامنة مدة الفاصل الزمني مع تكوين الصوت. يقبل المفاتيح التالية:
  • Audio – مرجع إلى تكوين الصوت.
  • StartAtAudioTime – متى تبدأ مدة الفاصل الزمني بالنسبة لمدى الصوت.
  • EndAtAudioTime – وقت اختياري عند انتهاء مدة الفاصل الزمني بالنسبة لمدى الصوت.
Client Schema
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,
})
end

schedule

مماثل لـ interval باستثناء أنه يمكنك تحديد أوقات بدء متعددة لنفس الحدث، مثل جدولة عرض الألعاب النارية مرتين في مشهد.

مفتاح التكوين الوصف
StartTimesجدول أوقات البدء بالنسبة لمدى المشهد، بالثواني.
OnStartوظيفة مخصصة للتنفيذ في كل وقت محدد في جدول StartTimes.
Skippableقيمة منطقية تحدد ما إذا كان يمكن تخطي الحدث المجدول للمستخدمين الذين ينضمون متأخرين، أو عند البحث قبل وقت بدء مجدول. إذا تم تعيينها إلى false، ستحدث جميع أوقات بدء الأحداث المجدولة قبل وقت الانضمام/البحث في ذلك الوقت. إذا تم تعيينها إلى true، ستحدث فقط أوقات البدء المجدولة بعد الانضمام/البحث. القيمة الافتراضية هي false.
SyncToAudioجدول يحدد ما إذا كان يجب مزامنة الجدول مع تكوين الصوت. يقبل المفاتيح التالية:
  • Audio – مرجع إلى تكوين الصوت.
  • StartAtAudioTimes – جدول أوقات البدء يحدد متى يتم تشغيل وظيفة OnStart بالنسبة لمدى الصوت.
Client Schema
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
})
end

inform

يُبلغ الإطار عن أي وحدات، أو كائنات واجهة مستخدم، أو اتصالات، إلخ. التي تم إنشاؤها في خطاف دورة الحياة OnRun، مما يضمن تنظيفها بشكل صحيح عند البحث. تشمل حالات الاستخدام:

  • إبلاغ الإطار عن اتصال مؤقت غير رسمي مثل RunService.Heartbeat بحيث يتم تنظيف الاتصال عند البحث إلى نقطة سابقة في مدة المشهد.

    Server Schema
    Schema.OnRun = function()
    print("OnRun (Server)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Initialize temporary heartbeat connection
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Inform framework of connection
    Schema:inform(tempConnection)
    end
    })
    end
  • استدعاء وظيفة "تنظيف" مخصصة في ModuleScript التي تقوم بتهيئة اتصال أو مرجع آخر خلال خطاف دورة الحياة OnRun.

    Server Schema
    local 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 module
    customModule.init()
    -- Call "clean" function in custom module on scene cleanup
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Initialize heartbeat connection
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Disconnect and clear heartbeat connection
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

الوظائف

loadScene

loadScene(sceneName: string, startTime: number ?)

يقوم بتحميل مشهد برمجيًا بواسطة sceneName ويبدأه عند startTime من بدايته. سيكون هناك "فترة سماح" مدتها 5 ثوانٍ لتحميل المشهد من الخادم قبل أن يحدث البحث ويبدأ تشغيل المشهد. هذا يعني أنه إذا استدعيت loadScene("[SceneName]", 20) في تمام الساعة 4:15:00 مساءً، سينتظر الإطار 5 ثوانٍ بالإضافة إلى 20 المطلوبة، مما يبدأ المشهد في الساعة 4:15:25 مساءً.

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" 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

يعيد مثيل من المخطط لإنشاء منطق للمشهد.

Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
end

seek

seek(time: number)

يبحث عن القيمة time، بالثواني، من بداية المشهد المحمل حاليًا.

Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number)

يحدد مقدار الوقت من نهاية جميع المشاهد التي يتم فيها إرسال تحذير. يمكنك اكتشاف التحذير إما من جانب العميل من خلال onSceneEndingWarningForClient أو من جانب الخادم من خلال onSceneEndingWarningForServer.

Script
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)

يعيد مجلد البيئة الخاص بالمشهد الحالي من جانب العميل أو جانب الخادم، اعتمادًا على ما إذا تم استدعاؤه من سكربت مخطط العميل أو سكربت مخطط الخادم على التوالي.

Client Schema
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)
end
Server Schema
local 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)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

يعيد مجلد البيئة الخاص بالمشهد من جانب الخادم. على عكس getCurrentSceneEnvironment، يمكنك استدعاء هذه الوظيفة من سكربت مخطط العميل.

Client Schema
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)
end

isLoadingScene

isLoadingScene(): boolean

يتم استدعاؤها من الخادم لمعرفة ما إذا كان المشهد يتم تحميله حاليًا.

Script
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.

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.

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.

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.

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)
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.