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.
Görev
OrtaDrone 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);
}
}
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
1İlk Betiğiniz
Merhaba, UnityKüpü YerleştirHer Karede Hareket EtHer Saniye DönTuşlarla Yön VerÖzet: Küpü Sür4Vektörler
Vektörleri ToplamaYönlerYerel ve Dünya UzayıÇapraz HızNesneler Arasındaki MesafeVector3 Bir YapıdırÖzet: Drone Pilotu7Proje: Yıldızı Yakala
YakalayıcıDüşen Bir Yıldız5Dönüşümler ve Hiyerarşi
Ebeveynler ve ÇocuklarÖlçekNesnelere BakışBir Noktaya Doğru HareketTekrar: Yörüngedeki Ay8Nesneleri Bulma
Ada Göre BulEtiketlerTüre Göre BulReferanslar Bulmaktan İyidirUnity'de NullÖzet: En Yakın Madeni Para6GameObject'ler ve Bileşenler
Inspector'daki ReferanslarBir Bileşen AlEksik BileşenlerBir Bileşen EkleRequireComponentGöster ve GizleÖzet: Işık Anahtarı