الأصناف القابلة للتسلسل
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 15 من 50.
يؤدي وجود نص برمجي يتضمن إعدادات كثيرة إلى قائمة طويلة ومسطّحة في نافذة Inspector. يمكن لفئة C# عادية تجميع هذه الإعدادات: ضع عليها [System.Serializable]، وسيظهر الحقل من هذه الفئة كقائمة قابلة للطي تحمل اسم الحقل، وبداخلها حقول الفئة. يمكن لفئة واحدة أن تخدم عدة حقول وعدة نصوص برمجية:
[System.Serializable]
public class Stats
{
public float speed = 2f;
public int damage = 10;
}
public class Enemy : MonoBehaviour
{
public Stats normal;
public Stats enraged;
private Stats current;
void Start()
{
current = normal;
}
void Update()
{
transform.Translate(0f, 0f, current.speed * Time.deltaTime);
}
public void Enrage()
{
current = enraged;
}
}تعرض نافذة Inspector قائمتين قابلتين للطي، Normal وEnraged، تحتوي كل منهما على Speed وDamage. يحصل كل Enemy على كائني Stats خاصين به، وتُملأ قيمهما في نافذة Inspector الخاصة به، ويقرأهما الكود بالشكل normal.speed. تنشئ Unity هذه الكائنات عند تحميل النص البرمجي، لذا لا تكون normal مساوية لـ null أبدًا حتى من دون = new Stats()، وتكون القيم الابتدائية للحقول (2 و10) هي القيم التي يبدأ بها كائن Enemy جديد. يعمل struct بالطريقة نفسها مع السمة، [System.Serializable] public struct Range { public float min; public float max; }، ومثل Vector3، يُنسخ عند إسناده.
السمة ضرورية لأن Unity لا تحفظ إلا الأنواع التي يُطلب منها حفظها. من دونها، تكون الفئة غير مرئية في نافذة Inspector: فلا تظهر قائمة قابلة للطي، ولا تُحفظ القيم المحددة فيها، ولا تنشئ Unity الكائن، لذا يؤدي normal.speed إلى طرح NullReferenceException. تنطبق قواعد Inspector المعتادة داخل الفئة: الحقول العامة أو الحقول الخاصة الموسومة بـ [SerializeField]، وليس الخصائص أو الحقول الثابتة أبدًا.
التحدي
سهليحتوي مصباح المستكشف على شعاعين، ويبدّل مفتاح المسافة بينهما: شعاع عريض ودافئ لاستكشاف ما حوله، وآخر أبيض بارد ومركّز يصل إلى أعماق الكهف. يحتفظ Flashlight.cs بإعدادات كل شعاع الثلاثة في ستة حقول منفصلة. المشهد مُعدّ مسبقًا بحيث تُجمّع الإعدادات لكل شعاع، ويجب أن يطابقه البرنامج النصي:
- عرّف بنية
Beamبثلاثة حقول عامة:color(من النوع Color)، وrangeوangle(من النوع float). يجب أن تظهر في نافذة Inspector. - استبدل الحقول الستة المنفصلة بحقلين من النوع Beam، هما
wideوfocused. يضبط المشهدwideعلى لون دافئ، ومدى 6، وزاوية 80، ويضبطfocusedعلى لون أبيض بارد، ومدى 15، وزاوية 25. - اجعل
Apply()يقرأ قيمة Beam الخاصة بالشعاع الحالي، ويضبطcolorوrangeوspotAngleفي Light باستخدامها. تبقى بقية الأمور كما هي: يبدأ المصباح بالشعاع العريض، ويبدّل مفتاح المسافة بين الشعاعين.
اضغط تشغيل، ثم اضغط مفتاح المسافة لإضاءة الطرف البعيد من الكهف، ثم اضغط تحقّق.
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Flashlight : MonoBehaviour
{
public Color wideColor = Color.white;
public float wideRange = 5f;
public float wideAngle = 60f;
public Color focusedColor = Color.white;
public float focusedRange = 10f;
public float focusedAngle = 30f;
private bool focusedOn;
private Light lamp;
void Start()
{
lamp = GetComponent<Light>();
Apply();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
focusedOn = !focusedOn;
Apply();
}
}
void Apply()
{
lamp.color = focusedOn ? focusedColor : wideColor;
lamp.range = focusedOn ? focusedRange : wideRange;
lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء