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

如何让RuntimeInitializeOnLoadMethod跳过游戏首个场景的初始化?

解决方案

要实现仅在非主菜单场景加载时创建PersistObjects,你可以通过监听Unity的场景加载事件,结合场景名称判断来控制对象的实例化,同时确保对象只被创建一次。

修改后的代码

using UnityEngine;
using UnityEngine.SceneManagement;

public static class Initializer
{
    private static bool _persistObjectsCreated = false;
    // 替换成你的主菜单场景实际名称
    private const string _mainMenuSceneName = "MainMenu";

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    public static void SetupSceneLoadListener()
    {
        SceneManager.sceneLoaded += OnSceneLoaded;
        // 检查初始加载的场景是否需要创建持久化对象
        CheckAndSpawnPersistObjects(SceneManager.GetActiveScene());
    }

    private static void OnSceneLoaded(Scene loadedScene, LoadSceneMode loadMode)
    {
        CheckAndSpawnPersistObjects(loadedScene);
    }

    private static void CheckAndSpawnPersistObjects(Scene targetScene)
    {
        // 已创建过,或是主菜单场景则直接返回
        if (_persistObjectsCreated || targetScene.name == _mainMenuSceneName)
            return;

        var persistPrefab = Resources.Load("PersistObjects");
        if (persistPrefab == null)
        {
            Debug.LogError("找不到PersistObjects预制体,请确认它在Resources文件夹下");
            return;
        }

        Object.DontDestroyOnLoad(Object.Instantiate(persistPrefab));
        _persistObjectsCreated = true;
        Debug.Log("持久化对象已创建并设置为跨场景保留");
    }
}

逻辑说明

  • 使用_persistObjectsCreated布尔值标记对象是否已实例化,避免重复创建。
  • 通过SceneManager.sceneLoaded监听所有场景加载完成事件,确保每次场景切换后都能检查是否需要创建持久化对象。
  • 游戏启动时,在首个场景加载完成后自动执行一次检查,判断初始场景是否为主菜单。
  • 仅当加载的场景不是主菜单且对象未创建时,才从Resources文件夹加载并实例化PersistObjects,同时设置为DontDestroyOnLoad。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:41