मैं एकता निरीक्षक में टॉगल बटन कैसे बनाऊं?


13

मैं एकता के इलाके उपकरण के समान एक उपकरण बनाना चाहता हूं, जिसमें निरीक्षक में कुछ अच्छे टॉगल बटन हैं:

निरीक्षक में बटन टॉगल करें टॉगल बटन

मैं इसके समान डिजाइन कैसे प्राप्त कर सकता हूं? मुझे पता है कि इंस्पेक्टर में सामान्य बटन और अन्य UI घटक कैसे बनाए जाते हैं, लेकिन मुझे बटन टॉगल करने के लिए पर्याप्त जानकारी नहीं मिल सकती है।

अब तक मैंने सामान्य टॉगल का उपयोग किया है जो एक चेकबॉक्स का उत्पादन करता है:

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()यह सुनिश्चित करने के लिए कि वे अशक्त हैं या नहीं:

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
अच्छा काम! मैं यूनिटी 3 डी एडिटर में टॉगल बटन का जवाब खोजने के लिए दिनों की तलाश में था। सिर्फ एक सवाल - आप _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)दो बूलियन होने के बजाय सिर्फ क्यों इस्तेमाल नहीं करते ? मेरे लिए यह अच्छी तरह से काम करता है और कोड स्टैडनर्ड एकता बटन / टॉगल का उपयोग करने के करीब दिखता है
Ivaylo

1
@ इवलासोस्लाव I ने स्पष्टता के लिए एक उदाहरण के रूप में प्रयोग किया है
लास

4

टॉगल बटन की वर्तमान स्थिति को लौटाता है - या तो एक ही राज्य मूल्य में पारित होता है या उपयोगकर्ता द्वारा बदल दिया गया नया मान। तो एक बेहतर पैटर्न होगा ...

// 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 का उपयोग करें । डॉक्स भ्रामक हैं, यह वास्तव में बटन को एक साथ चलाता है:

टूलबार उदाहरण

इसके अतिरिक्त, आप इन बटन शैली को सीधे खींचने के लिए शैलियों "बटनलेफ्ट", "बटनमीड", "बटन राइट" का उपयोग कर सकते हैं।

        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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.