[Unity Editor] Editor Window에서 Show Button 만드는 법은 없어요.

컨디션


Windows 10
Unity 5.6.1f1

일의 발단


한 번은 아래의 Editor Window 반을 할 때 오류가 발생했습니다.
TestEditorWindow.cs
using UnityEngine;
using UnityEditor;

public class TestEditorWindow : EditorWindow
{
    [MenuItem("Tools/TestEditorWindow")]
    static public void Open()
    {
        GetWindow<TestEditorWindow>();
    }

    void ShowButton()
    {
    }
}

이게 뭐야...

잘못


MSDN( https://msdn.microsoft.com/ja-jp/library/4k9x6bc0(v=vs.110).aspx ) 근거
parameters 그룹에 정확한 인자가 없습니다.
이 뜻의 잘못.(TargetParameterCountException)

잘못된 곳


스택 추적 중
UnityEditor.HostView.ShowGenericMenu () (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:350)
그래서, HostView.cs에서 오류가 발생한 것 같습니다.

오류가 발생한 곳의 코드를 보다


HostView.왜냐하면 cs가 DLL에 숨겨져 있거든요.
다음 저장소에서 Unity 내부의 소스 코드를 읽습니다.

HostView.cs 내용


Unity5.6.0f3 컴파일된 HostView.cs를 읽었는데 쇼버튼 방법을 반사로 부르는 곳이 있었다.
HostView.cs 350~370 줄의 원본 코드
protected void ShowGenericMenu()
{
    GUIStyle gUIStyle = "PaneOptions";
    Rect rect = new Rect(base.position.width - gUIStyle.fixedWidth - 4f, Mathf.Floor((float)(this.background.margin.top + 20) - gUIStyle.fixedHeight), gUIStyle.fixedWidth, gUIStyle.fixedHeight);
    if (EditorGUI.DropdownButton(rect, GUIContent.none, FocusType.Passive, "PaneOptions"))
    {
        this.PopupGenericMenu(this.m_ActualView, rect);
    }
    MethodInfo paneMethod = this.GetPaneMethod("ShowButton", this.m_ActualView);
    if (paneMethod != null)
    {
        object[] parameters = new object[]
        {
            new Rect(base.position.width - gUIStyle.fixedWidth - 20f, Mathf.Floor((float)(this.background.margin.top + 4)), 16f, 16f)
        };
        paneMethod.Invoke(this.m_ActualView, parameters);
    }
}
HostView.cs의 170~190 줄 소스 코드
private MethodInfo GetPaneMethod(string methodName)
{
    return this.GetPaneMethod(methodName, this.m_ActualView);
}
private MethodInfo GetPaneMethod(string methodName, object obj)
{
    MethodInfo result;
    if (obj == null)
    {
        result = null;
    }
    else
    {
        for (Type type = obj.GetType(); type != null; type = type.BaseType)
        {
            MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
Rect형 변수를 매개변수로 지정하여 반사를 통해 ShowButon 메서드를 호출합니다.
방금 오류는 Editor Window에서 매개 변수가 없는 ShowButon 방법을 정의했기 때문에 발생한 것 같습니다.

ShowButton(Rectr)을 정의해 보십시오.


다음 Editor Window 클래스를 생성하고 창을 엽니다.
TestEditorWindow.cs
using UnityEngine;
using UnityEditor;

public class TestEditorWindow : EditorWindow
{
    [MenuItem("Tools/TestEditorWindow")]
    static public void Open()
    {
        GetWindow<TestEditorWindow>();
    }

    void ShowButton(Rect r)
    {
        Debug.Log("called ShowButton");
    }
}

ShowButon 방법이 호출되었음을 확인했습니다.(완료

총결산


Editor Window반에서 Show Button 방법을 만들면 Unity 쪽에서 마음대로 부르기 때문에 Show Button 방법을 만들 수 없습니다.

좋은 웹페이지 즐겨찾기