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

سكربت أساسي للعدو

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

تشترك الأعداء في معظم شيفرتهم: نقاط الصحة، والسرعة، وطريقة الحركة. يمكن أن تكون هذه الشيفرة في صنف أساسي مشتق من 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

التحدي

سهل

تزحف الوحوش نحو القلعة. يحتوي Enemy.cs على ما تشترك فيه: تضبط Start قيمة hp على maxHp وتحفظ spawnPoint، ويجعل Update الوحش يتقدم على محور z بسرعة speed. الـ Grunt هو Enemy عادي ويعمل. يضيف نوعان خطوة خاصة بكل منهما، لكن كلاً منهما يفقد جزء Enemy:

  • Golem: تجعل Start الخاص به الغول أكبر بمقدار 1.5 مرة وتسجل The golem wakes up، لكن قيمة hp تبقى 0، لأن Unity تشغّل Start الخاص بـ Golem ولا تشغّل Start الخاص بـ Enemy مطلقًا.
  • Wasp: يجعل Update الخاص به يتحرك بمقدار 1 وحدة إلى أي من جانبي spawnPoint.x، لكنه يتعرج في مكانه، لأن Unity تشغّل Update الخاص بـ Wasp ولا تشغّل Update الخاص بـ Enemy مطلقًا.

اجعل Start وUpdate في Enemy من النوع protected virtual، وتجاوزهما في Golem وWasp بحيث يشغّل كل منهما جزء Enemy أولًا، ثم الجزء الخاص به. اضغط Play، ثم Check.

جرّب بنفسك

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;
    }
}
quiz iconاختبر نفسك

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

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