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>().

לחץ על "שחק" ועל מקש הרווח: הסליימים מתכווצים, והאימפ קופץ לאחור. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

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

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