Menu
CoddyTech

GetComponents

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

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");
    }
}

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

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

challenge icon

אתגר

קל

רובוט האימון צריך להציג כל פגיעה. ‏Health.cs ב-Robot סופר את hp, ושלושה חלקים יכולים להגיב: ‏Flash ב-Head הופך אותו לאדום, ‏Recoil ב-Robot מטלטל אותו לאחור, ו-Sparks ב-Antenna משליך ניצוצות. מקש הרווח פוגע ברובוט בעוצמה 1, ולחיצה פוגעת בו בעוצמה 2 (‏Trainer.cs מוכן). כרגע Health מודיע רק לראש.

  • ב-IHitReaction.cs, הכריזו על ממשק IHitReaction עם מתודה אחת, void React(int damage).
  • גרמו ל-Flash, ‏Recoil ו-Sparks לממש אותו: המתודה של כל אחד מהם הופכת ל-React(int damage). ‏Flash עושה את מה שעשה קודם. ‏Recoil מטלטל את הרובוט 0.5 יחידות לאחור (+z) עבור כל נקודת נזק, ו-Sparks משליך ניצוץ אחד עבור כל נקודת נזק.
  • ב-TakeDamage של Health, אחרי ש-hp פוחת, קראו ל-React(amount) בכל IHitReaction שנמצא ב-Robot ובילדים שלו, באמצעות קריאה אחת ל-GetComponentsInChildren, ותעדו כמה הגיבו, כך: Reactions: 3.

לחצו על הפעלה, פגעו ברובוט באמצעות מקש הרווח ולחיצה, ואז לחצו על בדיקה.

נסו בעצמכם

using UnityEngine;

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

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz iconבחנו את עצמכם

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

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