如何让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
相关产品推荐
相关产品推荐

