WinCNT

Unity의 인스펙터에 버튼 표시하기 본문

Unity/Unity 관련

Unity의 인스펙터에 버튼 표시하기

WinCNT_SSS 2023. 2. 17. 11:35

급히 유니티의 컴포넌트를 하나 만들게 되었다

필요할 때 실행하는 컴포넌트였기 때문에 인스펙터에 버튼을 추가하고 싶었다

 

그런데 유니티 Button이라고 검색하니 버튼 컴포넌트에 대한 내용만 나와서…

인스펙터에 버튼 표시하기로 검색하니 적당한 내용이 나오길래

실험삼아 구현해보고 대략적인 소스 코드를 정리해두려고 한다


Unity Inspector에 버튼 추가하기

결론부터 말하자면 각각 MonoBehaviour와 Editor를 계승한 스크립트가 필요했다

 

실제로 실행할 처리를 구현한 스크립트는 다음과 같다

using UnityEngine;

public class Test : MonoBehaviour
{
    public void OnClikedCustomButton()
    {
        Debug.Log("Click");
    }
}

컴포넌트의 인스펙터에 버튼을 표시할 스크립트는 다음과 같이 쓴다

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestButton : Editor
{   
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        
        Test component = (Test)target;
        if (GUILayout.Button("Test Button"))
            component.OnClikedCustomButton();
    }
}

당연히 실제 실행할 함수의 이름이 일치해야 한다

위의 코드에서는 OnClikedCustomButton()라는 함수이다

 

그리고 Test란 컴포넌트를 GameObject에 붙이면 다음과 같이 나온다

 

버튼을 눌러보면 잘 작동한다

 

참고로 이번에 구현할 컴포넌트는 검증용이라 딱히 확장성을 신경 안 써도 되서…

그냥 두 클래스를 하나의 파일에 합쳐놓았다

using UnityEngine;
using UnityEditor;

public class Test : MonoBehaviour
{
    public void OnClikedCustomButton()
    {
        Debug.Log("Click");
    }
}

[CustomEditor(typeof(Test))]
public class TestButton : Editor
{   
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        
        Test component = (Test)target;
        if (GUILayout.Button("Test Button"))
            component.OnClikedCustomButton();
    }
}

문제 없이 작동하길래 이걸로 결정했다

문제가 생긴다면 그 때 가서 생각해야지

2023-07-10)

비슷한 안건으로 테스트했는데 문제가 생겼다!

바로 Editor를 상속한 클래스(TestButton)가 빌드 시에 포함되면 에러가 발생한다

역시 정공법대로 분리해서 Editor 폴더에 만드는 게 나을 듯 하다


마무리

Unity에 대해 잘 모르지만 검색만 잘 하면 레퍼런스가 잘 나오는 게임 엔진이라는 걸 새삼 깨달았다


참고 사이트

[Unity3D] Editor - 인스펙터 커스텀 버튼 만들기

 

[Unity3D] Editor - 인스펙터 커스텀 버튼 만들기

인스펙터 커스텀 버튼 만들기 작성 기준 버전 :: 2018.3.2f1 유니티 엔진에서 게임을 제작할 때, 모든 작업을 일일이 수작업으로 진행하면 개발 시간이 길어진다. 특히 같은 오브젝트를 여러 개 생

wergia.tistory.com