Почему метод Show у Editor Window работает некорректно?

241
01 июля 2017, 08:34

В документации сказано, что метод EditorWindow.Show открывает окно EditorWindow. Замечательно. Создаю я два класса:

первый

public class WindowOne : EditorWindow {
    public static WindowOne windowOneInstance;
    [MenuItem("Window/Open Window One")]
    public static void Init() {
        windowOneInstance = GetWindow<WindowOne>(false, "Window One", true);
    }
}

второй

public class WindowTwo : EditorWindow {
    public static WindowTwo windowTwoInstance;
    public static WindowOne windowOneInstance;
    [MenuItem("Window/Open Window Two")]
    public static void Init() {
        windowTwoInstance = GetWindow<WindowTwo>(false, "Window Two", true);
        windowOneInstance = WindowOne.windowOneInstance;
    }
    public void OnGUI() {
        if (GUI.Button(new Rect(0, 0, 200, 50), new GUIContent("show window one"))) {
            windowOneInstance.Show();
        }
    }
}

Всё очень просто: в меню я кликаю по Open Window One, затем по Open Window Two, чтобы открыть два окна и затем одно из них (Window One) я закрываю:

Теперь, если во втором окне я кликаю кнопку "show window one", то первое окно не появляется. Точнее появляется какая-то однопкисельная точка, которую нельзя ни увеличить в размерах, ни сдвинуть с места, ни что-то еще

Если я пишу GetWindow(typeof (WindowOne)); вместо .Show() - то окно показывается, но я не уверен, что это то же самое окно, что было в начале, потому что instanceID этого окна будет отличаться от того, что было изначально.

Собственно, почему метод Show работает так странно? Что я делаю не так? И что мне нужно сделать, чтобы показать тот же самый экземпляр окна, который был закрыт (временно скрыт) ранее?

Версия Unity - 5.6.0p4

Answer 1

Если закрыл окно, то показать потом его снова уже нельзя, ссылка становится null. А пиксель который показывает, это болванка создается, и растянуть ее можно, если потянуть в верхний левый угол(на маке не уверен), там окно будет с пометкой "Failed to load". В том числе EditorWindow это ScriptableObject. И вот что делает функция Show:

public void Show()
    {
        this.Show(false);
    }
    public void Show(bool immediateDisplay)
    {
        if (this.m_Parent == null)
        {
            EditorWindow.CreateNewWindowForEditorWindow(this, true, immediateDisplay);
        }
    }

Ну и видимо при закрытии он ставит размер окна EditorWindow минимальными. И при повторном открытии получаешь пустое окно с минимальными размерами(насколько позволяет ОС).

Выход: EditorWindow использовать как болванку для отображения, а данные и действия брать из своих статических скриптов.

READ ALSO
Найти коэффициент полинома C#

Найти коэффициент полинома C#

Я пишу программу, способную решать уравнения / системы с помощью этой библиотеки

352
EF множественные CRUD

EF множественные CRUD

Есть несколько моделей и для них BusinessContext в котором описаны CRUD операцииПо сути они одни, только меняются таблицы

251
Рисование карты игроком по типу Free Rider HD

Рисование карты игроком по типу Free Rider HD

Надо предоставить игроку возможность создавать игровое поле посредством рисования(пример)Ввод осуществляется исходя из координат курсора(в...

200
Аналог scanner&#39;а из java в c#

Аналог scanner'а из java в c#

Добрый день

186