الأصناف القابلة للتسلسل
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 18 من 64.
يحصل البرنامج النصي الذي يحتوي على إعدادات كثيرة على قائمة طويلة ومسطحة في المفتّش. يمكن لفئة 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;
}
}يعرض المفتّش قائمتين قابلتين للطي، Normal وEnraged، وتحتوي كل منهما على Speed وDamage. يحصل كل Enemy على كائني Stats خاصين به، وتُملأ قيمهما في المفتّش الخاص به، ويقرأهما الكود على النحو normal.speed. تنشئ Unity هذه الكائنات عند تحميل البرنامج النصي، لذلك لا تكون normal مطلقًا null حتى من دون = new Stats()، كما أن قيم التهيئة للحقول (2 و10) هي القيم التي يبدأ بها Enemy جديد. يعمل struct بالطريقة نفسها مع السمة، [System.Serializable] public struct Range { public float min; public float max; }، ومثل Vector3، يُنسخ عند إسناده.
السمة مطلوبة لأن Unity لا تحفظ إلا الأنواع التي يُطلب منها حفظها. من دونها تكون الفئة غير مرئية للمفتّش: فلا توجد قائمة قابلة للطي، ولا تُحفظ القيم المضبوطة هناك، ولا تنشئ Unity الكائن، ولذلك يؤدي normal.speed إلى رمي NullReferenceException. داخل الفئة، تسري قواعد المفتّش المعتادة: حقول عامة أو حقول خاصة موسومة بـ [SerializeField]، وليس خصائص أو حقولًا static مطلقًا.
التحدي
سهلاجمع إعدادات كل حزمة ضوئية في بنية واحدة.
- فوق
Flashlight، أعلِنpublic struct BeamمعColor colorوfloat rangeوfloat angleعامة. أضِف إليها[System.Serializable]لكي يعرضها Inspector. - استبدل الحقول الستة المنفصلة بـ
public Beam wide;وpublic Beam focused;. - في
Apply()، عيّن القيم الثلاث للضوء منfocusedOn ? focused : wide.
اضغط «العب» ثم مفتاح المسافة: تصل الحزمة الضوئية إلى البلورة. ثم اضغط «تحقق».
جرّب بنفسك
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مراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity