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

Unity中如何处理场景加载事件?是否有更优实践?

针对SceneManager.sceneLoaded事件的实现方案

不一定非要创建空GameObject挂载脚本,根据你的需求场景,有几种更优或更灵活的实践方式:

1. 持久化单例管理器(全局场景逻辑)

如果需要在所有场景切换时都响应加载事件,可以写一个继承MonoBehaviour的单例类,在Awake阶段设置DontDestroyOnLoad让它跨场景持久化,然后在Awake或Start中注册SceneManager.sceneLoaded事件。这样全局只需要一个实例,不用在每个场景都创建空对象。

示例代码:

public class SceneLoadManager : MonoBehaviour
{
    public static SceneLoadManager Instance { get; private set; }

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);
        // 注册场景加载事件
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // 处理场景加载后的逻辑,比如初始化UI、加载数据等
        Debug.Log($"场景 {scene.name} 加载完成");
    }

    private void OnDestroy()
    {
        // 记得取消注册,避免内存泄漏
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }
}

2. ScriptableObject全局事件(解耦式方案)

如果想让多个独立模块都能响应场景加载事件,且不想硬依赖单例,可以用ScriptableObject做全局事件分发:

  • 创建一个继承ScriptableObject的事件类,定义场景加载完成的委托
  • 在负责场景加载的逻辑里(比如单例管理器或加载按钮脚本),在场景加载完成时触发这个事件
  • 任何需要响应的脚本,都可以在Awake/Start中订阅该事件,实现解耦

这种方式的好处是各个模块无需互相引用,扩展性更强。

3. 静态类结合委托(慎用)

可以用静态类来注册SceneManager.sceneLoaded事件,但要注意:

  • 静态类没有MonoBehaviour的生命周期,所以要确保事件只注册一次(比如用一个布尔标记判断)
  • 场景卸载时无法自动取消注册,需要手动处理,否则可能导致内存泄漏或重复触发逻辑

示例代码:

public static class SceneLoadHandler
{
    private static bool isRegistered = false;

    public static void RegisterSceneLoadedEvent()
    {
        if (!isRegistered)
        {
            SceneManager.sceneLoaded += OnSceneLoaded;
            isRegistered = true;
        }
    }

    private static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // 处理逻辑
    }

    public static void UnregisterSceneLoadedEvent()
    {
        if (isRegistered)
        {
            SceneManager.sceneLoaded -= OnSceneLoaded;
            isRegistered = false;
        }
    }
}

4. 单个场景的空GameObject(简单场景适用)

如果只是某个特定场景加载后需要执行逻辑,直接在该场景创建空GameObject并挂载脚本是完全没问题的,这种方式直观简单,不需要额外的全局逻辑,适合小型项目或单一场景的需求。


内容的提问来源于stack exchange,提问作者hbprotoss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:40:49