Làm cách nào để tạo nút chuyển đổi trong Unity Inspector?


13

Tôi muốn tạo một công cụ tương tự như công cụ Địa hình của Unity, có một số nút chuyển đổi đẹp trong trình kiểm tra:

Chuyển đổi các nút trong thanh tra Nút bấm

Làm thế nào tôi có thể đạt được thiết kế tương tự như thế này? Tôi biết cách tạo các nút bình thường và các thành phần UI khác trong trình kiểm tra, nhưng tôi không thể tìm thấy đủ thông tin để làm cho các nút chuyển đổi.

Cho đến nay tôi đã sử dụng các toggles bình thường tạo ra một hộp kiểm:

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

Đặt nút chuyển GUIStylethành "Nút" không tạo ra kết quả mong muốn. Nội dung văn bản hoặc hình ảnh nằm bên trái nút thay vì bên trong.

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

Hành vi không mong muốn trên chuyển đổi

Ngoài ra, không có tùy chọn nào được tìm thấy trong GUISkin dường như không có ích.

Câu trả lời:


8

Tôi đã giải quyết vấn đề này bằng cách sử dụng các nút thay vì bật tắt.

Đầu tiên xác định hai kiểu nút trước bất kỳ chức năng nào:

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

Sau đó, OnInspectorGui()đảm bảo chúng được tạo nếu null:

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

Và sau đó sử dụng ý tưởng được đề xuất bởi @jzx để chuyển đổi các kiểu:

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

Điều này tạo ra những gì tôi muốn:

Nút bật đầu tiên Nút bật thứ hai


1
Bạn đã làm rất tốt! Tôi đã tìm kiếm nhiều ngày để tìm câu trả lời cho các nút chuyển đổi trong Unity3D Editor. Chỉ một câu hỏi - tại sao bạn không sử dụng _smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal), thay vì có hai booleans? Điều đó hoạt động tốt đối với tôi và mã trông gần giống với việc sử dụng nút / toggles stadnard
Ivaylo Slavov

1
@IvayloSlavov Tôi đã sử dụng nó như một ví dụ cho sự rõ ràng
Lasse

4

Toggle trả về trạng thái hiện tại của nút - hoặc cùng trạng thái được truyền trong giá trị hoặc giá trị mới do người dùng thay đổi. Vì vậy, một mô hình tốt hơn sẽ là ...

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

Bạn có thể sử dụng mô hình hoán đổi phụ thuộc vào trạng thái tương tự cho GUIStyles.

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

2

Đây là một cách cơ bản, nhưng đơn giản để làm điều đó:

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

lấy từ đây


2

Sử dụng GUILayout.Toolbar . Các tài liệu sai lệch, nó thực sự chạy các nút với nhau:

ví dụ thanh công cụ

Ngoài ra, bạn có thể sử dụng các kiểu "buttonleft", "buttonmid", "buttonright" để vẽ trực tiếp các kiểu nút này.

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

0

Bạn có thể làm được việc này:

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

Điều rất quan trọng là bạn phải vận động buttonStylebên trong OnInspectorGUI()nếu không bạn sẽ gặp lỗi. Ngoài ra, đừng làm buttonStyle = GUI.skin.button;vì bạn sẽ sao chép skin.buttontham chiếu và mọi thay đổi trên buttonStylesẽ thay đổi tất cả các kiểu nút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.