Menu
CoddyTech

Eksik Bileşenler

Coddy'nin Unity Journey'sinin Unity'de Script Yazmanın Temelleri bölümünün bir parçası. Ders 45 / 85.

İstediğiniz bileşen nesnede yoksa GetComponent sizi durdurmaz. Editor'da, null ile eşit kabul edilen bir vekil döndürür ve kodunuz bu vekili ilk kez kullandığında Unity hata verir. Bu top, Space tuşuna basıldığında zıplamalı, ancak ona kimse bir Rigidbody eklememiş:

Rigidbody rb;

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

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

Space'e basıldığında MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. mesajı görünür. Mesaj, eksik türü ve nesneyi belirtir. Bileşeni Inspector'dan ekleyin ya da nesnede bilerek bulunmayabileceği durumlarda önce var olup olmadığını kontrol edin. Bileşen varsa TryGetComponent(out rb) true döndürür ve rb'yi doldurur; yoksa hata vermeden false döndürür (out, yöntemin bir değeri değişken üzerinden geri vermesini sağlar):

bool canHop;

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

Update() daha sonra topu yalnızca if (canHop) koşulu sağlandığında iter. Editor dışında, derlenmiş bir oyunda GetComponent bunun yerine sıradan bir null döndürür; bu nedenle aynı hata orada NullReferenceException olarak ortaya çıkar.

challenge icon

Görev

Orta

Lamp2'de Light yok: Space tuşunun onu atlamasını ve bozuk olduğunu göstermesini sağla.

  1. Start() içinde GetComponent satırını, bool hasBulb; alanıyla birlikte hasBulb = TryGetComponent(out bulb); olarak değiştir.
  2. hasBulb false olduğunda lambayı renklendir: GetComponent<Renderer>().material.color = Color.gray;.
  3. Update() içinde ışığı yalnızca hasBulb true olduğunda değiştir.

“Oyna”'ya bas ve Space tuşuna bas: çalışan lambalar hata vermeden değişir. Ardından “Kontrol et”.

Kendin dene

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'de Script Yazmanın Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground