Search
Duplicate

GUI(Editor) 설계 및 기능

1. EditorApplication 클래스

역할: 에디터의 중심 클래스 역할을 하며, 에디터의 초기화, 업데이트, 렌더링, 종료 등 주요 루프를 담당.
목적:
에디터의 메인 프로세스를 제어하고, 주요 기능(프로젝트 열기, 씬 저장 등)을 실행.
여러 EditorWindow를 관리하며 이를 통해 UI의 다양한 창을 제어.
주요 기능:
Initialize(): 에디터 초기화.
Update(): 로직 업데이트.
OnGUI(): 렌더링 업데이트.
Run(): 메인 루프 실행.
Release(): 종료 및 리소스 해제.
창 검색 기능(GetWindow): 이름으로 특정 윈도우 객체 반환.
여러 프로젝트 및 씬 관련 작업(OpenProject, SaveScene, OpenScene 등).
#pragma once #include "guiEditor.h" #include "guiEditorWindow.h" #include "..\\YamYamEngine_SOURCE\\yaRenderTarget.h" namespace gui { /// <summary> /// EditorApplication 클래스는 에디터에서 사용되는 메인 클래스로 /// 에디터의 메인 루프를 실행하고 에디터의 초기화 및 종료를 담당합니다. /// </summary> class EditorApplication { public: enum class eState { Disable, Active, Destroy, }; template <typename T> T* GetWindow(const std::wstring& name) { auto iter = mEditorWindows.find(name); if (iter == mEditorWindows.end()) return nullptr; return dynamic_cast<T*>(iter->second); } ///<summary> ///에디터를 초기화합니다. ///</summary> static bool Initialize(); /// <summary> /// 에디터를 로직을 업데이트합니다. /// </summary> static void Update(); /// <summary> /// 에디터 렌더링을 업데이트합니다. /// </summary> static void OnGUI(); /// <summary> /// 에디터 업데이트 /// </summary> static void Run(); /// <summary> /// 에디터를 종료합니다. /// </summary> static void Release(); static void OpenProject(); static void NewScene(); static void SaveScene(); static void SaveSceneAs(); static void OpenScene(const std::filesystem::path& path); private: static bool imGguiInitialize(); static void imGuiRender(); static std::map<std::wstring, EditorWindow*> mEditorWindows; static ImGuiWindowFlags mFlag; static ImGuiDockNodeFlags mDockspaceFlags; static eState mState; static bool mFullScreen; static ya::math::Vector2 mViewportBounds[2]; static ya::math::Vector2 mViewportSize; static bool mViewportFocused; static bool mViewportHovered; static ya::graphics::RenderTarget* mFrameBuffer; }; }
C++
복사

2. Editor 클래스

역할: 에디터 내부의 특정 컴포넌트를 커스터마이징하고 관리.
목적:
특정 객체의 Inspector 기능을 재정의하거나 확장하여, 커스터마이즈된 UI와 편집 기능 제공.
주요 기능:
Initialize(), Update(), OnGUI(): 초기화, 갱신, 렌더링.
OnEnable(), OnDisable(), OnDestroy(): 상태 변화 및 종료 처리.
mState: 컴포넌트의 상태(Paused, Active, 등)를 관리.
#pragma once #include "guiEntity.h" namespace gui { /// <summary> /// Editor는 특정 컴포넌트의 Inspector를 커스터마이징하는 데 사용됩니다. /// Inspector 창에 표시되는 UI를 재정의하거나 확장합니다. /// </summary> class Editor : public Entity { public: enum class eState { Paused, Active, Disabled, Destroyed }; Editor(); virtual ~Editor(); virtual void Initialize(); virtual void Update(); virtual void OnGUI(); virtual void OnEnable(); virtual void OnDisable(); virtual void OnDestroy(); private: eState mState; }; }
C++
복사

3. EditorWindow 클래스

역할: 독립적인 창(UI)을 생성 및 관리하며, 에디터에 새로운 도구나 워크플로우를 추가.
목적:
사용자 인터페이스의 독립적인 창을 통해 새로운 도구 및 기능 제공.
각각의 창이 독립적으로 초기화, 업데이트, 렌더링을 수행.
주요 기능:
Initialize(), Update(), OnGUI(): 윈도우 초기화, 갱신, 렌더링.
Run(): 창 실행.
상태 관리(mState): 창의 상태를 Disable, Active, Destroy로 관리.
크기 및 속성 관리: GetSize(), SetSize(), GetFlag(), 등.
#pragma once #include "guiEntity.h" namespace gui { /// <summary> /// EditorWindow는 독립적인 창을 생성하여 에디터에 새로운 도구나 워크플로우를 추가하는 데 사용됩니다. /// 에디터 에서 실행되는 완전히 새로운 사용자 인터페이스를 제공합니다. /// </summary> class EditorWindow : public Entity { public: enum class eState { Disable, Active, Destroy, }; EditorWindow(); virtual ~EditorWindow(); virtual void Initialize(); virtual void Update(); virtual void OnGUI(); virtual void Run(); virtual void OnEnable(); virtual void OnDisable(); virtual void OnDestroy(); ImGuiWindowFlags GetFlag() const { return mFlag; } eState GetState() const { return mState; } void SetState(eState state) { mState = state; } ImVec2 GetSize() { return mSize; } void SetSize(ImVec2 size) { mSize = size; } private: ImGuiWindowFlags mFlag; eState mState; ImVec2 mSize; }; }
C++
복사

