当您加载场景时SceneManager.LoadSceneAsync()
,实际上发生了两件事:
- 场景的gameObjects被加载到内存中。
- 然后启用整个场景。将为场景中的对象调用所有Awake()和Start()回调。
第二步,启用场景,实际上是冻结了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;
为什么?因为您告诉异步操作不要继续进行场景加载的第二步,所以该操作将永远不会完成。
如果您想知道操作的第一部分何时准备就绪,然后再继续进行第二部分,则必须依靠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回调保持在最低水平,并在协程中通过几个周期初始化脚本。