Menu
CoddyTech

חיים ונזק

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 53 מתוך 63.

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

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

TakeDamage היא public, ולכן סקריפטים אחרים יכולים לקרוא לה, והיא הקוד היחיד שמשנה את hp. קוצים, קליעים ולבה קוראים כולם לאותה מתודה, וסקריפט Health לבדו מחליט מה פירוש 0: להשמיד את הארגז, לסיים את המשחק או להפעיל אנימציית מוות. כל סקריפט נמצא בקובץ משלו, ששמו כשם המחלקה שלו.

GetComponent<Health>() מחזירה null עבור דברים שאין להם Health, כמו הרצפה, ולכן הקוצים בודקים לפני שהם קוראים לה. TryGetComponent(out Health health) מבצעת את החיפוש ואת הבדיקה בקריאה אחת: היא מחזירה true וממלאת את health רק כשיש רכיב כזה.

challenge icon

אתגר

בינוני

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

Health, על בובת האימון ועל האביר (המפקח מגדיר את hp ואת armor):

  • מתודה ציבורית TakeDamage(int amount): hp פוחת ב-amount פחות armor, אך תמיד ב-1 לפחות.
  • אחרי כל פגיעה, רשמו ביומן את שם האובייקט ואת כמות ה-hp שנותרה, כך: Dummy hp: 2.
  • כאשר ה-hp הוא 0 או פחות, השמידו את האובייקט.

Bullet, על כל קליע:

  • כשהקליע פוגע במשהו שיש לו רכיב Health, קראו למתודה TakeDamage(damage) שלו.
  • השמידו את הקליע בלי קשר במה הוא פוגע, כולל בקיר.

לחצו על Play, הפילו את בובת האימון ואת האביר, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // הפחת את amount פחות armor (לפחות 1), רשום ביומן כמה נשאר, והשמד כשהערך מגיע ל-0
    }
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה פיזיקה ומשחקיות