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

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

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

Сообщение PhoenixRFA 22 ноя 2017, 21:10

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

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

Сообщение samana 23 ноя 2017, 02:08

Обычно ведь классы 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-ка почему-то обрезана справа, но я там просто вбивал цифры позиций.
Скрытый текст:
Изображение
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение samana 23 ноя 2017, 11:08

Я немного перемудрил, ведь в классе настроек можно менять переменные напрямую, поэтому достаточно сократить до

Синтаксис:
Используется 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();
    }
   
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение PhoenixRFA 23 ноя 2017, 15:49

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

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

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

Вообщем, в погоне понять всё и сразу не вижу простых инструментов. [curved_hands]
А еще есть сомнения в производительности этих автоматических разметок, но это еще нужно проверить.
Спасибо, что открыли глаза и подтолкнули меня на размышления. Извиняюсь за своё дилетантство.
Аватара пользователя
PhoenixRFA
UNец
 
Сообщения: 5
Зарегистрирован: 27 дек 2015, 14:17

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

Сообщение samana 23 ноя 2017, 17:11

PhoenixRFA писал(а):А еще есть сомнения в производительности этих автоматических разметок

Редактор Unity сам на них же и работает, так что не переживайте.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2