#nullable enable using UnityEngine; using UnityEngine.UIElements; using UVC.Core; using UVC.Studio.Manager; using UVC.UIToolkit; using UVC.UIToolkit.Util; namespace UVC.Studio { /// UIDocument 타입 충돌 방지용 마커 래퍼 — Static UI Document public sealed class StaticUIDocument { public readonly UIDocument Value; public StaticUIDocument(UIDocument v) { Value = v; } } /// UIDocument 타입 충돌 방지용 마커 래퍼 — Dynamic UI Document public sealed class DynamicUIDocument { public readonly UIDocument Value; public DynamicUIDocument(UIDocument v) { Value = v; } } /// UIDocument 타입 충돌 방지용 마커 래퍼 — Modal UI Document public sealed class ModalUIDocument { public readonly UIDocument Value; public ModalUIDocument(UIDocument v) { Value = v; } } public class StudioSceneContext : InjectorSceneContext { /// /// StudioSceneContext 인스턴스에 접근하기 위한 편의 프로퍼티 /// public static new StudioSceneContext? Instance => InjectorSceneContext.Instance as StudioSceneContext; [SerializeField] private GizmoUndoBridge? gizmoUndoBridge; [SerializeField] private UndoRedoManager? undoRedoManager; [SerializeField] private UIDocument? staticUI; [SerializeField] private UIDocument? dynamicUI; [SerializeField] private UIDocument? modalUI; /// /// Scene 라이프사이클 서비스들을 등록합니다. /// 씬 로드 시 자동 호출되며, 씬 전환 시 자동으로 정리됩니다. /// protected override void RegisterSceneServices() { base.RegisterSceneServices(); // 여기에 StudioSceneContext에 등록할 서비스들을 추가하세요. Injector.RegisterSingleton(); if(gizmoUndoBridge != null) Injector.RegisterInstance(gizmoUndoBridge, ServiceLifetime.Scene); if(undoRedoManager != null) Injector.RegisterInstance(undoRedoManager, ServiceLifetime.Scene); if(staticUI != null) { staticUI.name = "StaticUI"; UTKPointerBlocker.Register(staticUI.rootVisualElement); Injector.RegisterInstance(new StaticUIDocument(staticUI), ServiceLifetime.Scene); UTKTopMenu? topMenu = staticUI.rootVisualElement.Q("topMenu"); if(topMenu != null) { Injector.RegisterInstance(topMenu, ServiceLifetime.Scene); } UTKToolBar? toolBar = staticUI.rootVisualElement.Q("toolBar"); if(toolBar != null) { Injector.RegisterInstance(toolBar, ServiceLifetime.Scene); } UTKPropertyTabListWindow? propertyWindow = staticUI.rootVisualElement.Q("propertyWindow"); if(propertyWindow != null) { Injector.RegisterInstance(propertyWindow, ServiceLifetime.Scene); // StageObjectManager 등록 var stageObjectManager = new StageObjectManager(); Injector.RegisterInstance(stageObjectManager); // SelectionManager 등록 (StageObjectManager, PropertyWindow 의존) var selectionManager = new SelectionManager(stageObjectManager, propertyWindow); Injector.RegisterInstance(selectionManager); } } if(dynamicUI != null) { dynamicUI.name = "DynamicUI"; Injector.RegisterInstance(new DynamicUIDocument(dynamicUI), ServiceLifetime.Scene); } if(modalUI != null) { modalUI.name = "ModalUI"; Injector.RegisterInstance(new ModalUIDocument(modalUI), ServiceLifetime.Scene); // 모달 UI를 사용하는 모든 UTK 컴포넌트에 루트 설정 필수 UTKAlert.SetRoot(modalUI.rootVisualElement); UTKColorPicker.SetRoot(modalUI.rootVisualElement); UTKDatePicker.SetRoot(modalUI.rootVisualElement); UTKModal.SetRoot(modalUI.rootVisualElement); UTKNotification.SetRoot(modalUI.rootVisualElement); UTKToast.SetRoot(modalUI.rootVisualElement); } var explorerWindow = new UTKTreeListWindow(); explorerWindow.Title = "Explorer"; Injector.RegisterInstance(explorerWindow, ServiceLifetime.Scene); var libraryWindow = new UTKAccordionListWindow(); libraryWindow.Title = "Library"; Injector.RegisterInstance(libraryWindow, ServiceLifetime.Scene); } } }