“Örneklemek İstediğiniz Nesne null” Ama işe yarıyor, hatayı yok sayabilir miyim?


18

Bu benim başıma hiç gelmedi, bu yüzden biraz kafam karıştı.

GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;

Bu bir hata atar, ancak nesne aslında somutlaştırılır ve her şey istendiği gibi çalışır. Hata, bunu kaç kez tekrarladığım önemli değil, programı durdurmaz.

Bu hatayı yok sayabilir miyim yoksa görmediğim bir sorun var mı?


32
hataları asla görmezden gelmemelisiniz. Her zaman bir nedenden dolayı
oradalar

5
Sadece "işe yarıyor" diye hataları asla görmezden gelmeme fikrini ikiye katlamak istiyorum. Tanım olarak, bir hata varsa, işe yaramaz. Elbette, istediğiniz her şeyi yapıyor gibi görünebilir, ancak bu sadece kırık parçayı henüz bulamadığınız anlamına gelir.
Monica'nın Davası

Yanıtlar:


46

Nesne Intantiate()bir istisna fırlatmaya rağmen doğru şekilde başlatılırsa , hata komut dosyasının başka bir örneğinden geliyorsa - yanlışlıkla sahnenizde ikinci bir kopya olabilir.

Bir örnek doğru şekilde yapılandırılır ve hatasız Instantiate()olarak beklendiği gibi gerçekleştirilir , böylece nesne istendiği gibi oluşturulur.

Başka bir örnek yanlış yapılandırılmış ve hata veriyor. Ancak yalnızca doğru yapılandırılmış örneğe bakıyorsanız, bu hata hiçbir yerden gelmeyecek ve görünür bir sonucu olmayacaktır.

İstenmeyen sahne kopyalarını izlemenize yardımcı olması için nesnenin yolunu Başlat'ta (veya rahatsız eden çizgiden hemen önce boş bir denetimde) yazdırabilirsiniz.

Bu hatayı kesinlikle görmezden gelmemelisiniz.

En iyi ihtimalle, gereksiz yere hesaplama döngülerini yakıyor. En kötüsü, oyununuzun tam olarak anlamadığınız bir şey yaptığını ve çizgideki daha büyük sorunların kökü olabileceğinin bir işaretidir.


12
+1, hatalar uyarılarla aynı değildir, bir hata varsa, oyunun çökmesine ne zaman yükseleceğini asla bilemezsiniz.
TomTsagk

13
Uyarıları da göz ardı etmek her zaman güvenli değildir. Bir hata olmasa bile, muhtemelen oyunun çöktüğü bir duruma yol açabilir.
Sean Burton

2
@SeanBurton'a katılıyorum, uyarıları göz ardı etmek güvenli bir uygulama değil. Bir uyarıyı, yalnızca ona neyin neden olduğunu anlarsanız ve kodunuzda bir soruna neden olmadığından rahatsanız, göz ardı etmelisiniz. O zaman bile, kendinize daha iyisini yapamayacağınızı sorun.
Jack Aidley

3
Büyük bir ekiple üzerinde çalıştığım her proje, bir noktada "cahil" uyarılarla aşırı yüklendi ve gerçek sorunları maskelemeye başladı. Bu yüzden, uyarıların da ciddi şekilde ele alınmasını kesinlikle savunurum ve eğer bir kişi kaçınılmazsa, ilgili satırı neden devre dışı bırakarak, orada uyarı oluşturmayı atlamanın neden güvenli olduğunu açıklayan bir yorum ile.
DMGregory

1
@DMGregory ile% 100'üm, sadece çok küçük ekipler üzerinde çalıştım, ancak uyarıların toplanmaya başladığı "gerçek" sorunları bulmak korkunçtu, ya da her zaman özlüyorsunuz. MO'm, eklentilerin kodundaki uyarıları devre dışı bırakmam gerekse bile (lütfen EVER uyarılarıyla eklenti yapmayın) günlüğü test dışında temiz tutmaktır, uzun vadede IMO'da çok daha iyi. Düzenleme: net olmak gerekirse, başka bir yol olmadığından (zamanın% 0.001'i olur)% 100 emin olmadığınız sürece uyarıları asla devre dışı bırakmayın, her zaman bunları düzeltin.
Trisibo

21

Cevap

Sorunuzu doğrudan cevaplayarak başlayayım:

çalışıyor, hatayı yok sayabilir miyim?

Sen olabilir . Sen should bir şey yanlış gidiyor demektir çünkü değil. Bu hataya alışırsınız, ancak "gizleyebilir" veya başka bir hataya neden olabilir.

Şu anda bir hata mesajınız var ve hala doğru çalışıyor. Tersi, bu değil geribildirim neden kötüdür: Çalışma ve olmamasından (tanımama daha doğrusu)!

Tavsiye

Bunun nereden geldiğini öğrenmek için, tüm bunları birkaç satıra ayırın.

string resourceLocation = "Prefabs/Items/" + someName;
Object prefab = Resources.Load(resourceLocation);
Object instance = Instantiate(prefab);
GameObject someObject = instance as GameObject;

Bir hata sadece bunun hangi satırda olduğunu gösterir. Bu kodda hata oluşursa, satır numarası burada hangi parçanın yanlış gittiğiyle ilgili daha fazla bilgi verecektir. Ayrıca, genel sürümü kullanmanızı tavsiye ederim Resources.Load, bu aslında endişelenmemiz için bir adım daha az olurdu:

string resourceLocation = "Prefabs/Items/" + someName;
GameObject prefab = Resources.Load<GameObject>(resourceLocation);
GameObject someObject = Instantiate(prefab);

Nedenini bulmak

  • Şimdi, biraz Unity deneyimi bize “Örneklemek istediğiniz Nesnenin boş olduğunu” söylüyor Instantiate().
  • Yani, bu vasıta prefabolduğunu null.
  • Yani bu Resources.Loadgeri dönüş demektir null.
  • BelgeleriResources.Load "diyor İade de varlık pathonu bulunabilir, aksi takdirde null döndürür. "
  • Bu, verilen yolu bulamadığı anlamına gelir (aradığım dize resourceLocation)

Bu yolla ilgili bir sorun var, bu yüzden ilk adım Debug.Log ile gerçekte ne olduğunu görmek olacaktır. "Her şey istendiği gibi çalışıyor", bir sürümün çalıştığı yerde diğerinin size bu hatayı vermesi olasıdır.

Bu durumda, Debug.Log'un 2 parametre sürümünü kullanmak iyi bir fikirdir Debug.Log(resourceLocation, gameObject);. Şimdi Unity editöründe günlük mesajına tıklarsanız, GameObjectnereden geldiğini seçecektir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.