클래스 간 관계 및 작동 방식

1.
EditorApplication
에디터의 중심으로 EditorWindow와 같은 하위 객체를 관리.
전체 루프와 주요 기능을 제어.
2.
EditorWindow
독립적인 창을 관리하며, EditorApplication에 의해 호출 및 렌더링.
3.
Editor
EditorWindow 또는 EditorApplication의 일부로 특정 객체의 Inspector 또는 컴포넌트를 담당.

예시 흐름

1.
EditorApplication 초기화 및 실행 → 여러 EditorWindow 객체 생성.
2.
EditorWindow 가 독립적으로 UI 및 동작을 관리.
3.
특정 창에서 Editor 객체가 Inspector 기능 커스터마이징.
이 구조는 확장성과 유지보수성을 고려하여 잘 설계된 구조로 보입니다.

GUILayout 클래스

역할:

에디터에서 UI 요소를 효율적으로 배치하기 위한 도구 클래스.
EditorEditorWindow를 커스터마이징할 때 자동 레이아웃 계산을 제공하여 개발자가 UI 요소의 배치를 쉽게 구성할 수 있도록 돕는다.

목적:

개발자가 UI를 배치할 때 세부적인 위치나 크기를 수동으로 지정할 필요 없이, 자동으로 적절한 위치를 계산.
동적인 레이아웃 관리:
창 크기 변경, 요소 추가/삭제 시 자동으로 배치가 조정됨.
일정한 간격, 정렬, 비율 등 UI 구성의 일관성을 유지.

예상되는 기능 (현재 코드에는 정의되어 있지 않음):

아직 클래스 내부가 구현되지 않았지만, 일반적인 GUILayout 클래스에서 기대할 수 있는 기능은 다음과 같습니다:
1.
컨테이너 기능:
UI 요소들을 포함하는 영역 정의.
컨테이너 크기와 정렬에 따라 자식 요소들의 위치를 자동으로 결정.
2.
레이아웃 관련 함수:
Horizontal Layout: UI 요소들을 가로로 배치.
Vertical Layout: UI 요소들을 세로로 배치.
Grid Layout: UI 요소들을 그리드 형식으로 배치.
예:
cpp 코드 복사 GUILayout::BeginHorizontal(); GUILayout::Button("Button 1"); GUILayout::Button("Button 2"); GUILayout::EndHorizontal();
C++
복사
3.
간격 및 정렬:
요소 간 간격 설정 (padding, spacing).
정렬(왼쪽, 오른쪽, 중앙) 지원.
4.
동적 크기 관리:
UI 요소가 창 크기에 따라 자동으로 크기를 조정.
5.
상태 관리:
레이아웃 시작/종료(BeginLayout, EndLayout).

클래스 사용 예시 (가상 코드):

cpp 코드 복사 void EditorWindow::OnGUI() { GUILayout::BeginVertical(); GUILayout::Label("Settings"); GUILayout::Button("Save"); GUILayout::Button("Cancel"); GUILayout::EndVertical(); }
C++
복사
위와 같이 GUILayout을 사용하면 UI 구성 요소를 논리적이고 간단하게 정의 가능.

정리:

GUILayout 클래스는 에디터에서 UI 작업을 간소화하고 효율적으로 만들기 위해 설계된 자동 레이아웃 관리 도구입니다.
EditorEditorWindow 클래스와 함께 사용되어, UI 커스터마이징의 복잡도를 줄이고 생산성을 높이는 것이 주된 목표입니다.
추후 내부 구현에서 실제 기능과 사용 사례가 추가되면 더 많은 세부사항을 정의할 수 있을 것입니다.
#pragma once namespace gui { /// <summary> /// GUILayout 클래스는 에디터에서 UI를 만들기 위해 제공되는 클래스 중 하나로 /// 자동으로 레이아웃을 계산하여 간단하게 UI 요소를 배치할 수 있도록 돕습니다. /// Editor나 EditorWindow를 커스터마이징할 때 사용됩니다. /// </summary> class GUILayout { //To do ... }; }
C++
복사