📅  最后修改于: 2023-12-03 14:50:24.419000             🧑  作者: Mango
在游戏开发过程中经常需要加载不同的场景,在Unity中也有提供相关的API。但是,如果场景的加载方式和流程都没有很好的组织,那么代码混乱,维护成本就会很高。因此,本文将介绍如何在Unity中,通过编写统一的场景管理类来加载场景,并使场景的加载方式与流程更加合理化。
在介绍具体实现之前,我们需要注意以下的事项:
我们需要通过编写一个统一的场景管理类,来实现场景的加载、卸载和切换。可以将该类命名为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
方法时,控制台就会打印加载场景的日志。当场景加载完成后,会回调上面设置的回调函数。
通过编写统一的场景管理类,可以有效的降低代码的维护成本,并保证场景的加载流程更加合理和规范。同时,为了不让统一场景管理类和其它业务逻辑相耦合,我们还需要设计场景加载流程。场景加载流程可以让代码更加清晰易懂,降低开发难度。