ה־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.
אתגר
בינוניעצור את השגיאות של הרחפן לאחר שהמטרה שלו מושמדת.
- ב־
Update(), החלף את שתי השורות ב־if (target != null), בדיקת ה־null הייחודית של Unity. - בתוך התנאי, כתוב
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
1יסודות C# ב-Unity
שלום, Unityמשתניםמספרים עשרוניים צריכים fטקסט ב-Consoleמשתנים ששומרים ערכיםאם ואחרתהשוואת מספריםחזרה: אוסף המטבעות10מציאת דברים
מציאה לפי שםתגיותמציאה לפי סוגהפניות עדיפות על חיפושה־Null של Unityסיכום: המטבע הקרוב ביותר5וקטורים
חיבור וקטוריםכיווניםמרחב מקומי ומרחב עולמימהירות אלכסוניתהמרחק בין עצמיםVector3 הוא מבנה נתוניםסיכום: הטסת רחפן8אובייקטי משחק ורכיבים
הפניות ב-Inspectorקבלת רכיברכיבים חסריםהוספת רכיבRequireComponentהצגה והסתרהחזרה: מתג תאורה6טרנספורמציות והיררכיה
הורים וילדיםלהניף את הדגלקנה מידהלהסתכל על דבריםלנוע לעבר נקודהסיכום: הירח המקיף12מחזור החיים של הסקריפט
Awake ו-StartUpdate ו-LateUpdateOnEnable ו-OnDisableסדר מחזור החייםסיכום: יומן מחזור החייםתרגלו בעצמכם: Unity אונליין