
لتطبيق معرفتك بنصوص الوحدة، قم بإنشاء نص وحدة يسمح للاعبين بالتقاط المفاتيح واستخدامها لفتح صناديق الكنز.
إعداد المشروع
يتضمن هذا المشروع خريطة بدء مع لوحة زعماء وكائنات ملتقطة مكتوبة للمفاتيح وصناديق الكنز.
قم بتحميل مشروع البدء
في Roblox Studio، افتح الملف الذي تم تنزيله: Intro to Module Scripts - Starter Project.rbxl.

إنشاء نص وحدة
لكي يتمكن اللاعبون من الحصول على الكنز من الصناديق، قم بإنشاء نص وحدة يُسمى TreasureManager. استخدام نص وحدة سيوصل بين عمليات الالتقاط ولوحات الزعماء معًا.
في ServerStorage، أنشئ ModuleScript جديدة وأعد تسميتها إلى TreasureManager.

في TreasureManager، أعد تسمية جدول الوحدة الافتراضي عن طريق استبدال module بـ TreasureManager في كلا المكانين.
local TreasureManager = {}return TreasureManager
استخدام الوظائف في نصوص الوحدة
لاختبار كيفية عمل الوظائف في نصوص الوحدة، قم بإنشاء وظيفة جديدة باسم getKey(). عند استدعاء وظيفة getKey() من نص آخر، ستتلقى جزء المفتاح لتدميره وتضيف 1 إلى عدد المفاتيح في جعبة اللاعب.
إنشاء وظيفة وحدة للمفاتيح
ستستخدم هذه النصوص وحدة مجموعة من الوظائف المحلية ونصوص الوحدة، اكتب تعليقين لمساعدتك في فصلها.
local TreasureManager = {}------------------ الوظائف المحلية------------------ وظائف الوحدةreturn TreasureManagerتحت تعليق وظائف الوحدة، أضف وظيفة وحدة جديدة إلى TreasureManager باسم getKey().
استخدم معاملين:
- keyPart - الجزء الذي سيتم تدميره.
- whichCharacter - اللاعب الذي لمست جزء المفتاح.
local TreasureManager = {}------------------ الوظائف المحلية------------------ وظائف الوحدةfunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerفي getKey()، دمر keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
استخدام وظيفة الوحدة
الآن، يمكن استخدام وظيفة الوحدة getKey() في نصوص أخرى. لاختبار هذه الوظيفة، ستفتح نصًا مسبق الصنع وتستدعيها.
افتح نص المفتاح في Workspace ⟩ Keys ⟩ KeyScript.
في keyScript، قم بتخزين نص الوحدة في متغير يُسمى treasureManager واضبطه على: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- استدعي نص الوحدة أدناه ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()يوجد بالفعل وظيفة تُسمى partTouched() للتحقق من لمس لاعب للجزء. داخل partTouched():
- استدعِ وظيفة الوحدة getKey() لتدمير المفتاح.
- مرر keyPart و whichCharacter.
local ServerStorage = game:GetService("ServerStorage")-- استدعي نص الوحدة أدناه ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- أعط اللاعب مفتاحًا ودمر جزء المفتاح-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendقم بتشغيل المشروع وتحقق من أن لمس مفتاح يدمره.
نصائح استكشاف الأخطاء
المشكلة: حصولك على رسالة خطأ تتضمن: "Infinite yield possible".
- تحقق من تهجئة نص الوحدة في النص. إذا كان نص الوحدة، مثل TreasureManager، مكتوبًا بشكل مختلف، ستظهر هناك خطأ.
المشكلة: حصولك على رسالة خطأ تتضمن: "attempt to index global".
- تحقق من السطر الذي يتضمن الاستدعاء لنص الوحدة في keyScript. إذا كان النص لا يتضمن require، لا يمكنه استخدام الوظائف والمتغيرات من نص الوحدة.
المشكلة: النص لا يعمل أو لا يمكنه التقاط المفاتيح.
في نص الوحدة، تأكد من أن كل الشيفرة بين local TreasureManager = {} و return TreasureManager. يجب أن تكون return آخر سطر من الشيفرة في نص الوحدة.
تحقق من وجود قوسين في نهاية السطر مع require، كما هو الحال في WaitForChild("TreasureManager")).
إنشاء وظيفة محلية
الآن، تتعقب لوحة الزعماء عدد المفاتيح والكنوز التي يمتلكها اللاعب. لتغيير أرقام لوحة الزعماء، استخدم وظيفة محلية في نص الوحدة. يتم استخدام وظيفة محلية لأنه لن تكون هناك حاجة لتغيير قيم مفاتيح أو كنوز اللاعب في أي مكان آخر غير نص TreasureManager.
في ServerStorage، افتح نص TreasureManager.
قم بإنشاء متغيرات محلية للقيام بما يلي:
احصل على خدمة اللاعبين حتى يتمكن النص من العمل مع إحصاءات لوحة زعماء اللاعبين.
قم بتخزين عدد المفاتيح التي يحصل عليها اللاعب بعد لمس keyPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ الوظائف المحلية------------------ وظائف الوحدةfunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerانسخ والصق هاتين الوظيفتين المحليتين في قسم الوظائف المحلية.
getPlayerKeys() تعيد قيمة Lockpicks إحصائية الزعماء للاعب.
getPlayerTreasure() تعيد قيمة Treasure إحصائية الزعماء للاعب.
------------------ الوظائف المحليةlocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ وظائف الوحدةلإضافة مفاتيح اللاعب، في وظيفة getKey():
قم بإنشاء متغير محلي لاستدعاء getPlayerKeys(whichCharacter).
أضف قيمة keyDrop إلى playerKeys.
------------------ وظائف الوحدةfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endقم بتشغيل المشروع. تحقق من أن لمس مفتاح يدمره ويضيف 1 إلى مفاتيح اللاعب في لوحة الزعماء.

