Як створити кнопку перемикання в Unity Inspector?


13

Я хочу створити інструмент, подібний до інструменту Unin'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 Я використав це як приклад для ясності
Lasse

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.Tool . Документи вводять в оману, він фактично запускає кнопки разом:

приклад панелі інструментів

Крім того, ви можете використовувати стилі "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.