Unity2D开发入门-场景切换

前言

场景切换

在Unity中,场景切换可以通过以下几种方式完成:

使用代码进行场景切换:在脚本中使用SceneManager类来加载和卸载场景。

可以使用SceneManager.LoadScene("场景名称")来加载新场景,使用SceneManager.UnloadScene("场景名称")来卸载当前场景。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneSwitcher : MonoBehaviour
{
public void SwitchScene(string sceneName)
{
SceneManager.LoadScene(sceneName);
}
}

可以将以上代码添加到一个游戏对象上,然后在其他脚本中调用SwitchScene方法来切换场景。

使用Unity的场景管理器:在Unity编辑器中,可以使用场景管理器来直接切换场景。打开菜单栏的”Window”,选择”Scene Management”,然后选择需要切换的场景即可。

切换场景不销毁

在Unity中切换场景时,默认情况下,前一个场景是会被销毁的。

当你加载一个新场景时,Unity会自动卸载前一个场景,释放相关的资源。

然而,你也可以选择在切换场景时保留前一个场景。

这个功能可以通过设置LoadSceneMode参数为LoadSceneMode.Additive来实现。这样做可以让前一个场景保持加载状态,并在新场景加载之上展示。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneSwitcher : MonoBehaviour
{
public void SwitchScene(string sceneName)
{
SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
}
}

在上述示例中,当切换到新场景时,前一个场景将保留在加载状态,并且新场景将以前一个场景的上层进行展示。

这意味着你可以在多个场景之间进行切换,而不会销毁之前的场景。

需要注意的是,如果你选择保留前一个场景,请确保在适当的时候手动卸载场景,以释放资源并避免内存泄漏。

总之,你可以根据具体需求选择是否销毁前一个场景来达到所需的场景切换效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneManager : MonoBehaviour
{
public void LoadScene(string sceneName)
{
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
}

public void UnloadScene(string sceneName)
{
SceneManager.UnloadSceneAsync(sceneName);
}

// 切换当前活动场景
public void SwitchScene(string sceneName)
{
// 先加载新场景
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
// 卸载当前场景
SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
}
}

开始场景

常见的场景比如

  • 开始菜单场景
  • 人物选择场景
  • 游戏场景

但是我们的背景声音或者音效,我们不想每个场景都加载,这时候我们可以让场景不销毁。

这样背景声音和音效就可以全局使用了。

File => Build Settings 中要把我们的场景都拖进来

image-20230723192703236

开始场景控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameStart : MonoBehaviour
{
private void Awake()
{
DontDestroyOnLoad(this);
SceneManager.LoadScene("Menu");
}

[RuntimeInitializeOnLoadMethod]
public static void OnGameLoad()
{
if (SceneManager.GetActiveScene().name == "GameStart")
{
return;
}

SceneManager.LoadScene("GameStart");
}
}

其中下面代码保证不销毁

1
DontDestroyOnLoad(this);

[RuntimeInitializeOnLoadMethod]修饰的方法可以保证起始的场景永远是GameStart,从而即使直接从其他场景启动也会从入口场景启动。

退出游戏

1
2
3
4
5
#if UNITY_EDITOR
EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif