【Unity】PlayMode と EditMode でエディタLayoutを切り替えるエディタ拡張

概要

Unity Editor の Layout を PlayMode と Edit Mode で切り替えるエディタ拡張です。
Edit Mode と Play Mode で開きたいウィンドウが違うので自動で切り替えるようにしました。

ソースコード

EditorWindow で作成すると, Layout変更時に消えてしまうので
横着してScriptableObject で作っています。

using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CreateAssetMenu(fileName = "EditorLayoutSettings", menuName = "Settings/Editor Layout Settings", order = 1)]
public class EditorLayoutSettings : ScriptableObject
{
    public bool enabled = false;
    public int editModeLayoutIndex = 0;
    public int playModeLayoutIndex = 0;
}

[CustomEditor(typeof(EditorLayoutSettings))]
public class EditorLayoutSettingsEditor : Editor
{
    (string, string)[] filePathToNames;

    void OnEnable()
    {
        UpdatePaths();
        EditorApplication.playModeStateChanged += HandleOnPlayModeChanged;
    }

    void OnDisable()
    {
        EditorApplication.playModeStateChanged -= HandleOnPlayModeChanged;
    }

    public override void OnInspectorGUI()
    {
        var settings = (EditorLayoutSettings)target;
        settings.enabled = EditorGUILayout.Toggle("enabled", settings.enabled);
        settings.editModeLayoutIndex = EditorGUILayout.Popup("Edit Mode Layout", settings.editModeLayoutIndex, filePathToNames.Select(x => x.Item2).ToArray());
        settings.playModeLayoutIndex = EditorGUILayout.Popup("Play Mode Layout", settings.playModeLayoutIndex, filePathToNames.Select(x => x.Item2).ToArray());

        if (GUILayout.Button("Reload"))
        {
            UpdatePaths();
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(settings);
        }
    }

    void UpdatePaths()
    {
        var paths = Directory.GetFiles(Path.Combine(InternalEditorUtility.unityPreferencesFolder, "Layouts") + "/default", "*.wlt");
        filePathToNames = paths
            .Select(path => path.Replace('\\', '/'))
            .Select(path => (path, Path.GetFileNameWithoutExtension(Path.GetFileName(path))))
            .ToArray();

    }

    void HandleOnPlayModeChanged(PlayModeStateChange state)
    {
        var settings = (EditorLayoutSettings)target;

        if (filePathToNames == null)
        {
            return;
        }

        if (!settings.enabled)
        {
            return;
        }

        UpdatePaths();
        switch (state)
        {
            case PlayModeStateChange.ExitingEditMode:
                EditorUtility.LoadWindowLayout(filePathToNames[settings.playModeLayoutIndex].Item1);
                break;
            case PlayModeStateChange.ExitingPlayMode:
                EditorUtility.LoadWindowLayout(filePathToNames[settings.editModeLayoutIndex].Item1);
                break;
        }
    }
}

参考

https://discussions.unity.com/t/how-to-switch-unity-layouts-during-play-and-edit-mode/214670