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 46 / 67.

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 edildiğinde obj == null true olur; kısa sınama !obj için de aynı şey geçerlidir. Bu, Unity'nin sahte null değeridir.

?., ?? ve is null, bu == işleç davranışını kullanmaz. C# başvurusunu sınarlar; başvuru hâlâ var olduğundan çağrının devam etmesine izin verirler ve yok edilmiş nesneye erişmek MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. hatasını fırlatır. Bu etiket, elenebilecek (yok edilebilecek) yarış liderinin adını gösterir:

[SerializeField] private Transform leader;

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

UnityEngine.Object türünden 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

Drone hedefini kovalar ve hedef, oyun başladıktan 2 saniye sonra yok edilir. O andan itibaren Console, MissingReferenceException hatasıyla dolar; çünkü target?.position hedefin yok olduğunu fark etmez.

Update() metodunu Unity'nin kendi null denetimiyle düzelt: hedef varken drone ona doğru speed hızıyla uçar; hedef yok edildikten sonra drone bulunduğu yerde kalır ve hata oluşmaz.

Play'e bas ve Console'u izle, betiği düzelt, ardından Check'e 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);
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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