"Objek yang ingin Anda instantiate adalah null" Tapi itu berhasil, dapatkah saya mengabaikan kesalahan?

18

Ini tidak pernah terjadi pada saya jadi saya agak bingung.

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

Ini melempar kesalahan tetapi objek sebenarnya instantiated dan semuanya berfungsi sebagaimana dimaksud. Kesalahan tidak menghentikan program tidak peduli berapa kali saya mereproduksi ini.

Bisakah saya mengabaikan kesalahan ini atau ada masalah yang tidak saya lihat?

pengguna4676310
sumber
32
Anda tidak boleh mengabaikan kesalahan. Mereka selalu ada karena suatu alasan;)
Gabriele Vierti
5
Saya ingin yang kedua gagasan untuk tidak pernah mengabaikan kesalahan hanya karena "itu berfungsi". Menurut definisi, jika ada kesalahan, itu tidak berfungsi. Tentu, ini sepertinya melakukan semua yang Anda inginkan, tetapi itu berarti Anda belum menemukan bagian yang rusak.
Dana Gugatan Monica

Jawaban:

46

Jika objek dibuat dengan benar terlepas dari Intantiate()garis yang melemparkan pengecualian, maka kesalahan tersebut berasal dari contoh lain dari skrip - Anda mungkin secara tidak sengaja memiliki salinan kedua dalam adegan Anda.

Satu instance dikonfigurasi dengan benar, dan melakukan Instantiate()seperti yang diharapkan tanpa kesalahan, sehingga objek dibuat seperti yang diinginkan.

Contoh lain dikonfigurasi secara tidak benar, dan melempar kesalahan. Tetapi jika Anda hanya melihat contoh yang dikonfigurasi dengan benar, kesalahan ini tampaknya datang entah dari mana dan tidak memiliki konsekuensi yang terlihat.

Anda dapat mencetak jalur ke objek pada Mulai - atau dalam cek nol tepat sebelum garis yang menyinggung - untuk membantu melacak duplikat adegan yang tidak diinginkan.

Anda benar-benar tidak boleh mengabaikan kesalahan ini.

Paling-paling, itu membakar siklus komputasi yang tidak perlu. Paling buruk, itu adalah pertanda bahwa gim Anda melakukan sesuatu yang tidak sepenuhnya Anda pahami, dan itu bisa menjadi akar masalah yang jauh lebih besar.

DMGregory
sumber
12
+1, kesalahan tidak sama dengan peringatan, jika ada kesalahan, Anda tidak pernah tahu kapan itu akan meningkat ke seluruh permainan yang mogok.
TomTsagk
13
Tidak selalu aman untuk mengabaikan peringatan juga. Bahkan jika itu bukan kesalahan itu masih berpotensi menyebabkan situasi di mana permainan crash.
Sean Burton
2
Saya setuju dengan @SeanBurton, mengabaikan peringatan bukanlah praktik yang aman. Anda harus mengabaikan peringatan jika, dan hanya jika, Anda memahami apa yang menyebabkannya dan merasa nyaman bahwa itu tidak menyebabkan masalah dalam kode Anda. Meski begitu, tanyakan pada diri Anda apakah Anda tidak bisa melakukannya dengan lebih baik.
Jack Aidley
3
Setiap proyek yang saya kerjakan dengan tim besar pada titik tertentu telah menjadi begitu penuh dengan peringatan "yang tidak dapat diabaikan" sehingga mulai menutupi masalah yang sebenarnya. Jadi saya pasti akan menganjurkan memperlakukan peringatan dengan serius juga, dan jika seseorang tidak dapat dihindari, menonaktifkannya untuk baris yang relevan bersama dengan komentar yang dengan jelas mendefinisikan mengapa aman untuk melewatkan peringatan di sana.
DMGregory
1
Saya 100% dengan @DMGregory, saya hanya bekerja di tim yang sangat kecil, tetapi beberapa kali peringatan mulai menumpuk itu mengerikan untuk menemukan masalah "asli", atau Anda akan kehilangan mereka sepanjang waktu. MO saya adalah untuk menjaga log bersih kecuali untuk pengujian, bahkan jika saya harus menonaktifkan peringatan pada kode plugin (tolong, jangan membuat plugin dengan peringatan sebelumnya), itu jauh lebih baik dalam jangka panjang IMO. Sunting: agar jelas, jangan pernah menonaktifkan peringatan kecuali Anda 100% yakin tidak ada jalan lain (yang terjadi 0,001% dari waktu), selalu benar-benar memperbaikinya.
Trisibo
21

Menjawab

Biarkan saya memulai dengan menjawab pertanyaan Anda secara langsung:

berfungsi, dapatkah saya mengabaikan kesalahan?

Kamu bisa . Anda tidak boleh , karena itu berarti ada sesuatu yang salah. Anda akan terbiasa dengan kesalahan ini, tetapi bisa "bersembunyi" atau menyebabkan kesalahan lain.

Saat ini Anda memiliki pesan kesalahan dan masih berfungsi dengan benar. Sebaliknya, itu tidak bekerja dan tidak memiliki (atau lebih tepatnya: tidak mengenali) umpan balik mengapa, jauh lebih buruk!

Nasihat

Untuk mencari tahu dari mana asalnya, pisahkan semua ini menjadi beberapa baris.

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

Kesalahan hanya memberi tahu Anda di baris mana hal itu terjadi. Jika kesalahan terjadi dalam kode ini, nomor baris akan memberi tahu Anda lebih banyak tentang bagian mana yang salah di sini. Juga, saya sarankan menggunakan versi generik Resources.Load, yang sebenarnya akan memberi kita satu langkah lebih sedikit untuk khawatir:

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

Mencari tahu mengapa

  • Sekarang, sedikit pengalaman Unity memberitahu kita bahwa "Objek yang ingin Anda Instantiate adalah null" disebabkan oleh Instantiate().
  • Jadi, itu berarti prefabadalah null.
  • Jadi itu berarti Resources.Loadkembali null.
  • The dokumentasi untukResources.Load mengatakan " Pengembalian aset di pathjika dapat ditemukan jika tidak akan mengembalikan null. "
  • Jadi itu berarti tidak menemukan jalur yang diberikan (string yang saya sebut resourceLocation)

Ada yang salah dengan jalan ini, jadi langkah pertama yang jelas adalah untuk melihat apa yang sebenarnya menjadi, dengan Debug. Log. Sebagai "semuanya berfungsi sebagaimana dimaksud", kemungkinan ada beberapa duplikasi yang terjadi di mana satu versi berfungsi dan yang lain memberi Anda kesalahan ini.

Dalam hal ini, sebaiknya gunakan versi 2 parameter Debug.Log Debug.Log(resourceLocation, gameObject);. Sekarang jika Anda mengklik pesan log di editor Unity, itu akan memilih dari GameObjectmana asalnya.

Raphael Schmitz
sumber