Null في Unity
جزء من قسم أساسيات البرمجة النصية في Unity في رحلة Unity على Coddy. الدرس 46 من 67.
لكائن 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 (كائنات GameObjects والمكوّنات والسكربتات الخاصة بك)، اختبر باستخدام == null أو != null أو if (obj)، واحتفظ بـ ?. و?? لكائنات C# العادية مثل السلاسل النصية. وتذكّر أيضًا أن Destroy ينتظر حتى نهاية الإطار: حتى ذلك الحين، يظل الكائن حيًا وتكون == null خاطئة.
التحدي
متوسطتطارد الطائرة المسيّرة هدفها، ويُدمَّر الهدف بعد مرور ثانيتين من بدء اللعبة. بعد ذلك، تمتلئ وحدة التحكم بالاستثناء MissingReferenceException، لأن target?.position لا يلاحظ اختفاء الهدف.
أصلح Update() باستخدام اختبار null الخاص بـ Unity: ما دام الهدف موجودًا، تطير الطائرة المسيّرة نحوه بسرعة speed؛ وبمجرد تدميره، تبقى الطائرة المسيّرة في مكانها من دون أخطاء.
اضغط على Play وراقب وحدة التحكم، وأصلح النص البرمجي، ثم اضغط على Check.
جرّب بنفسك
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
1أول سكربت لك
مرحبًا يا Unityضع المكعبتحرّك في كل إطاراستدر كل ثانيةوجّه باستخدام المفاتيحمراجعة: قُد المكعب5التحويلات والتسلسل الهرمي
الآباء والأبناءالتحجيمالنظر إلى الأشياءالتحرك نحو نقطةمراجعة: القمر الدائر8العثور على الأشياء
البحث بالاسمالوسومالبحث حسب النوعالمراجع أفضل من البحثNull في Unityمراجعة: أقرب عملة