Menu
CoddyTech

שדות UnityEvent

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

השדה On Click () של כפתור הוא שדה UnityEvent, וגם לסקריפטים משלך יכול להיות שדה כזה. שדה UnityEvent ציבורי מופיע ב-Inspector כרשימה מאותו סוג, והסקריפט מפעיל אותו באמצעות Invoke() בלי לדעת מה מחובר אליו. הספירה לאחור הזו מתקדמת פעם בשנייה:

using UnityEngine;
using UnityEngine.Events;

public class Countdown : MonoBehaviour
{
    public int seconds = 3;
    public UnityEvent<int> onTick;
    public UnityEvent onFinished;

    void Start()
    {
        InvokeRepeating("Tick", 1f, 1f);
    }

    void Tick()
    {
        seconds--;
        onTick.Invoke(seconds);
        if (seconds == 0)
        {
            CancelInvoke("Tick");
            onFinished.Invoke();
        }
    }
}

ב-Inspector, השדה On Finished () כולל שורות כמו בכפתור: שורה אחת משגרת את הרקטה, ושורה אחרת פותחת את השער. שלב אחר משתמש שוב באותו Countdown עם שורות אחרות, ואף אחד לא כותב סקריפט חדש. UnityEvent<int> מעביר ערך. בתפריט הנפתח שלו, שיטה שמקבלת int מופיעה תחת Dynamic int, והשורה הזו מקבלת את הערך שניתן ל-Invoke, במקרה הזה מספר השניות שנותרו. אותה שיטה תחת Static Parameters מקבלת במקום זאת מספר שהוקלד בשורה, ואפשר גם לחבר שיטות ללא פרמטרים.

Unity יוצר שדה UnityEvent כשהוא טוען את הסקריפט, לכן onTick לעולם אינו null ואינו זקוק ל-?., והקוד יכול להוסיף מאזינים באמצעות onTick.AddListener(ShowSeconds). בחרו ב-UnityEvent כשהתגובה משתנה מאובייקט לאובייקט ומוגדרת ב-Inspector, על ידיכם או על ידי מעצב שאינו פותח את הסקריפט כלל. בחרו באירוע C# כשהקוד מאזין: המהדר בודק את שמות השיטות, כך ששינוי שם גורם לכשל בבנייה במקום להשאיר שורת <Missing> שקטה, ואירוע C# לעולם אינו מופיע ב-Inspector.

challenge icon

אתגר

קל

מרוץ של שלוש הקפות מסביב לאי. החצים מניעים את המכונית (Car.cs), והסצנה מחוברת כפי שמעצב היה מחבר אותה ב-Inspector: הרשימה On Lap (Int32) של FinishLine קוראת ל-LapBoard.ShowLaps (Dynamic int) ב-LapText ול-Crowd.Cheer ב-Crowd, והרשימה On Race Over () שלה קוראת ל-LapBoard.ShowFinished ול-Car.Stop. הסקריפטים האלה מוכנים, אבל אין לאן לחבר את השורות עד של-FinishLine יהיו האירועים.

כתבו את FinishLine.cs:

  • שני שדות UnityEvent: onLap, שמעביר int, ו-onRaceOver, שלא מעביר דבר.
  • בכל פעם שהמכונית (עם התג Player) נכנסת לקו, הושלמה הקפה: הפעילו את onLap עם מספר ההקפות שהושלמו (1, ואז 2, ואז 3). שום דבר אחר שחוצה את הקו אינו נחשב.
  • כאשר מספר ההקפות שהושלמו מגיע ל-laps (3), הפעילו את onRaceOver. לאחר מכן, חציית הקו אינה עושה דבר.

לחצו על Play, סעו שלוש הקפות מסביב לאי, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // המכונית חצתה את קו הסיום: הושלמה עוד הקפה
    }
}
quiz iconבחנו את עצמכם

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

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