من أجل استوديوهات التطوير المهنية، يمكن أن يؤدي إعداد أدوات الطرف الثالث والاستثمار في الأتمتة إلى تحسين كبير في إنتاجية المطورين. تتميز نهج Roblox في السحابة بالعديد من المزايا، ولكن نقل بعض الأجزاء من سير العمل التطويري خارج السحابة يمكن أن يساعد الفرق الأكبر في تتبع التغييرات مع مرور الوقت، ومراجعة الكود، واستخدام اللغات والأدوات التي الفوا استخدامها بالفعل.
- إذا كنت ترغب فقط في استخدام محرر نصوص خارجي أو الاحتفاظ بالكود في التحكم في الإصدارات، فإن Script Sync هو خيار رائع.
- إذا كنت تريد إدارة مشروعك بالكامل كمجموعة من الملفات المحلية، تغطي هذه الصفحة بعض الأدوات والاستراتيجيات.
مشكلة المزامنة
في جوهرها، فإن استخدام أدوات خارجية مع Roblox هو مشكلة المزامنة:
- تريد أن توجد مثيلات Roblox الخاصة بك كملفات على القرص حتى تتمكن من استخدام أدواتك الخاصة للعمل عليها.
- يجب عليك إعادة ملفاتك إلى مشروع Roblox الخاص بك بعد الانتهاء من العمل عليها.
- إذا قام شخص آخر بتغيير تلك الملفات نفسها في هذه الأثناء، يجب عليك التعامل مع أي تعارضات.
لكي تشعر الحل الكامل بأنه سلس وأوتوماتيكي، تحتاج إلى: أ) الاستماع للتغييرات في الملفات و ب) دمج هذه التغييرات مرة أخرى في Studio.
بدلاً من نهج Roblox القائم على السحابة، يسمح Rojo بنهج "نظام الملفات أولاً". يقوم بتشغيل خادم على جهازك يتواصل مع إضافة Studio لمزامنة ملفاتك ونموذج بيانات Studio.
تثبيت Rojo باستخدام Rokit
يمكنك تنزيل وتشغيل ملف Rojo الثنائي يدويًا، ولكن هذه الطريقة تحمل مخاطر استخدام مطورين مختلفين على فريقك إصدارات Rojo مختلفة. الحل الأفضل هو استخدام مدير سلسلة أدوات مثل Rokit، والذي يستخدم ملف تكوين - قائمة بالمستودعات والإصدارات - لجعل عملية التثبيت والترقية متسقة عبر الآلات.
لأنه يدير بيئة التطوير الأساسية الخاصة بك بدلاً من الحزم داخل مشروعك، فإن Rokit يشبه أكثر nvm من npm، ولكن المقارنة ليست مثالية. يبدو ملف rokit.toml بسيطًا هكذا:
[tools]
rojo = "rojo-rbx/rojo@7.6.1"
wally = "upliftgames/wally@0.3.2"
lune = "lune-org/lune@0.10.4"
ثم تقوم بتثبيت هذه الأدوات باستخدام rokit install. بالإضافة إلى ملف rokit.toml العام، يدعم Rokit ملفات لكل مشروع، بحيث يمكنك بسهولة استخدام إصدارات مختلفة من Rojo أو Wally أو أي أداة أخرى لمشاريع مختلفة وإبقاء فريقك بالكامل على نفس الإصدارات.
عندما تصدر أداة إصدارًا جديدًا، تقوم بعد ذلك بزيادة رقم الإصدار في ملف .toml الخاص بك بوضوح، وتستخدم Rokit لإجراء الترقية، ثم اختبار الإصدار الجديد، والتراجع إذا تسبب في أي مشاكل. للحصول على الأوامر وتعليمات التثبيت، راجع Rokit.
تشغيل Rojo
بعد تثبيت Rojo باستخدام Rokit، ما قمت بتثبيته فعلاً هو خادم Rojo. الخطوة التالية هي تثبيت إضافة Rojo لـ Roblox Studio.
يمكنك تثبيته من متجر المبدعين أو تثبيته محليًا باستخدام هذا الأمر:
rojo plugin install
ثم قم بإنشاء هيكل المشروع للعبتك الجديدة وبنيتها:
rojo init my-new-experiencecd my-new-experiencerojo build -o my-new-experience.rbxl
بدلاً من ذلك، يمكنك نقل لعبة قائمة. في كلتا الحالتين، بعد أن يكون لديك مشروع، ابدأ خادم Rojo:
rojo serve
في Roblox Studio، افتح ملف .rbxl الذي قمت بإنشائه للتو، افتح إضافة Rojo، واتصل بالخادم الذي يعمل الآن، في تلك المرحلة يمكنك بدء إجراء تغييرات في محرر النصوص المفضل لديك ومشاهدة تلك التغييرات تتزامن تلقائيًا مع Studio.


