দৃশ্যের মধ্যে স্মার্ট লোডিং স্ক্রিন


14

পরের দৃশ্যটি লোড হওয়ায় একটি লোডিং অ্যানিমেশন প্রদর্শনের জন্য আমি একটি লোডিং স্ক্রিন তৈরি করেছি। আমি পরের দৃশ্যের সাথে সংযোজিতভাবে লোড করছি:

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

এবং সেটও করে Application.backgroundLoadingPriority = ThreadPriority.Low;, তবে আচরণটি এখনও নিয়মিত স্তরের লোডের সমান।

আমি কিছু অনুপস্থিত করছি?

প্রত্যাশিত আচরণ:

  • প্রস্থান থেকে বেরিয়ে আসা এবং ম্লান হয়ে যাওয়া।
  • লোড হচ্ছে স্ক্রিন প্রদর্শিত হবে।
  • লোড শেষ হয়ে গেলে, লোড হওয়া পর্দা ফেইড হয়ে যায়।
  • পরের দৃশ্যে বিবর্ণ।

কি হচ্ছে:

  • প্রস্থান থেকে বেরিয়ে আসা এবং ম্লান হয়ে যাওয়া।
  • লোডিং স্ক্রিন উপস্থিত, হিমশীতল
  • হঠাৎ করেই নতুন দৃশ্য ম্লান হয়ে যায়।

লোড শুরু হয়ে গেলে, খেলাটি নিয়মিত দৃশ্যের বোঝার মতোই হিমশীতল করে।

আমি পড়েছি যে আপনাকে সেট করতে হবে allowSceneActivation = false, যাতে আপনি লোডিং স্ক্রিনটি ম্লান করতে পারেন, এবং তারপরে এটি trueunityক্যের সমাপ্তি লোডিং করতে দিতে সেট করতে পারেন , তবে এ্যাসিঙ্ক অপারেশন কখনই লোডিং শেষ করে না like


আমার এই সমস্যা ছিল এবং আমি এখানে কিছুই পাইনি। গুগল করার পরে আমি জানতে পারি যে এই সমস্যাটি কী কারণে ঘটছে। আমি এখানে পোস্ট করার সিদ্ধান্ত নিয়েছি যাতে অন্যান্য উত্তর সহজেই খুঁজে পেতে পারে। আপনি যদি আমার উত্তর / প্রশ্নের কিছুটা উন্নতি করতে চান তবে দয়া করে আমাকে জানান। ধন্যবাদ!
লিও

উত্তর:


18

আপনি যখন কোনও দৃশ্য লোড করেন তখন SceneManager.LoadSceneAsync()দুটি জিনিস ঘটে থাকে:

  • দৃশ্যের গেমঅবজেক্টগুলি স্মৃতিতে লোড হয়।
  • তারপরে পুরো দৃশ্যটি সক্ষম হয়। সমস্ত জাগ্রত () এবং স্টার্ট () কলব্যাকগুলি দৃশ্যের অবজেক্টগুলির জন্য কল করা হবে।

দ্বিতীয় পদক্ষেপটি দৃশ্যটি সক্ষম করে তোলে যা প্রকৃতপক্ষে unityক্যকে হিমশীতল করে তোলে, কারণ unityক্য আপনার স্ক্রিপ্টগুলিতে সেই সমস্ত সূচনা কলব্যাকগুলি একক চক্রের মধ্যে চালাচ্ছে।

প্রকৃতপক্ষে সেট SceneManager.LoadSceneAsync().allowSceneActivationকরা falseপ্রক্রিয়াটির প্রথম ধাপটি সম্পূর্ণ করার জন্য অ্যাসিঙ্ক অপারেশনকে তৈরি করবে এবং প্রক্রিয়াটির 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

আমার ইউনিটি ৫..6-তে ঠিক একই সমস্যা ছিল এবং আমি ইতিমধ্যে ফলন বিবৃতিতে যুক্ত করার চেষ্টা করেছি। এটি স্বয়ং লোডসিনিঅ্যাসেন্সই thatক্যের মূল থ্রেডকে ব্লক করে চলেছিল এবং বর্তমান দৃশ্যের কোনও লোডিং অগ্রগতি সুন্দরভাবে দেখানো থেকে আটকাচ্ছিল।

এটি যতটা আমি বলতে পারি ইউনিটির মধ্যে একটি বাগ বলে মনে হচ্ছে। যখন আমার দৃশ্যটি কম জটিল তখন আমার কোডটি দুর্দান্ত, মসৃণ রূপান্তরটি কাজ করেছিল। একবার এটি বড় হয়ে যাওয়ার পরে, ইউনিটি প্রায় 6 সেকেন্ডের জন্য থ্রেডটি ব্লক করেছিল, পুরো সময়টি গেমটি 'প্রতিক্রিয়া না দেখায়' অপারেশনটি সম্ভবত "অ্যাসিঙ্ক" সত্ত্বেও

আমি যেভাবে সমস্যাটি সমাধান করেছি তা ছিল আমার আলোকপাতের দিকে নজর দেওয়া। অতীতে আলো এবং এই বৈশিষ্ট্যটি সহ প্রচুর বাগ রয়েছে। সুতরাং আমি আমার জিনিসগুলি দিয়ে গিয়েছিলাম এবং দেখতে পেয়েছিলাম যে আমার একটি বস্তুর উপর স্পটলাইট ছিল (যদিও এটি অক্ষম থাকলেও ...)

আমি স্পটলাইট মুছে ফেলেছি, এবং হুর! দৃশ্য ঠিকঠাক অ্যাসিঙ্ক ঠিকমতো! তালা নেই!


সম্পাদনার আগে, এই পোস্টটি আসলে সমস্যার কোনও সমাধান দেওয়ার প্রস্তাব দেয় নি। এখনই ঠিক আছে যে আপনি একটি সংশোধন করেছেন, তবে ভবিষ্যতে আপনি যদি "এই সমস্যাটিও আমার হয়ে আসছে" বলতে চান তবে আপনাকে সেই উদ্দেশ্যে উত্তর ব্যবহার করা উচিত নয়। কিছুটা প্রতিনিধি উপার্জন করা আপনাকে বিদ্যমান পোস্টগুলিতে মন্তব্য করতে বা নতুন উত্তরগুলিকে উত্সাহিত করতে প্রশ্নগুলিতে বদান্যতা দেবে।
ডিএমগ্রিগরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.