diff --git a/Assets/_DDD/_Scripts/GameUi/New.meta b/Assets/_DDD/_Scripts/GameUi/New.meta
new file mode 100644
index 000000000..0034041f1
--- /dev/null
+++ b/Assets/_DDD/_Scripts/GameUi/New.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b710f3e6683e1e649a6d44dc476b5083
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_DDD/_Scripts/GameUi/New/Converters.meta b/Assets/_DDD/_Scripts/GameUi/New/Converters.meta
new file mode 100644
index 000000000..1b0a4a586
--- /dev/null
+++ b/Assets/_DDD/_Scripts/GameUi/New/Converters.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 75317739247907e4099f44de6f643a56
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_DDD/_Scripts/GameUi/New/Converters/CommonConverters.cs b/Assets/_DDD/_Scripts/GameUi/New/Converters/CommonConverters.cs
new file mode 100644
index 000000000..d15ab1849
--- /dev/null
+++ b/Assets/_DDD/_Scripts/GameUi/New/Converters/CommonConverters.cs
@@ -0,0 +1,223 @@
+using System.Linq;
+using UnityEngine;
+
+namespace DDD.MVVM
+{
+ ///
+ /// 불린 값을 반전시키는 컨버터
+ /// 예: true → false, false → true
+ ///
+ public class InvertBoolConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ return value is bool boolValue ? !boolValue : false;
+ }
+
+ public object ConvertBack(object value)
+ {
+ return Convert(value); // 반전은 양방향 동일
+ }
+ }
+
+ ///
+ /// 아이템 개수를 텍스트로 변환하는 컨버터
+ /// 예: 5 → "아이템 수: 5"
+ ///
+ public class ItemCountConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ if (value is int count)
+ return $"아이템 수: {count}";
+ return "아이템 수: 0";
+ }
+
+ public object ConvertBack(object value)
+ {
+ if (value is string str && str.StartsWith("아이템 수: "))
+ {
+ var countStr = str.Substring("아이템 수: ".Length);
+ return int.TryParse(countStr, out var count) ? count : 0;
+ }
+ return 0;
+ }
+ }
+
+ ///
+ /// null 또는 빈 값을 불린으로 변환하는 컨버터
+ /// 예: null → false, "" → false, "text" → true
+ ///
+ public class IsNullOrEmptyConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ if (value == null) return true;
+ if (value is string str) return string.IsNullOrEmpty(str);
+ return false;
+ }
+
+ public object ConvertBack(object value)
+ {
+ return value is bool boolValue && !boolValue ? "" : null;
+ }
+ }
+
+ ///
+ /// 숫자를 백분율 텍스트로 변환하는 컨버터
+ /// 예: 0.75f → "75%"
+ ///
+ public class PercentageConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ if (value is float floatValue)
+ return $"{(floatValue * 100):F0}%";
+ if (value is double doubleValue)
+ return $"{(doubleValue * 100):F0}%";
+ return "0%";
+ }
+
+ public object ConvertBack(object value)
+ {
+ if (value is string str && str.EndsWith("%"))
+ {
+ var percentStr = str.Substring(0, str.Length - 1);
+ if (float.TryParse(percentStr, out var percent))
+ return percent / 100f;
+ }
+ return 0f;
+ }
+ }
+
+ ///
+ /// 열거형을 문자열로 변환하는 컨버터
+ ///
+ public class EnumToStringConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ return value?.ToString() ?? string.Empty;
+ }
+
+ public object ConvertBack(object value)
+ {
+ // 역변환은 타입 정보가 필요하므로 기본 구현만 제공
+ return value;
+ }
+ }
+
+ ///
+ /// 컬렉션의 개수를 확인하는 컨버터
+ /// 예: List(5개) → true, List(0개) → false
+ ///
+ public class CollectionHasItemsConverter : IValueConverter
+ {
+ public object Convert(object value)
+ {
+ if (value is System.Collections.ICollection collection)
+ return collection.Count > 0;
+ if (value is System.Collections.IEnumerable enumerable)
+ return enumerable.Cast