Unity Inspector'da nasıl bir geçiş düğmesi oluştururum?


13

Müfettişte güzel geçiş düğmeleri bulunan Unity'nin Arazi aracına benzer bir araç oluşturmak istiyorum:

Müfettişteki düğmeleri aç / kapat Geçiş düğmesi

Buna benzer tasarımı nasıl başarabilirim? Müfettişte normal düğmeler ve diğer UI bileşenleri oluşturmayı biliyorum, ancak düğmeler arasında geçiş yapmak için yeterli bilgi bulamıyorum.

Şimdiye kadar bir onay kutusu üreten normal geçişler kullandık:

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

Mafsalın GUIStyle"Düğme" olarak ayarlanması istenen sonucu vermez. Metin veya görüntü içeriği, içeride değil düğmenin solunda yer alır.

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

Geçişte istenmeyen davranış

Ayrıca GUISkin'de bulunan seçeneklerin hiçbiri yardımcı görünmüyor.

Yanıtlar:


8

Geçiş yapmak yerine düğmeleri kullanarak bu sorunu çözdüm.

Önce herhangi bir işlevden önce iki düğme stili tanımlayın:

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

Sonra OnInspectorGui()null ise oluşturulduğundan emin olun:

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

Ve sonra stilleri değiştirmek için @jzx tarafından önerilen fikri kullanın:

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

Bu istediğimi üretir:

İlk değiştirilen düğme İkinci geçiş düğmesi


1
İyi iş! Unity3D Editör'de geçiş düğmeleri için cevabı bulmak için günler arıyordum. Sadece bir soru - neden _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)iki boolean yerine neden kullanmıyorsunuz ? Bu benim için iyi çalışıyor ve kod stadnard birlik düğmesini / geçişlerini kullanmaya yakın görünüyor
Ivaylo Slavov

1
@IvayloSlavov Bunu açıklık için bir örnek olarak kullandım
Lasse

4

Geçiş , düğmenin geçerli durumunu döndürür - ya değerde geçen durum ya da kullanıcı tarafından değiştirilen yeni değer. Yani daha iyi bir kalıp ...

// 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 için aynı duruma bağlı değiştirme desenini kullanabilirsiniz.

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

3

İşte bunu yapmanın temel ancak basit bir yolu:

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

buradan alındı


1
Bu, bunu yapmanın oldukça basit bir yoludur.
nsxdavid

2

GUILayout.Toolbar öğesini kullanın . Dokümanlar yanıltıcıdır, aslında düğmeleri birlikte çalıştırır:

araç çubuğu örneği

Ayrıca, bu düğme stilini doğrudan çizmek için "buttonleft", "buttonmid", "buttonright" stillerini kullanabilirsiniz.

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

0

Bunu yapabilirsiniz:

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

Bu instanciate çok önemli buttonStyleiçeride OnInspectorGUI()aksi halde hata alırsınız. Ayrıca, referansı buttonStyle = GUI.skin.button;kopyalayacağınız skin.buttonve herhangi bir değişiklik buttonStyletüm düğme stillerini değiştireceği için yapmayın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.