إذا كنت بحاجة، تحقق من نصك مقابل النص أدناه لأي مشكلات استكشاف.
نص TreasureManager الحالي
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ الوظائف المحلية
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ وظائف الوحدة
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
الحصول على معلومات من نصوص الوحدة
سيتم استخدام نص TreasureManager عندما يلمس اللاعب صندوق كنز للتحقق مما إذا كان لديهم على الأقل مفتاح واحد قبل فتحه ومنحهم الذهب.
تحقق مما إذا كان يمكن فتح الصناديق
أولاً في نص TreasureManager ⟩ ServerStorage، قم بإعداد متغيرات لعدد المفاتيح التي تكلف فتح صندوق، وكمية الذهب التي يحتويها كل صندوق.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ الوظائف المحليةlocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endلإنشاء وظيفة تتحقق مما إذا كان يمكن للاعب فتح صندوق، في قسم وظائف الوحدة، أضف وظيفة جديدة إلى جدول TreasureManager تُسمى canOpenChest() مع المعامل whichCharacter.
------------------ وظائف الوحدةfunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endانسخ والصق الشيفرة أدناه في canOpenChest() لإرجاع true إذا كان لدى اللاعب مفاتيح كافية، وfalse إذا لم يكن لديهم.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
منح اللاعبين الكنز
لكي يتمكن اللاعب من فتح صندوق، قم بإنشاء وظيفة في TreasureManager تمنحهم الكنز.
أضف وظيفة وحدة جديدة إلى TreasureManager تُسمى openChest().
مرّر وسيطتين:
- chestPart - جزء الصندوق لتدميره.
- whichCharacter - اللاعب الذي سيحصل على الكنز.
function TreasureManager.openChest(chestPart, whichCharacter)endلخصم مفاتيح اللاعب ومنحهم الكنز، انسخ والصق الشيفرة أدناه في openChest(). تستخدم هذه الشيفرة المتغيرات التي تم إنشاؤها سابقًا، مثل chestReward، كمية الكنز الممنوحة لكل صندوق.
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.Parent:Destroy()end
استدعاء وظائف الصندوق
الآن بعد أن تم إنشاء وظيفتي الوحدة canOpenChest() و openChest()، يمكن استدعاؤهما بواسطة أجزاء الصناديق كلما لمسها اللاعب باستخدام وظيفة partTouched() مسبقة الصنع.
في Workspace ⟩ Chests افتح ChestScript.
أنشئ متغيرًا جديدًا يُسمى treasureManager واستدعِ نص TreasureManager في ServerStorage.
local ServerStorage = game:GetService("ServerStorage")-- استدعي نص الوحدة أدناهlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()في partTouched()، تحت جملة if humanoid، أنشئ متغيرًا جديدًا يُسمى canOpen واضبطه على:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- تحقق مما إذا كان يمكن للاعب فتح صندوق، ثم دعهم يحصلون على الكنز-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endendبعد ذلك، أنشئ جملة if للتحقق مما إذا كان canOpen صحيحًا.
إذا كانت الإجابة كذلك، استدعِ وظيفة openChest() من TreasureManager.
ثم،مرّر وسيطتين: chestPart، الصندوق لتدميره، و whichCharacter، اللاعب لمنح الكنز.
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- تحقق مما إذا كان يمكن للاعب فتح صندوق، ثم دعهم يحصلون على الكنز-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendقم بتشغيل المشروع. تحقق من:
- إذا كان لديك على الأقل مفتاح 1، فإن لمس صندوق سيتلفه ويمنح الكنز.
- إذا كان لديك 0 مفاتيح، فلا يمكنك فتح صندوق الكنز.
نصائح استكشاف الأخطاء
في ChestScript، تأكد من أن الوظائف المستدعاة من نص الوحدة مثل canOpenChest() مكتوبة بالضبط كما توجد في نص TreasureManager. أي اختلاف سيسبب خطأ.
تحقق من أن الوظائف المنسوخة والمطابقة، مثل treasureManager.openChest()، هي بالضبط كما هو موضح في الدرس. أي اختلافات يمكن أن تسبب أخطاء خفية في النص.
النصوص المكتملة
نص TreasureManager المكتمل
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ الوظائف المحلية
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ وظائف الوحدة
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart.Parent:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
نص ChestScript المكتمل
local ServerStorage = game:GetService("ServerStorage")
-- استدعي نص الوحدة أدناه ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- تحقق مما إذا كان بإمكان اللاعب فتح صندوق، ثم دعهم يحصلون على الكنز
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- يربط كل جزء من أجزاء الصناديق بوظيفة اللمس حتى يعمل على جميع الأجزاء
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
نص keyScript المكتمل
local ServerStorage = game:GetService("ServerStorage")
-- استدعي نص الوحدة أدناه ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- أعط اللاعب مفتاحًا ودمر جزء المفتاح
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- يربط كل جزء من أجزاء المفاتيح بوظيفة اللمس حتى يعمل على جميع الأجزاء
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end
الملخص
تطبيق شائع لاستخدام نصوص الوحدة في تجارب Roblox هو التعامل مع المهام المشتركة المستخدمة من قبل اللاعبين، مثل منحهم النقاط. في هذا المثال، تم إنشاء نص وحدة يُسمى TreasureManager للتعامل مع منح اللاعبين المفاتيح والكنوز كلما تفاعلوا مع الكائنات داخل اللعبة.