दृश्यों के बीच चिकनी लोडिंग स्क्रीन


14

मैंने एक लोडिंग एनीमेशन बनाने के लिए एक लोडिंग स्क्रीन बनाई क्योंकि अगला दृश्य लोड हो रहा है। मैं अगले दृश्य को अतुल्यकालिक रूप से लोड करता हूं:

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

और सेट भी Application.backgroundLoadingPriority = ThreadPriority.Low;, लेकिन व्यवहार अभी भी एक नियमित स्तर के लोड के समान है।

क्या मैं कुछ भूल रहा हूँ?

अपेक्षित व्यवहार:

  • बाहर निकलें स्तर, और बाहर फीका।
  • लोड हो रहा है स्क्रीन प्रकट होता है।
  • एक बार लोड हो जाने के बाद, लोडिंग स्क्रीन को फीका कर दें।
  • अगले दृश्य में फीका

क्या हो रहा है:

  • बाहर निकलें स्तर, और बाहर फीका।
  • लोड हो रहा है स्क्रीन, जमे हुए दिखाई देता है
  • अचानक नया दृश्य सामने आता है।

एक बार जब लोड शुरू होता है, तो गेम नियमित रूप से फ्रीज लोड की तरह होता है।

मैंने पढ़ा कि आपको सेट करना है allowSceneActivation = false, इसलिए आप लोडिंग स्क्रीन को फीका कर सकते हैं, और फिर इसे सेट करने trueके लिए एकता को लोड करने दे सकते हैं, लेकिन यह पूरी तरह से मेरे गेम को फ्रीज कर देता है, जैसे कि async ऑपरेशन कभी भी लोडिंग को खत्म नहीं करता है।


मुझे यह समस्या थी और यहाँ कुछ भी नहीं मिला। गुग्लिंग के बाद मुझे पता चला कि यह मुद्दा क्या था। मैंने इसे यहां पोस्ट करने का फैसला किया ताकि दूसरे को आसानी से जवाब मिल सके। कृपया मुझे बताएं कि क्या आप मेरे उत्तर / प्रश्न में कुछ सुधार जोड़ेंगे। धन्यवाद!
सिंह

जवाबों:


18

जब आप कोई दृश्य लोड करते SceneManager.LoadSceneAsync()हैं तो वास्तव में दो चीजें होती हैं:

  • दृश्य के GameObjects को मेमोरी में लोड किया जाता है।
  • फिर पूरा दृश्य सक्षम है। सभी अवेक () और स्टार्ट () कॉलबैक को दृश्य में वस्तुओं के लिए बुलाया जाएगा।

दूसरा चरण, दृश्य को सक्षम करना, वास्तव में एकता को मुक्त करता है, क्योंकि एकता एक ही चक्र में आपकी स्क्रिप्ट में उन सभी आरंभीकरण कॉलबैक को चला रही है।

दरअसल स्थापित करने SceneManager.LoadSceneAsync().allowSceneActivationके लिए falseasync आपरेशन प्रक्रिया का केवल पहला चरण को पूरा करने के लिए है, और जब तक यह करने के लिए सेट है इंतजार करेंगे कर देगा trueप्रक्रिया के दूसरे भाग शुरू करने के लिए।

लेकिन अगर आप सेट allowSceneActivationकरने के लिए falseऔर इस तरह कॉलबैक पर उपज, आप अच्छे के लिए अपने खेल फ्रीज होगा:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

क्यों? क्योंकि आप दृश्य लोड के दूसरे चरण के साथ आगे बढ़ने के लिए Async ऑपरेशन को बता रहे हैं, इसलिए ऑपरेशन कभी पूरा नहीं होगा।

यदि आप जानना चाहते हैं कि ऑपरेशन का पहला भाग कब तैयार है, तो दूसरे के साथ आगे बढ़ें, आपको भरोसा करना होगा AsyncOperation.progress। झंडे 0.9fके इंतजार में यह मान रुक जाएगा allowSceneActivation

यह कुछ इस तरह होना चाहिए:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

यदि आप चाहते हैं कि दृश्य सक्रियण आपके गेम को फ्रीज न करें, तो आपको अपने जागने और कमबैक करने के लिए कॉलबैक शुरू करना चाहिए, और कई चक्रों के माध्यम से अपनी स्क्रिप्ट को कॉरआउट में आरंभ करना चाहिए।


0

यूनिटी 5.6 में मेरे पास एक ही मुद्दा था, और पहले ही उपज बयानों में जोड़ने की कोशिश की थी। यह स्वयं लोडसिनेस्टिक्स था जो एकता के मुख्य धागे को अवरुद्ध कर रहा था और वर्तमान दृश्य को अच्छी तरह से किसी भी लोडिंग प्रगति को रोकने से रोक रहा था।

यह एकता में एक बग प्रतीत होता है जहाँ तक मैं बता सकता हूँ। जब मेरा दृश्य कम जटिल था तो मेरे कोड ने बहुत अच्छा काम किया, चिकनी संक्रमण। एक बार जब यह बड़ा हो गया, तो यूनिटी ने लगभग 6 सेकंड के लिए धागे को अवरुद्ध कर दिया, जबकि सारा गेम ऑपरेशन के बावजूद 'जवाब नहीं देने' के रूप में बैठता है "माना जाता है"

जिस तरह से मैंने इस मुद्दे को हल किया, वह मेरे प्रकाश को देखना था। प्रकाश और इस सुविधा के साथ अतीत में बड़े पैमाने पर बग आए हैं। तो मैं अपनी वस्तुओं के माध्यम से चला गया, और मैंने पाया कि एक वस्तु पर स्पॉटलाइट था (भले ही यह अक्षम था ...)

मैंने स्पॉटलाइट को हटा दिया, और हुर्रे! दृश्य ठीक से async लोड! कोई ताला नहीं!


संपादन से पहले, यह पोस्ट वास्तव में समस्या के समाधान की पेशकश नहीं करता था। अब यह ठीक है कि आपने एक सुधार जोड़ दिया है, लेकिन भविष्य में अगर आप यह कहना चाहते हैं कि "मुझे यह समस्या हो रही है" तो आपको उस उद्देश्य के लिए उत्तर का उपयोग नहीं करना चाहिए। थोड़ा प्रतिनिधि अर्जित करने से आप मौजूदा पोस्ट पर टिप्पणी कर सकते हैं, या नए उत्तरों को प्रोत्साहित करने के लिए प्रश्नों पर एक इनाम डाल सकते हैं।
DMGregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.