Menu
CoddyTech

ה־Null של Unity

חלק מהיחידה יסודות הסקריפטים ב-Unity במסלול ה-Unity של Coddy. שיעור 60 מתוך 85.

לעצם של 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

אתגר

בינוני

עצור את השגיאות של הרחפן לאחר שהמטרה שלו מושמדת.

  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);   // האובייקט target מושמד לאחר 2 שניות
    }

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

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

תרגלו בעצמכם: Unity אונליין