التطوير / ROBLOX
أين تضع Script وLocalScript وModuleScript في Roblox Studio
فحص عملي للموقع وRunContext: تشغيل الخادم والعميل، نسخ LocalScript، تحميل الوحدة وجدول الحاويات.
حدد أولاً من ينفذ الفعل #
امنح كل مقطع مهمة واضحة. تحتاج قواعد المكافآت إلى تحقق الخادم، بينما عرض الواجهة المحلية من عمل العميل. يمكن وضع دالة مشتركة في وحدة تستدعيها الجهة المناسبة. اختر نقطة التشغيل قبل إضافة العناصر في Explorer.
يتأثر التنفيذ بالنوع والموقع وRunContext في Script العادي. قد يتصرف النص نفسه بطريقة مختلفة في حاوية أخرى. ننشئ هنا رسالتين منفصلتين للخادم والعميل ثم نحمل وحدة صغيرة. استخدم مشروع تدريب منفصلاً لربط كل رسالة بمثال محدد.
1. شغّل Script عادياً على الخادم #
أضف Script عادياً باسم ServerStart داخل ServerScriptService. اختره واضبط RunContext على Server في Properties. تعمل القيمة الافتراضية Legacy أيضاً في هذه الحاوية، لكن Server توضح الهدف. تأكد من تفعيل السكربت.
استبدل المحتوى بالمثال الأول وافتح Output ثم ابدأ Test مع لاعب. توقع SERVER: ready في سياق الخادم. يثبت ذلك الوصول إلى print() وليس اكتمال نظام مكافآت. إذا غابت الرسالة فافحص الفلاتر والموقع قبل تغيير الكود.
print("SERVER: ready")2. شغّل Script للعميل #
أضف Script عادياً باسم ClientStart في ReplicatedStorage. اضبط RunContext صراحةً على Client ثم الصق المثال الثاني. وجود Script بقيمة Legacy هنا لا ينشئ وحده نقطة تشغيل للعميل.
ابدأ Test جديداً. ابحث عن CLIENT: ready في سياق العميل وSERVER: ready في سياق الخادم. هاتان جهتا اللعبة التجريبية. يوصي التوثيق الحالي بـReplicatedStorage لهذا المدخل. تجنب نقل Script ذي سياق Client إلى StarterPlayerScripts؛ قد يعمل الأصل ونسخته ويسببان التكرار.
print("CLIENT: ready")3. راعِ النسخ عند استخدام LocalScript #
يعمل LocalScript على العميل ولا يمتلك RunContext. لتمرين مستقل أوقف Test وعطّل ClientStart مؤقتاً، ثم أنشئ LocalScript باسم LocalStart داخل StarterPlayer → StarterPlayerScripts واستخدم print("LOCAL: ready").
ابحث عن رسالة العميل بعد الاختبار. تنسخ محتويات Starter إلى اللاعب، ولذلك قد يشير المصدر إلى Players ثم اسم اللاعب ثم PlayerScripts. يفسر ذلك اختلاف مسار التنفيذ عن موضع الأصل. LocalScript المخزن فقط في ReplicatedStorage لا يبدأ لمجرد وجوده هناك.
4. حمّل ModuleScript من نقطة تشغيل #
أوقف الاختبار وأنشئ ModuleScript باسم PracticeModule بدقة داخل ReplicatedStorage. الصق أول مثالي هذا القسم. يعيد جدولاً يحتوي start(). إنشاء الوحدة لا يستدعي الدالة؛ يجب أن يحملها كود يعمل فعلاً.
استبدل ServerStart بالمثال الثاني: يجد الوحدة ويتلقى قيمتها عبر require() ثم يستدعي start(). ينبغي أن يعرض Test جديد MODULE: started في سياق الخادم. تنتظر WaitForChild الاسم المحدد؛ الخطأ الإملائي لا ينشئ الوحدة الغائبة. قارن اسم Explorer بالنص PracticeModule في الكود.
local PracticeModule = {}
function PracticeModule.start()
print("MODULE: started")
end
return PracticeModuleprint("SERVER: ready")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local practice = require(ReplicatedStorage:WaitForChild("PracticeModule"))
practice.start()5. اختر الحاوية بحسب الغرض #
استخدم الجدول كبنية أولية. تناسب ServerScriptService مدخل الخادم، وReplicatedStorage مدخل Script الموصى به بسياق Client والوحدات المشتركة. يمكن إبقاء وحدة خاصة بالخادم في ServerScriptService عندما لا يحتاجها العميل.
الموقع وإمكانية الوصول سؤالان مختلفان. تصل محتويات ReplicatedStorage إلى العملاء؛ فلا تضع أسراراً في وحداتها ولا تجعلها بديلة عن تحقق الخادم للمشتريات والمكافآت. تخزن ServerStorage عناصر الخادم، ولا يبدأ Script عادي داخلها تلقائياً. ضع نقطة التشغيل في حاوية تنفيذ مناسبة.
| النوع والسياق | الموقع | الغرض |
|---|---|---|
| Script · Server | ServerScriptService | مدخل الخادم |
| Script · Client | ReplicatedStorage | مدخل العميل |
| LocalScript | StarterPlayer → StarterPlayerScripts | نسخة العميل |
| ModuleScript | ReplicatedStorage | وحدة مشتركة |
| Script | ServerStorage | تخزين؛ Script لا يبدأ |
6. افحص أربعة أمور عند غياب التشغيل #
افحص النوع الدقيق ومسار Explorer وRunContext إن وجد وحالة التفعيل. وللوحدة ابحث أيضاً عن السكربت العامل الذي يستدعي require(). تشابه الأيقونات أو تطابق الأسماء لا يثبت تطابق بيئة التنفيذ.
ضع print قصيراً في البداية وأزل فلتر النص وأظهر السياق المناسب في Output. إذا ظهرت العلامة الأولى فقط فافحص ما بين العلامتين؛ وإذا غابتا فافحص البدء وعرض الرسائل. اقرأ خطأ التنفيذ من مصدره. نقل الملفات عشوائياً يصعّب عزل السبب.
7. احفظ الأصل وأعد التحقق #
أوقف Test قبل التعديل النهائي. إذا عدلت نسخة LocalScript في PlayerScripts أثناء اللعب، انقل الإصلاح إلى الأصل في StarterPlayerScripts. تُعاد عناصر جلسة الاختبار بعد الإيقاف، ولذلك قد لا يبقى تعديل النسخة المؤقتة في التشغيل التالي.
أعد تفعيل ClientStart للأمثلة الرئيسية وعطّل LocalStart عندما لا تحتاجه. في Test جديد افحص SERVER: ready وCLIENT: ready وMODULE: started من استدعاء الخادم. احفظ المشروع. ينبغي أن تعرف النوع والمسار والسياق والمستدعي لكل رسالة قبل نقل الوظائف الحقيقية واحدةً تلو الأخرى.
المصادر الأصلية
Roblox Creator HubRoblox Creator Hub · ModuleScript
Roblox Creator Hub · Output
Roblox Creator Hub · Testing modes