using Cysharp.Threading.Tasks; using UVC.Locale; // ConfirmButtonText의 기본값을 위해 추가 using UVC.Log; // ULog 사용 예시를 위해 추가 (필요에 따라) namespace UVC.UI.Modal { /// /// 📢 간단한 알림 메시지를 화면에 보여주는 친구예요. /// 이 친구는 "확인" 버튼만 가지고 있어서, 사용자가 내용을 읽고 확인 버튼을 누를 때까지 기다려줘요. /// 복잡한 선택 없이, 간단한 정보 전달이나 경고를 보여줄 때 사용하면 좋아요. /// /// /// /// // 가장 기본적인 알림창 사용법 /// async UniTask ShowMyFirstAlert() /// { /// await Alert.Show("알림", "게임 데이터가 성공적으로 저장되었습니다!"); /// ULog.Debug("사용자가 알림을 확인했습니다."); /// } /// /// // 버튼 글자도 바꿔볼까요? /// async UniTask ShowCustomButtonAlert() /// { /// await Alert.Show("레벨 업!", "축하합니다! 레벨 5를 달성했어요!", confirmButtonText: "야호!"); /// } /// /// public static class Alert { /// /// 🎨 알림창의 기본 디자인(프리팹) 파일이 어디 있는지 알려주는 경로예요. /// 특별히 다른 디자인을 쓰고 싶지 않으면 이 기본 디자인을 사용해요. /// private const string DefaultPrefabPath = "Prefabs/UI/Modal/Alert"; /// /// ✨ 지정된 제목과 메시지로 알림창을 화면에 뿅! 하고 보여줘요. /// 사용자가 "확인" 버튼을 누를 때까지 코드는 여기서 잠시 멈춰 기다려요. /// /// 알림창 맨 위에 크게 보일 '제목'이에요. 다국어 키도 가능해요. /// 알림창에 보여줄 '메시지 내용'이에요. 다국어 키도 가능해요. /// "확인" 버튼에 보여줄 글자예요. 아무것도 안 적으면 기본 글자("확인" 또는 설정된 언어)가 나와요. 다국어 키도 가능해요. /// 만약 특별히 만들어둔 알림창 디자인이 있다면, 그 파일 경로를 여기에 적어주세요. 없으면 기본 디자인을 사용해요. 다국어 키도 가능해요. /// 사용자가 확인 버튼을 누르면 완료되는 작업(UniTask)이에요. 특별한 값을 돌려주진 않아요. /// /// /// public class GameManager : MonoBehaviour /// { /// public async void OnPlayerSaveGame() /// { /// // (게임 저장 로직...) /// bool success = true; // 저장 성공했다고 가정 /// /// if (success) /// { /// await Alert.Show("저장 완료", "게임 진행 상황이 안전하게 저장되었습니다.", "알겠습니다"); /// ULog.Debug("저장 완료 알림을 플레이어가 확인했습니다."); /// } /// else /// { /// await Alert.Show("저장 실패", "오류가 발생하여 저장하지 못했습니다.", "다시 시도"); /// // (다시 시도 로직 또는 다른 처리...) /// } /// /// // 예시: 퀘스트 완료 메시지를 현재 설정된 언어로 보여줍니다. /// // titleLocalizationKey: "quest_completed_title" -> "퀘스트 완료" (한국어), "Quest Complete" (영어) /// // messageLocalizationKey: "quest_completed_message" -> "{0} 퀘스트를 완료했습니다!" (한국어), "You have completed the {0} quest!" (영어) /// // 여기서 {0} 부분은 실제 퀘스트 이름으로 바뀔 수 있도록 LocalizationManager에서 처리한다고 가정합니다. /// /// string localizedQuestName = LocalizationManager.Instance.GetString(questNameKey); // 예: "main_quest_01" -> "첫 번째 임무" /// string formattedMessageKey = "quest_completed_message"; // 실제로는 메시지 포맷팅이 필요할 수 있음 /// /// // 실제 메시지는 LocalizationManager에서 포맷팅을 지원해야 함 /// // 여기서는 간단히 키만 전달하는 것으로 가정 /// await Alert.Show("quest_completed_title", formattedMessageKey, confirmButtonLocalizationKey: "ui_button_great"); /// ULog.Debug("퀘스트 완료 알림을 플레이어가 확인했습니다."); /// } /// } /// /// public static async UniTask Show( string title, string message, string confirmButtonText = null, string customPrefabPath = null) { string prefabPath = string.IsNullOrEmpty(customPrefabPath) ? DefaultPrefabPath : customPrefabPath; // ModalContent 레시피를 만들어요. 알림창은 취소 버튼이 필요 없으니 숨겨요. ModalContent content = new ModalContent(prefabPath) { Title = LocalizationManager.Instance.GetString(title), Message = LocalizationManager.Instance.GetString(message), ShowCancelButton = false, // Alert에서는 취소 버튼 숨김 }; // 확인 버튼 글자를 따로 정해줬다면 그걸로 설정해요. if (!string.IsNullOrEmpty(confirmButtonText)) { content.ConfirmButtonText = LocalizationManager.Instance.GetString(confirmButtonText); } // 아니면 ModalContent의 기본 설정(다국어 지원 "button_confirm" 키)을 따라요. // 만약 다른 기본 키를 쓰고 싶다면 여기서 설정할 수도 있어요. // 예: content.ConfirmButtonText = LocalizationManager.Instance.GetString("alert_default_ok_button"); // Modal 시스템에게 "이 레시피대로 모달 창 열어줘!" 라고 부탁해요. // Alert은 사용자의 선택 결과(true/false)가 중요하지 않으므로, bool 타입으로 받고 결과는 무시해요. await Modal.Open(content); } } }