Wie erstelle ich eine Umschaltfläche in Unity Inspector?

13

Ich möchte ein Tool erstellen, das dem Terrain-Tool von Unity ähnelt und einige nützliche Schaltflächen im Inspector enthält:

Schaltflächen im Inspektor umschalten Umschaltknopf

Wie kann ich ein ähnliches Design erzielen? Ich weiß, wie normale Schaltflächen und andere UI-Komponenten im Inspektor erstellt werden, aber ich kann nicht genügend Informationen finden, um die Schaltflächen umzuschalten.

Bisher habe ich normale Schalter verwendet, die eine Checkbox erzeugen:

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;
}

Wenn Sie den Schalter GUIStyleauf "Button" stellen, wird das gewünschte Ergebnis nicht erzielt. Der Text- oder Bildinhalt wird links von der Schaltfläche und nicht innen angezeigt.

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

Unerwünschtes Verhalten beim Umschalten

Auch scheint keine der in GUISkin gefundenen Optionen zu helfen.

Lasse
quelle

Antworten:

8

Ich habe dieses Problem gelöst, indem ich Buttons anstelle von Toggles verwendet habe.

Definieren Sie zunächst zwei Schaltflächenstile, bevor Sie Funktionen ausführen:

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

Dann OnInspectorGui()stellen Sie sicher, dass sie generiert werden, wenn null:

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

Verwenden Sie dann die von @jzx vorgeschlagene Idee, um die Stile umzuschalten:

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();

Das ergibt, was ich wollte:

Erster umgeschalteter Knopf Zweite umgeschaltete Taste

Lasse
quelle
1
Gut gemacht! Ich habe tagelang gesucht, um die Antwort für Schaltflächen im Unity3D-Editor zu finden. Nur eine Frage - warum benutzt du nicht einfach _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal), anstatt zwei Booleaner zu haben? Das funktioniert gut für mich und den Code sieht schließen stadnard Einheit Knopf / Knebel mit
Ivaylo Slavov
1
@ IvayloSlavov Ich habe das als Beispiel für Klarheit genommen
Lasse
4

Toggle gibt den aktuellen Status der Schaltfläche zurück - entweder denselben Status, der als Wert übergeben wurde, oder den neuen Wert, den der Benutzer geändert hat. Also ein besseres Muster wäre ...

// 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.
}

Sie können dasselbe zustandsabhängige Austauschmuster für GUIStyles verwenden.

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

Hier ist eine einfache, aber einfache Möglichkeit, dies zu tun:

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

von hier genommen

Kari
quelle
2

Verwenden Sie GUILayout.Toolbar . Die Dokumente sind irreführend und führen die Schaltflächen tatsächlich zusammen aus:

Beispiel für eine Symbolleiste

Außerdem können Sie die Stile "buttonleft", "buttonmid" und "buttonright" verwenden, um diese Schaltflächen direkt zu zeichnen.

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

Du kannst das:

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
    }
}

Es ist sehr wichtig, dass Sie das buttonStyleInnere instanziieren, OnInspectorGUI()andernfalls wird eine Fehlermeldung angezeigt . Tun buttonStyle = GUI.skin.button;Sie dies auch nicht, da Sie die skin.buttonReferenz kopieren und bei jeder Änderung buttonStylealle Schaltflächenstile ändern würden.

Hyago Oliveira
quelle