Menu
CoddyTech
flag Ar iconالعربيةdown icon

الصحة والضرر

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 53 من 63.

يتطلب إحداث الضرر نصّين برمجيين. يوضع نصّ برمجي باسم Health على كل ما يمكن أن يتعرض للضرر، ويتولى نقاط صحته، بينما يعثر النص البرمجي الذي يُحدث الضرر على ذلك النص ويستدعي إحدى دواله. إليك نصًّا برمجيًا باسم Health لصندوق يتحطم بعد ثلاث ضربات، ونصًّا برمجيًا باسم Spikes يُلحق الضرر بكل ما يهبط عليه:

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

الدالة TakeDamage هي public، لذا يمكن للنصوص البرمجية الأخرى استدعاؤها، وهي الجزء الوحيد من الشيفرة الذي يغيّر hp. تستدعي المسامير والرصاص والحمم الدالة نفسها، ويحدّد نص Health وحده معنى وصول القيمة إلى 0: تحطيم الصندوق، أو إنهاء اللعبة، أو تشغيل رسوم متحركة للموت. يوجد كل نص برمجي في ملف خاص به، يحمل اسم الفئة التي يتضمنها.

تعيد GetComponent<Health>() قيمة null للأشياء التي لا تملك Health، مثل الأرضية، لذا تتحقق المسامير قبل الاستدعاء. تنفّذ TryGetComponent(out Health health) عملية البحث والتحقق باستدعاء واحد: فتعيد true وتملأ health فقط عند وجود مكوّن.

challenge icon

التحدي

متوسط

يطلق مسدس التدريب النار على دمية وفارس مدرّع. سكربت Shooter على المسدس جاهز: يُديره السهمان الأيمن والأيسر، ويُطلق رصاصة عند الضغط على مفتاح المسافة. اكتب السكربتين اللذين يجعلان الطلقات تُحتسب.

Health، على الدمية والفارس (يُعيّن Inspector قيمتَي hp وarmor):

  • دالة عامة TakeDamage(int amount): تنخفض قيمة hp بمقدار amount ناقص armor، لكن بمقدار لا يقل عن 1 دائمًا.
  • بعد كل إصابة، سجّل اسم الكائن وقيمة hp المتبقية، مثل Dummy hp: 2.
  • عندما تصبح قيمة hp صفرًا أو أقل، دمّر الكائن.

Bullet، على كل رصاصة (يعيّن Inspector قيمة damage إلى 2):

  • عندما تصيب الرصاصة شيئًا يحتوي على Health، استدعِ TakeDamage(damage) الخاص به.
  • دمّر الرصاصة مهما كان ما تصيبه، بما في ذلك الجدار.

اضغط على Play، وأسقط الدمية والفارس، ثم اضغط على Check.

جرّب بنفسك

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // أنقص amount بعد طرح armor منه (بحد أدنى 1)، وسجّل القيمة المتبقية، ودمّر الكائن عند 0
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الفيزياء وأسلوب اللعب