Bagaimana cara membuat tombol sakelar di Unity Inspector?


13

Saya ingin membuat alat yang mirip dengan alat Terrain Unity, yang memiliki beberapa tombol sakelar yang bagus di inspektur:

Beralih tombol di inspektur Tombol berganti

Bagaimana saya bisa mencapai desain yang mirip dengan ini? Saya tahu cara membuat tombol normal dan komponen UI lainnya di inspektur, tetapi saya tidak dapat menemukan informasi yang cukup untuk membuat tombol beralih.

Sejauh ini saya telah menggunakan matikan normal yang menghasilkan kotak centang:

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

Mengatur toggle GUIStyleke "Button" tidak menghasilkan hasil yang diinginkan. Konten teks atau gambar berada di sebelah kiri tombol alih-alih di dalam.

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

Perilaku yang tidak diinginkan pada sakelar

Juga tidak ada opsi yang ditemukan di GUISkin tampaknya tidak membantu.

Jawaban:


8

Saya memecahkan masalah ini dengan menggunakan tombol alih-alih matikan.

Pertama-tama tentukan dua gaya tombol sebelum fungsi apa pun:

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

Kemudian OnInspectorGui()pastikan mereka dihasilkan jika nol:

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

Dan kemudian gunakan ide yang diusulkan oleh @jzx untuk beralih gaya:

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

Ini menghasilkan apa yang saya inginkan:

Tombol sakelar pertama Tombol sakelar kedua


1
Kerja bagus! Saya mencari berhari-hari untuk menemukan jawaban untuk tombol toggle di Unity3D Editor. Hanya satu pertanyaan - mengapa Anda tidak menggunakan saja _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal), alih-alih memiliki dua boolean? Itu bekerja dengan baik untuk saya dan kode terlihat dekat dengan menggunakan tombol / matikan kesatuan standar
Ivaylo Slavov

1
@IvayloSlavov Saya menggunakan itu sebagai contoh untuk kejelasan
Lasse

4

Toggle mengembalikan status tombol saat ini - baik kondisi yang sama dengan nilai yang diteruskan atau nilai baru seperti yang diubah oleh pengguna. Jadi pola yang lebih baik adalah ...

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

Anda dapat menggunakan pola swapping yang bergantung pada negara yang sama untuk 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

Ini adalah cara dasar, tetapi sederhana untuk melakukannya:

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

diambil dari sini


1
Ini adalah cara sederhana yang cukup sederhana untuk melakukan ini.
nsxdavid

2

Gunakan GUILayout.Toolbar . Dokumen menyesatkan, sebenarnya menjalankan tombol bersama:

contoh toolbar

Selain itu, Anda dapat menggunakan gaya "buttonleft", "buttonmid", "buttonright" untuk menggambar gaya tombol ini secara langsung.

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

0

Kamu bisa melakukan ini:

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

Sangat penting bagi Anda untuk memulai buttonStyledi dalam OnInspectorGUI()jika tidak Anda akan mendapatkan kesalahan. Juga, jangan lakukan buttonStyle = GUI.skin.button;karena Anda akan menyalin skin.buttonreferensi dan setiap perubahan buttonStyleakan mengubah semua gaya tombol.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.