"आप जिस वस्तु को इंस्टेंट करना चाहते हैं वह अशक्त है" लेकिन यह काम करता है, क्या मैं त्रुटि को अनदेखा कर सकता हूं?


18

यह मेरे साथ कभी नहीं हुआ है इसलिए मैं थोड़ा भ्रमित हूं।

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

यह एक त्रुटि फेंकता है लेकिन वस्तु वास्तव में तात्कालिक है और सब कुछ उद्देश्य के अनुसार काम करता है। त्रुटि कार्यक्रम को रोकती नहीं है, चाहे मैं कितनी भी बार इसे दोहराऊं।

क्या मैं इस त्रुटि को अनदेखा कर सकता हूं या कुछ समस्या है जो मुझे दिखाई नहीं दे रही है?


32
आपको त्रुटियों को कभी भी अनदेखा नहीं करना चाहिए। वे हमेशा एक कारण के लिए होते हैं;)
गैब्रियल वेलेटी

5
मैं त्रुटियों को नज़रअंदाज़ न करने के विचार को केवल इसलिए चाहता हूं क्योंकि "यह काम करता है"। परिभाषा के अनुसार, यदि कोई त्रुटि है, तो यह काम नहीं करता है। यकीन है, यह सब कुछ आप इसे करने के लिए चाहते हो सकता है, लेकिन इसका मतलब है कि आप अभी तक टूटी हुई बिट नहीं मिला है।
निधि मोनिका का मुकदमा

जवाबों:


46

यदि Intantiate()किसी अपवाद को फेंकने के बावजूद ऑब्जेक्ट को तुरंत ठीक किया जाता है, तो त्रुटि स्क्रिप्ट के दूसरे उदाहरण से आ रही है - आपके गलती से आपके दृश्य में दूसरी प्रतिलिपि हो सकती है।

एक उदाहरण सही तरीके से कॉन्फ़िगर किया गया है, और Instantiate()बिना किसी त्रुटि के साथ अपेक्षित प्रदर्शन करना है , इसलिए ऑब्जेक्ट वांछित के रूप में बनाया गया है।

एक और उदाहरण गलत तरीके से कॉन्फ़िगर किया गया है, और एक त्रुटि फेंकता है। लेकिन अगर आप सही ढंग से कॉन्फ़िगर किए गए इंस्टेंस को देख रहे हैं, तो यह त्रुटि कहीं से नहीं आएगी और इसका कोई परिणाम दिखाई नहीं देगा।

आप अवांछित पंक्तिबद्ध डुप्लिकेट को ट्रैक करने में मदद करने के लिए, शुरू होने वाली रेखा से ठीक पहले - या प्रारंभ में ऑब्जेक्ट पर पथ का प्रिंट आउट कर सकते हैं।

आपको बिल्कुल इस त्रुटि को अनदेखा नहीं करना चाहिए।

सबसे अच्छा, यह अनावश्यक रूप से गणना चक्र जल रहा है। सबसे कम, यह एक संकेत है कि आपका खेल कुछ ऐसा कर रहा है जिसे आप पूरी तरह से नहीं समझते हैं, और यह लाइन के नीचे बहुत बड़ी समस्याओं का मूल हो सकता है।


12
+1, त्रुटियाँ चेतावनियों के समान नहीं हैं, अगर कोई त्रुटि है, तो आप कभी नहीं जानते कि यह पूरे खेल के दुर्घटनाग्रस्त होने पर कब बढ़ेगा।
टॉमटैग

13
चेतावनी को अनदेखा करना हमेशा सुरक्षित नहीं होता है। यहां तक ​​कि अगर यह एक त्रुटि नहीं है, तब भी यह संभावित रूप से एक ऐसी स्थिति का कारण बन सकता है जहां खेल दुर्घटनाग्रस्त हो जाता है।
सीन बर्टन

2
मैं @ सीनबर्टन से सहमत हूं, चेतावनियों को नजरअंदाज करना सुरक्षित अभ्यास नहीं है। आपको एक चेतावनी को अनदेखा करना चाहिए यदि, और केवल अगर, आप समझते हैं कि यह क्या कारण है और यह सहज है कि यह आपके कोड में कोई समस्या पैदा नहीं कर रहा है। फिर भी, अपने आप से पूछें कि क्या आप इसे बेहतर नहीं कर सकते।
जैक एदले