تمتلك مشاريع Rojo متطلبات معينة لتسمية الملفات، والعديد من خيارات التكوين، وبعض القيود، جميعها مغطاة في وثائق Rojo.
مديري الحزم
يمتلك Roblox مجموعة قوية من واجهات البرمجة المضمنة، ولكن إذا كنت ترغب في استخدام حزم برمجية من المجتمع بطريقة متسقة وقابلة للتكرار، تحتاج إلى مدير حزم. Wally هو خيار شائع. يمكنك تثبيته من خلال Rokit، تمامًا مثل Rojo.
داخل دليل Rojo الخاص بلعبتك، قم بتشغيل wally init. ثم أضف الحزم التي ترغب فيها إلى wally.toml. قد يبدو الملف هكذا:
[package]
name = "my-home-directory/my-new-experience"
version = "0.1.0"
registry = "https://github.com/UpliftGames/wally-index"
realm = "shared"
[dependencies]
react = "jsdotlua/react@17.2.1"
react-roblox = "jsdotlua/react-roblox@17.2.1"
cryo = "phalanxia/cryo@1.0.3"
ثم قم بتشغيل wally install. يقوم Wally بإنشاء دليل Packages وتنزيل الحزم المحددة هناك. الخطوة النهائية هي إضافة دليل Packages إلى Rojo بحيث تتزامن محتوياته مرة أخرى إلى Roblox. افتح default.project.json وأضف المسار. لتبسيط الأمور، تضيف هذه المثال الدليل بالكامل إلى ReplicatedStorage بحيث تكون جميع الحزم متاحة لجميع السكربتات، لكن قد تفضل إضافة حزم محددة إلى ServerScriptService أو StarterPlayerScripts:
{
"name": "my-new-experience",
"tree": {
"$className": "DataModel",
"ReplicatedStorage": {
"Shared": {
"$path": "src/shared"
},
"Packages": {
"$path": "Packages"
}
},
...
}
}
ثم يمكنك طلب الحزم داخل سكربتاتك تمامًا كما ترسل أي ModuleScript أخرى:
local Players = game:GetService("Players")local ReplicatedStorage = game:GetService("ReplicatedStorage")local React = require(ReplicatedStorage.Packages.react)local ReactRoblox = require(ReplicatedStorage.Packages["react-roblox"])local handle = Instance.new("ScreenGui", Players.LocalPlayer.PlayerGui)local root = ReactRoblox.createRoot(handle)local helloFrame = React.createElement("TextLabel", {Text = "مرحبا بالعالم!",Size = UDim2.new(0, 200, 0, 200),Position = UDim2.new(0.5, 0, 0.5, 0),AnchorPoint = Vector2.new(0.5, 0.5),BackgroundColor3 = Color3.fromRGB(248, 217, 109),Font = Enum.Font.LuckiestGuy,TextSize = 24})root:render(helloFrame)
مثل معظم مشاريع البرمجة الأخرى، الهدف هو أن يتمكن المساهمون من استنساخ مستودع، وتثبيت Rokit، وتشغيل بعض الأوامر، والحصول على نفس بيئة التطوير مثل بقية الفريق.
التحكم في الإصدارات
وجود مجموعة من الملفات النصية العادية على جهاز الكمبيوتر الخاص بك يفتح مجموعة من الإمكانيات، لكن الأهم هو التحكم في الإصدارات. يمكنك تخزين ملفاتك في مستودع Git أو Mercurial؛ استضافة مستودعات بعيدة ومراجعة تغييرات الكود في GitHub، GitLab، أو Bitbucket؛ واستخدام أي محرر نصوص تحبه.
يمتلك Visual Studio Code وCursor أكبر نظام إيكولوجي للإضافات، ولكن Sublime Text وNotepad++، وVim جميعها خيارات شعبية. أيًا كان المحرر الذي تختاره، سيتطلب محاذاة قدرات محرر سكربت Studio بعض الإضافات.
قد تعتبر أيضًا إضافة:
- مدقق نحوي مثل selene لكشف المشكلات الشائعة وفرض معايير البرمجة
- مُنسق كود مثل StyLua
- خادم لغة مثل Luau Language Server للاكمال التلقائي، والتحقق من الأنواع، والمزيد
تراجع كل شيء
نظرًا لأن أدوات الطرف الثالث تقوم بمزامنة التغييرات مرة أخرى إلى Roblox Studio بدلاً من استبداله، فإن أي جزء من سير العمل هذا لا يتضمن أي التزام. في أي وقت، يمكنك التوقف عن استخدام واحدة أو كل هذه الأدوات والعودة إلى تحرير لعبتك حصريًا في Studio. إن عدم وجود مخاطرة يجعل التجريب مع أدوات الطرف الثالث جذابًا بشكل خاص.