Menu
CoddyTech

GetComponents

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

GetComponent<T>() מחזירה את ההתאמה הראשונה. GetComponents<T>() מחזירה כל התאמה באובייקט כמערך, ו־GetComponentsInChildren<T>() מחזירה כל התאמה באובייקט ובכל מה שנמצא מתחתיו. כש־T הוא ממשק, קריאה אחת אוספת כל חלק שיכול לבצע פעולה, ללא קשר למחלקה שלו. כאן המכונות של מפעל הן ילדים של האובייקט Factory, וכל חלק שפועל באמצעות חשמל מממש את IPowered:

public interface IPowered
{
    void SetPower(bool on);
}
public class Generator : MonoBehaviour
{
    public GameObject factory;

    public void Switch(bool on)
    {
        IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
        foreach (IPowered part in parts)
        {
            part.SetPower(on);
        }
        Debug.Log(parts.Length + " parts powered");
    }
}

מנורה מפעילה את Light שלה, מאוורר מתחיל להסתובב, ומסוע מתחיל לנוע — כל אחד מהם עושה זאת בפונקציית SetPower משלו. מכונה עם Lamp ועם Fan על אותו אובייקט נספרת פעמיים, מכיוון שכל רכיב הוא התאמה נפרדת. Generator אף פעם לא מציין אותם בשמות, ולכן Siren שמממש את IPowered ומתווסף מתחת ל־Factory מאוחר יותר, יופעל בקריאה הבאה ל־Switch.

GetComponentsInChildren כולל את האובייקט שעליו קוראים לו, והוא מדלג על ילדים שאינם פעילים אלא אם מעבירים לו true: GetComponentsInChildren<IPowered>(true). ‏GetComponents בודקת רק את האובייקט האחד, ומתאימה לחלקים שנמצאים זה לצד זה, כמו אור וזמזם על דלת אחת.

challenge icon

אתגר

קל

תנו לכל חלק ברובוט להראות שהוא נפגע.

  1. ב־IHitReaction.cs, הכריזו על public interface IHitReaction עם void React(int damage);.
  2. גרמו ל־Flash, ל־Recoil ול־Sparks לממש אותו: שנו את שם כל מתודה ל־public void React(int damage).
  3. הזיזו את Recoil לאחור ב־0.5f * damage; Sparks משליך damage ניצוצות.
  4. בתוך TakeDamage, קראו ל־React(amount) בכל אחד מהאובייקטים שמחזיר GetComponentsInChildren<IHitReaction>(), ואז רשמו ביומן Reactions: 3 (המספר שלהם).

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

נסו בעצמכם

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}

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

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