Menu
CoddyTech

Enums ב-Inspector

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

שדה enum מופיע ב־Inspector כרשימה נפתחת, מה שהופך אותו לדרך נוחה להגדיר אובייקטים שמשתמשים באותו סקריפט. Prefab אחד של 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.

challenge icon

אתגר

קל

בבסיס יש שלוש דלתות: מחסן הציוד דורש כרטיס מפתח אדום, המעבדה את הכרטיס הכחול, והכספת את שניהם. הערך needs של כל דלת והערך card של כל כרטיס מוגדרים ב-Inspector באמצעות ה-enum‏ Access, והקבצים Door.cs ו-Keycard.cs מוכנים. החצים מזיזים את Player, שה-KeyRing שלו מכיל את הכרטיסים שאסף. השלימו את KeyRing.cs:

  • הפכו את Access ל-enum שערכיו ניתנים לשילוב, כך שדלת תוכל לדרוש כמה כרטיסים וטבעת המפתחות תוכל להכיל כמה. השאירו את ארבעת השמות: None, Red, Blue ו-Green.
  • Add(Access 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)
    {
        // נכון כאשר הצרור מכיל את כל הכרטיסים שב־needs
        return false;
    }
}
quiz iconבחנו את עצמכם

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

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