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 הייתה מגדירה Start משלה, 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(); היא השורה הראשונה.

לחצו על "שחק": הגולם צועד עם מלוא ה־hp, והצרעה מזגזגת בזמן שהיא צועדת. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

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

תרגלו בעצמכם: Unity אונליין