ה-Null של Unity
חלק מהיחידה יסודות התכנות ב-Unity במסלול ה-Unity של Coddy. שיעור 46 מתוך 67.
לאובייקט של Unity יש שני חלקים: אובייקט ה־C# שהסקריפט שלך מחזיק, ואובייקט המנוע שמאחוריו. Destroy(obj) מסיר את חלק המנוע בסוף הפריים, אבל המשתנה שלך עדיין מצביע על חלק ה־C#, ולכן במונחי C# רגילים הוא אינו null. Unity מבצעת דריסה ל־== כדי לטפל בזה: ברגע שהאובייקט מושמד, obj == null הוא true, וכך גם הבדיקה הקצרה !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 הוא false.
אתגר
בינוניהרחפן רודף אחרי המטרה שלו, והמטרה מושמדת לאחר 2 שניות מתחילת המשחק. מאותו רגע, ה־Console מתמלא בשגיאות MissingReferenceException, כי target?.position לא מזהה שהמטרה נעלמה.
תקן את Update() בעזרת בדיקת ה־null המובנית של Unity: כל עוד המטרה קיימת, הרחפן עף לעברה במהירות speed; לאחר שהיא מושמדת, הרחפן נשאר במקומו, ללא שגיאות.
לחץ על Play וצפה ב־Console, תקן את הסקריפט, ואז לחץ על 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הצב את הקובייהזוז בכל פרייםהסתובב בכל שנייהנווט בעזרת המקשיםסיכום: נהג בקובייה4וקטורים
חיבור וקטוריםכיווניםמרחב מקומי ומרחב עולמימהירות אלכסוניתהמרחק בין עצמיםVector3 הוא מבנה נתוניםסיכום: הטסת רחפן10מחזור החיים של הסקריפט
Awake ו-StartUpdate ו-LateUpdateOnEnable ו-OnDisableסדר מחזור החייםסיכום: מתעד מחזור החיים8איתור דברים
חיפוש לפי שםתגיותחיפוש לפי סוגהפניות עדיפות על Findה-Null של Unityסיכום: המטבע הקרוב ביותר