调用函数LoadScene()时 它会立即切换场景,还是仅仅表示场景需要更改? LoadScene()的文档没有说明。
我正在使用的具体示例如下所示:
LoadScene(levelName);
ItemBox newBox = (ItemBox)Instantiate(...);
所以使用上面的代码,newBox会存在于我们刚加载的场景中,还是会在旧场景中创建,然后在加载新关卡时被销毁。
答案 0 :(得分:9)
这是
UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay");
是的,它“立即” - 也就是说 s ynchronously。
换句话说,它在那行代码“停止”,等待它加载整个场景(即使需要几秒钟),然后新场景开始。
请勿使用您在问题中提及的旧命令。
请注意,Unity还可以执行 a 同步加载..它“在后台慢慢加载新场景”。
但是:我鼓励您只使用普通的“LoadScene”。重要的是可靠性和简单性。 用户只需不介意,如果机器加载时只是“停止”几秒钟。
(每次我点击电视上的“Netflix”时,电视都需要一段时间才能完成。没人关心 - 这是正常的。)
但是如果你确实想要在后台加载,那么这就是......
public void LaunchGameRunWith(string levelCode, int stars, int diamonds)
{
.. analytics
StartCoroutine(_game( levelCode, superBombs, hearts));
}
private IEnumerator _game(string levelFileName, int stars, int diamonds)
{
// first, add some fake delay so it looks impressive on
// ordinary modern machines made after 1960
yield return new WaitForSeconds(1.5f);
AsyncOperation ao;
ao = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Gameplay");
// here's exactly how you wait for it to load:
while (!ao.isDone)
{
Debug.Log("loading " +ao.progress.ToString("n2"));
yield return null;
}
// here's a confusing issue. in the new scene you have to have
// some sort of script that controls things, perhaps "NewLap"
NewLap newLap = Object.FindObjectOfType< NewLap >();
Gameplay gameplay = Object.FindObjectOfType<Gameplay>();
// this is precisely how you conceptually pass info from
// say your "main menu scene" to "actual gameplay"...
newLap.StarLevel = stars;
newLap.DiamondTime = diamonds;
newLap.ActuallyBeginRunWithLevel(levelFileName);
}
注意:当播放器“播放到实际的游戏场景”时,该脚本会回答“如何从主菜单”传递信息的问题。
答案 1 :(得分:0)
也许已更改。从文档中:
使用SceneManager.LoadScene时,加载不会立即发生,而是在下一帧完成。
我一直在做与海报完全相同的事情,并且它是在旧场景中实例化的。
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html