오늘 신기한 시도를 해봤다,
이 InspectorWindow를
이런 식으로 side by side 형태으로 만들고 싶었다.
일단 타입을 가지고 오는 것은 성공했고 생각보다 쉽다.
public static System.Type inspectorType = System.Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll");
리플렉션을 사용해서 dll 파일에서 Type을 뜯어올 수 있다.
결론을 말하겠다 실패했다.
Docking은 가능하지만 위 창 처럼 분리를 하는 것은 불가능하다(임의로 Position을 옮겨서 따라하는 것은 가능함) 내부적으로 Split하는 부분이 어딨는지 모르겠고 그에 관한 문서도 존재하지 않는다.
Docking
두개의 Window를 Dockig하는 방법은 두가지가 있다. GetMethod 함수를 활용해서 dll 파일에 접근 하거나 또는 GetWindow를 할때 Docking을 하는 방법이 있다.
// 첫번 째 방식
_inspectorWindow = (ScriptableObject.CreateInstance(inspectorType) as EditorWindow);
_inspectorWindow.Show();
_inspectorWindow = GetWindow(inspectorType);
_inspectorWindow.minSize = new Vector2(400, 600);
_inspectorWindow.maxSize = new Vector2(400, 600);
_wndTest1 = GetWindow<Test>("Inspector", true,
new Type[] { inspectorType });
_wndTest1.titleContent = new GUIContent("Test_1");
_wndTest1.minSize = new Vector2(400, 600);
_wndTest1.maxSize = new Vector2(400, 600);
// 두번 째 방식
var dockedWindowType = typeof(EditorWindow).Assembly.GetType("UnityEditor.DockArea");
var dockedWindow = dockedWindowType.GetMethod("Dock", BindingFlags.NonPublic | BindingFlags.Instance);
if (dockedWindow != null)
{
dockedWindow.Invoke(_inspectorWindow, new object[] { _wndTest1 });
}
두개의 Window를 정의한다. CreateInstance를 사용하는 이유는 GetWindow를 사용하기에는 엑세스가 불가능한 타입을 사용하는 이유도 있고 System.Type이라는 특정 되지 않는 Type를 매개변수로 넘겨줘야 하기 때문에 Window를 받아올 수 가 없다 따라서 직접 생성을 하는 방식이 유효하다.
그리고 두번 째 Window를 정의 할 때 매개변수로 Type Array를 넣는다. Docking 할 위치를 정해주는 매개변수다.
이렇게 한다면 Docking을 구현할 수 있다.
두번째 방식으로는 직접 Type을 가지고 오고 GetMethod 함수를 사용해서 Dock이라는 함수를 들고와 연결해주는 방식이다.
여튼 이런 식으로 하면 Docking이 구현이 된다.
결론
아마 유니티 내부적인 Event를 뜯다보면 Mosue Up할때 Split해주는 이벤트가 있지 않을까 싶다. 마우스가 다운 됐을 때 Window를 옮길 수 있고 다시 Up할때 위치에 따라 Split을 해주기 때문이다.
보이는 거와 같이 가능한 모습.
dll 파일을 뜯어서 확인을 해봤다.
SplitView라는 Class가 저렇게 분할하는 기능을 맡고 있다는 것을 알게 되었다. 유니티는 내부적으로 View라는 클래스를 사용하여 Editor에 View들을 띄우게 된다. (Game, Scene 등등) 이런 뷰들을 분할해서 보여주는 기능이다.
여튼 간에 SplitView는 Rect 연산과 Mouse입력 이벤트를 통해서 Split를 해주는 것으로 보인다. View라는 클래스 자체에 View라는 다른 클래스를 자식으로 삼을 수 있는 것을 보아 EditorWindow도 m_parent라는 변수를 가지고 있어 Editor에 띄울 수 있는데 참조를 막아놔서 가지고 오는 것은 불가능하다.
'Unity' 카테고리의 다른 글
[Unity] SOManagementWindow 제작 일기 Part.2 (0) | 2025.04.25 |
---|---|
[Unity] SOManagementWindow 제작 일기 Part.1 (0) | 2025.04.25 |
[졸업작품, Unity] 아이작 방 생성 알고리즘 구현 (0) | 2025.04.03 |
[Unity]UniTask란? (0) | 2025.03.31 |
[Unity] 2D 환경에서 점프 구현 (y축 이동이 구현되어 있을 때) (0) | 2025.03.17 |