Unity SceneUI View Toggle

Unity에서 Unreal처럼 SceneView의 보이는 UI에 대한 Toggle키를 만들었습니다.

SceneViewGameModeToggle.zip 다운로드

 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
70
71
72
73
74
75
76
77
#if UNITY_EDITOR

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class SceneViewGameModeToggle
{
    static bool isGameMode = false;

    static SceneViewGameModeToggle()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView sceneView)
    {
        Event e = Event.current;

        if (e.type == EventType.KeyDown && e.keyCode == KeyCode.G)
        {
            ToggleGameMode(sceneView);
            e.Use(); // 이벤트 소비
        }
    }

    static void ToggleGameMode(SceneView sceneView)
    {
        isGameMode = !isGameMode;

        // Gizmo on/off
        sceneView.drawGizmos = !isGameMode;

        // Selection outline / wireframe
        Tools.hidden = isGameMode;

        // Scene 아이콘 (라이트, 카메라 등)
        AnnotationUtility.SetIconState(isGameMode ? 0 : 1);

        SceneView.RepaintAll();
    }
}

/// <summary>
/// 내부 API (아이콘 표시 제어)
/// </summary>
static class AnnotationUtility
{
    static System.Type annotationUtilityType;
    static System.Reflection.MethodInfo setIconEnabledMethod;

    static AnnotationUtility()
    {
        annotationUtilityType = typeof(Editor).Assembly.GetType("UnityEditor.AnnotationUtility");
        setIconEnabledMethod = annotationUtilityType.GetMethod(
            "SetIconEnabled",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic
        );
    }

    public static void SetIconState(int enabled)
    {
        var annotations = annotationUtilityType.GetMethod(
            "GetAnnotations",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic
        ).Invoke(null, null) as System.Array;

        foreach (var annotation in annotations)
        {
            var classId = (int)annotation.GetType().GetField("classID").GetValue(annotation);
            var scriptClass = (string)annotation.GetType().GetField("scriptClass").GetValue(annotation);
            setIconEnabledMethod.Invoke(null, new object[] { classId, scriptClass, enabled });
        }
    }
}

#endif
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Hugo로 만듦
JimmyStack 테마 사용 중