using Cysharp.Threading.Tasks; using UVC.Locale; using UVC.Log; // LocalizationManager 사용을 위해 추가 namespace UVC.UI.Modal { /// /// 📜 모달 창에 어떤 내용을 보여줄지, 어떻게 행동할지 정하는 '레시피' 또는 '주문서' 같은 친구예요. /// 이 클래스의 객체를 만들어서 Modal.Open()에 전달하면, 여기에 적힌 대로 모달 창이 만들어져요. /// /// /// /// // "MyAwesomeModalPrefab"이라는 디자인을 사용하는 모달을 위한 레시피를 만들어요. /// var myRecipe = new ModalContent("Prefabs/UI/MyAwesomeModalPrefab") /// { /// Title = "새로운 모험!", // 모달 창 제목 /// Message = "모험을 시작할 준비가 되었나요?", // 모달 창 메시지 /// ConfirmButtonText = "네, 갑시다!", // 확인 버튼 글자 /// ShowCancelButton = false // 취소 버튼은 안 보여줄래요. /// }; /// /// // 이렇게 만든 레시피(myRecipe)를 Modal.Open()에 전달하면 모달이 뿅 나타나요! /// // bool userChoseConfirm = await Modal.Open(myRecipe); /// /// public class ModalContent { /// /// 🏷️ 모달 창의 제목이에요. 여기에 글자를 적으면 모달 창 맨 위에 크게 보여요. /// 예: "알림", "게임 저장", "친구 요청" /// public string Title { get; set; } /// /// 💬 모달 창에 보여줄 주요 메시지 내용이에요. 사용자에게 전달하고 싶은 말을 여기에 적어요. /// 예: "게임 설정을 저장했습니다.", "정말로 아이템을 구매하시겠어요?" /// public string Message { get; set; } private string _confirmButtonText = "확인"; /// /// ✅ '확인' 버튼에 보여줄 글자예요. /// 특별히 정해주지 않으면 기본적으로 "확인" (또는 설정된 언어에 맞게)이라고 나와요. /// 직접 "네", "저장하기", "출발!" 처럼 원하는 글자로 바꿀 수 있어요. /// 다국어 키를 사용해서 설정할 수도 있어요. (예: "ui_button_confirm", "action_ok") /// public string ConfirmButtonText { get { // _confirmButtonText가 명시적으로 설정되지 않았고, LocalizationManager 사용이 가능하다면 번역된 문자열을 반환 if (string.IsNullOrEmpty(_confirmButtonText) && LocalizationManager.Instance != null) { return LocalizationManager.Instance.GetString(_confirmButtonText); } // 명시적으로 설정된 값이 있거나 LocalizationManager를 사용할 수 없다면 해당 값 또는 기본 키 반환 return _confirmButtonText; } set => _confirmButtonText = value; } private string _cancelButtonText = "취소"; /// /// ❌ '취소' 버튼에 보여줄 글자예요. /// 특별히 정해주지 않으면 기본적으로 "취소" (또는 설정된 언어에 맞게)이라고 나와요. /// 직접 "아니요", "닫기", "나중에" 처럼 원하는 글자로 바꿀 수 있어요. /// 다국어 키를 사용해서 설정할 수도 있어요. (예: "ui_button_cancel", "action_no") /// public string CancelButtonText { get { // _cancelButtonText가 명시적으로 설정되지 않았고, LocalizationManager 사용이 가능하다면 번역된 문자열을 반환 if (string.IsNullOrEmpty(_cancelButtonText) && LocalizationManager.Instance != null) { return LocalizationManager.Instance.GetString(_cancelButtonText); } // 명시적으로 설정된 값이 있거나 LocalizationManager를 사용할 수 없다면 해당 값 또는 기본 키 반환 return _cancelButtonText; } set => _cancelButtonText = value; } /// /// 👍 '확인' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌) /// false로 바꾸면 '확인' 버튼이 사라져요. /// public bool ShowConfirmButton { get; set; } = true; /// /// 👎 '취소' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌) /// false로 바꾸면 '취소' 버튼이 사라져요. /// public bool ShowCancelButton { get; set; } = true; /// /// 👎 '닫기' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌) /// false로 바꾸면 '닫기' 버튼이 사라져요. /// public bool ShowCloseButton { get; set; } = true; /// /// 🎨 모달 창의 '디자인 도면' 파일이 어디 있는지 알려주는 경로예요. /// Unity 에디터에서 만들어둔 프리팹(Prefab) 파일의 경로를 적어줘야 해요. /// 예: "Prefabs/UI/MyCustomModal" /// public string PrefabPath { get; private set; } /// /// 🧑‍🍳 ModalContent 레시피를 만드는 방법이에요. (생성자) /// 모달 창을 어떤 디자인으로 만들지 알려줘야 해요. /// /// 사용할 모달 창 디자인(프리팹) 파일의 경로예요. /// /// /// // "CommonModalPrefab" 디자인을 사용하는 레시피 만들기 /// var content = new ModalContent("Prefabs/UI/CommonModalPrefab"); /// content.Title = "안내"; /// content.Message = "이것은 일반적인 안내 모달입니다."; /// /// public ModalContent(string prefabPath) { PrefabPath = prefabPath; // Title, Message 등 다른 텍스트 속성도 필요한 경우 여기서 기본 다국어 키를 사용하여 초기화할 수 있습니다. // 예: Title = LocalizationManager.Instance.GetString("default_modal_title"); } /// /// 🚀 모달 창이 화면에 나타나기 *직전*에 이 레시피가 할 일을 정해요. (비동기 작업 가능) /// 예를 들어, 모달에 필요한 데이터를 미리 불러오거나 특별한 준비를 할 수 있어요. /// `ModalView.OnOpen()` 보다 먼저 호출돼요. /// /// /// 이 메서드를 상속받아서 특별한 준비 작업을 추가할 수 있어요: /// /// public class MySpecialModalContent : ModalContent /// { /// public MySpecialModalContent(string prefabPath) : base(prefabPath) { } /// /// public override async UniTask OnOpen() /// { /// await base.OnOpen(); // 부모 클래스의 OnOpen도 호출해주는 게 좋아요. /// ULog.Debug("나만의 특별한 모달 내용 준비 시작!"); /// // 예: await LoadSomeDataForTheModal(); /// ULog.Debug("나만의 특별한 모달 내용 준비 완료!"); /// } /// } /// /// public virtual async UniTask OnOpen() { // 기본적으로는 아무것도 하지 않아요. 필요하면 상속받아서 내용을 채워주세요! //ULog.Debug($"[ModalContent] '{Title}' OnOpen called."); await UniTask.CompletedTask; } /// /// 🎬 모달 창이 화면에서 사라지기 *직전*에 이 레시피가 할 일을 정해요. (비동기 작업 가능) /// 예를 들어, 모달에서 사용했던 자원을 정리하거나 특별한 마무리를 할 수 있어요. /// `ModalView.OnClose()` 보다 먼저 호출돼요. /// /// /// 이 메서드를 상속받아서 특별한 마무리 작업을 추가할 수 있어요: /// /// public class MySpecialModalContent : ModalContent /// { /// public MySpecialModalContent(string prefabPath) : base(prefabPath) { } /// /// // ... OnOpen 재정의 ... /// /// public override async UniTask OnClose() /// { /// ULog.Debug("나만의 특별한 모달 내용 마무리 시작!"); /// // 예: await ReleaseSomeDataUsedInModal(); /// ULog.Debug("나만의 특별한 모달 내용 마무리 완료!"); /// await base.OnClose(); // 부모 클래스의 OnClose도 호출해주는 게 좋아요. /// } /// } /// /// public virtual async UniTask OnClose() { // 기본적으로는 아무것도 하지 않아요. 필요하면 상속받아서 내용을 채워주세요! //ULog.Debug($"[ModalContent] '{Title}' OnClose called."); await UniTask.CompletedTask; } } }