Menu
CoddyTech

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

جزء من قسم هندسة الألعاب في 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 مطلقًا.

challenge icon

التحدي

سهل

اجمع إعدادات كل حزمة ضوئية في بنية واحدة.

  1. فوق Flashlight، أعلِن public struct Beam مع Color color وfloat range وfloat angle عامة. أضِف إليها [System.Serializable] لكي يعرضها Inspector.
  2. استبدل الحقول الستة المنفصلة بـ public Beam wide; وpublic Beam focused;.
  3. في 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

تدرّب بنفسك: Playground لـ Unity