Страница 1 из 1

Редактирование переменных из редактора во время выполнения

СообщениеДобавлено: 22 ноя 2017, 21:10
PhoenixRFA
Доброго времени суток.
Пишу свой редактор, наследуя EditorWindow, пользуюсь GUI функциями для рисования элементов. Используя свой GUISkin, я изменяю параметры элементов (цвет, фон и т.д.) и они изменяются в окне редактора во время выполнения. Столкнулся с тем, что приходится подстраивать размеры и положение разных элементов, для этого изменяю значения в скрипте и жду компиляции, что бы увидеть изменения.
Так вот, есть ли возможность хранить данные в классе и редактировать этот класс прямо из редактора? Пытался использовать ScriptableObject но ничего толкового из этого не вышло.
Жду ваших советов. Спасибо.

Re: Редактирование переменных из редактора во время выполнения

СообщениеДобавлено: 23 ноя 2017, 02:08
samana
Обычно ведь классы GUILayout или EditorGUILayout хорошо справляются с автоматической подгонкой элементов. Может вы их не используете?

Но если вам всё таки надо вручную выставить позиции каждых элементов, то для быстрого варианта можно временно создать окно для таких настроек. Правда для каждого параметра, который вы хотите менять, придётся создавать переменную.

Например у вас есть окно с двумя кнопками и вы ещё не знаете, в какую позицию захотите их поставить. Для каждой кнопки создаём переменную в которой будет хранится её положение. А при клике ПКМ в любом месте окна, будем вызывать дополнительно окно с настройками.

Окно настроек запоминает ссылку на то окно, чьи переменные будет менять.
И так же в этом окне настроек придётся продублировать эти переменные.
Меняя в окне настроек свойства позиций, кнопки в оригинальном окне так же будут менять своё положение. После того, как вы довольны результатом, то можно уже вручную прописать конкретные позиции для каждой кнопки в оригинальном скрипте и удалить лишние строки в скрипте настроек.

Пробовал на таком скрипте (в одном файле)

Синтаксис:
Используется csharp
using UnityEditor;
using UnityEngine;

public class MyWindow : EditorWindow
{
    [MenuItem("Samana/MyWindow")]
    static void ShowWindow()
    {
        GetWindow<MyWindow>();
    }

    public Vector2Int buttonLeft = new Vector2Int(117,81);
    public Vector2Int buttonRight = new Vector2Int(230,79);

    private void OnGUI()
    {
        if (Event.current.type == EventType.MouseDown && Event.current.button == 1)
        {
            GenericMenu menu = new GenericMenu();
            menu.AddItem(new GUIContent("Settings"), false, createSettingsWindow);
            menu.ShowAsContext();
        }

        GUI.Button(new Rect(buttonLeft.x, buttonLeft.y, 100, 30), "Left");
        GUI.Button(new Rect(buttonRight.x, buttonRight.y, 100, 30), "Right");
    }

    public void createSettingsWindow()
    {
        GetWindow<TempSettings>().setRef(this);
    }

}

public class TempSettings : EditorWindow
{
    MyWindow win;
    public Vector2Int buttonLeft;
    public Vector2Int buttonRight;

    public void setRef(MyWindow win)
    {
        this.win = win;
        buttonRight = win.buttonRight;
        buttonLeft = win.buttonLeft;
    }

    private void OnGUI()
    {
        buttonLeft = EditorGUILayout.Vector2IntField("buttonLeft", buttonLeft, GUILayout.ExpandWidth(false));
        buttonRight = EditorGUILayout.Vector2IntField("buttonRight", buttonRight, GUILayout.ExpandWidth(false));

        applySettings();
    }

    private void applySettings()
    {
        win.buttonLeft = buttonLeft;
        win.buttonRight = buttonRight;

        win.Repaint();
    }
}

 


*gif-ка почему-то обрезана справа, но я там просто вбивал цифры позиций.
Скрытый текст:
Изображение

Re: Редактирование переменных из редактора во время выполнения

СообщениеДобавлено: 23 ноя 2017, 11:08
samana
Я немного перемудрил, ведь в классе настроек можно менять переменные напрямую, поэтому достаточно сократить до

Синтаксис:
Используется csharp
public class TempSettings : EditorWindow
{
    MyWindow win;
   
    public void setRef(MyWindow win)
    {
        this.win = win;
    }

    private void OnGUI()
    {
        win.buttonLeft = EditorGUILayout.Vector2IntField("buttonLeft", win.buttonLeft, GUILayout.ExpandWidth(false));
        win.buttonRight = EditorGUILayout.Vector2IntField("buttonRight", win.buttonRight, GUILayout.ExpandWidth(false));

        win.Repaint();
    }
   
}

Re: Редактирование переменных из редактора во время выполнения

СообщениеДобавлено: 23 ноя 2017, 15:49
PhoenixRFA
samana писал(а):Обычно ведь классы GUILayout или EditorGUILayout хорошо справляются с автоматической подгонкой элементов. Может вы их не используете?

Видимо я слишком заморочился. Постараюсь пользоваться Layout'ами.
samana писал(а):Пробовал на таком скрипте (в одном файле)

За код спасибо! Сам делал нечто подобное, но выглядит это как велосипед. Хотелось чего-то более "правильного" что ли)

Вообщем, в погоне понять всё и сразу не вижу простых инструментов. [curved_hands]
А еще есть сомнения в производительности этих автоматических разметок, но это еще нужно проверить.
Спасибо, что открыли глаза и подтолкнули меня на размышления. Извиняюсь за своё дилетантство.

Re: Редактирование переменных из редактора во время выполнения

СообщениеДобавлено: 23 ноя 2017, 17:11
samana
PhoenixRFA писал(а):А еще есть сомнения в производительности этих автоматических разметок

Редактор Unity сам на них же и работает, так что не переживайте.