Menu
CoddyTech

القيمة Null في Unity

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

لكائن Unity نصفان: كائن C# الذي يحتفظ به برنامجك النصي، وكائن المحرك الذي يقف وراءه. تزيل Destroy(obj) نصف المحرك في نهاية الإطار، لكن متغيرك يظل يشير إلى نصف C#، لذا فهو ليس null من منظور C# البحت. تتجاوز Unity العامل == لمعالجة ذلك: بمجرد تدمير الكائن، تصبح obj == null صحيحة، وكذلك الاختبار المختصر !obj. هذا هو null الوهمي في Unity.

لا تستخدم ?. و?? وis null العامل ==. فهي تختبر مرجع C#، الذي لا يزال موجودًا، لذا تسمح بتمرير الاستدعاء، ويؤدي التعامل مع الكائن المدمر إلى طرح MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. يعرض هذا الملصق اسم متصدر السباق، الذي قد يُقصى (ويُدمّر):

[SerializeField] private Transform leader;

void Update()
{
    // يُطلق استثناءً بمجرد تدمير leader: string shown = leader?.name ?? "nobody";
    string shown = leader != null ? leader.name : "nobody";
    Debug.Log("Leader: " + shown);
}

بالنسبة إلى أي شيء مصدره UnityEngine.Object (كائنات اللعبة والمكوّنات والبرامج النصية الخاصة بك)، اختبر باستخدام == null أو != null أو if (obj)، واحتفظ بـ ?. و?? لكائنات C# العادية مثل السلاسل النصية. وتذكّر أيضًا أن Destroy تنتظر حتى نهاية الإطار: وحتى ذلك الحين، يظل الكائن حيًا وتكون == null غير صحيحة.

challenge icon

التحدي

متوسط

أوقف أخطاء الطائرة المسيّرة بعد تدمير هدفها.

  1. في Update()، استبدل السطرين بـ if (target != null)، وهو اختبار null الخاص بـ Unity.
  2. بداخله، اكتب transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);.

اضغط «العب»: تطارد الطائرة المسيّرة الهدف، ثم تنتظر دون أخطاء في وحدة التحكم. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class Chaser : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private float speed = 2f;

    void Start()
    {
        Destroy(target.gameObject, 2f);   // يُدمَّر الهدف بعد 2 ثانية
    }

    void Update()
    {
        Vector3 goal = target?.position ?? transform.position;
        transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
    }
}

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

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