مع تزايد تعقيد المشاريع، يصبح من المهم التفكير في كيفية تنظيم النصوص. يمكن أن تضمن الممارسات الجيدة في التنظيم عدم تكرار الشيفرة بين النصوص، أو أن تصبح صعبة الإدارة.
طريقة أفضل لتنظيم وإعادة استخدام الشيفرة هي مع نصوص الوحدات، وهو نوع فريد من النصوص الذي يخزن مجموعة من الدوال والمتغيرات المصممة لتحقيق غرض مشترك، مثل إدارة أموال اللاعبين أو الأعداء. يمكن استخدام الشيفرة داخل نصوص الوحدات بواسطة نصوص أخرى. بهذه الطريقة، يمكنك استدعاء نفس الدالة التي تعطي عملات من نصوص مختلفة كلما أنهى اللاعب مهمة أو وجد عنصرًا للاستلام.
من خلال تخزين الشيفرة الشائعة الاستخدام في نصوص الوحدات، يصبح صيانة وتنظيم الشيفرة أسهل لأن التغييرات تحتاج إلى أن تُجرى في نص وحدة واحدة فقط، بدلاً من تحديث نصوص متعددة.
أساسيات نصوص الوحدات
نصوص الوحدات هي في الواقع كائنات منفصلة مقارنة بكائنات النصوص. في Roblox، يمكن تمييز نصوص الوحدات برمز بنفسجي.
إنشاء نص وحدة
عادةً ما يتم وضع نصوص الوحدات في ServerScriptService عند استخدامها بواسطة نصوص جانبية للجهة الخادمة وReplicatedStorage عند استخدامها بواسطة نصوص محلية للجهة العميلة (مثل تفاعلات واجهة المستخدم).
- أنشئ نص وحدة في ServerScriptService.

