IDamageable
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 7 מתוך 64.
ממשק הוא רשימה של מתודות שמחלקה מתחייבת להכיל, בלי קוד בתוכן. מחלקות שאין להן דבר אחר במשותף יכולות לתת את אותה התחייבות. ב־C# פשוט:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}משתנה מסוג IGreeter יכול להכיל Robot או Cat, ו־greeter.Greet() מפעיל את מה שהוא מכיל. מחלקה שמציינת את IGreeter אך אין לה מתודת Greet() ציבורית לא תתקמפל.
במשחק, דברים רבים יכולים להיפגע, ואין להם הרבה דברים אחרים במשותף: לשחקן יש נקודות חיים, וארגז נשבר בפגיעה הראשונה. מחלקת בסיס משותפת הייתה כופה עליהם להשתייך לאותה משפחה. ממשק מציין את הדבר היחיד המשותף להם, וכל סקריפט מממש אותו בדרכו:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}לסקריפט עדיין יש מחלקת בסיס אחת, MonoBehaviour, והוא מציין אחריה ממשקים. הממשק נמצא בקובץ משלו, IDamageable.cs, ואינו יורש מ־MonoBehaviour: הוא אינו רכיב ולעולם לא מוצב על אובייקט בפני עצמו. מחלקה שמציינת אותו חייבת להכיל מתודת TakeDamage(int) ציבורית, אחרת היא לא תתקמפל.
מי שגורם לנזק מבקש את הממשק, ולא מחלקה:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}כדור האש פוגע בשחקן ושובר ארגזים באותן שורות, וסוג יעד שייווסף בהמשך לא יצריך שינוי כאן. Unity לא מציגה שדה מסוג ממשק ב־Inspector, לכן סקריפטים מחזיקים GameObject או רכיב ומבקשים ממנו את הממשק, כפי שעושה כדור האש.
אתגר
קלהפוך את איש השלג, הפעמון והדחליל ל־IDamageable, כדי שהפטיש יפגע בהם.
Snowman:TakeDamageמקטינה אותו ב־0.25f * amountבכל ציר; אם הוא מגיע ל־0.5 או פחות, השמד אותו.Bell: רשוםDongפעם אחת לכל נקודה והוסף אתamountל־rings.Scarecrow: רק הפגיעה הראשונה מפעילה אתtransform.Rotate(0f, 0f, 90f);.- ב־
Slam, קרא ל־TakeDamage(power)עבורIDamageableשל כל מתנגש, אם יש כזה.
לחץ על „שחק” והנף את הפטיש לעבר כל אחד מהם. לאחר מכן לחץ על „בדיקה”.
נסו בעצמכם
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין