Как создать кнопку переключения в Unity Inspector?


13

Я хочу создать инструмент, аналогичный инструменту Unity's Terrain, в инспекторе которого есть несколько удобных кнопок переключения:

Кнопки переключения в инспекторе Переключаемая кнопка

Как я могу добиться подобного дизайна для этого? Я знаю, как создавать обычные кнопки и другие компоненты пользовательского интерфейса в инспекторе, но не могу найти достаточно информации, чтобы кнопки переключались.

До сих пор я использовал обычные переключатели, которые производят флажок:

var tmp = EditorGUILayout.Toggle( SetAmountFieldContent, _setValue );

if ( tmp != _setValue )
{
  _setValue = tmp;
  if ( _setValue )
    _smoothValue = false;
}

tmp = EditorGUILayout.Toggle( SmoothValueFieldContent, _smoothValue );

if ( tmp != _smoothValue )
{
  _smoothValue = tmp;
  if ( _smoothValue )
    _setValue = false;
}

Установка переключателя GUIStyleв положение «Кнопка» не дает желаемого результата. Текст или изображение идет слева от кнопки, а не внутри.

var tmp = EditorGUILayout.Toggle( SetAmountFieldContent, _setValue, "Button" );

Нежелательное поведение при переключении

Также ни один из найденных вариантов в GUISkin , похоже, не помогает.

Ответы:


8

Я решил эту проблему с помощью кнопок вместо переключателей.

Сначала определите два стиля кнопок перед любыми функциями:

private static GUIStyle ToggleButtonStyleNormal = null;
private static GUIStyle ToggleButtonStyleToggled = null;

Затем OnInspectorGui()убедитесь, что они генерируются, если null:

if ( ToggleButtonStyleNormal == null )
{
  ToggleButtonStyleNormal = "Button";
  ToggleButtonStyleToggled = new GUIStyle(ToggleButtonStyleNormal);
  ToggleButtonStyleToggled.normal.background = ToggleButtonStyleToggled.active.background;
}

А затем используйте предложенную @jzx идею для переключения стилей:

GUILayout.BeginHorizontal(  );

if ( GUILayout.Button( SetAmountFieldContent, _setValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal ) )
{
  _setValue = true;
  _smoothValue = false;
}

if ( GUILayout.Button( SmoothValueFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal ) )
{
  _smoothValue = true;
  _setValue = false;
}

GUILayout.EndHorizontal();

Это производит то, что я хотел:

Первая кнопка Вторая переключаемая кнопка


1
Прекрасная работа! Я искал несколько дней, чтобы найти ответ для кнопок переключения в редакторе Unity3D. Только один вопрос - почему бы вам просто не использовать _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)вместо двух логических значений? Это хорошо работает для меня, и код выглядит близко к использованию кнопки / переключателей стандартного единства
Ивайло Славов

1
@IvayloSlavov Я использовал это в качестве примера для ясности
Лассе

4

Toggle возвращает текущее состояние кнопки - либо то же состояние, переданное в значении, либо новое значение, измененное пользователем. Так что лучшая модель была бы ...

// TODO: Initialize these with GUIContent
private GUIContent _toggleButtonDepressedLabel;
private GUIContent _toggleButtonDefaultLabel;

// Current toggle state
bool _toggleButtonState;

void DisplayToggle()
{
    var image = _toggleButtonValue
                ? _toggleButtonDepressedLabel
                : _toggleButtonDefaultLabel;
    var newState = EditorGUILayout.Toggle(image, _toggleButtonState);
    if (newState != _toggleButtonState)
    {
        _toggleButtonState = newState;
        OnToggleButtonChanged();
    }
}

void OnGUI ()
{
    DisplayToggle();
}

void OnToggleButtonChanged()
{
    // Do stuff.
}

Вы можете использовать тот же шаблон обмена в зависимости от состояния для GUIStyles.

private GUIStyle _toggleButtonDepressedStyle;
private GUIStyle _toggleButtonDefaultStyle;
// ...
    var image = _toggleButtonValue
                ? _toggleButtonDepressedLabel
                : _toggleButtonDefaultLabel;
    var style = _toggleButtonValue
                ? _toggleButtonDepressedStyle
                : _toggleButtonDefaultStyle;
    var newState = EditorGUILayout.Toggle(image, _toggleButtonState, style);

3

Вот простой, но простой способ сделать это:

 pressed = GUILayout.Toggle(pressed, "Toggle me !", "Button");

взяты отсюда


1
Это чертовски простой способ сделать это.
nsxdavid

2

Используйте GUILayout.Toolbar . Документы вводят в заблуждение, на самом деле кнопки запускаются вместе:

пример панели инструментов

Кроме того, вы можете использовать стили "buttonleft", "buttonmid", "buttonright", чтобы нарисовать стиль этих кнопок напрямую.

        var left = GUI.skin.FindStyle("buttonleft");
        GUILayout.Button("left only button", left);

0

Ты можешь сделать это:

private GUIStyle buttonStyle;
private bool enableToogle;

public override void OnInspectorGUI()
{
    buttonStyle = new GUIStyle(GUI.skin.button);
    enableToogle = GUILayout.Toggle(enableToogle, "Toogle Me", buttonStyle);

    if(enableToogle)
    {
        // your stuff here
    }
}

Очень важно, чтобы вы инстанцировали buttonStyleвнутри, OnInspectorGUI()иначе вы получите ошибку. Кроме того, не делайте этого, buttonStyle = GUI.skin.button;потому что вы будете копировать skin.buttonссылку, и любое изменение buttonStyleприведет к изменению всех стилей кнопок.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.