שדות 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.
אתגר
קלמרוץ של שלוש הקפות מסביב לאי. החצים מניעים את המכונית (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)
{
// המכונית חצתה את קו הסיום: הושלמה עוד הקפה
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי3אירועים
אירועי C# ב-Unityהירשם ב-OnEnableשדות UnityEventאירועים מניעים את ממשק המשתמשסיכום: חלונית הישג