изменение GUILayout

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

изменение GUILayout

Сообщение TeslaGan 01 мар 2021, 16:02

есть библиотека объектов. для ее первоначальной настройки, есть внешний скрипт UnityEditor который отображает незаполненную фурнитуру
Синтаксис:
Используется csharp
    public static void OnGUI() {
            _DragAndDrop = EditorGUILayout.BeginScrollView(_DragAndDrop, false, true, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height * 2 / 10f));
            EditorGUILayout.BeginVertical(new GUIStyle(), GUILayout.MaxHeight(10));
            foreach (Furniture c in ListOfFurniture.GetClearFurniture.Values) {
                new FixFurnitureGui().OnGUI(c);
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndScrollView();
    }
 

для отображения каждой записи есть скрипт FixFurnitureGui()
Синтаксис:
Используется csharp
    public class FurnitureGui {
        internal bool isOpenedDescription = false;
        internal int index;
        internal int price;
        internal Furniture.ProcessingType type;

    public void OnGUI(Furniture data) {
        EditorGUILayout.BeginVertical();

        EditorGUILayout.BeginHorizontal();
        GUILayout.Label(data.Name);
        type = data.TypeFurniture;

        EditorGUI.BeginChangeCheck();
        type = (Furniture.ProcessingType)EditorGUILayout.EnumPopup(type, GUILayout.Width(50));
        if (EditorGUI.EndChangeCheck()) {
            data.ChangeTypeFurniture(type);
               ListOfFurniture.RemoveClearFurniture(data.Key);
            }
        }
            EditorGUI.BeginChangeCheck();
           
            price = EditorGUILayout.IntField(price, GUILayout.Width(30));
            if (EditorGUI.EndChangeCheck()) {
                data.ChangePriceOrder(price);
            }
        EditorGUILayout.EndHorizontal();

        isOpenedDescription = EditorGUILayout.Foldout(isOpenedDescription, "описание");

        if (isOpenedDescription) {

            GUILayout.Label(data.Description);
            GUILayout.Label("Объем   " + data.Geometry);
            GUILayout.Label("Цена:              " + data.Price);
            GUILayout.Label("Ключ:              " + data.Key);

        }
        EditorGUILayout.EndVertical();

        var rect = EditorGUILayout.BeginHorizontal();
        Handles.color = Color.gray;
        Handles.DrawLine(new Vector2(rect.x - 15, rect.y), new Vector2(rect.width + 15, rect.y));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();
    }

но вот возникло пару трудностей:
1. как отловить окончание изменения цены(поле больше не выделено, или нажата кнопка Enter)? пытался делать через EditorGUI.EndChangeCheck(), но он отлавливает любое изменение поля.
2. как можно заставить перерисоваться контейнер OnGUI? если поле type меняется, запись в GetClearFurniture удаляется, но отображение записи остается в окне чистой фурнитуры
3. вопрос со звездочкой. есть ли в новой версии юнити функция отрисовки линии? на просторах зарубежного форума нашлось пару старых костылей, но неужели нет норм функции. я помню что раньше(когда я только изучал юнити) было что-то простое, поддерживающее стили.
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: изменение GUILayout

Сообщение TeslaGan 02 мар 2021, 11:36

подебажив проект, понял что OnGUI отрисовывается каждый кадр... и скрипт public static void OnGUI() {/.../ new FixFurnitureGui().OnGUI(c);}
создавал сотни контейнеров, из-за этого оно удаляло только 1 контейнер, но оставались другие(странно правда почему в скролвью были только одни копии контейнеров фурнитуры). создал переменную, которая хранит все контейнеры фурнитуры, и инстатиирую ее извне
Синтаксис:
Используется csharp
   
private static List<FurnitureGui> FurnitureContainGUI = new List<FurnitureGui>();
public static void CreateNewList() {
        FurnitureContainGUI.Clear();
        foreach (Furniture b in ListOfFurniture.GetClearFurniture.Values) {
            FurnitureContainGUI.Add(new FurnitureGui(b));
           
        }
}
public static void OnGUI() {
            _DragAndDrop = EditorGUILayout.BeginScrollView(_DragAndDrop, false, true, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height * 2 / 10f));
            EditorGUILayout.BeginVertical(new GUIStyle(), GUILayout.MaxHeight(10));
            if (FurnitureContainGUI.Count > 0)
                foreach (FurnitureGui b in FurnitureContainGUI)
                    b.OnGUI();
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndScrollView();
    }

осталось разобраться с остальными вопросами
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: изменение GUILayout

Сообщение TeslaGan 07 мар 2021, 10:25

и еще вопрос. в EditorWindow понадобилось заполнение массива. как можно сделать список подобный стандартному Юнитевскому в инспекторе?
Изображение
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: изменение GUILayout

Сообщение 1max1 07 мар 2021, 15:45

TeslaGan писал(а):и еще вопрос. в EditorWindow понадобилось заполнение массива. как можно сделать список подобный стандартному Юнитевскому в инспекторе?
Изображение

Рисовать всё вручную и каждый элемент через цикл, либо, если это поле изначально массив, в PropertyField указать true в includeChildren, тогда юнька сама всё нарисует.
вопрос со звездочкой. есть ли в новой версии юнити функция отрисовки линии?

Тебе именно в инспекторе? Судя по всему только костылями.
https://docs.unity3d.com/ScriptReferenc ... wRect.html
https://docs.unity3d.com/ru/current/Scr ... I.Box.html
как отловить окончание изменения цены(поле больше не выделено, или нажата кнопка Enter)?

Без костылей никак, нужно проверять фокус и нажатие клавиш)) Ну, по крайней мере я не знаю такой фичи. Если тебе не нужно мгновенное применение нового значение есть вот такое https://docs.unity3d.com/ScriptReferenc ... Field.html значение меняется только при потере фокуса или ентера.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: изменение GUILayout

Сообщение TeslaGan 08 мар 2021, 11:59


понятно. спасибо. так и делал. просто раньше, во времена еще старой гуи, был простой метод для этого.
1max1 писал(а):https://docs.unity3d.com/ScriptReference/EditorGUILayout.DelayedIntField.html значение меняется только при потере фокуса или ентера.

вот. именно то, что и искал. спасибо огромное.
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: изменение GUILayout

Сообщение TeslaGan 10 мар 2021, 22:40

видимо этот Editor меня не отпустит.
решили через https://docs.unity3d.com/ScriptReferenc ... Field.html подгружать текстурки.
Brushes2D = (Texture2D)EditorGUILayout.ObjectField("", Brushes2D , typeof(Texture2D), true, GUILayout.Width(120), GUILayout.Height(120));

все подгружается, все работает, дизайнеру нравится. но как теперь сериализовать текстуру? можно ли как-то получить путь к текстуре вместо самой текстуры?
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: изменение GUILayout

Сообщение 1max1 10 мар 2021, 22:56

можно ли как-то получить путь к текстуре вместо самой текстуры?

https://docs.unity3d.com/ScriptReferenc ... tPath.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 25