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