Unity多场景项目:如何实现常驻运行的C#类及后台常驻场景?
当然可以!这在Unity开发中是非常常见的解决方案,专门用来处理那些需要跨场景持续运行的功能——比如全局状态管理、音频控制、网络连接或者常驻UI等等。下面分两种常见方案来实现你的需求:
方案一:单例脚本+DontDestroyOnLoad(轻量首选)
如果只是需要一个持续运行的C#类,不需要整个场景的资源常驻,这种方式最简洁:
创建全局管理器对象
在任意场景中新建一个空GameObject(比如命名为GlobalManager),然后挂载你需要持续运行的C#脚本。编写单例与持久化逻辑
在脚本中使用DontDestroyOnLoad标记该对象,确保场景切换时不被销毁,同时用单例模式保证全局只有一个实例:using UnityEngine; using UnityEngine.SceneManagement; public class GlobalManager : MonoBehaviour { // 全局单例实例 public static GlobalManager Instance { get; private set; } void Awake() { // 确保只有一个全局管理器实例 if (Instance == null) { Instance = this; // 标记该对象在场景切换时不被销毁 DontDestroyOnLoad(gameObject); // 在这里初始化你的全局功能(比如加载配置、初始化网络等) InitializeGlobalServices(); } else { // 如果已经存在实例,销毁重复的对象 Destroy(gameObject); } } private void InitializeGlobalServices() { // 示例:初始化全局音频管理器、状态存储等 Debug.Log("全局服务已初始化,将持续运行于所有场景"); } // 示例:全局场景切换方法 public void SwitchScene(string sceneName) { SceneManager.LoadScene(sceneName); } }使用方式
之后无论你切换到哪个场景,都可以通过GlobalManager.Instance访问这个脚本的所有方法和属性,它会一直保持运行状态。
方案二:常驻后台场景(适合多资源全局共享)
如果你需要整个场景的资源(比如全局音效源、常驻UI画布、全局特效等)都保持加载状态,可以设置一个始终启动的后台场景:
创建后台场景
新建一个场景(比如命名为GlobalBackground),在里面添加所有需要常驻的对象和资源(比如刚才的GlobalManager、背景音乐源等)。配置Build Settings
打开File > Build Settings,将GlobalBackground场景添加到Scenes In Build列表,并拖动到最顶部——Unity会在游戏启动时自动加载列表中的第一个场景。场景切换逻辑
切换前台场景时,使用LoadSceneMode.Additive加载新场景,并卸载之前的前台场景,确保后台场景始终保持加载:public void SwitchToForegroundScene(string targetSceneName) { // 卸载所有已加载的非后台场景 for (int i = 0; i < SceneManager.sceneCount; i++) { Scene currentScene = SceneManager.GetSceneAt(i); if (currentScene.name != "GlobalBackground" && currentScene.isLoaded) { SceneManager.UnloadSceneAsync(currentScene); } } // 异步加载新的前台场景 SceneManager.LoadSceneAsync(targetSceneName, LoadSceneMode.Additive); }
注意事项
- 如果你使用方案二,注意不要在后台场景中添加过多资源,避免不必要的内存占用。
- 单例模式要确保
Awake方法中的逻辑正确,避免重复创建实例导致的bug。 - 场景切换时如果有异步加载需求,记得处理加载进度和回调,提升用户体验。
内容的提问来源于stack exchange,提问作者Bob5421

