רכיבים מופשטים
חלק מהיחידה ארכיטקטורת משחקים ב-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 נשאר ללא שינוי.
אתגר
קלהפוך את Monster למחלקה מופשטת, ותן למגדל לחשמל כל סוג של מפלצת.
- בתוך
Monster, כתובpublic abstract class Monsterו-protected abstract void React();, ללא גוף. - כעת המהדר מצביע על
Imp: הוסףprotected override void React()שמוסיף אתVector3.forward * 2fלמיקום שלו. - בתוך
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין