- Home /
How to switch Unity Layouts during Play and Edit Mode
I have been using the code below to switch between two layouts. "Preset Layout" for Play Mode and "Default Layout" for Edit Mode:
using UnityEngine;
using UnityEditor;
namespace Assets.Editor {
[InitializeOnLoad]
public class AutoLayoutChanger {
static AutoLayoutChanger() {
EditorApplication.playmodeStateChanged = HandleOnPlayModeChanged;
}
static void HandleOnPlayModeChanged() {
// This method is run whenever the playmode state is changed.
if (EditorApplication.isPlaying) {
EditorUtility.LoadWindowLayout("Preset Layout");
// do stuff when the editor is played.
} else if (!EditorApplication.isPaused) {
EditorUtility.LoadWindowLayout("Default Layout");
// other than playmode
}
}
}
}
However I will always run into this error:
Failed to load window layout: System.ArgumentException: Window layout at 'Preset Layout' could not be loaded.
at UnityEditor.WindowLayout.LoadWindowLayout (System.String path, Boolean newProjectLayoutWasCreated) [0x0008d] in C:\buildslave\unity\build\Editor\Mono\GUI\WindowLayout.cs:487
UnityEditor.EditorUtility:LoadWindowLayout(String)
Assets.Editor.AutoLayoutChanger:HandleOnPlayModeChanged() (at Assets/Scripts/AutoLayoutChanger.cs:14)
UnityEditor.EditorApplication:Internal_PlayModeStateChanged(PlayModeStateChange)
Does anybody know how to fix this or maybe even have code that works.
Answer by spilat12 · Dec 17, 2020 at 10:23 PM
Hi. I know I am about 2 years late with an answer, but still. You need to understand that each layout is saved as a file by Unity inside system files. This describes the main problem with your code:
EditorUtility.LoadWindowLayout("full path to layout file, including file extension")
You can get your path like so:
static string layoutsPreferencesPath = Path.Combine(InternalEditorUtility.unityPreferencesFolder, "Layouts");
To use the above code you would need the following namespace:
using UnityEditorInternal;
Now, at the moment I work on Mac, so I also need to add "/default" to the path. Finally, the file extension for the layout files is ".wlt". So you can get all filenames with their paths like so:
string[] fileNames = Directory.GetFiles(layoutsPreferencesPath + "/default", "*.wlt");
Cheers!