Menu
CoddyTech

IDamageable

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 6 מתוך 50.

במשחק יכולים להיות דברים רבים שנפגעים, ואין להם הרבה במשותף: לשחקן יש נקודות חיים, וארגז נשבר בפגיעה הראשונה. מחלקת בסיס משותפת הייתה כופה עליהם להשתייך לאותה משפחה. ממשק מציין את הדבר היחיד המשותף להם, וכל סקריפט מממש אותו בדרכו:

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

אתגר

קל

ענק שומר על כיכר הכפר. מקשי החצים מזיזים את הענק (Mover.cs, מוכן), ומקש הרווח מניף את הפטיש שלו: Hammer.cs קורא ל־Slam(), שמוצא כל מתנגש שנמצא בתוך radius. שלושה דברים בכיכר חוטפים מכה, כל אחד בדרכו, ואין להם שום דבר אחר במשותף:

  • Snowman: כל נקודת נזק מקטינה את גודלו ב־0.25 בכל ציר (הגודל ההתחלתי הוא 1.5). כשהגודל הוא 0.5 או פחות, הוא נמס: השמידו את איש השלג.
  • Bell: מדפיס Dong פעם אחת לכל נקודת נזק (מכה של 2 מדפיסה אותו פעמיים) ומוסיף את הנקודות ל־rings.
  • Scarecrow: המכה הראשונה מפילה אותו, ומסובבת אותו ב־90 מעלות סביב ציר z, ללא קשר לכמות הנזק. מכות נוספות לא משנות דבר.

IDamageable.cs מצהיר על הממשק, שכולל שיטה אחת: void TakeDamage(int amount). גרמו ל־Snowman, ל־Bell ול־Scarecrow לממש אותו, כל אחד עם תגובה משלו. לאחר מכן, בתוך Slam, קראו ל־TakeDamage(power) עבור ה־IDamageable של כל מתנגש שנמצא. על מתנגשים שאין להם כזה, כמו הקרקע, מדלגים.

לחצו על Play, גשו לכל אחד מהם והניפו את הפטיש, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;

public class Snowman : MonoBehaviour
{
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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