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

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

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

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

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

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

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

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

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


البيئة
يحتوي مجلد البيئة في المشهد على كل ما يراه ويسمعه المستخدمون، بما في ذلك أشياء ثلاثية الأبعاد، تضاريس، خصائص الإضاءة وآثار بيئية، وأشياء واجهة المستخدم. عندما يتم تحميل مشهد، يتم توزيع تلك الأشياء والخصائص إلى Workspace، Terrain، وLighting، مما يحل محل الأشياء/الخصائص الموجودة لتشكيل مساحة مكررة.
يحتوي مجلد البيئة على الحاويات التالية:
| الحاوية | الوصف |
|---|---|
| العميل | يحتوي على جميع الأصول التي يجب تحميلها عندما ينضم أي مستخدم (عميل) إلى الحدث، مثل أشياء واجهة المستخدم أو نموذج الرسوم المتحركة. |
| تولد اللاعب | يحتوي على الأجزاء التي يظهر فيها المستخدمون عند الانضمام. أي جزء في هذا المجلد يتصرف مثل SpawnLocation. |
| الخادم | يحتوي على جميع الأصول التي يجب تحميلها عند إنشاء مشهد لأول مرة على الخادم. يُنصح بأن توضع معظم الأصول المرئية هنا. |
| التضاريس | يحتوي على تضاريس المشهد. |
| الإضاءة | يحتوي على خصائص الإضاءة العالمية كخصائص، بالإضافة إلى المعدلات مثل آثار الجو والتصحيح اللاحق effects. |
الأحداث
مجلد الأحداث في المشهد هو مجرد عنصر نائب لـ RemoteEvents التي تتواصل بين العميل والخادم الوحدات. ليس من الضروري وضع أي شيء في هذا المجلد.
العميل
هذا السكربت ينفذ schema منطق على العميل.
الخادم
هذا السكربت ينفذ schema منطق على الخادم.
مخططات المشهد
مخطط المشهد يحدد ما يحدث في أي نقطة في الجدول الزمني للمشهد. يجب عليك تعريف مخطط المشهد في كل من الوحدات الخاصة به العميل و الخادم وتضمين خطافات دورة الحياة لإدارة متى تحدث الإعدادات.
خطافات دورة الحياة
تتيح لك خطافات حياة المخطط إدارة متى تحدث عمليات المشهد. عادةً ما سيعمل مشهد في الإنتاج في أبسط تدفق:
يمكن أن تُقطع OnRun عند البحث:
يمكن أن تتكرر جميع ثلاث تلك الخطاطات أيضا إذا تم إعادة تشغيل المشهد:
الإعدادات
تحدد إعدادات المخطط العمليات الأساسية للمشهد، على سبيل المثال تشغيل الصوت عند 00:32، أو صف واحد من رسوم متحركة للمزامنة مع ذلك الصوت، أو جدولة حدث المشهد مثل عرض للألعاب النارية، وأكثر من ذلك. تدعم كل إعدادات بعض الوظائف المرتجعة حيث يكون المعامل الأول (self) هو مثيل الإعداد.
البحث عن المشاهد
تتمثل ميزة فريدة من نوعها في مسجل الأحداث في إمكانية "البحث" في المشاهد كما قد تبحث في فيديو. في وضع الاستبدال، يمكنك أيضًا التبديل بين المشاهد لمعاينة حدث متعدد المشاهد بالكامل قبل نشره للإنتاج.
البحث عن المشهد غير متاح للجميع حيث يجب ألا يتمتع المستخدمون الذين يستمتعون بالحدث بالقدرة على التحكم في تدفق وقته. بدلاً من ذلك، يجب أن تمنح إذن البحث بناءً على PlaceId الحدث المحدد وكذلك UserIds المحددة و/أو المجموعات والأدوار الموجودة ضمنها.
- قم بإنشاء Script جديد داخل ServerScriptService.
- قم بلصق الكود التالي في السكربت الجديد.
سكريبت - تعيين أذونات البحثlocal 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/مشاهد الخادم. |
| إلغاء تحميل العميل | إذا كان محتوى عميل المشهد محملاً، ينقل مجلد Client من Workspace/مشاهد العميل مرة أخرى إلى مجلد [المشهد]/البيئة. |
| إلغاء تحميل الخادم | إذا كان محتوى خادم المشهد محملاً، ينقل مجلد الخادم من Workspace/مشاهد الخادم مرة أخرى إلى مجلد [المشهد]/البيئة. |
| إلغاء تحميل جميع المشاهد | ينقل كافة المجلدات عميل وخادم لكل مشهد محمّل مرة أخرى إلى مجلد البيئة الخاص به. |
حفظ وتحميل الإضاءة
تخزن خدمة Lighting العلوية كافة خصائص الإضاءة وتأثيرات الأماكن. نظرًا لأنها خدمة علوية، لا يمكنك نقلها يدويًا إلى مجلد البيئة/الخادم أو البيئة/العميل لمشهد معين. بدلاً من ذلك، يمكنك استخدام الإضافة لنسخ خصائصها وأطفالها إلى مجلد البيئة/الإضاءة للمشهد.
قم بتكوين خصائص إضاءة المشهد، الآثار اللاحقة، آثار الجو، وصناديق السماء عبر خدمة Lighting العلوية.

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

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

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

