Modal 개발 완료. Toolbar 개발 중

This commit is contained in:
logonkhi
2025-06-13 17:10:58 +09:00
parent e8d52b3e90
commit 2ffe7abac6
37 changed files with 3278 additions and 466 deletions

View File

@@ -1,24 +1,47 @@
using UVC.Locale; // LocalizationManager 사용을 위해 추가
using Cysharp.Threading.Tasks;
using UVC.Locale;
using UVC.Log; // LocalizationManager 사용을 위해 추가
namespace UVC.UI.Modal
{
/// <summary>
/// 📜 모달 창에 어떤 내용을 보여줄지, 어떻게 행동할지 정하는 '레시피' 또는 '주문서' 같은 친구예요.
/// 이 클래스의 객체를 만들어서 Modal.Open()에 전달하면, 여기에 적힌 대로 모달 창이 만들어져요.
/// </summary>
/// <example>
/// <code>
/// // "MyAwesomeModalPrefab"이라는 디자인을 사용하는 모달을 위한 레시피를 만들어요.
/// var myRecipe = new ModalContent("Prefabs/UI/MyAwesomeModalPrefab")
/// {
/// Title = "새로운 모험!", // 모달 창 제목
/// Message = "모험을 시작할 준비가 되었나요?", // 모달 창 메시지
/// ConfirmButtonText = "네, 갑시다!", // 확인 버튼 글자
/// ShowCancelButton = false // 취소 버튼은 안 보여줄래요.
/// };
///
/// // 이렇게 만든 레시피(myRecipe)를 Modal.Open()에 전달하면 모달이 뿅 나타나요!
/// // bool userChoseConfirm = await Modal.Open&lt;bool&gt;(myRecipe);
/// </code>
/// </example>
public class ModalContent
{
/// <summary>
/// 모달 창의 제목입니다. 다국어 지원을 위해 직접 설정하거나, 생성 후 별도로 설정할 수 있습니다.
/// 🏷️ 모달 창의 제목이에요. 여기에 글자를 적으면 모달 창 맨 위에 크게 보여요.
/// 예: "알림", "게임 저장", "친구 요청"
/// </summary>
public string Title { get; set; }
/// <summary>
/// 모달 창에 표시될 메시지 또는 본문 내용입니다. 다국어 지원을 위해 직접 설정하거나, 생성 후 별도로 설정할 수 있습니다.
/// 💬 모달 창에 보여줄 주요 메시지 내용이에요. 사용자에게 전달하고 싶은 말을 여기에 적어요.
/// 예: "게임 설정을 저장했습니다.", "정말로 아이템을 구매하시겠어요?"
/// </summary>
public string Message { get; set; }
private string _confirmButtonText;
/// <summary>
/// 확인 버튼에 표시될 텍스트입니다.
/// 기본적으로 "modal_confirm_button" 키를 사용하여 <see cref="LocalizationManager"/>에서 번역된 문자열을 가져옵니다.
/// 직접 설정하여 이 기본값을 재정의할 수 있습니다.
/// ✅ '확인' 버튼에 보여줄 글자예요.
/// 특별히 정해주지 않으면 기본적으로 "확인" (또는 설정된 언어에 맞게)이라고 나와요.
/// 직접 "네", "저장하기", "출발!" 처럼 원하는 글자로 바꿀 수 있어요.
/// </summary>
public string ConfirmButtonText
{
@@ -37,9 +60,9 @@ namespace UVC.UI.Modal
private string _cancelButtonText;
/// <summary>
/// 취소 버튼에 표시될 텍스트입니다.
/// 기본적으로 "modal_cancel_button" 키를 사용하여 <see cref="LocalizationManager"/>에서 번역된 문자열을 가져옵니다.
/// 직접 설정하여 이 기본값을 재정의할 수 있습니다.
/// ❌ '취소' 버튼에 보여줄 글자예요.
/// 특별히 정해주지 않으면 기본적으로 "취소" (또는 설정된 언어에 맞게)이라고 나와요.
/// 직접 "아니요", "닫기", "나중에" 처럼 원하는 글자로 바꿀 수 있어요.
/// </summary>
public string CancelButtonText
{
@@ -57,24 +80,43 @@ namespace UVC.UI.Modal
}
/// <summary>
/// 확인 버튼 표시 여부를 결정합니다. (기본값: true)
/// 👍 '확인' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌)
/// false로 바꾸면 '확인' 버튼이 사라져요.
/// </summary>
public bool ShowConfirmButton { get; set; } = true;
/// <summary>
/// 취소 버튼 표시 여부를 결정합니다. (기본값: true)
/// 👎 '취소' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: 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 생성자입니다.
/// 🧑‍🍳 ModalContent 레시피를 만드는 방법이에요. (생성자)
/// 모달 창을 어떤 디자인으로 만들지 알려줘야 해요.
/// </summary>
/// <param name="prefabPath">로드할 프리팹의 경로입니다. 이 프리팹 내부에 UI 요소들이 구성되어 있어야 합니다.</param>
/// <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;
@@ -83,9 +125,10 @@ namespace UVC.UI.Modal
}
/// <summary>
/// 특정 다국어 키를 사용하여 확인 버튼 텍스트를 설정합니다.
/// 🔑 '확인' 버튼의 글자를 다국어 키를 사용해서 설정해요.
/// 게임이 여러 언어를 지원할 때 유용해요.
/// </summary>
/// <param name="localizationKey">사용할 다국어 키입니다.</param>
/// <param name="localizationKey">미리 정해둔 다국어 키 (예: "ui_button_yes", "action_save")</param>
public void SetConfirmButtonTextFromKey(string localizationKey)
{
// 직접 값을 설정하는 대신, 키를 저장하고 getter에서 처리하도록 할 수도 있으나,
@@ -105,9 +148,9 @@ namespace UVC.UI.Modal
}
/// <summary>
/// 특정 다국어 키를 사용하여 취소 버튼 텍스트를 설정합니다.
/// 🔑 '취소' 버튼의 글자를 다국어 키를 사용해서 설정해요.
/// </summary>
/// <param name="localizationKey">사용할 다국어 키입니다.</param>
/// <param name="localizationKey">미리 정해둔 다국어 키 (예: "ui_button_no", "action_cancel")</param>
public void SetCancelButtonTextFromKey(string localizationKey)
{
if (LocalizationManager.Instance != null)
@@ -119,5 +162,65 @@ namespace UVC.UI.Modal
_cancelButtonText = $"[{localizationKey}]";
}
}
/// <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;
}
}
}