التعدادات في 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.
التحدي
سهلاجعل الباب يحتاج إلى عدة بطاقات مفاتيح، واجعل حلقة المفاتيح تحمل عدة بطاقات.
- في
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التعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity