Нарисуйте «EditorGUILayout.FloatField» с пользовательской меткой после поля? - PullRequest
0 голосов
/ 11 мая 2018

Я создаю собственное окно редактора и хочу нарисовать EditorGUILayout.FloatField на нем.если я напишу это:

EditorGUILayout.FloatField("change val", someFloatValue);

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

Что у меня есть сейчас:

EditorGUILayout.FloatField with a default label position.jpg

Что бы яхотел бы достичь:

EditorGUILayout.FloatField with a label behind.jpg


UPD. Я пропустил важную информацию: поведение мыши над текстурой должно бытьТо же самое, что и над ярлыком FloatField, т. е. если я нажму на текстуру и начну перетаскивать курсор - значение с плавающей точкой в ​​поле должно измениться


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

Можно ли не создавать много вспомогательных классов для этого простого действия?Если да, то как?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Просто поместите поле метки после поля с плавающей запятой

EditorGUILayout.BeginHorizontal();
someFloatValue = EditorGUILayout.FloatField(someFloatValue);
EditorGUILayout.LabelField("Change Val")
EditorGUILayout.EndHorizontal();

Если вы хотите поместить текстуру, просто создайте GUIStyle с текстурой, которую вы хотите использовать в качестве фона, и используйте стиль для метки

GUIStyle myStyle = new GUIStyle();
myStyle.normal.background = myTexture;

EditorGUILayout.BeginHorizontal();
someFloatValue = EditorGUILayout.FloatField(someFloatValue);
EditorGUILayout.LabelField("", myStyle)
EditorGUILayout.EndHorizontal();

Теперь, чтобы обрабатывать ширину, просто используйте GUILayout.Width()

GUIStyle myStyle = new GUIStyle();
myStyle.normal.background = myTexture;

EditorGUILayout.BeginHorizontal();
someFloatValue = EditorGUILayout.FloatField(someFloatValue, GUILayout.Width(150));
EditorGUILayout.LabelField("", myStyle)
EditorGUILayout.EndHorizontal();
0 голосов
/ 11 мая 2018

Ну, я сделал Гадкий обходной путь для поля (также для IntField). Если удалить весь лишний код, который я использовал для наполнения контента - он будет довольно коротким ...

Упрощенный пример выглядит так:

using UnityEditor;
using UnityEngine;

public class MainWindow : EditorWindow {

    private float floatFieldVal;    
    private Rect groupFloatFieldRect;


    [MenuItem("Examples/Test")]
    static void Init() {
        MainWindow window = (MainWindow)GetWindow(typeof(MainWindow), false, "My Empty Window");
        window.Show();
    }


    void OnGUI() {
        EditorGUILayout.BeginHorizontal(); {

            EditorGUILayout.BeginVertical(); { 
                GUILayout.Button("Button 1");
                GUILayout.Button("Button 2");
                GUILayout.Button("Button 3");
            } EditorGUILayout.EndVertical();

            EditorGUILayout.BeginVertical(GUILayout.Width(300)); { 
                // never load asset in the loop :)
                string assetFullPath = "Assets/Editor/Test.guiskin";
                var fakeFieldGUISkin = (GUISkin)AssetDatabase.LoadAssetAtPath(assetFullPath, typeof(GUISkin));
                GUIStyle fakeFieldStyle = fakeFieldGUISkin.GetStyle("test");

                // place fake floatField right over a real field texture button
                Rect test = new Rect(groupFloatFieldRect);
                test.position = new Vector2(test.x + groupFloatFieldRect.width - 20, test.y + 3);
                test.size = new Vector2(20, 20);
                floatFieldVal = EditorGUI.FloatField(test,  "fake", floatFieldVal, fakeFieldStyle);

                // Draw FloatField And Texture as a Group
                Rect groupRect = EditorGUILayout.BeginHorizontal(); {     
                    // never create GUIStyle in the loop :)
                    GUIStyle floatIconStyle = new GUIStyle(EditorStyles.toolbarButton) {
                        fixedWidth = 20f,
                        margin = new RectOffset(0, 0, 0, 0),
                        padding = new RectOffset(0, 0, 0, 0)
                    };

                    floatFieldVal = EditorGUILayout.FloatField("", floatFieldVal);  
                    // It emulates a texture
                    GUILayout.Label("◀▶", floatIconStyle)

                    // save group rect in a variable
                    if (Event.current.type == EventType.Repaint)
                        groupFloatFieldRect = groupRect;

                } EditorGUILayout.EndHorizontal();
            } EditorGUILayout.EndVertical();        
        } EditorGUILayout.EndHorizontal();
    }


    void OnInspectorUpdate() {
        Repaint();
    }    
}

Конечно, все магические числа приведены только для быстрого примера. Также guiskin загрузка и создание GUIStyle не должны быть в цикле (в данном случае OnGUI). Это для быстрого примера тоже.

Test.guiskin предназначен для удаления данных скина по умолчанию и регулирования других параметров при необходимости.

Вот как выглядит приведенный выше код:

снимок экрана window.jpg

анимированная демонстрация поддельного поля.gif

0 голосов
/ 11 мая 2018

Это очень возможно, но вы не должны быть классами GUILayout / EditorGUILayout.Расположение в именах классов означает, что эти варианты обрабатывают позиционирование самостоятельно, каждый из них занимает пространство по умолчанию и перемещается к следующей строке, это очень удобно, но для более сложных вещей, вы должны использовать версии GUIкоторые принимают Rect в качестве позиции для рисования, поэтому берут из классов GUI / EditorGUI (без Layout в имени класса)

Я рекомендую начать с создания пользовательского PropertyDrawer, а API-интерфейс для PropertyDrawer вызывает вручнуюразмещение элементов, так что есть множество хороших примеров.Как только вы начнете рисовать, используя Rects вместо автоматических макетов, нет предела тому, сколько слоев материала для рисования куда, фактически тривиально начать рисовать вне вашего собственного инспектора (если он находится в том же окне)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...