Posts 유니티 에디터 - 하이라키 윈도우 관련 코드 모음
Post
Cancel

유니티 에디터 - 하이라키 윈도우 관련 코드 모음

Memo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 1. 하이라키 윈도우 타입
public static Type HierarchyWindowType
{
    get
    {
        if (_hierarchyWindowType == null)
            _hierarchyWindowType = 
                typeof(EditorWindow).Assembly.GetTypes()
                .Where(t => t.Name == "SceneHierarchyWindow")
                .First();

        return _hierarchyWindowType;
    }
}
private static Type _hierarchyWindowType;


// 2. 하이라키 윈도우 객체
public static SearchableEditorWindow HierarchyWindow
{
    get
    {
        if (_hierarchyWindow == null)
            _hierarchyWindow = EditorWindow.GetWindow(HierarchyWindowType) as SearchableEditorWindow;

        return _hierarchyWindow;
    }
}
private static SearchableEditorWindow _hierarchyWindow;


// 3. 하이라키 윈도우에 포커스 되어 있는지 여부
public static bool IsFocusedOnHierarchyWindow
{
    get
    {
        var focused = EditorWindow.focusedWindow;
        if (focused == null)
            return false;

        return focused.titleContent.text == "Hierarchy";
    }
}

// 하이라키 윈도우가 2개 이상이면 첫 번째 하이라키 윈도우에만 제대로 인식되는 문제가 있음
public static bool IsFocusedOnHierarchyWindow2
    => EditorWindow.focusedWindow == HierarchyWindow;


// 4. 하이라키의 게임오브젝트가 선택된 상태에서 키 입력 이벤트 감지하기
[InitializeOnLoadMethod]
private static void StaticInitMethod()
{
    EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyWindow;
    EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyWindow;
}

private static void OnHierarchyWindow(int instanceID, Rect selectionRect)
{
    Event cur = Event.current;

    if (cur == null) return;
    if (Selection.activeGameObject == null) return;

    if (cur.type == EventType.KeyDown)
    {
        Debug.Log(cur.keyCode);
    }
}
This post is licensed under CC BY 4.0 by the author.