You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity多场景项目:如何实现常驻运行的C#类及后台常驻场景?

实现Unity跨场景常驻功能:后台场景与持久化脚本

当然可以!这在Unity开发中是非常常见的解决方案,专门用来处理那些需要跨场景持续运行的功能——比如全局状态管理、音频控制、网络连接或者常驻UI等等。下面分两种常见方案来实现你的需求:

方案一:单例脚本+DontDestroyOnLoad(轻量首选)

如果只是需要一个持续运行的C#类,不需要整个场景的资源常驻,这种方式最简洁:

  1. 创建全局管理器对象
    在任意场景中新建一个空GameObject(比如命名为GlobalManager),然后挂载你需要持续运行的C#脚本。

  2. 编写单例与持久化逻辑
    在脚本中使用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);
        }
    }
    
  3. 使用方式
    之后无论你切换到哪个场景,都可以通过GlobalManager.Instance访问这个脚本的所有方法和属性,它会一直保持运行状态。

方案二:常驻后台场景(适合多资源全局共享)

如果你需要整个场景的资源(比如全局音效源、常驻UI画布、全局特效等)都保持加载状态,可以设置一个始终启动的后台场景:

  1. 创建后台场景
    新建一个场景(比如命名为GlobalBackground),在里面添加所有需要常驻的对象和资源(比如刚才的GlobalManager、背景音乐源等)。

  2. 配置Build Settings
    打开File > Build Settings,将GlobalBackground场景添加到Scenes In Build列表,并拖动到最顶部——Unity会在游戏启动时自动加载列表中的第一个场景。

  3. 场景切换逻辑
    切换前台场景时,使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:36