Unity中的LoadScene()函数什么时候改变场景?
When does the LoadScene() function in Unity change the scene?
当您调用函数 LoadScene() 时
它会立即切换场景,还是只是发出需要更改场景的信号? LoadScene() 的文档没有说。
我正在使用的具体示例如下所示:
LoadScene(levelName);
ItemBox newBox = (ItemBox)Instantiate(...);
那么对于上面的代码,newBox是存在于我们刚刚加载的场景中,还是在旧场景中创建,然后在加载新关卡时销毁。
是
UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay");
是的,它做到了"instantly"——也就是说s是同步的。
换句话说,它 "stops" 在该行代码处,等待加载整个场景(即使这需要几秒钟),然后新场景开始。
不要使用问题中提到的旧命令。
请注意,Unity 还可以执行 a 同步加载.. 它 "slowly loads the new scene in the background".
但是:我鼓励你只使用普通的"LoadScene"。重要的是可靠性和简单性。 用户只是不介意如果机器在关卡加载时"stops"几秒钟。
(每次我在电视上单击 "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);
}
注意:该脚本回答了玩家点击播放 "on to the actual game play scene" 时如何传递信息 "from your main menu" 的问题 "on to the actual game play scene"。
也许它变了。来自文档:
When using SceneManager.LoadScene, the loading does not happen immediately, it completes in the next frame.
我一直在做与海报完全相同的事情,它在旧场景中实例化。
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html
当您调用函数 LoadScene() 时 它会立即切换场景,还是只是发出需要更改场景的信号? LoadScene() 的文档没有说。
我正在使用的具体示例如下所示:
LoadScene(levelName);
ItemBox newBox = (ItemBox)Instantiate(...);
那么对于上面的代码,newBox是存在于我们刚刚加载的场景中,还是在旧场景中创建,然后在加载新关卡时销毁。
是
UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay");
是的,它做到了"instantly"——也就是说s是同步的。
换句话说,它 "stops" 在该行代码处,等待加载整个场景(即使这需要几秒钟),然后新场景开始。
不要使用问题中提到的旧命令。
请注意,Unity 还可以执行 a 同步加载.. 它 "slowly loads the new scene in the background".
但是:我鼓励你只使用普通的"LoadScene"。重要的是可靠性和简单性。 用户只是不介意如果机器在关卡加载时"stops"几秒钟。
(每次我在电视上单击 "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);
}
注意:该脚本回答了玩家点击播放 "on to the actual game play scene" 时如何传递信息 "from your main menu" 的问题 "on to the actual game play scene"。
也许它变了。来自文档:
When using SceneManager.LoadScene, the loading does not happen immediately, it completes in the next frame.
我一直在做与海报完全相同的事情,它在旧场景中实例化。
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html