Menu
CoddyTech

Unity'de Null

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

Bir Unity nesnesinin iki yarısı vardır: betiğinizin tuttuğu C# nesnesi ve arkasındaki motor nesnesi. Destroy(obj), motor yarısını karenin sonunda kaldırır, ancak değişkeniniz hâlâ C# yarısına işaret eder; bu nedenle yalın C# açısından null değildir. Unity bunu kapsamak için == işleç davranışını geçersiz kılar: nesne yok edildikten sonra obj == null true olur; kısa sınama !obj da true olur. Unity'nin *sahte null* davranışı budur.

?., ?? ve is null, bu == işleç davranışını kullanmaz. C# başvurusunu sınarlar; başvuru hâlâ mevcut olduğundan çağrının yapılmasına izin verirler ve yok edilmiş nesneye dokunmak MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. hatasını verir. Bu etiket, elenebilen (yok edilebilen) yarış liderinin adını gösterir:

[SerializeField] private Transform leader;

void Update()
{
    // leader yok edildiğinde hata fırlatır: string shown = leader?.name ?? "nobody";
    string shown = leader != null ? leader.name : "nobody";
    Debug.Log("Leader: " + shown);
}

UnityEngine.Object öğesinden gelen her şey için (GameObject'ler, bileşenler, betikleriniz) == null, != null veya if (obj) ile sınama yapın; ?. ve ?? işleçlerini dizeler gibi yalın C# nesneleri için kullanın. Ayrıca Destroy işleminin karenin sonuna kadar beklediğini unutmayın: o zamana kadar nesne hâlâ canlıdır ve == null false olur.

challenge icon

Görev

Orta

Hedefi yok edildikten sonra drone'un hata vermesini durdur.

  1. Update() içinde, her iki satırı da Unity'nin kendi null testi olan if (target != null) ile değiştir.
  2. Bunun içine transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime); yaz.

“Oyna” düğmesine bas: drone hedefi kovalar, ardından Console'da hata olmadan bekler. Sonra “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

public class Chaser : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private float speed = 2f;

    void Start()
    {
        Destroy(target.gameObject, 2f);   // target, 2 saniye sonra yok edilir
    }

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

Unity'de Script Yazmanın Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground