שדות 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.
אתגר
קלהוסף ל־FinishLine את האירועים שאליהם מחוברים רכיבי השורה בסצנה.
- הוסף
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;ומשתנה int פרטי למספר ההקפות שהושלמו. - ב־
OnTriggerEnter, כאשרotherמתויג בתורPlayer, ספור את ההקפה וקרא ל־onLap.Invokeעם מספר ההקפות שהושלמו. - כשהם מגיעים ל־
laps, קרא ל־onRaceOver.Invoke(); לאחר מכן, חצייה נוספת לא תעשה דבר.
לחץ על "שחק" ונהג במשך שלוש הקפות. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// המכונית חצתה את קו הסיום: הושלמה עוד הקפה
}
}
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין