Unity Inspector에서 토글 버튼을 어떻게 만듭니 까?


13

인스펙터에 멋진 토글 버튼이있는 Unity의 Terrain 툴과 유사한 툴을 만들고 싶습니다 :

인스펙터의 버튼 토글 토글 버튼

이와 비슷한 디자인을 어떻게 얻을 수 있습니까? 인스펙터에서 일반 버튼과 다른 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()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)두 개의 부울 대신을 사용하지 않습니까? 즉 stadnard 단결 버튼 / 토글을 사용하여 가까운 저와 코드 외모 잘 작동
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.buttonbuttonStyle

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.