3
हर परियोजना जो मैंने एक बड़ी टीम के साथ काम की है, कुछ समय के लिए "आग्नेय" चेतावनियों के साथ अतिभारित हो गई है, जो कि अन्य मुद्दों को मुखौटा बनाना शुरू कर दिया है। इसलिए मैं निश्चित रूप से चेतावनियों को गंभीरता से मानने की वकालत करता हूँ, और यदि कोई अपरिहार्य है, तो संबंधित पंक्ति के लिए इसे अक्षम करने के साथ-साथ एक टिप्पणी के साथ स्पष्ट रूप से परिभाषित करना कि यह चेतावनी उत्पन्न करना क्यों सुरक्षित है।
DMGregory

1
मैं @DMGregory के साथ 100% हूं, मैंने केवल बहुत छोटी टीमों पर काम किया है, लेकिन "वास्तविक" मुद्दों को खोजने के लिए कई बार चेतावनियों का ढेर लगना भयानक था, या आप हर समय उन्हें याद करेंगे। मेरा एमओ को परीक्षण को छोड़कर लॉग को साफ रखना है, भले ही मुझे प्लगइन्स कोड पर चेतावनी को निष्क्रिय करना है (कृपया, चेतावनियों के साथ प्लगइन्स को कभी न बनाएं), यह लंबे समय तक चलने वाले आईएमओ में बहुत बेहतर है। संपादित करें: स्पष्ट होने के लिए, कभी भी चेतावनी को अक्षम न करें जब तक कि आप 100% सुनिश्चित न हों कि कोई अन्य तरीका नहीं है (जो कि समय का 0.001% होता है), हमेशा उन्हें ठीक करें।
त्रिशिबो

21

उत्तर

मुझे सीधे अपने सवाल का जवाब देकर शुरू करें:

यह काम करता है, क्या मैं त्रुटि को अनदेखा कर सकता हूं?

आप कर सकते थे । आपको नहीं करना चाहिए , क्योंकि इसका मतलब है कि कुछ गलत हो रहा है। आपको इस त्रुटि की आदत हो जाएगी, लेकिन यह "छिपा" सकता है या किसी अन्य त्रुटि का कारण बन सकता है।

वर्तमान में आपके पास एक त्रुटि संदेश है और यह अभी भी सही ढंग से काम करता है। दूसरे तरीके से, यह काम नहीं कर रहा है और (या नहीं: पहचान नहीं रहा है) प्रतिक्रिया क्यों, बहुत बुरा है!

सलाह

यह पता लगाने के लिए कि यह कहाँ से आता है, इस पूरी चीज़ को कई लाइनों में विभाजित करें।

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

एक त्रुटि केवल आपको बताती है कि यह किस रेखा पर हुआ। यदि इस कोड में त्रुटि होती है, तो लाइन नंबर आपको इस बारे में अधिक बताएगा कि कौन सा हिस्सा यहां गलत हुआ। इसके अलावा, मैं इसके सामान्य संस्करण का उपयोग करने की सलाह Resources.Loadदूंगा, जो वास्तव में हमें चिंता करने के लिए एक कदम कम देगा:

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

क्यों खोज रहे हैं

  • अब, यूनिटी का थोड़ा सा अनुभव हमें बताता है कि "आप जिस वस्तु को इंस्टेंट करना चाहते हैं वह अशक्त है" Instantiate()
  • तो, इसका मतलब prefabहै कि null
  • तो इसका मतलब है कि Resources.Loadरिटर्न null
  • के लिए दस्तावेज़Resources.Load कहते हैं, " रिटर्न में संपत्ति pathअगर यह पाया जा सकता है अन्यथा अशक्त देता है। "
  • तो इसका मतलब है कि यह दिए गए मार्ग को नहीं खोजता है (स्ट्रिंग जिसे मैंने कहा था resourceLocation)

इस रास्ते में कुछ गड़बड़ है, इसलिए स्पष्ट पहला कदम यह देखना होगा कि यह वास्तव में डेब्यू के साथ समाप्त होता है। जैसा कि "सब कुछ इरादा के अनुसार काम करता है", इसकी संभावना है कि कुछ दोहराव चल रहा है जहां एक संस्करण काम करता है और दूसरा आपको यह त्रुटि देता है।

उस स्थिति में, डीबग.लॉग के 2 पैरामीटर संस्करण का उपयोग करना एक अच्छा विचार है Debug.Log(resourceLocation, gameObject);। अब यदि आप एकता संपादक में लॉग संदेश पर क्लिक करते हैं, तो यह चयन करेगा GameObjectकि यह कहां से आया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.