التعدادات في 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.
التحدي
سهلتحتوي القاعدة على ثلاثة أبواب: يحتاج المخزن إلى بطاقة المفتاح الحمراء، والمختبر إلى الزرقاء، والخزنة إلى كلتيهما. يُحدَّد 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;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء