Menu
CoddyTech

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 או רכיב ומבקשים ממנו את הממשק, כפי שעושה כדור האש.

challenge icon

אתגר

קל

הפוך את איש השלג, הפעמון והדחליל ל־IDamageable, כדי שהפטיש יפגע בהם.

  1. Snowman: TakeDamage מקטינה אותו ב־0.25f * amount בכל ציר; אם הוא מגיע ל־0.5 או פחות, השמד אותו.
  2. Bell: רשום Dong פעם אחת לכל נקודה והוסף את amount ל־rings.
  3. Scarecrow: רק הפגיעה הראשונה מפעילה את transform.Rotate(0f, 0f, 90f);.
  4. ב־Slam, קרא ל־TakeDamage(power) עבור IDamageable של כל מתנגש, אם יש כזה.

לחץ על „שחק” והנף את הפטיש לעבר כל אחד מהם. לאחר מכן לחץ על „בדיקה”.

נסו בעצמכם

using UnityEngine;

public class Snowman : MonoBehaviour
{
}

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity

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