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 בודקת רק את האובייקט האחד, ומתאימה לחלקים שנמצאים זה לצד זה, כמו אור וזמזם על דלת אחת.
אתגר
קלתנו לכל חלק ברובוט להראות שהוא נפגע.
- ב־
IHitReaction.cs, הכריזו עלpublic interface IHitReactionעםvoid React(int damage);. - גרמו ל־
Flash, ל־Recoilול־Sparksלממש אותו: שנו את שם כל מתודה ל־public void React(int damage). - הזיזו את Recoil לאחור ב־
0.5f * damage; Sparks משליךdamageניצוצות. - בתוך
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין