如何在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中找到的所有选项似乎都没有帮助。

Answers:


8

我通过使用按钮而不是切换按钮解决了这个问题。

首先在任何功能之前定义两种按钮样式:

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

然后OnInspectorGui()确保它们为null时生成:

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编辑器中找到切换按钮的答案。只是一个问题-为什么不使用_smoothValue = !GUILayout.Button( SetAmountFieldContent, _smoothValue ? ToggleButtonStyleToggled : ToggleButtonStyleNormal)而不是两个布尔值呢?这对我来说效果很好,代码看起来接近使用标准统一按钮/切换
Ivaylo Slavov

1
@IvayloSlavov我用作为为了清楚示例
拉塞

4

Toggle返回按钮的当前状态-传入的是相同的状态,或者是用户更改的新值。因此,更好的模式是...

// 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都将更改所有按钮的样式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.