简体   繁体   中英

Is it possible to change the scene to load before the editor entered play mode in Unity?

I put all the managers in the game on an empty scene called Init. The editor must be run from this scene for the game to work properly. So I want to write an editor script that loads the Init scene first and then loads the level scene.

My editor script:

[InitializeOnLoad]
public class LevelFix
{   
    static LevelFix()
    {
        EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
    }
    private static void OnPlayModeStateChanged(PlayModeStateChange state)
    {  
        switch (state)
        {
            case PlayModeStateChange.ExitingEditMode:
                bool initCheck = true;
                int sceneCount = SceneManager.sceneCount;
                Scene lastLevel = SceneManager.GetActiveScene();                

                for (int i = 0; i < sceneCount; i++) 
                {
                    Scene scene = SceneManager.GetSceneAt(i);
                    if (scene.name.Contains("Level"))
                    {                        
                        initCheck = false;
                    }                    
                }
                  
                if (!initCheck)
                {                    
                    PlayerPrefs.SetString("LastLevel", lastLevel.name);
                }
                
                break;

            case PlayModeStateChange.EnteredPlayMode:                
                SceneManager.LoadScene(0); //Init Scene
                break;
        } 
    }    
} 

Init Manager responsible for the level to be loaded (Located in Init scene):

 public class InitManager : MonoBehaviour
{
    private IEnumerator Start()
    {
        yield return SceneManager.LoadSceneAsync(PlayerPrefs.GetString("LastLevel", "Level01"), LoadSceneMode.Additive);
        SceneManager.SetActiveScene(SceneManager.GetSceneByName(PlayerPrefs.GetString("LastLevel", "Level01")));             
        Destroy(gameObject);
    }
}

The problem with the code above is that whichever level I run, first that level opens and then Init opens. This situation causes some errors. Is there any way to set the scene to be loaded before the editor entered play mode?

Yes, Unity provides a very simple way to load a specific scene when entering Play Mode with EditorSceneManager.playModeStartScene :

[InitializeOnLoad]
public class SetStartScene {
    static SetStartScene() {
        EditorSceneManager.playModeStartScene = AssetDatabase.LoadAssetAtPath<SceneAsset>(scenePath);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM