רכיבים מופשטים
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 3 מתוך 50.
חלק ממחלקות הבסיס מתארות סוג של דבר שמעולם לא קיים בפני עצמו. כל כלי נשק יורה, אבל לכלי נשק שאינו אקדח או רובה ציד אין דרך לירות. סמנו מחלקה כזו בתור 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 יישאר ללא שינוי.
אתגר
קלהמגדל של הקוסם מחשמל את המפלצות שבשדה. הקובץ Monster.cs מכיל את המשותף לכל המפלצות: hp (3) ו־Zap(), שמפחיתה 1 מנקודות החיים, משמידה את המפלצת כשהן מגיעות ל־0, ואחרת קוראת ל־React(). הקובץ Slime.cs גורם למפלצת הרפש להתכווץ בתגובה. ל־Imp.cs אין תגובה, ו־Monster מספק לה React ריקה, כך שאין שום דבר שמתריע לך שהיא חסרה.
- הפוך את Monster למחלקה אבסטרקטית ואת React למתודה אבסטרקטית, כדי שמפלצת שלא מגדירה כיצד היא מגיבה לא תתקמפל. אז המהדר יצביע על Imp.
- כתוב את React של Imp: היא קופצת 2 יחידות לאחור, הרחק מהמגדל (לאורך +z).
- ב־Tower.cs, כשלוחצים על Space, קבל את רכיב Monster של כל אובייקט שמתויג Monster, ללא קשר לסוג שלו, וקרא לו
Zap().
לחץ על Play וחשמל את המפלצות, ואז לחץ על Check.
נסו בעצמכם
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי