场景之间的平滑加载屏幕


14

我创建了一个加载屏幕,以在下一个场景加载时显示加载动画。我异步加载下一个场景:

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

并且也设置了Application.backgroundLoadingPriority = ThreadPriority.Low;,但是其行为仍然与常规级别加载相同。

我想念什么吗?

预期的行为:

  • 退出关卡,然后淡出。
  • 出现载入画面。
  • 加载完成后,淡出加载屏幕。
  • 淡入下一场景。

怎么了:

  • 退出关卡,然后淡出。
  • 出现载入画面,冻结
  • 突然,新景象渐渐消失了。

一旦开始加载,游戏就会像常规的场景加载一样疯狂。

我读到您必须设置allowSceneActivation = false,因此您可以淡出加载屏幕,然后将其设置true为让unity完成加载,但这完全冻结了我的游戏,就像异步操作永远不会完成加载一样。


我遇到了这个问题,在这里找不到任何东西。谷歌搜索后,我发现了导致此问题的原因。我决定将其发布在此处,以便其他人可以轻松找到答案。请让我知道您是否可以对我的答案/问题进行一些改进。谢谢!
狮子座

Answers:


18

当您加载场景时SceneManager.LoadSceneAsync(),实际上发生了两件事:

  • 场景的gameObjects被加载到内存中。
  • 然后启用整个场景。将为场景中的对象调用所有Awake()和Start()回调。

第二步,启用场景,实际上是冻结了unity,因为unity在单个周期中运行了脚本中的所有初始化回调。

实际上,设置SceneManager.LoadSceneAsync().allowSceneActivationfalse会使异步操作仅完成过程的第一步,并且将等待直到设置true为开始过程的第二部分。

但是,如果你设置allowSceneActivationfalse并在这样的回调收益率,你会冻结你的好游戏:

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

//Fade the loading screen out here

AO.allowSceneActivation = true;

为什么?因为您告诉异步操作不要继续进行场景加载的第二步,所以该操作将永远不会完成。

如果您想知道操作的第一部分何时准备就绪,然后再继续进行第二部分,则必须依靠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;

如果您希望场景激活不冻结游戏,则应将Awake和Start回调保持在最低水平,并在协程中通过几个周期初始化脚本。


0

我在Unity 5.6中遇到了完全相同的问题,并且已经尝试在yield语句中添加。是LoadSceneAsync本身阻止了Unity的主线程,并阻止了当前场景很好地显示任何加载进度。

据我所知,这似乎是Unity中的一个错误。当我的场景不太复杂时,我的代码可以很好地平稳过渡。一旦变大,Unity会阻塞线程约6秒钟,尽管游戏据说是“异步的”,但游戏始终处于“无响应”状态

我解决问题的方法是看我的照明。过去,照明和此功能存在大量错误。因此,我浏览了我的对象,发现我对一个对象有一个关注点(即使它已被禁用...)

我删除了聚光灯,万岁!场景正确加载异步!没有锁!


在进行编辑之前,本文实际上并未提供解决问题的方法。现在,您已经添加了修复程序,这很好,但是将来如果您想说“我也遇到了这个问题”,则不应出于此目的使用答案。赚取少量代表可以让您对现有帖子发表评论,或者对问题进行奖励以鼓励新的答案。
DMGregory
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.