Menu
CoddyTech

ה-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.

challenge icon

אתגר

בינוני

הרחפן רודף אחרי המטרה שלו, והמטרה מושמדת לאחר 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);
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות התכנות ב-Unity