Menu
CoddyTech
flag Ar iconالعربيةdown icon

التعدادات في Inspector

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 17 من 50.

يظهر حقل enum في Inspector كقائمة منسدلة، ما يجعله طريقة مفيدة لإعداد كائنات تشترك في السكربت نفسه. يخدم نموذج Pickup واحد العملات والقلوب والدروع: يحصل كل نسخ منه في المستوى على نوعها من القائمة المنسدلة، ويستخدم السكربت تعليمة switch عليه:

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. تحتاج كل قيمة إلى بت خاص بها، لذا تكون الأرقام قوى العدد 2:

[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) صحيحة عندما تكون كل قيمة في x معيّنة، وتعرض ToString() القيم المعيّنة، مثل Fire, Poison.

challenge icon

التحدي

سهل

تحتوي القاعدة على ثلاثة أبواب: يحتاج المخزن إلى بطاقة المفتاح الحمراء، والمختبر إلى الزرقاء، والخزنة إلى كلتيهما. يُحدَّد needs لكل باب وcard لكل بطاقة في نافذة Inspector باستخدام التعداد Access، كما أن Door.cs وKeycard.cs جاهزان. تحرّك الأسهم Player، الذي يحتفظ KeyRing الخاص به بالبطاقات التي يلتقطها. أكمل KeyRing.cs:

  • اجعل Access تعدادًا يمكن دمج قيمه، بحيث يمكن أن يحتاج الباب إلى عدة بطاقات وأن تحتفظ الحلقة بعدة بطاقات. أبقِ أسماءه الأربعة: 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)
    {
        // true عندما تحتوي الحلقة على كل بطاقة في needs
        return false;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity