143 lines
7.1 KiB
C#
143 lines
7.1 KiB
C#
using Cysharp.Threading.Tasks;
|
|
using UVC.Locale; // ButtonText의 기본값을 위해 추가
|
|
using UVC.Log; // ULog 사용 예시를 위해 추가 (필요에 따라)
|
|
|
|
namespace UVC.UI.Modal
|
|
{
|
|
/// <summary>
|
|
/// 🤔 사용자에게 "정말 ~하시겠어요?" 하고 물어보고, "예" 또는 "아니오" 선택을 받는 친구예요.
|
|
/// 중요한 결정이나 되돌릴 수 없는 행동 전에 한 번 더 확인받을 때 사용하면 좋아요.
|
|
/// 사용자가 어떤 버튼을 눌렀는지 (확인 또는 취소) 알려줘요.
|
|
/// </summary>
|
|
/// <example>
|
|
/// <code>
|
|
/// // 게임 종료 전에 정말 끌 건지 물어보는 예시
|
|
/// public async void TryExitGame()
|
|
/// {
|
|
/// bool wantsToExit = await Confirm.Show("게임 종료", "정말로 게임을 종료하시겠습니까?", "네, 종료합니다", "아니요, 계속할래요");
|
|
/// if (wantsToExit)
|
|
/// {
|
|
/// ULog.Debug("사용자가 게임 종료를 확인했습니다.");
|
|
/// // Application.Quit(); // 실제 게임 종료 코드
|
|
/// }
|
|
/// else
|
|
/// {
|
|
/// ULog.Debug("사용자가 게임 종료를 취소했습니다.");
|
|
/// }
|
|
/// }
|
|
///
|
|
/// // 아이템 삭제 확인
|
|
/// public async void TryDeleteItem(string ItemName)
|
|
/// {
|
|
/// string title = "아이템 삭제";
|
|
/// string message = $"정말로 '{ItemName}' 아이템을 삭제하시겠습니까? 이 행동은 되돌릴 수 없습니다.";
|
|
///
|
|
/// // 기본 버튼 텍스트 사용 (ModalContent에서 설정된 "확인", "취소")
|
|
/// bool confirmed = await Confirm.Show(title, message);
|
|
///
|
|
/// if (confirmed)
|
|
/// {
|
|
/// ULog.Debug($"'{ItemName}' 아이템 삭제를 진행합니다.");
|
|
/// // (아이템 삭제 로직...)
|
|
/// }
|
|
/// }
|
|
/// </code>
|
|
/// </example>
|
|
public static class Confirm
|
|
{
|
|
/// <summary>
|
|
/// 🎨 확인창의 기본 디자인(프리팹) 파일이 어디 있는지 알려주는 경로예요.
|
|
/// </summary>
|
|
private const string DefaultPrefabPath = "Prefabs/UI/Modal/Confirm"; // 실제 프로젝트 경로에 맞게 수정하세요.
|
|
|
|
/// <summary>
|
|
/// ✨ 지정된 제목과 메시지로 확인창을 화면에 뿅! 하고 보여줘요.
|
|
/// 사용자가 "확인" 또는 "취소" 버튼을 누를 때까지 코드는 여기서 잠시 멈춰 기다려요.
|
|
/// </summary>
|
|
/// <param name="title">확인창 맨 위에 크게 보일 '제목'이에요. 다국어 키도 가능해요.</param>
|
|
/// <param name="message">확인창에 보여줄 '질문 또는 메시지 내용'이에요. 다국어 키도 가능해요.</param>
|
|
/// <param name="confirmButtonText">"확인" 버튼에 보여줄 글자예요. 안 적으면 기본 글자("확인")가 나와요. 다국어 키도 가능해요.</param>
|
|
/// <param name="cancelButtonText">"취소" 버튼에 보여줄 글자예요. 안 적으면 기본 글자("취소")가 나와요. 다국어 키도 가능해요.</param>
|
|
/// <param name="customPrefabPath">특별히 만들어둔 확인창 디자인 파일 경로예요. 없으면 기본 디자인을 사용해요. 다국어 키도 가능해요.</param>
|
|
/// <returns>사용자가 "확인"을 누르면 true, "취소"를 누르면 false를 돌려주는 작업(UniTask<bool>)이에요.</returns>
|
|
/// <example>
|
|
/// <code>
|
|
/// public class ShopManager : MonoBehaviour
|
|
/// {
|
|
/// public async void OnPurchaseItem(string ItemName, int price)
|
|
/// {
|
|
/// string purchaseTitle = "구매 확인";
|
|
/// string purchaseMessage = $"{ItemName} 아이템을 {price} 골드에 구매하시겠습니까?";
|
|
///
|
|
/// bool confirmed = await Confirm.Show(purchaseTitle, purchaseMessage, "구매", "나중에");
|
|
///
|
|
/// if (confirmed)
|
|
/// {
|
|
/// ULog.Debug($"{ItemName} 구매를 진행합니다.");
|
|
/// // (구매 처리 로직...)
|
|
/// }
|
|
/// else
|
|
/// {
|
|
/// ULog.Debug($"{ItemName} 구매를 취소했습니다.");
|
|
/// }
|
|
///
|
|
/// // 예시: 설정 초기화 전에 다국어로 확인을 받습니다.
|
|
/// // titleLocalizationKey: "settings_reset_title" -> "설정 초기화" (한국어), "ResetChildren Settings" (영어)
|
|
/// // messageLocalizationKey: "settings_reset_confirm_message" -> "모든 설정을 초기화하시겠습니까?" (한국어), "Are you sure you want to reset all settings?" (영어)
|
|
///
|
|
/// bool confirmed = await Confirm.ShowLocalized(
|
|
/// "settings_reset_title",
|
|
/// "settings_reset_confirm_message",
|
|
/// confirmButtonLocalizationKey: "ui_button_reset", // "초기화"
|
|
/// cancelButtonLocalizationKey: "ui_button_keep_current" // "유지"
|
|
/// );
|
|
///
|
|
/// if (confirmed)
|
|
/// {
|
|
/// ULog.Debug("설정을 초기화합니다.");
|
|
/// // (설정 초기화 로직...)
|
|
/// }
|
|
/// else
|
|
/// {
|
|
/// ULog.Debug("설정 초기화를 취소했습니다.");
|
|
/// }
|
|
///
|
|
/// }
|
|
/// }
|
|
/// </code>
|
|
/// </example>
|
|
public static async UniTask<bool> Show(
|
|
string title,
|
|
string message,
|
|
string confirmButtonText = null,
|
|
string cancelButtonText = 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),
|
|
ShowConfirmButton = true, // Confirm에서는 확인 버튼 항상 표시
|
|
ShowCancelButton = true // Confirm에서는 취소 버튼 항상 표시
|
|
};
|
|
|
|
// 확인 버튼 글자를 따로 정해줬다면 그걸로 설정해요.
|
|
if (!string.IsNullOrEmpty(confirmButtonText))
|
|
{
|
|
content.ConfirmButtonText = LocalizationManager.Instance.GetString(confirmButtonText);
|
|
}
|
|
|
|
// 취소 버튼 글자를 따로 정해줬다면 그걸로 설정해요.
|
|
if (!string.IsNullOrEmpty(cancelButtonText))
|
|
{
|
|
content.CancelButtonText = LocalizationManager.Instance.GetString(cancelButtonText);
|
|
}
|
|
|
|
// Modal 시스템에게 "이 레시피대로 모달 창 열어줘!" 라고 부탁하고, 사용자의 선택(true/false)을 기다려요.
|
|
return await Modal.Open<bool>(content);
|
|
}
|
|
}
|
|
} |