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

المكوّنات المفقودة

جزء من قسم أساسيات البرمجة النصية في Unity في رحلة Unity على Coddy. الدرس 31 من 67.

عندما لا يكون المكوّن الذي تطلبه موجودًا على الكائن، فإن GetComponent لا يمنعك من المتابعة. في المحرّر، يعيد قيمة بديلة تُقارَن بـ null، ويُصدر Unity استثناءً في المرة الأولى التي يستخدم فيها كودك هذه القيمة. ينبغي لهذه الكرة أن تقفز عند الضغط على Space، لكن لم يضف أحد إليها مكوّن Rigidbody:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 300f);
    }
}

تُظهر ضغطة Space الرسالة MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it.. تذكر الرسالة نوع المكوّن المفقود والكائن. أضف المكوّن من نافذة Inspector، أو اطلبه أولًا إذا كان من الممكن أن يفتقر إليه الكائن عن قصد. تُرجع TryGetComponent(out rb) القيمة true وتملأ rb عندما يكون المكوّن موجودًا، وتُرجع false من دون خطأ عندما لا يكون موجودًا (تتيح out للدالة إعادة قيمة عبر المتغير):

bool canHop;

void Start()
{
    canHop = TryGetComponent(out rb);
}

بعد ذلك، لا تدفع Update() الكرة إلا if (canHop). خارج المحرّر، في لعبة مبنية، يُرجع GetComponent قيمة null عادية بدلًا من ذلك، لذا يظهر الخطأ نفسه هناك على هيئة NullReferenceException.

challenge icon

التحدي

متوسط

يُشغّل مفتاح المسافة مصابيح الشوارع ويطفئها، لكن مصباح Lamp2 معطّل: لا يحتوي على Light، ويؤدي الضغط على مفتاح المسافة إلى التوقف مع ظهور MissingComponentException. أصلح البرنامج النصي:

  • تظل المصابيح التي تحتوي على Light تُشغّل وتُطفأ باستخدام مفتاح المسافة.
  • لا يلمس المصباح الذي لا يحتوي على Light هذا المكوّن أبدًا، لذلك لا يحدث أي خطأ.
  • عند بدء اللعبة، يلوّن المصباح الذي لا يحتوي على Light لمبته باستخدام Color.gray، حتى يتمكن اللاعبون من معرفة أنه معطّل.

اضغط على Play، ثم على مفتاح المسافة لرؤية الخطأ. أصلحه، ثم اضغط على Check.

جرّب بنفسك

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}
quiz iconاختبر نفسك

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

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