مسجل الأحداث

*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، قم بالتنقيب عن القيمة داخل المتن داخل مجلد ReplicatedStorage.

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

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

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

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

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

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

طول الزمن

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

البيئة

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

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

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

الأحداث

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

العميل

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

الخادم

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

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

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

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

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

يمكن أن تُقطع OnRun عند البحث:

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

الإعدادات

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

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

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

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

  1. قم بإنشاء Script جديد داخل ServerScriptService.
  2. قم بلصق الكود التالي في السكربت الجديد.
سكريبت - تعيين أذونات البحث

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.setSeekingPermissions({
placeIDs = {},
userIDs = {},
groups = {
{GroupID = , MinimumRankID = },
}
})
  1. املأ الجداول التالية ضمن استدعاء setSeekingPermissions كما يلي:
placeIDsقائمة مفصولة بفواصل من قيم PlaceId لدعم البحث ضمنها.
userIDsقائمة مفصولة بفواصل من UserIds للأشخاص الذين يمكنهم البحث ضمن الأماكن المدعومة.
groupsقائمة مفصولة بفواصل من الجداول، كل منها يحتوي على معرف مجموعة والحد الأدنى من الرتبة لأعضاء تلك المجموعة الذين يمكنهم البحث ضمن الأماكن المدعومة.

إضافة مكون مدير المشهد

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

لتثبيت المكون:

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

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

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

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

  5. بعد تثبيت المكون، سيظهر في علامة تبويب الإضافات في الاستوديو.

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

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

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

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

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

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

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

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

    النسخ المكررة
    الخصائص المحفوظة

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

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

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

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

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

  3. حدد وقم بتوسيع مجلد البيئة/التضاريس لذلك المشهد وسترى عنصر 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جدول يحدد ما إذا كانت الرسوم المتحركة متزامنة مع إعداد الصوت. يقبل المفاتيح التالية:
  • Audio – المرجع إلى إعداد الصوت.
  • StartAtAudioTime – متى يجب تشغيل الرسوم المتحركة بالنسبة لدورة الصوت.
  • EndAtAudioTime – الوقت الاختياري الذي يجب إنهاء الرسوم المتحركة فيه بالنسبة لدورة الصوت.
مخطط العميل

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

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جدول يحدد ما إذا كان يجب تزامن مدة الفاصل الزمني مع إعداد الصوت. يقبل المفاتيح التالية:
  • Audio – المرجع إلى إعداد الصوت.
  • StartAtAudioTime – متى يجب بدء مدة الفاصل الزمني بالنسبة لدوران الصوت.
  • EndAtAudioTime – الوقت الاختياري الذي يجب أن تنتهي فيه مدة الفاصل الزمني بالنسبة لدوران الصوت.
مخطط العميل

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جدول يحدد ما إذا كان يجب تزامن الجدولة مع إعداد الصوت. يقبل المفاتيح التالية:
  • Audio – المرجع إلى إعداد الصوت.
  • StartAtAudioTimes – جدول من أوقات البدء تحدد متى يتم تشغيل دالة OnStart بالنسبة لدوران الصوت.
مخطط العميل

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,
    })
    end
    ModuleScript - CustomModule

    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- تهيئة الاتصال بالنبض
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- فصل وتنظيف الاتصال بالنبض
    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 مساءً.

سكريبت

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() do
task.wait()
end
print("تم تحميل المشهد")

الأحداث

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