على مدار دروس البرمجة الأساسية، قمت ببرمجة أجزاء فردية لإنشاء مشاهد قابلة للعب. مع الطريقة السابقة، إذا قمت بتكرار الأجزاء، فستكون لديك أيضًا نصوص مكررة. سيجعل هذا تحديث النصوص مرهقًا حيث سيتعين إجراء التغييرات نصًا بنص.
في هذا الدرس، سيتم استخدام نمط مختلف لإنشاء عدد من عناصر استعادة الصحة، مع وجود نسخة واحدة فقط من النص الذي يحدد سلوك عنصر استعادة الصحة. عندما يتم لمس العنصر، سيستعيد صحة اللاعب، ويتلاشى قليلاً، ويُعطّل لفترة قصيرة من الزمن.
الإعداد
أولاً، ستحتاج إلى جزء أو نموذج لاستخدامه كعنصر استعادة صحة. يتضمن مثال عالم Showdown Town العديد من عناصر استعادة الصحة المنتشرة في جميع أنحاء الخريطة.

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


استعادة الصحة
للبدء، يحتاج النص إلى استعادة صحة اللاعب. يجب أن يكون هذا النمط مألوفًا لك من درس Deadly Lava.
في ServerScriptService، أضف نصًا يسمى PickupManager.
في هذا النص، أعلن عن ثابت يسمى MAX_HEALTH بقيمة 100.
أنشئ دالة تسمى onTouchHealthPickup مع معلمات للجزء الآخر الذي لمس العنصر والعنصر نفسه.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endفي الدالة، احصل على نموذج الشخصية من الوالد لـ otherPart. بعد ذلك، تحقق مما إذا كان لديه Humanoid باستخدام FindFirstChildWhichIsA().
إذا كان لديه إنسان آلي، قم بتعيين خاصية Health الخاصة بهم إلى MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
الحصول على مجلد العناصر
قد لا يكون المجلد الذي يحتوي على عناصر استعادة الصحة قد تم تحميله في اللعبة بحلول الوقت الذي يتم فيه تشغيل النص. يمكن استخدام WaitForChild لإيقاف النص والحصول على مجلد HealthPickups عند تحميله.
عند استدعائه على مجلد، ستعيد دالة GetChildren مصفوفة بمحتويات المجلد.
تحت MAX_HEALTH، أعلن عن متغير يسمى healthPickupsFolder واستخدم دالة WaitForChild للحصول على مجلد HealthPickups من Workspace.
أنشئ متغيرًا يسمى healthPickups لتخزين نتيجة استدعاء دالة GetChildren على healthPickupsFolder.
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
حلقة باستخدام ipairs
يحتاج onTouchHealthPickup إلى أن يتم استدعاؤه لكل عنصر استعادة صحة في المصفوفة. للقيام بذلك بكفاءة، سيتم استخدام نوع جديد من بناء جملة الحلقة.
ipairs هي دالة يمكن استخدامها مع حلقة for للمرور عبر كل عنصر من عناصر المصفوفة. لا تحتاج إلى تحديد مكان بدء الحلقة وانتهائها. يتم تعريف حلقة for باستخدام ipairs على النحو التالي:

- الفهرس: هذا يعادل متغير التحكم في حلقة for العادية.
- القيمة: سيتم ملؤها بكل عنصر في المصفوفة أثناء تكرار الحلقة. من الجيد تسمية متغير القيمة بناءً على ما سيحتويه فعليًا.
- المصفوفة: يتم تمرير المصفوفة التي تريد التكرار عليها إلى دالة ipairs.
في الكود التالي، لا تحتاج إلى الفهرس لأي شيء، لذا يمكن تركه فارغًا باستخدام _. أنشئ حلقة for باستخدام دالة ipairs، مع تمرير healthPickups.
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
endستكون هناك حاجة إلى دالة تغليف لتمرير عنصر استعادة الصحة إلى دالة onTouchHealthPickup عند الاتصال بحدث Touched.
في حلقة for، قم بتوصيل حدث Touched بدالة مجهولة مع معلمة تسمى otherPart.
استدعِ دالة onTouchHealthPickups، مع تمرير كل من معلمة otherPart و healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
اختبر الكود الآن ويجب أن تجد أن عنصر استعادة الصحة يستعيد صحتك. ستحتاج إلى إلحاق الضرر بلاعبك أولاً - جرب الوقوف على الفتحة بجوار نقطة الولادة.

يجب أن تظهر شريط صحة في الزاوية العليا اليمنى والذي سيختفي عندما يتم شفاء اللاعب.
فترة التهدئة للعنصر
حاليًا، سيقوم العنصر بشفاء أي لاعب يلمسه إلى أجل غير مسمى. سيكون من الأكثر فعالية إذا كان يمكن جمعه مرة واحدة فقط، مع فترة تهدئة قصيرة قبل أن يمكن استخدامه مرة أخرى.
أولاً، تحتاج إلى تسجيل ما إذا كان العنصر في فترة التهدئة أم لا. يجب أن يكون النمط أدناه مألوفًا من درس Fade Trap - هذه المرة، سيتم تحقيق التوقف عن طريق تعيين سمة على عنصر استعادة الصحة.
في حلقة for، قم بتعيين سمة جديدة تسمى "Enabled" إلى true.
قم بتغليف الكود داخل onTouchHealthPickup في عبارة if مع الشرط healthPickup:GetAttribute("Enabled").
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
تعطيل العنصر
يجب أن يوفر العنصر ملاحظات بصرية بأنه معطل - طريقة شائعة للإشارة إلى ذلك هي جعله شفافًا قليلاً.
أعلن عن ثلاثة ثوابت في أعلى النص (لا تتردد في ضبط كل قيمة حسب رغبتك):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")في عبارة if في onTouchHealthPickup، قم بتعيين Transparency للعنصر إلى DISABLED_TRANSPARENCY، وقيمة السمة Enabled إلى false.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendاستدعِ دالة task.wait()، مع تمرير COOLDOWN كمدة الانتظار.
قم بتعيين Transparency مرة أخرى إلى ENABLED_TRANSPARENCY وEnabled مرة أخرى إلى true.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
اختبر العنصر مرة أخرى: يجب أن تجد أنه عند لمس العنصر، يستعيد صحتك، يصبح شفافًا، ثم يعود جاهزًا للاستخدام مرة أخرى.
إذا كنت ترغب في جعل الملاحظات أكثر تأثيرًا على اللاعب عند جمع العنصر، جرب تقليل سطوع ضوء النقطة في العنصر عندما تغير الشفافية.
حاول استخدام هذه العناصر لاستعادة الصحة في مشاريعك الخاصة، أو قم بتغيير المظهر والتأثير لإعطاء نوع مختلف من القوة للاعبين لديك.
الكود النهائي
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end