diff --git a/.idea/.idea.Degulleo3D/.idea/inspectionProfiles/Project_Default.xml b/.idea/.idea.Degulleo3D/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..dfb35ffb
--- /dev/null
+++ b/.idea/.idea.Degulleo3D/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Editor.meta b/Assets/Editor.meta
new file mode 100644
index 00000000..d3e3b472
--- /dev/null
+++ b/Assets/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fb977eee32cc2024181234437bfb8480
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Editor/ReadOnlyDrawer.cs b/Assets/Editor/ReadOnlyDrawer.cs
new file mode 100644
index 00000000..f28e0596
--- /dev/null
+++ b/Assets/Editor/ReadOnlyDrawer.cs
@@ -0,0 +1,24 @@
+#if UNITY_EDITOR
+using UnityEngine;
+using UnityEditor;
+
+// PlayerStatsTest.ReadOnlyAttribute를 위한 에디터 속성 드로어
+[CustomPropertyDrawer(typeof(PlayerStatsTest.ReadOnlyAttribute))]
+public class ReadOnlyDrawer : PropertyDrawer
+{
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+ {
+ // 이전 GUI 활성화 상태 저장
+ bool wasEnabled = GUI.enabled;
+
+ // 필드 비활성화 (읽기 전용)
+ GUI.enabled = false;
+
+ // 속성 그리기
+ EditorGUI.PropertyField(position, property, label, true);
+
+ // GUI 활성화 상태 복원
+ GUI.enabled = wasEnabled;
+ }
+}
+#endif
\ No newline at end of file
diff --git a/Assets/Editor/ReadOnlyDrawer.cs.meta b/Assets/Editor/ReadOnlyDrawer.cs.meta
new file mode 100644
index 00000000..3f22dabf
--- /dev/null
+++ b/Assets/Editor/ReadOnlyDrawer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eb5079b7064e2324890f78e18dfe7a6e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/KSH.meta b/Assets/KSH.meta
new file mode 100644
index 00000000..32286553
--- /dev/null
+++ b/Assets/KSH.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8899b70334c78204fb97b6da706ac4c6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/KSH/GameConstants.cs b/Assets/KSH/GameConstants.cs
new file mode 100644
index 00000000..2bd483bb
--- /dev/null
+++ b/Assets/KSH/GameConstants.cs
@@ -0,0 +1,43 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+// 행동 타입
+public enum ActionType
+{
+ Sleep, // 8시 기상
+ OverSlept, // 결근-늦잠
+ ForcedSleep, // 탈진(체력 0)
+ Eat,
+ Work,
+ Dungeon,
+ Housework, // 집안일
+ OvertimeWork, // 야근
+ TeamDinner, // 회식
+ Absence // 결근
+}
+
+public class GameConstants
+{
+ // 기본 스탯 값
+ public float baseHealth = 8f;
+ public float baseTime = 8f;
+ public float baseReputation = 2f;
+
+ // 스탯 한계 값
+ public float maxHealth = 10f;
+ public float maxTime = 24f;
+ public float maxReputation = 10f;
+
+ // 체력 회복 한계 값
+ public float limitRecover = 8.0f;
+
+ // 기상 시간
+ public float wakeUpTime = 8.0f;
+
+ // 수면 이벤트 강제 값
+ public float forcedValue = 999f;
+
+ // 날짜 한계 값
+ public static int maxDays = 7;
+}
diff --git a/Assets/KSH/GameConstants.cs.meta b/Assets/KSH/GameConstants.cs.meta
new file mode 100644
index 00000000..7fb223ac
--- /dev/null
+++ b/Assets/KSH/GameConstants.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1e1682026c3858a4f8974675387aaf5a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/KSH/GameManager.cs b/Assets/KSH/GameManager.cs
new file mode 100644
index 00000000..80b0725b
--- /dev/null
+++ b/Assets/KSH/GameManager.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+public class GameManager : Singleton
+{
+ [SerializeField] private PlayerStats playerStats;
+
+ private Canvas _canvas;
+
+ // 게임 진행 상태
+ private int currentDay = 1;
+ public int CurrentDay => currentDay;
+ private int maxDays = GameConstants.maxDays;
+
+ // 날짜 변경 이벤트, 추후에 UI 상의 날짜를 변경할 때 사용
+ public event Action OnDayChanged;
+
+ private void Start()
+ {
+ // PlayerStats의 하루 종료 이벤트 구독
+ if (playerStats == null)
+ {
+ playerStats = FindObjectOfType();
+ }
+
+ if (playerStats == null)
+ {
+ Debug.LogError("PlayerStats 컴포넌트를 찾을 수 없습니다.");
+ return;
+ }
+ playerStats.OnDayEnded += AdvanceDay;
+ }
+
+ // 날짜 진행
+ public void AdvanceDay()
+ {
+ currentDay++;
+ OnDayChanged?.Invoke(currentDay);
+
+ // 최대 일수 도달 체크
+ if (currentDay > maxDays)
+ {
+ TriggerTimeEnding();
+ }
+ }
+
+ // 엔딩 트리거
+ private void TriggerTimeEnding()
+ {
+ // TODO: 엔딩 처리 로직
+ Debug.Log("7일이 지나 게임이 종료됩니다.");
+ }
+
+ public void ChangeToGameScene()
+ {
+ SceneManager.LoadScene("Game"); // 던전 Scene
+ }
+
+ public void ChangeToMainScene()
+ {
+ SceneManager.LoadScene("Housing"); // Home Scene
+ }
+
+ // TODO: Open Setting Panel 등 Panel 처리
+
+ protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode)
+ {
+ // TODO: 씬 로드 시 동작 구현. ex: BGM 변경
+
+ // UI용 Canvas 찾기
+ // _canvas = GameObject.FindObjectOfType