ฉันจะสร้างปุ่มสลับใน Unity Inspector ได้อย่างไร


13

ฉันต้องการสร้างเครื่องมือที่คล้ายกับเครื่องมือภูมิประเทศของ Unity ซึ่งมีปุ่มสลับบางปุ่มในตัวตรวจสอบ:

สลับปุ่มในตัวตรวจสอบ ปุ่มล็อค

ฉันจะออกแบบที่คล้ายกันนี้ได้อย่างไร ฉันรู้วิธีสร้างปุ่มปกติและส่วนประกอบ 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
เยี่ยมมาก! ฉันกำลังค้นหาวันเพื่อค้นหาคำตอบของปุ่มสลับใน Unity3D Editor แค่คำถามเดียว - ทำไมคุณไม่ใช้เพียงแค่_smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)มีบูลีนสองตัว? ที่ทำงานได้ดีสำหรับฉันและรหัสดูใกล้เคียงกับการใช้ปุ่มสามัคคีสลับ / สลับ
Ivaylo Slavov

1
@IvayloSlavov ฉันใช้มันเป็นตัวอย่างสำหรับความชัดเจน
Lasse

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 เอกสารกำลังทำให้เข้าใจผิดจริง ๆ แล้วมันรันปุ่มด้วยกัน:

ตัวอย่างแถบเครื่องมือ

นอกจากนี้คุณสามารถใช้สไตล์ "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จะเป็นการเปลี่ยนลักษณะของปุ่มทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.