Menu
CoddyTech

שדות UnityEvent

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

האירוע 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

אתגר

קל

הוסף ל־FinishLine את האירועים שאליהם מחוברים רכיבי השורה בסצנה.

  1. הוסף using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; ומשתנה int פרטי למספר ההקפות שהושלמו.
  2. ב־OnTriggerEnter, כאשר other מתויג בתור Player, ספור את ההקפה וקרא ל־onLap.Invoke עם מספר ההקפות שהושלמו.
  3. כשהם מגיעים ל־laps, קרא ל־onRaceOver.Invoke(); לאחר מכן, חצייה נוספת לא תעשה דבר.

לחץ על "שחק" ונהג במשך שלוש הקפות. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

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

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

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

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