📜  加载场景统一 - C# (1)

📅  最后修改于: 2023-12-03 14:50:24.419000             🧑  作者: Mango

加载场景统一 - C#

在游戏开发过程中经常需要加载不同的场景,在Unity中也有提供相关的API。但是,如果场景的加载方式和流程都没有很好的组织,那么代码混乱,维护成本就会很高。因此,本文将介绍如何在Unity中,通过编写统一的场景管理类来加载场景,并使场景的加载方式与流程更加合理化。

注意事项

在介绍具体实现之前,我们需要注意以下的事项:

  1. 统一场景管理类的作用是进行场景的管理,不应该与其它的业务逻辑耦合;
  2. 统一场景管理类的作用是控制场景加载的流程,在不同的场景之间切换时,应该统一的设置需要卸载的资源,以减少内存占用;
  3. 在场景切换时,应该考虑到异步加载的情况,以保证游戏的流畅度。
实现步骤
步骤一:编写统一场景管理类

我们需要通过编写一个统一的场景管理类,来实现场景的加载、卸载和切换。可以将该类命名为SceneManager,在该类中编写以下方法:

方法一:LoadScene

该方法用于加载指定名称的场景。该方法需要使用Unity提供的异步加载方法,并在加载前,统一卸载上一个场景中的需要卸载的资源。方法如下:

public static void LoadScene(string sceneName)
{
    // 卸载上一个场景中的需要卸载的资源
    // ...

    // 异步加载场景
    SceneManager.LoadSceneAsync(sceneName);
}

方法二:UnloadScene

该方法用于卸载当前场景中的需要卸载的资源。可以在该方法中,统一卸载一些资源,例如图集、音效等。方法如下:

public static void UnloadScene()
{
    // 卸载一些需要卸载的资源
    // ...

    // 卸载当前场景中的所有资源
    Resources.UnloadUnusedAssets();
}

方法三:SwitchScene

该方法用于切换场景。调用该方法时,会先卸载当前场景中的资源,再加载需要切换的场景。方法如下:

public static void SwitchScene(string sceneName)
{
    // 卸载当前场景中的资源
    UnloadScene();

    // 异步加载场景
    LoadScene(sceneName);
}
步骤二:组织场景加载的流程

在实际使用中,我们可能需要在加载场景时,做一些其他的操作,例如初始化场景管理类、加载场景之前的loading等。为了不让以上的操作与场景管理类的核心职责耦合,我们需要设计一个场景加载流程,在场景管理类中提供一个回调函数,在场景加载完成后调用这个方法。具体的实现方法如下:

回调函数

SceneManager中提供一个回调函数:

public static void OnSceneLoaded(Action onSceneLoadedCallback)
{
    if (onSceneLoadedCallback == null)
    {
        return;
    }

    _onSceneLoadedCallback = onSceneLoadedCallback;
}

场景加载流程的代码

在业务逻辑中,需要先初始化SceneManager,并且在需要加载场景的地方,调用SwitchScene方法。在调用SwitchScene方法前,可以设置回调函数:

SceneManager.OnSceneLoaded(() => 
{
    // 场景切换完成后的操作
});

SceneManager.SwitchScene("SceneName");

在执行SwitchScene方法时,控制台就会打印加载场景的日志。当场景加载完成后,会回调上面设置的回调函数。

总结

通过编写统一的场景管理类,可以有效的降低代码的维护成本,并保证场景的加载流程更加合理和规范。同时,为了不让统一场景管理类和其它业务逻辑相耦合,我们还需要设计场景加载流程。场景加载流程可以让代码更加清晰易懂,降低开发难度。