Menu
CoddyTech

סקריפט בסיס לאויב

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 2 מתוך 50.

לאויבים יש חלק גדול מהקוד שלהם במשותף: נקודות חיים, מהירות ודרך לנוע. הקוד הזה יכול להיות במחלקת בסיס שיורשת מ־MonoBehaviour, וכל סוג של אויב יורש ממנה. האויב הזה מגדיר את נקודות החיים שלו ב־Start והולך בכיוון שאליו הוא פונה ב־Update, ורוח משנה את פעולת ההתחלה כדי לנוע במהירות כפולה:

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: האויב ותת־המחלקות שלו יכולים להשתמש בו, אבל סקריפטים אחרים לא.

Unity מאתרת את Start ואת Update לפי השם, ללא קשר לרמת הגישה שלהם, ומפעילה את אלה שבמחלקה היורשת ביותר. אם Start של Enemy היה void Start() פרטי, ול־Ghost היה Start משלה, 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 שלה מניעה אותה בזיגזג יחידה אחת לכל צד של spawnPoint.x, אבל היא מזגזגת במקום, כי Unity מריצה את Update של Wasp ולא את Update של Enemy.

הגדירו את Start ואת Update של Enemy בתור protected virtual, ובצעו להן override ב-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