بمجرد حفظ التضاريس لمشهد، يمكنك تحميلها بسرعة مرة أخرى إلى خدمة Terrain العلوية بالنقر على تحميل التضاريس من نافذة الإضافة.
مرجع API
خطافات حياة المخطط
OnSetup
جهاز OnSetup هو مخصص لتهيئة الأصول والمتغيرات المشار إليها في OnRun أو OnEndScene، وإعداد connections التي تكون مخصصة للاستمرار طوال مدة المشهد، وما إلى ذلك. تستقبل هذه الخطاطة معامل 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 (العميل)")
-- الوصول إلى بيئات المشهد؛ لا ينطبق على الوضع داخل المتن
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- انتظر الأصول
dummy = clientEnvironment:WaitForChild("Dummy")
print("الوقت الحالي هو:", timePositionObject.Value)
end
مخطط الخادم
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 (الخادم)")
-- الوصول إلى بيئة المشهد؛ لا ينطبق على الوضع داخل المتن
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("الوقت الحالي هو:", timePositionObject.Value)
end
OnRun
OnRun هو خطاطة حياة التشغيل الرئيسية داخل المخطط. يجب أن تحتوي على جميع الإعدادات المؤقتة الخاصة بالمشهد، من تشغيل الصوت أو رسوم متحركة إلى جدولة حدث مثل عرض للألعاب النارية.
مخطط العميل
Schema.OnRun = function()
print("OnRun (العميل)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("الصوت يشغل")
end,
OnEnd = function(self)
print("الصوت انتهى")
end
})
end
OnEndScene
جهاز OnEndScene مفيد لتنظيف أي شيء متبقي في المشهد، مثل قطع الاتصالات المُنشأة في OnSetup أو OnRun التي تبقى طوال مدة المشهد.
مخطط الخادم
Schema.OnEndScene = function()
print("OnEndScene (الخادم)")
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 (العميل)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("الصوت يشغل")
end,
OnEnd = function(self)
print("الصوت انتهى")
end
})
end
animate
ينشئ Animation الذي يتم تشغيله في وقت معين.
| مفتاح الإعدادات | الوصف |
|---|---|
| StartTime | عندما يجب تشغيل الرسوم المتحركة بالنسبة لطول المشهد، بالثواني. |
| EndTime | الوقت الاختياري عند إنهاء الرسوم المتحركة بالنسبة لطول المشهد، بالثواني. |
| Rig | جهاز الرسوم المتحركة لتشغيل الرسوم المتحركة عليه. |
| AnimationId | معرف الأصول للرسوم المتحركة لتشغيلها. |
| Speed | سرعة تشغيل الرسوم المتحركة؛ القيمة الافتراضية هي 1. |
| FadeInTime | مدة الوقت لتخفيف الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني). |
| FadeOutTime | مدة الوقت لتخفيف الرسوم المتحركة، بالثواني؛ القيمة الافتراضية هي 0.2 (ثواني). |
| OnStart | دالة مخصصة لتشغيلها عند بدء تشغيل الرسوم المتحركة. |
| OnEnd | دالة مخصصة لتشغيلها عند الانتهاء من تشغيل الرسوم المتحركة. |
| Looped | ما إذا كانت الرسوم المتحركة ستتكرر؛ القيمة الافتراضية هي خطأ. |
| SyncToAudio | جدول يحدد ما إذا كانت الرسوم المتحركة متزامنة مع إعداد الصوت. يقبل المفاتيح التالية:
|
مخطط العميل
Schema.OnRun = function()
print("OnRun (العميل)")
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("تشغيل الرسوم المتحركة")
end,
OnEnd = function(self)
print("توقف الرسوم المتحركة")
end
})
end
tween
ينشئ Tween قابلاً للتكوين يتم الاحتفاظ به في البحث وفي الانضمام الديناميكي، مما يعني أنه يمكنك ربط التحولات في نقاط زمنية منفصلة وكل شيء يجب أن يتم تشغيله ويتزامن كما هو متوقع.
| مفتاح الإعدادات | الوصف |
|---|---|
| StartTimes | جدول لبدء الأوقات بالنسبة لطول المشهد، بالثواني. |
| Tween | جدول يحدد العنصر والخصائص التي يجب تغييرها. يقبل المفاتيح التالية:
|
| OnStart | دالة مخصصة لتشغيلها عند بدء تشغيل التحول. |
| OnHeartbeat | دالة مخصصة لتشغيلها في كل Heartbeat؛ تستقبل معامل تحويل التحول كمعاملها الثاني. |
| OnEnd | دالة مخصصة لتشغيلها عند الانتهاء من تشغيل التحول. |
| SyncToAudio | جدول يحدد ما إذا كان يجب تزامن التحول مع إعداد الصوت. يقبل المفاتيح التالية:
|
مخطط العميل
Schema.OnRun = function()
print("OnRun (العميل)")
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("التحول يعمل")
end,
OnHeartbeat = function(self, alpha)
print("نبض التحول", alpha)
end,
OnEnd = function(self)
print("التحول مكتمل")
end,
})
end
interval
ينفذ دالة مرتجعة مخصصة على مدى مدة محددة بتردد محدد، بالثواني. مفيد للأحداث المتكررة مثل الأضواء الوامضة، تغيير شدة الصوت، إلخ. أدنى تردد ممكن هو 0 ثواني، لكن تقنيًا يتم تقليص الحد الأدنى للتردد دائمًا إلى Heartbeat.
| مفتاح الإعدادات | الوصف |
|---|---|
| StartTime | بداية مدة الفاصل الزمني بالنسبة لطول المشهد، بالثواني. |
| EndTime | نهاية مدة الفاصل الزمني بالنسبة لطول المشهد، بالثواني. |
| Frequency | مدى تكرار دالة OnInterval، بالثواني، مع أول تنفيذ يحدث عند StartTime. |
| OnStart | دالة مخصصة لتشغيلها عند بدء السلسلة من الفواصل. |
| OnInterval | دالة مخصصة لتشغيلها في كل فاصل ضمن المدة المحددة (StartTime إلى EndTime). |
| OnEnd | دالة مخصصة لتشغيلها عند انتهاء سلسلة الفواصل. |
| SyncToAudio | جدول يحدد ما إذا كان يجب تزامن مدة الفاصل الزمني مع إعداد الصوت. يقبل المفاتيح التالية:
|
مخطط العميل
Schema.OnRun = function()
print("OnRun (العميل)")
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 | منطق يحدد ما إذا كان يمكن تخطي الحدث المجدول للمستخدمين الذين ينضمون متأخرين، أو عند البحث للأمام عن وقت بدء مجدول. إذا تم تعيينه إلى خطأ، ستحدث جميع أوقات بدء الأحداث المجدولة التي قبل وقت الانضمام/البحث في ذلك الوقت. إذا تم تعيينه إلى صحيح، ستحدث أوقات البدء المجدولة بعد الانضمام/البحث فقط. القيمة الافتراضية هي خطأ. |
| SyncToAudio | جدول يحدد ما إذا كان يجب تزامن الجدولة مع إعداد الصوت. يقبل المفاتيح التالية:
|
مخطط العميل
Schema.OnRun = function()
print("OnRun (العميل)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- قم بتهيئة الاتصال المؤقت للنبض
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- أبلغ الإطار عن الاتصال
Schema:inform(tempConnection)
end
})
end
inform
يُبلغ الإطار بأي وحدات، عناصر واجهة المستخدم، اتصالات، إلخ، التي تم إنشاؤها في خطوة حياة OnRun، مما يضمن تنظيفها بشكل صحيح عند البحث. تتضمن حالات الاستخدام:
إبلاغ الإطار عن اتصال مؤقت مثل RunService.Heartbeat بحيث يتم تنظيف الاتصال عند البحث في وقت سابق من مدة المشهد.
مخطط الخادمSchema.OnRun = function()print("OnRun (الخادم)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- قم بتهيئة الاتصال المؤقت للنبضlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- أبلغ الإطار عن الاتصالSchema:inform(tempConnection)end})endاستدعاء دالة "التنظيف" مخصصة في ModuleScript التي تنشئ اتصالاً أو مرجعًا آخر خلال خطوة حياة OnRun.
مخطط الخادم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 (الخادم)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- استدعاء الدالة "init" في الوحدة المخصصةcustomModule.init()-- استدعاء الدالة "clean" في الوحدة المخصصة عند تنظيف المشهدSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- تهيئة الاتصال بالنبضCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- فصل وتنظيف الاتصال بالنبضif 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"))
-- اكتشف المشهد التالي الذي سيتم تحميله عندما ينتهي المشهد الحالي
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" انتهت؛ تحميل المشهد الأول في الحفلة
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" انتهت؛ تحميل المشهد الثاني في الحفلة
EventSequencer.loadScene("Track2")
else
-- الرجوع إلى المشهد السابق
EventSequencer.loadScene("PreShow")
end
end)
createSchema
createSchema(): table
يعيد مثيلًا من مخطط المشهد schema لإنشاء منطق للمشهد.
مخطط العميل
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (العميل)")
end
seek
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"))
-- تحميل المشهد
EventSequencer.loadScene("BeautifulScene")
-- تعيين وقت التحذير إلى 5 ثوانٍ قبل انتهاء المشهد
EventSequencer.setSceneWarningTime(5)
-- اكتشاف متى يكون المشهد على وشك الانتهاء
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("المشهد على وشك الانتهاء!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
يمنح إذن البحث بناءً على PlaceId للحدث المحدد وكذلك UserIds المحددة و/أو المجموعات والأدوار الموجودة ضمنها. انظر البحث والتبديل بين المشاهد لمزيد من المعلومات.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (يؤدي إلى اشتباك)
يعيد مجلد بيئة الخاصة بالمشهد الحالي على جانب العميل أو جانب الخادم، اعتمادًا على ما إذا تمت استدعاؤه من سكربت مخطط العميل أو سكربت مخطط الخادم على التوالي.
مخطط العميل
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 (العميل)")
-- الوصول إلى بيئات المشهد؛ لا ينطبق على الوضع داخل المتن
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("الوقت الحالي هو:", timePositionObject.Value)
end
مخطط الخادم
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 (الخادم)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (يؤدي إلى اشتباك)
يعيد مجلد بيئة الخاصة بالمشهد الحالي على جانب الخادم. على عكس 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 (العميل)")
-- الوصول إلى بيئات المشهد؛ لا ينطبق على الوضع داخل المتن
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("الوقت الحالي هو:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
يتم استدعاؤه من الخادم لمعرفة ما إذا كان المشهد قيد التحميل حاليًا.
سكريبتlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))print(EventSequencer.isLoadingScene())while EventSequencer.isLoadingScene() dotask.wait()endprint("تم تحميل المشهد")
الأحداث
onSceneEndingWarningForClient
يتم إطلاقها على العميل قبل أن يكون المشهد على وشك الانتهاء. الوقت الافتراضي هو 3 ثوانٍ، لكن يمكنك تكوينه من خلال setSceneWarningTime. لا يمكن توصيل هذا الحدث إلا في LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- اكتشاف متى يكون المشهد على وشك الانتهاء (من جانب العميل)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("المشهد على وشك الانتهاء!")
end)
onSceneEndingWarningForServer
يتم إطلاقها على الخادم قبل أن يكون المشهد على وشك الانتهاء. الوقت الافتراضي هو 3 ثوانٍ، لكن يمكنك تكوينه من خلال setSceneWarningTime. لا يمكن توصيل هذا الحدث إلا في Script.
سكريبت
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- اكتشاف متى يكون المشهد على وشك الانتهاء (من جانب الخادم)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("المشهد على وشك الانتهاء!")
end)
onSceneLoadedForClient
يتم إطلاقها على العميل عندما يبدأ المشهد. لا يمكن توصيل هذا الحدث إلا في LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- اكتشاف متى يبدأ المشهد (من جانب العميل)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("المشهد يبدأ الآن!")
end)
onOrchestrationFinished
يتم إطلاقه على الخادم عندما يصل المشهد إلى طول الزمن الخاص به وينتهي فعليًا. يستقبل هذا الحدث معطى نص متسلسل endedSceneName للمشهد الذي انتهى للتو، ويمكنك التواصل مع هذا الحدث لجدولة تحميل مشهد آخر. لا يمكن توصيله إلا في Script.
سكريبت
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- اكتشف المشهد التالي الذي سيتم تحميله عندما ينتهي المشهد الحالي
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" انتهت؛ تحميل المشهد الأول في الحفلة
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" انتهت؛ تحميل المشهد الثاني في الحفلة
EventSequencer.loadScene("Track2")
else
-- الرجوع إلى المشهد السابق
EventSequencer.loadScene("PreShow")
end
end)-- "Track1" انتهى؛ تحميل المشهد الثاني في الحفل
EventSequencer.loadScene("Track2")
else
-- العودة إلى مشهد ما قبل العرض
EventSequencer.loadScene("PreShow")
end
end)