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.
Görev
OrtaHedefi yok edildikten sonra drone'un hata vermesini durdur.
Update()içinde, her iki satırı da Unity'nin kendi null testi olanif (target != null)ile değiştir.- 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
1Unity'de C# Temelleri
Merhaba, UnityDeğişkenlerOndalık Sayılar için f GerekirKonsolda MetinHatırlayan DeğişkenlerEğer ve DeğilseSayıları KarşılaştırmaTekrar: Coin Collector4Girdi
Basılı, Basılı Tutulmuş, BırakılmışEksenlerAdlandırılmış DüğmelerFare DüğmeleriTekrar: Zıplama Yükleme7Döngüler ve Metotlar
for ile tekrarlamaİç içe döngülerBir metot yazmaYanıt veren metotlarDizilerTekrar: Merdiven10Nesneleri Bulma
Ada Göre BulEtiketlerTüre Göre BulReferanslar Bulmaktan İyidirUnity'de NullÖzet: En Yakın Madeni Para13Proje: Bloklardan Kaç
KoşucuGökyüzünden Bloklar5Vektörler
Vektörleri ToplamaYönlerYerel ve Dünya UzayıÇapraz HızNesneler Arasındaki MesafeVector3 Bir Struct'tırTekrar: Drone Pilotu8GameObject'ler ve Bileşenler
Inspector'daki ReferanslarBir Bileşen AlEksik BileşenlerBileşen EkleRequireComponentGöster ve GizleÖzet: Işık Anahtarı3Inspector
Inspector AlanlarıSerializeFieldOndalıklı Sayılar ve MathfInspector ÖzellikleriTekrar: Asansör6Dönüşümler ve Hiyerarşi
Ebeveynler ve ÇocuklarBayrağı Göndere ÇekÖlçekNesnelere BakBir Noktaya Doğru Hareket EtTekrar: Yörüngedeki Ay9Proje: Yıldızı Yakala
YakalayıcıDüşen Bir YıldızKendi başına pratik yap: Unity playground