هيكل نصوص الوحدات
عند إنشائها، يبدأ كل نص وحدة بالشيفرة أدناه:
local Module = {}return Module
تقوم السطر local Module = {} بإنشاء جدول، أو حاوية للشيفرة، حيث يمكن تخزين الدوال والمتغيرات المشتركة للوحدة. يجب إعادة تسمية هذا الجدول ليتناسب مع غرض الوحدة، مثل RewardManager أو ParticleController. بينما المتغيرات الأخرى تستخدم حالة الجمل (مثل myVariable)، يُفضل أن تستخدم جداول الوحدات حالة باسكال وتبدأ بحرف كبير (MyModule).
local RewardManager = {}return RewardManager
لكي تتمكن النصوص الأخرى من استخدام الدوال أو المتغيرات غير المحلية لوحدة، تنتهي كل وحدة بـ return MyModule. كلما حاول نص آخر الحصول على الشيفرة من الوحدة، يتيح return لذاك النص الوصول إلى الشيفرة المخزنة داخل جدول الوحدة.
إضافة إلى نصوص الوحدات
لإضافة دالة أو متغير إلى الوحدة يمكن استخدامه في نص آخر، اكتب اسم جدول الوحدة، متبوعًا بنقطة، واسم الدالة أو المتغير، كما في TestModule.myVariable. استخدام مشغل النقطة هو وسيلة أخرى لإضافة الشيفرة إلى جدول، مما يسمح للنصوص الأخرى بالوصول إلى تلك الشيفرة متى ما تم إرجاع جدول الوحدة.
local TestModule = {}
-- يضيف متغيرًا إلى جدول 'TestModule'
TestModule.myVariable = 100
-- يضيف دالة إلى جدول 'TestModule'
function TestModule.doTask(player)
-- شيفرة نموذجية
end
return TestModule
النطاق في نصوص الوحدات
لكي يتم استخدام دالة أو متغير الوحدة في نص خارجي، لا تكتب local.
كتابة local أمام المتغيرات والدوال يعني أنها قابلة للاستخدام بواسطة ذلك النص فقط. على الرغم من أن هذه ممارسة جيدة لمعظم النصوص لتقليل الأخطاء وحل المشكلات، لا يمكنك جعل دوال ومتغيرات نص الوحدة محلية.
يجب أن تتضمن أي شيفرة تستخدم فقط بواسطة نص الوحدة local أيضًا. على سبيل المثال، تتضمن الشيفرة أدناه المتغير المحلي difficultyModifier، الذي يمكن استخدامه فقط في نص الوحدة، والدالة getCoinReward()، القابلة للاستخدام في النصوص الخارجية للوحدة.
local RewardManager = {}
-- قابلة للاستخدام فقط في نص الوحدة
local rewardCoins = 50
-- قابلة للاستخدام فقط في نص الوحدة
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- قابلة للاستخدام في نصوص أخرى
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
استخدام الوحدات في نصوص أخرى
بحد ذاته، لا يمكن لنص الوحدة تشغيل الشيفرة — يحتاج إلى أن يتم تحميله في نص آخر باستخدام الكلمة المفتاحية require(). تقبل الوظيفة require() حجة واحدة، موقع نص الوحدة في المتصفح.
لاستخدام وحدة، في نص منفصل، اضبط متغيرًا يساوي require(moduleScript).
local MyModule = require(ServerStorage.ModuleScript)
الآن، يحتوي المتغير MyModule على جدول الوحدة الذي تم إنشاؤه في ذلك النص. لاستخدام الدوال والمتغيرات من ذلك الجدول، اكتب اسم المتغير، يليها نقطة، واسم ما تريد استخدامه في نص الوحدة، مثل MyModule.myFunction(). عندما يتم تشغيل النص ويصل إلى تلك السطر، سيصل إلى تلك الدالة المحددة أو المتغير المخزن في جدول الوحدة.
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
مثال على RewardManager
نص وحدة - RewardManager
local RewardManager = {}
-- قابلة للاستخدام فقط في نص الوحدة
local rewardCoins = 50
-- قابلة للاستخدام فقط في نص الوحدة
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- قابلة للاستخدام في نصوص أخرى
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
نص - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- تحميل نص الوحدةlocal RewardManager = require(ServerStorage.RewardManager)-- استدعاء الدالة من نص الوحدةlocal coins = RewardManager.getCoinReward("easy")print("Should award " .. coins .. " coins")
استكشاف الأخطاء العامة
تتناول بعض النصائح هنا المشكلات الشائعة عند العمل مع نصوص الوحدات. تذكر أن نصوص الوحدات قد تكون موضوعًا معقدًا يتطلب المزيد من الدقة. لمزيد من التفاصيل، راجع هذا الدليل الفني الأكثر تفصيلًا حول نصوص الوحدة.
المشكلة: تلقي رسالة خطأ تتضمن: "Infinite yield possible" أو "not a valid member".
- تحقق من تهجئة نص الوحدة حيث تم تحميلها. يجب أن تشمل require() المسار والتهجئة الدقيقة لنص الوحدة، قد يكون لها اسم مختلف عن جدول الوحدة.
المشكلة: تلقي رسالة خطأ تتضمن: "attempt to index global".
- في أي نصوص تستخدم نص الوحدة، تأكد من تحميلها باستخدام الوظيفة require(). إذا لم يكن الأمر كذلك، فلا يمكن لذلك النص استخدام الدوال والمتغيرات من نص الوحدة.
الملخص
نصوص الوحدة في Roblox هي وسيلة يستخدمها المبرمجون لتنظيم وإعادة استخدام الشيفرة. غالبًا ما يتم تخزين نص الوحدة في ServerStorage (أو ReplicatedStorage للتفاعلات المعتمدة على العميل). من هناك، يمكن للنصوص الأخرى استدعاء الدوال والمتغيرات المخزنة في تلك الوحدة.
على سبيل المثال، قد تمنح تجربة واحدة نقاطًا للاعبين مقابل جمع عناصر. يمكن لنص الوحدة التعامل مع الشيفرة لإعطاء النقاط. بعد ذلك، يمكن أن تستدعي نصوص الأنواع المختلفة من العناصر دالة نص الوحدة. هذا يقلل الحاجة لإعادة استخدام الشيفرة بين النصوص، مما يجعل الشيفرة أسهل في الفهم والصيانة.