Menu
CoddyTech
flag Ar iconالعربيةdown icon

الأصناف القابلة للتسلسل

جزء من قسم هندسة الألعاب في 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]، وليس الخصائص أو الحقول الثابتة أبدًا.

challenge icon

التحدي

سهل

يحتوي مصباح المستكشف على شعاعين، ويبدّل مفتاح المسافة بينهما: شعاع عريض ودافئ لاستكشاف ما حوله، وآخر أبيض بارد ومركّز يصل إلى أعماق الكهف. يحتفظ 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;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity