Menu
CoddyTech

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

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

يظهر حقل التعداد في نافذة Inspector على هيئة قائمة منسدلة، ما يجعله وسيلة ملائمة لإعداد كائنات تستخدم النص البرمجي نفسه. يكفي عنصر Pickup prefab واحد للعملات والقلوب والدروع: تحصل كل نسخة في المستوى على نوعها من القائمة المنسدلة، ويُبدّل النص البرمجي بناءً عليه:

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، تتيح لك إعادة ترتيب الأسماء لاحقًا من دون تغيير أي اختيار محفوظ.

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

challenge icon

التحدي

سهل

اجعل الباب يحتاج إلى عدة بطاقات مفاتيح، واجعل حلقة المفاتيح تحمل عدة بطاقات.

  1. في KeyRing.cs، ضع [System.Flags] فوق Access، ورقّم قيمه كالتالي: None = 0, Red = 1, Blue = 2, Green = 4.
  2. تحافظ Add(Access card) على البطاقات الموجودة بالفعل: cards |= card;.
  3. تعيد 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

تدرّب بنفسك: Playground لـ Unity