Menu
CoddyTech

IDamageable

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 7 من 64.

الواجهة هي قائمة بالأساليب التي تتعهد فئة بتوفيرها، من دون كتابة أي شيفرة داخلها. ويمكن للفئات التي لا يجمعها أي شيء آخر أن تقدم التعهد نفسه. بلغة C# العادية:

interface IGreeter
{
    string Greet();
}

class Robot : IGreeter
{
    public string Greet() { return "Beep"; }
}

class Cat : IGreeter
{
    public string Greet() { return "Meow"; }
}

يمكن لمتغير من النوع IGreeter أن يحتوي على Robot أو Cat، ويشغّل greeter.Greet() الأسلوب الخاص بالكائن الذي يحتوي عليه. ولن تُترجم فئة تسرد IGreeter من دون أن تتضمن أسلوبًا عامًا Greet().

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

public interface IDamageable
{
    void TakeDamage(int amount);
}
public class PlayerHealth : MonoBehaviour, IDamageable
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        Debug.Log("Ouch! hp: " + hp);
    }
}
public class Crate : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        Destroy(gameObject);
    }
}

تظل للوحدة البرمجية فئة أساسية واحدة، وهي MonoBehaviour، وتسرد الواجهات بعدها. توضع الواجهة في ملف مستقل باسم IDamageable.cs، ولا ترث من MonoBehaviour: فهي ليست مكوّنًا ولا تُضاف بمفردها إلى أي كائن. ويجب أن تتضمن الفئة التي تسردها أسلوبًا عامًا TakeDamage(int)، وإلا فلن تُترجم.

الجهة التي تُلحق الضرر تطلب الواجهة، لا فئة بعينها:

// Fireball.cs
void OnCollisionEnter(Collision collision)
{
    IDamageable target = collision.gameObject.GetComponent<IDamageable>();
    if (target != null)
    {
        target.TakeDamage(3);
    }
    Destroy(gameObject);
}

تؤذي الكرة النارية اللاعب وتحطّم الصناديق باستخدام الأسطر نفسها، ولا يحتاج نوع جديد من الأهداف يُضاف لاحقًا إلى أي تعديل هنا. لا تعرض Unity حقلًا من نوع واجهة في نافذة Inspector، لذا تحتفظ الوحدات البرمجية بكائن GameObject أو بمكوّن، ثم تطلب منه الواجهة، كما تفعل الكرة النارية.

challenge icon

التحدي

سهل

اجعل رجل الثلج والجرس والفزّاعة يطبّقون IDamageable، لكي تصيبهم المطرقة.

  1. Snowman: تقلّصه TakeDamage بمقدار 0.25f * amount على كل محور؛ وعند 0.5 أو أقل، دمّره.
  2. Bell: سجّل Dong مرةً لكل نقطة، وأضف amount إلى rings.
  3. Scarecrow: تنفّذ الضربة الأولى فقط transform.Rotate(0f, 0f, 90f);.
  4. في Slam، استدعِ TakeDamage(power) على IDamageable لكل مُصادم، إن وُجد.

اضغط «العب» واضرب كل واحد منها. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class Snowman : MonoBehaviour
{
}

جميع دروس هندسة الألعاب في Unity

تدرّب بنفسك: Playground لـ Unity