טיפוסי Enum ב־Inspector
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 20 מתוך 64.
שדה enum מופיע ב־Inspector כרשימה נפתחת, מה שהופך אותו לדרך נוחה להגדיר אובייקטים שמשתמשים באותו סקריפט. קדם־הכנה אחד של Pickup משמש למטבעות, לבבות ומגינים: כל עותק בשלב מקבל את הסוג שלו מהרשימה הנפתחת, והסקריפט בוחר בהתאם:
public enum PickupKind { Coin, Heart, Shield }
public class Pickup : MonoBehaviour
{
public PickupKind kind;
public int amount = 1;
void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent(out PlayerStats stats)) return;
switch (kind)
{
case PickupKind.Coin: stats.coins += amount; break;
case PickupKind.Heart: stats.hp += amount; break;
case PickupKind.Shield: stats.shielded = true; break;
}
Destroy(gameObject);
}
}הסצנה שומרת כל בחירה כמספר של הערך: Coin הוא 0, Heart הוא 1, Shield הוא 2. הוספת ערך בסוף בטוחה. הוספת ערך בתחילת הרשימה, כמו ב־{ Gem, Coin, Heart, Shield }, מזיזה את כל המספרים, וכל פריט איסוף בכל סצנה משנה את סוגו. שינוי שם של ערך הוא בטוח, כי המספר שלו נשאר זהה. כתיבת המספרים במפורש, Coin = 0, Heart = 1, Shield = 2, מאפשרת לך לסדר מחדש את השמות בהמשך בלי להזיז אף בחירה שמורה.
enum עם [System.Flags] מכיל כמה ערכים בו־זמנית. ברשימה הנפתחת שלו יש סימון לכל ערך, בנוסף ל־Nothing ול־Everything. כל ערך זקוק לביט משלו, לכן המספרים הם חזקות של שתיים:
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // מסומנים ב-Inspector: Fire ו-Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}| משלב ערכים: Element.Fire | Element.Poison הוא 5. HasFlag(x) הוא true כשכל הערכים ב־x מסומנים, ו־ToString() מציג את הערכים המסומנים, כמו Fire, Poison.
אתגר
קלאפשר לדלת להזדקק לכמה כרטיסי מפתח, ולמחזיק להכיל כמה.
- ב־
KeyRing.cs, הצב את[System.Flags]מעלAccessומספר אותו כך:None = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)שומר את הכרטיסים שכבר נמצאים שם:cards |= card;.Opens(Access needs)מחזירה true רק כשהמחזיק מכיל את כל הכרטיסים שב־needs.
לחץ על "שחק" ואסוף את שני הכרטיסים: הכספת נפתחת. ואז לחץ על "בדיקה".
נסו בעצמכם
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// הוסף את הכרטיס למחזיק הכרטיסים, בלי להסיר את הכרטיסים שכבר נמצאים בו
}
public bool Opens(Access needs)
{
// מחזיר true כאשר מחזיק הכרטיסים מכיל את כל הכרטיסים שב־needs
return false;
}
}
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין