دروس تعليمية متوسطة

إنشاء Pickups للصحة

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

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

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

الإعداد

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

خيار التحرير في Studio من الصفحة الرئيسية للتجربة

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

استعادة الصحة

للبدء، يحتاج النص إلى استعادة صحة اللاعب. ينبغي أن يكون هذا النمط مألوفًا لديك من درس الحمم المميتة.

  1. في ServerScriptService، أضف نصًا يسمى PickupManager.

  2. في هذا النص، أعلن عن ثابت يسمى MAX_HEALTH بالقيمة 100.

  3. أنشئ وظيفة تسمى onTouchHealthPickup مع معلمات للجزء الآخر الذي لمس الـ Pickup والـ Pickup نفسه.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. في الوظيفة، احصل على نموذج الشخصية من الوالد لـ otherPart. بعد ذلك، تحقق مما إذا كان لديه Humanoid باستخدام FindFirstChildWhichIsA().

  5. إذا كان لديه إنسان، قم بتعيين خاصية Health لديهم إلى MAX_HEALTH.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

احصل على مجلد الـ Pickups

قد لا يكون المجلد الذي يحمل الـ Pickups للصحة قد تم تحميله في التجربة قبل أن يعمل النص. يمكن استخدام WaitForChild لإيقاف النص والحصول على مجلد HealthPickups عند تحميله.

عند استدعاء GetChildren على مجلد، ستعيد الوظيفة مصفوفة من محتويات المجلد.

  1. أسفل MAX_HEALTH، أعلن عن متغير يسمى healthPickupsFolder واستخدم وظيفة WaitForChild للحصول على مجلد HealthPickups من Workspace.

  2. أنشئ متغيرًا باسم healthPickups لتخزين نتيجة استدعاء وظيفة GetChildren على healthPickupsFolder.


    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

حلقة باستخدام ipairs

تحتاج onTouchHealthPickup إلى أن تُستدعى لكل Pickup للصحة في المصفوفة. للقيام بذلك بكفاءة، سيتم استخدام نوع جديد من بناء الجملة للحلقة.

ipairs هي وظيفة يمكن استخدامها مع حلقة for للمرور عبر كل عنصر في مصفوفة. لا تحتاج إلى تحديد من أين ستبدأ الحلقة وتنتهي. تُعرَّف حلقة for باستخدام ipairs كما يلي:

for index, value in ipairs(array) do

  • 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.

  1. في حلقة for، قم بربط حدث Touched إلى دالة مجهولة مع معلمة تسمى otherPart.

  2. استدعِ وظيفة onTouchHealthPickups، ممررًا كل من معلمة otherPart وhealthPickup.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

اختبر الكود الخاص بك الآن ويجب أن تجد أن Pickup الصحة يستعيد صحتك. ستحتاج إلى إلحاق الأذى بلاعبك أولاً - جرب الوقوف على فتحة التهوية بجوار نقطة الانطلاق.

فتحة بخارية في عالم المثال إلى يمين نقطة الانطلاق

يجب أن تظهر شريط صحة في الزاوية العليا اليمنى والذي سيختفي عندما يتم شفاء اللاعب.

فترة تباطؤ الـ Pickup

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

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

  1. في حلقة for، قم بتعيين خاصية جديدة تسمى "Enabled" إلى true.

  2. لف الكود داخل onTouchHealthPickup في عبارة if مع الشرط healthPickup:GetAttribute("Enabled").


    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
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup:SetAttribute("Enabled", true)
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

تعطيل الـ Pickup

يجب أن يوفر الـ Pickup ردود فعل بصرية على أنه معطل - طريقة شائعة للإشارة إلى ذلك هي جعله شفافًا قليلاً.

  1. أعلن عن ثلاثة ثوابت في أعلى النص (لا تتردد في تعديل كل قيمة كما تفضل):

    • ENABLED_TRANSPARENCY = 0.4
    • DISABLED_TRANSPARENCY = 0.9
    • COOLDOWN = 10

    local MAX_HEALTH = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. في عبارة if في onTouchHealthPickup، قم بتعيين Transparency للـ Pickup إلى DISABLED_TRANSPARENCY، وقيمة الخاصية Enabled إلى false.


    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)
    end
    end
    end
  3. استدعِ وظيفة task.wait()، ممررًا COOLDOWN كمدة الانتظار.

  4. أعد تعيين Transparency إلى ENABLED_TRANSPARENCY وEnabled إلى true.


    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

اختبر الـ 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
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.