using UVC.UI.Menu; using System.Collections.Generic; using UVC.UI.Commands; // DebugLogCommand 등 기본 Command 사용 시 // using SampleProject.UI.Commands; // 프로젝트별 Command 사용 시 using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용 using System; namespace SampleProject.UI.Menu { public class SampleProjectTopMenuController : TopMenuController { protected override void Awake() { // 1. 동일한 GameObject에서 SampleProjectTopMenuView 컴포넌트 검색 view = GetComponent(); // 2. 동일한 GameObject에 없다면, 자식 GameObject에서 검색 if (view == null) { view = GetComponentInChildren(); } // view가 여전히 null이라면, 부모 타입(TopMenuView)으로 다시 한번 검색 (선택 사항) if (view == null) { ULog.Warning("SampleProjectTopMenuView를 찾을 수 없어 TopMenuView로 검색합니다."); base.Awake(); // 부모의 Awake를 호출하여 TopMenuView를 찾도록 시도 } } protected override void Start() { // model과 _locManager는 부모 클래스에서 protected로 선언되어 접근 가능 // 만약 부모의 Start 로직을 완전히 대체하고 싶지 않다면 base.Start()를 호출할 수 있습니다. // 여기서는 메뉴 아이템 구성을 완전히 새로 하므로 base.Start()를 호출하지 않거나, // 호출 후 model.MenuItems.Clear()를 다시 수행합니다. model = new TopMenuModel(); // 새 모델 인스턴스 또는 프로젝트별 모델 사용 _locManager = UVC.Locale.LocalizationManager.Instance; // LocalizationManager 인스턴스 가져오기 if (view == null) { ULog.Error("SampleProjectTopMenuView가 Inspector에서 할당되지 않았거나 찾을 수 없습니다."); return; } if (_locManager == null) { ULog.Error("LocalizationManager 인스턴스를 찾을 수 없습니다. 메뉴 텍스트가 올바르게 표시되지 않을 수 있습니다."); } InitializeMenuItems(); // 프로젝트별 메뉴 아이템 초기화 메서드 호출 view.ClearMenuItems(); view.CreateMenuItems(model.MenuItems, view.MenuContainer); view.OnMenuItemClicked += HandleMenuItemClicked; // 부모의 핸들러 재사용 또는 override if (_locManager != null) { _locManager.OnLanguageChanged += HandleLanguageChanged; // 부모의 핸들러 재사용 또는 override } ULog.Debug("SampleProjectTopMenuController Start 실행됨"); } // 부모의 OnDestroy를 그대로 사용하거나, 필요시 override하여 로직 추가/변경 // protected new void OnDestroy() // { // base.OnDestroy(); // // 프로젝트별 리소스 해제 로직 추가 // } /// /// 프로젝트에 특화된 메뉴 아이템들을 초기화합니다. /// TopMenuController의 InitializeMenuItems를 override하거나, /// 이처럼 새로운 메서드를 만들어 사용할 수 있습니다. /// protected override void InitializeMenuItems() { model.MenuItems.Clear(); // 기존 메뉴 아이템 제거 // 예시: "파일" 메뉴는 유지하되, "새 프로젝트" 제거 및 "프로젝트 설정" 추가 model.MenuItems.Add(new MenuItemData("file", "menu_file", subMenuItems: new List { new MenuItemData("file_new_file", "menu_file_new_file", new DebugLogCommand("[SampleProject] 새 파일 선택됨")), new MenuItemData("file_open", "menu_file_open", new DebugLogCommand("[SampleProject] 파일 열기 선택됨")), MenuItemData.CreateSeparator("file_sep_sample1"), new MenuItemData("project_settings", "project_settings_key", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨")), // 프로젝트별 메뉴 아이템 MenuItemData.CreateSeparator("file_sep_sample2"), new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand()) })); // "편집" 메뉴는 그대로 사용 (부모 클래스의 메뉴 아이템 구성을 재활용하거나 여기서 다시 정의) model.MenuItems.Add(new MenuItemData("edit", "menu_edit", subMenuItems: new List { new MenuItemData("edit_undo", "menu_edit_undo", new DebugLogCommand("[SampleProject] 실행 취소 선택됨")), new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("[SampleProject] 다시 실행 선택됨")) })); // "도움말" 메뉴 추가 (프로젝트별) model.MenuItems.Add(new MenuItemData("help", "menu_help_key", subMenuItems: new List { new MenuItemData("help_about", "menu_about_key", new DebugLogCommand("[SampleProject] 프로그램 정보 선택됨")) })); if (_locManager != null) { // 언어 메뉴는 부모와 동일하게 유지하거나, 프로젝트별로 변경 가능 model.MenuItems.Add(new MenuItemData("language", "menu_language", subMenuItems: new List { new MenuItemData("lang_ko", "menu_lang_korean", new ChangeLanguageCommand("ko-KR", _locManager)), new MenuItemData("lang_en", "menu_lang_english", new ChangeLanguageCommand("en-US", _locManager)), // new MenuItemData("lang_jp", "menu_lang_japanese", new ChangeLanguageCommand("ja-JP", _locManager)) // 예: 일본어 추가 })); } else { ULog.Warning("[SampleProject] LocalizationManager가 null이므로 언어 변경 메뉴를 초기화할 수 없습니다."); } } // HandleMenuItemClicked와 HandleLanguageChanged는 필요에 따라 override하여 // 프로젝트별 특별한 처리를 추가할 수 있습니다. // 예시: // protected override void HandleMenuItemClicked(MenuItemData clickedItemData) // { // base.HandleMenuItemClicked(clickedItemData); // 부모 로직 실행 // ULog.Debug($"[SampleProject] 메뉴 아이템 클릭됨: {clickedItemData.ItemId}"); // // 프로젝트별 추가 클릭 처리 로직 // } } }