Popüler Yayınımıza da Göz Atabilirsiniz

Unity null reference exception object reference Hatası Çözümü %100 Kesin

Unity null reference exception object reference not set to an instance of an object hatası çözümü nasıl olur bu yayınımızdan bundan bahsedeceğiz.

İlk olarak hatayı daha iyi anlayıp nedeni kavrayacağız. Null reference hatası objeye herhangi bir değerin atanmadığını gösteriyor yani bir bakıma obje hiçbir şey taşımayan boş olarak görülüyor. Hiç değer taşımıyor. Bu yüzden de istediğimiz işlem yapılamıyor.



Mesela resimde gözüken hataya bakalım ve anlamaya çalışalım.

NullReferenceException: Object reference not set to an instance of an object

Tutorial.Die () (at Assets/Tutorial.cs:19)

Tutorial.Start () (at Assets/Tutorial.cs:11)

    Burada sizinkilerde daha çok yazı olup karışık görünebilir. Asıl önemli olan siz kendi kullandığınız scripte ait olan satırları bulun . Zaten hepsi genelde alt alta  oluyor. Geri kalanlar Unity'nin kendi scriptleri ve bizim işimiz yok.

    Hatada Tutorial adlı scriptin 19. satırında Die fonksiyonunda ve 11.satırda Start fonksiyonunda problem olduğu belirtiliyor. Buradaki satır numaraları bizim için aşırı derecede önemli. Hatanın nerede olduğunu söylüyor ve inanılmaz bir kolaylık sağlıyor. Aksi takdirde hata çözmek aşırı zamanlar alırdı.

Koda bakalım.



Unity Console menüsündeki mesajda 11 ve 19. satırları söylemişti bize. 11'e baktığımızda Die fonksiyonunu çağırdığını görüyoruz. 19.satır ise zaten Die fonksiyonun içindeki satır. Yani 11.satırda 19'u söylüyor bize bu fonksiyonda 19.satır hatalı diyor. 19.satıra bakalım

Man man_ = fighter.GetComponent<Man>();

fighter objesinden Man scriptini almaya çalışıyoruz. Ya fighter objemiz boş ya da Man scriptimizi alamıyoruz.

1. fighter Nesnesi Boşsa

    Zaten 8.satıra baktığımıza bir fighter oluşturulmuş ama değer tanımlanmamış yani hata verecektir bu nesne. Peki nasıl tanımlayacağız.  Başına public ekleyerek bir Man nesnesini Inspector üzerinden atayabiliriz. 

public GameObject fighter;

Ya da GetComponent ile değer atayabilir , başka scriptler üzerinden değer güncelleyebiliriz.

2. Man objesini alamıyorsa:

GetComponent şu mantıkta çalışır scripti hangi objeye atadıysanız o objede Man scriptini ara yani aynı objede.


Mesela yanda Tutorial scripti var ama Man scripti yok o zaman bize bu durum hata olarak dönecektir. Ve bir Man scripti eklememiz halinde çözülecektir.














Şuana kadar en basit çözümlerden ve nedenden bahsettik ama bir değer atadım diyorsanız şunlar dikkat edin.

    3.GameObject.Find yaparken büyük küçük harfine kadar tamamen aynı isimle aramıyor olabilirsiniz. Hierarchy'deki ismi kopyalayıp o şekilde aramanızı öneririm.
    4.GameObject.Find işlemi Active'liği mevcut olanlarda gerçekleşir. Eğer obje pasifse onu bulamaz ve hata verir. Mesela aşağıdaki görselde Objenin aktif olmadığı görülüyor.

İşaretli yerde objenin pasif olduğu görülüyor.
    
     5.Değer atama işleminiz hata verdikten sonra gerçekleşecek durumda ise  o zaman yine hata alırız. Çünkü benim objem boşken işlem yapmaya çalışıyorum. Ama değer atadığım satır bu işlemde sonra gerçekleşiyor. Bu birden çok scriptte çalışırken görülebilir. Örnek olarak her scriptin Start'ı başlangıç çok minik düzeyde de olsa farklı anlarda çalışır .

    Yorum atarak görüşlerinizi, sorunlarınızı bildirebilirsiniz. Saygılarımla!

Yorumlar

  1. hocam sürekli NullReferenceException: Object reference not set to an instance of an object hatası alıyorum ama düzeltemiyorum :(

    YanıtlaSil
  2. Hocam Allah razı olsun sayenizde hatayı giderdim. Componenti çekeceğim script o objede yokmuş onu yerleştirdiğim gibi çözüldü

    YanıtlaSil

Yorum Gönder

Bu blogdaki popüler yayınlar

C# örnekleri oyun nasıl yapılır

C# Puan Tablosu Oluşturma

C# ile List İçinde Değer Arama ve Bulma Find ve FindAll Komutu