Menu
CoddyTech

نص برمجي أساسي للعدو

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

في C#، يمكن لفئة أن ترث من فئة أخرى: تحصل class Ghost : Enemy على كل حقل ودالة في Enemy وتضيف ما يخصها. ويمكن استبدال دالة يعلّمها الصنف الأساسي بأنها virtual في الصنف الفرعي باستخدام override، كما ينفّذ base.Describe() نسخة الصنف الأساسي من داخل النسخة الجديدة. في C# العادي:

class Enemy
{
    protected int hp = 3;

    public virtual string Describe()
    {
        return "Enemy with " + hp + " hp";
    }
}

class Ghost : Enemy
{
    public override string Describe()
    {
        return base.Describe() + ", see-through";
    }
}

تعيد الدالة Describe() في Ghost القيمة Enemy with 3 hp, see-through. تعني protected أن Enemy وأصنافه الفرعية يمكنها استخدام hp، بينما لا تستطيع الأصناف الأخرى ذلك.

في Unity، تشترك الأعداء في معظم الشيفرة: نقاط الصحة والسرعة وطريقة الحركة. توجد هذه الشيفرة في صنف أساسي يرث من MonoBehaviour، ويرث منه كل نوع من الأعداء. يضبط هذا الصنف Enemy نقاط صحته في Start، ويتحرك في الاتجاه الذي يواجهه في Update، بينما يغيّر Ghost البداية ليتحرك بسرعة مضاعفة:

public class Enemy : MonoBehaviour
{
    public int maxHp = 3;
    public float speed = 2f;
    protected int hp;

    protected virtual void Start()
    {
        hp = maxHp;
    }

    protected virtual void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}
public class Ghost : Enemy
{
    protected override void Start()
    {
        base.Start();
        speed *= 2f;
    }
}

يرث Ghost الحقول، لذا يعرض Inspector القيمتين maxHp وspeed على Ghost، كما يرث Update، لذلك يتحرك من دون أن تكون له دالة Update خاصة به. إن hp هي protected: يمكن لـ Enemy وأصنافه الفرعية استخدامها، لكن لا تستطيع السكربتات الأخرى ذلك.

يعثر Unity على Start وUpdate بالاسم، مهما كان مستوى الوصول إليهما، ويستدعي الدالة الموجودة في الصنف الأكثر اشتقاقًا. لو كانت Start في Enemy دالة void Start() خاصة، وعرّف Ghost دالته الخاصة، لاستدعى Unity دالة Ghost وحدها: لن تُنفّذ دالة Enemy أبدًا، وستظل hp تساوي 0 من دون ظهور أي خطأ. إن تعريف رسائل الصنف الأساسي بصيغة protected virtual يجعل الأمر واضحًا في C#: يكتب الصنف الفرعي override، وينفّذ base.Start() جزء الصنف الأساسي عند النقطة التي تستدعيه فيها. إذا حذفت الاستدعاء، فسيُتخطى جزء الصنف الأساسي، وهذه هي طريقة استبدال خطوة بدلًا من الإضافة إليها.

challenge icon

التحدي

سهل

اجعل Golem وWasp ينفّذان جزء Enemy قبل الجزء الخاص بهما.

  1. في Enemy، اكتب protected virtual قبل void Start() وvoid Update().
  2. في Golem، اجعله protected override void Start()، واجعل base.Start(); أول سطر فيه.
  3. في Wasp، اجعله protected override void Update()، واجعل base.Update(); أول سطر فيه.

اضغط «العب»: يتحرك الغول ويمتلك نقاط صحته كاملة، ويتحرك الزنبور متعرجًا. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

// ما تشترك فيه جميع الوحوش.
public class Enemy : MonoBehaviour
{
    public int maxHp = 4;
    public float speed = 1.5f;

    protected int hp;
    protected Vector3 spawnPoint;

    void Start()
    {
        hp = maxHp;
        spawnPoint = transform.position;
    }

    void Update()
    {
        // تقدّم نحو القلعة على طول المحور z في الاتجاه السالب
        transform.position += Vector3.back * speed * Time.deltaTime;
    }
}

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

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