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

изменение GUILayout

СообщениеДобавлено: 01 мар 2021, 16:02
TeslaGan
есть библиотека объектов. для ее первоначальной настройки, есть внешний скрипт 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. вопрос со звездочкой. есть ли в новой версии юнити функция отрисовки линии? на просторах зарубежного форума нашлось пару старых костылей, но неужели нет норм функции. я помню что раньше(когда я только изучал юнити) было что-то простое, поддерживающее стили.

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

СообщениеДобавлено: 02 мар 2021, 11:36
TeslaGan
подебажив проект, понял что 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();
    }

осталось разобраться с остальными вопросами

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

СообщениеДобавлено: 07 мар 2021, 10:25
TeslaGan
и еще вопрос. в EditorWindow понадобилось заполнение массива. как можно сделать список подобный стандартному Юнитевскому в инспекторе?
Изображение

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

СообщениеДобавлено: 07 мар 2021, 15:45
1max1
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 значение меняется только при потере фокуса или ентера.

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

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

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

вот. именно то, что и искал. спасибо огромное.

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

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

все подгружается, все работает, дизайнеру нравится. но как теперь сериализовать текстуру? можно ли как-то получить путь к текстуре вместо самой текстуры?

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

СообщениеДобавлено: 10 мар 2021, 22:56
1max1
можно ли как-то получить путь к текстуре вместо самой текстуры?

https://docs.unity3d.com/ScriptReferenc ... tPath.html