क्या `उपज वापस झूठी है?` का यूनिटी 3 डी सी # स्क्रिप्ट में विशेष अर्थ है?


17

एकता में, हमारे पास कोराउटीन के लिए कुछ विशेष चीजें हैं जो सामान्य सी # के लिए अतिरिक्त हैं।

उदाहरण के लिए, हम उपयोग कर सकते हैं

yield return WaitForSeconds(5.f);

जारी रखने से पहले 5 मिनट प्रतीक्षा करें।

क्या करें yield return false;और क्या न yield return true;करें?


एचएम मुझे यकीन नहीं है कि अगर yield return trueकुछ खास है। लेकिन yield return nullबस एक फ्रेम के लिए रुक जाता है, इसलिए मुझे संदेह है कि yield return falseइसका सटीक प्रभाव समान है ( yield return 0क्योंकि 0 झूठे अशक्त सब हुड के नीचे समान हैं)
झॉकिंग

@ झूठा "चूंकि 0 झूठे अशक्त हुड के नीचे सभी समान हैं" ऐसा क्यों होता है? C # बहुत दृढ़ता से टाइप की जाने वाली भाषा है, इसलिए अधिकांश समय, "हुड के नीचे" कुछ कैसे दिखता है, इससे कोई फर्क नहीं पड़ता। उदाहरण के लिए, आप C और C ++ के विपरीत, बस if (0)या नहीं कर सकते if (null)
svick

श्रग फिर यह कोई फर्क नहीं पड़ता। मुझे पता है कि yield return 0काम करता है; जाहिरा तौर पर एमएलएम ने समझाया कि कारण
झाकिंग

2
यह सामान्य C # के अतिरिक्त नहीं है। यह yieldकीवर्ड कम से कम C # 2.0 के आसपास रहा है। सभी यूनिटी इसे कोरटाइन कहती है और जेनरेट किए गए इटरेटर को संभालती है और इसमें दिए गए मान इस तरह से दिए जाते हैं कि आप अपने कोड के निष्पादन में गैर-अवरोधक देरी पैदा कर सकते हैं।
या मैपर

1
@ आलमो: यह केवल इसलिए WaitForSecondsघोषित नहीं किया जाता है। जैसे ही आप एक विधि घोषित करते हैं, जो WaitForSecondsएक फ्लोट तर्क लेती है और यह आपके द्वारा लागू किए जा रहे गणना के तत्व प्रकार को वापस करता है, यह फिर से संकलित होगा। इसलिए, yieldएकता के लिए विशेष नहीं है। यदि कुछ भी हो, तो WaitForSecondsविधि एकता के लिए विशेष है, लेकिन फिर भी, यह भाषा C # का विस्तार नहीं करता है , लेकिन बस एक अतिरिक्त विधि है जिसे मानक C # का उपयोग करके लिखा गया था।
या मैपर

जवाबों:


19

शेड्यूलर समझता है कि केवल संभावित उपज मान हैं:

  • से प्राप्त वर्गों YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestऔर coroutine
  • एक WWWवस्तु
  • "कोई भी अन्य मूल्य" जो उपरोक्त में से एक नहीं है।

यदि "किसी अन्य मूल्य" का उत्पादन किया जाता है (जिसमें "null" एक स्ट्रिंग मूल्य किसी भी अन्य मूल प्रकार जैसे कि int, bool , ... या एक मनमानी वस्तु का संदर्भ शामिल है जो उपरोक्त में से एक नहीं है) अनुसूचक करेगा अगले फ्रेम के लिए "शेड्यूल" कॉरआउट

- Bunny83 उत्तर: एकता उत्तर पर प्रमुख सदस्य

इस तरह के WaitForEndOfFrameऔर अन्य, केवल रिक्त कार्य हैं जो YieldInstructionइंजन में क्या करना है यह तय करने के लिए टैग करते हैं ।

डिफ़ॉल्ट मामला लगता है WaitForEndOfFrame। इसलिए यदि आप yield returnकुछ ऐसा है जिसका एक विशेष अर्थ नहीं है, जैसे कि एक बूल, यह वैसा ही है WaitForEndOfFrame

इस व्यवहार पर कोई आधिकारिक दस्तावेज नहीं लगता है।


अपडेट करें

रटर ने एक और विशेष मामले के बारे में टिप्पणी की:yield return null

सहित सभी एकता Coroutines yield return null, फ्रेम रेंडरर्स को छोड़कर पहले चलाते हैं WaitForEndOfFrameएकता के जवाबों पर आप रटर का कमाल का जवाब पा सकते हैं , जिसमें आगे बताया गया है (अच्छा डायग्राम शामिल हैं)।


6
यह मानना ​​आम है कि उपज nullऔर WaitForEndOfFrameसमान हैं, लेकिन वे वास्तव में थोड़े अलग हैं , जैसा कि निष्पादन आदेश मैनुअल पेज पर विस्तृत है ।
Rutter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.