Menu
CoddyTech

רכיבים חסרים

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

כאשר הרכיב שביקשת אינו נמצא באובייקט, GetComponent לא עוצר אותך. בעורך הוא מחזיר תחליף שמשתווה ל־null, ו־Unity זורק חריגה בפעם הראשונה שהקוד שלך משתמש בו. הכדור הזה אמור לקפוץ כשלוחצים על Space, אבל לא הוסיפו לו Rigidbody:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 300f);
    }
}

לחיצה על Space מציגה את MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. ההודעה מציינת את הסוג החסר ואת האובייקט. הוסף את הרכיב בחלון Inspector, או, אם ייתכן שהאובייקט לא יכלול אותו בכוונה, בדוק קודם אם הוא קיים. TryGetComponent(out rb) מחזירה true וממלאת את rb כשהרכיב קיים, ומחזירה false בלי שגיאה כשהוא לא קיים (out מאפשרת למתודה להחזיר ערך דרך המשתנה):

bool canHop;

void Start()
{
    canHop = TryGetComponent(out rb);
}

לאחר מכן, Update() דוחפת את הכדור רק אם if (canHop). מחוץ לעורך, במשחק שנבנה, GetComponent מחזירה במקום זאת null רגיל, ולכן אותה טעות תופיע שם כ־NullReferenceException.

challenge icon

אתגר

בינוני

ל־Lamp2 אין רכיב Light: דאג לכך שמקש Space ידלג עליו, והצג שהוא מקולקל.

  1. ב־Start(), החלף את שורת GetComponent ב־hasBulb = TryGetComponent(out bulb);, והוסף שדה bool hasBulb;.
  2. כאשר hasBulb הוא false, צבע את המנורה: GetComponent<Renderer>().material.color = Color.gray;.
  3. ב־Update(), החלף את מצב האור רק כאשר hasBulb הוא true.

לחץ על "שחק" ואז על Space: המנורות התקינות יחליפו מצב, ללא שגיאה. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}

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

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