Menu
CoddyTech

مكوّنات مجرّدة

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

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

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

لن تُترجم فئة فرعية لا تكتب Fire، وستظهر الرسالة CS0534: 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. كما ترفض Unity وضع سكربت مجرد على كائن. اسحب Weapon إلى كائن، وستظهر الرسالة Can't add script behaviour 'Weapon'. The script class can't be abstract!، لأن Unity لا تستطيع إنشاء Weapon لا يملك Fire.

تظل السكربتات الأخرى تعمل مع النوع الأساسي. تُرجع GetComponent<Weapon>() أي فئة فرعية موجودة على الكائن، وتُشغّل Pull() طريقة Fire الخاصة بتلك الفئة الفرعية:

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

استبدل مكوّن Shotgun بمكوّن Pistol، وسيظل سكربت Player كما هو.

challenge icon

التحدي

سهل

اجعل Monster مجردة، واجعل البرج يطلق الصاعقة على كل نوع.

  1. في Monster، اكتب public abstract class Monster وprotected abstract void React();، دون جسم للدالة.
  2. يشير المترجم الآن إلى Imp: أضف protected override void React() ليضيف Vector3.forward * 2f إلى موضعه.
  3. في Tower، داخل الحلقة، استدعِ Zap() على target.GetComponent<Monster>().

اضغط «العب» ثم مفتاح المسافة: تنكمش كائنات Slime، ويقفز Imp إلى الخلف. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

// ما تشترك فيه جميع الوحوش.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // كيف يتفاعل هذا النوع من الوحوش مع صعقة ينجو منها.
    protected virtual void React()
    {
    }
}

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

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