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

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


استعادة الصحة
للبدء، يحتاج النص إلى استعادة صحة اللاعب. ينبغي أن يكون هذا النمط مألوفًا لديك من درس الحمم المميتة.
في ServerScriptService، أضف نصًا يسمى PickupManager.
في هذا النص، أعلن عن ثابت يسمى MAX_HEALTH بالقيمة 100.
أنشئ وظيفة تسمى onTouchHealthPickup مع معلمات للجزء الآخر الذي لمس الـ Pickup والـ Pickup نفسه.
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
احصل على مجلد الـ Pickups
قد لا يكون المجلد الذي يحمل الـ Pickups للصحة قد تم تحميله في التجربة قبل أن يعمل النص. يمكن استخدام 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 إلى أن تُستدعى لكل Pickup للصحة في المصفوفة. للقيام بذلك بكفاءة، سيتم استخدام نوع جديد من بناء الجملة للحلقة.
ipairs هي وظيفة يمكن استخدامها مع حلقة for للمرور عبر كل عنصر في مصفوفة. لا تحتاج إلى تحديد من أين ستبدأ الحلقة وتنتهي. تُعرَّف حلقة for باستخدام ipairs كما يلي:

- Index: هذا يعادل المتغير المتحكم في حلقة for العادية.
- Value: سيتم ملؤه بكل عنصر في المصفوفة مع تقدم الحلقة. من الجيد تسمية متغير القيمة باسم ما سيحتويه بالفعل.
- Array: المصفوفة التي ترغب في المرور عبرها يتم تمريرها إلى وظيفة 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
ستكون هناك حاجة إلى وظيفة التغليف لتمرير Pickup الصحة إلى وظيفة onTouchHealthPickup عند الاتصال بحدث Touched.
في حلقة for، قم بربط حدث Touched إلى دالة مجهولة مع معلمة تسمى otherPart.
استدعِ وظيفة onTouchHealthPickups، ممررًا كل من معلمة otherPart وhealthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
اختبر الكود الخاص بك الآن ويجب أن تجد أن Pickup الصحة يستعيد صحتك. ستحتاج إلى إلحاق الأذى بلاعبك أولاً - جرب الوقوف على فتحة التهوية بجوار نقطة الانطلاق.

يجب أن تظهر شريط صحة في الزاوية العليا اليمنى والذي سيختفي عندما يتم شفاء اللاعب.
فترة تباطؤ الـ Pickup
حاليًا، سيقوم الـ Pickup بعلاج أي لاعب يلمسه بلا حدود. سيكون أكثر فعالية إذا كان بإمكانه أن يتم جمعه مرة واحدة فقط، مع فترة تباطؤ قصيرة قبل أن يمكن استخدامه مرة أخرى.
أولًا، تحتاج إلى تسجيل ما إذا كان الـ Pickup في فترة التباطؤ أم لا. ينبغي أن يكون النمط أدناه مألوفًا لديك من فخ السقوط - في هذه المرة، سيتم تحقيق التأخير عن طريق تعيين خاصية على Pickup الصحة.
في حلقة 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
تعطيل الـ Pickup
يجب أن يوفر الـ Pickup ردود فعل بصرية على أنه معطل - طريقة شائعة للإشارة إلى ذلك هي جعله شفافًا قليلاً.
أعلن عن ثلاثة ثوابت في أعلى النص (لا تتردد في تعديل كل قيمة كما تفضل):
- 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 للـ Pickup إلى 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
اختبر الـ Pickup الخاص بك مرة أخرى: يجب أن تجد أنه عندما تلمس الـ Pickup فإنه يستعيد صحتك، يتلاشى، ثم يعود جاهزًا للاستخدام مرة أخرى.
إذا كنت ترغب في جعل ردود الفعل أكثر تأثيرًا للاعب عند جمع الـ Pickup، جرب تقليل سطوع نقطة الضوء في الـ Pickup عند تغيير الشفافية.
جرب استخدام هذه الـ Pickups للصحة في مشاريعك الخاصة، أو تغيير المظهر والتأثير لمنح لاعبيك نوعًا مختلفًا من القوة.
الكود النهائي
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