From c3a7814c948a468b3e50ec58fdf2256dd7c81f9b Mon Sep 17 00:00:00 2001 From: Sehyeon Date: Fri, 2 May 2025 14:20:31 +0900 Subject: [PATCH] =?UTF-8?q?DEG-124=20[Feat]=20=EC=94=AC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/KSH/DungeonLogic.cs | 3 + Assets/KSH/DungeonTestScene.unity | 4 +- Assets/KSH/PlayerStats.cs | 22 ++++++-- Assets/KSH/ReHousing.unity | 4 +- Assets/KSH/StatPanelController.cs | 56 +++++++++---------- .../DailyRoutine/InteractionController.cs | 17 ++++-- Assets/Scripts/Common/GameManager.cs | 25 ++------- .../Scripts/Common/GameUtility/EndingLogic.cs | 2 +- ProjectSettings/EditorBuildSettings.asset | 8 +-- 9 files changed, 73 insertions(+), 68 deletions(-) diff --git a/Assets/KSH/DungeonLogic.cs b/Assets/KSH/DungeonLogic.cs index ca7ef0aa..b870d546 100644 --- a/Assets/KSH/DungeonLogic.cs +++ b/Assets/KSH/DungeonLogic.cs @@ -90,7 +90,10 @@ public class DungeonLogic : MonoBehaviour _dungeonPanelController.SetBossHealthBar(0.0f); // 보스 체력 0 재설정 _player.SetState(PlayerState.Win); + // TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동 + + StartCoroutine(DelayedSceneChange()); // 3초 대기 후 전환 } } diff --git a/Assets/KSH/DungeonTestScene.unity b/Assets/KSH/DungeonTestScene.unity index a5a9f208..092d4a60 100644 --- a/Assets/KSH/DungeonTestScene.unity +++ b/Assets/KSH/DungeonTestScene.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40618f96d07ba42391fdb160fda8d033bc650752cd76802cfd2f1073780ee864 -size 241617 +oid sha256:00f0c3d6c23235a6f83ce7bedb6039d9eea0912c97ab6fc1483c7a960331f710 +size 240564 diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index 0766c619..da3d4a9d 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -36,16 +36,30 @@ public class PlayerStats : MonoBehaviour private float previousAddHealth = 0f; - private void Start() + public static PlayerStats Instance; + private void Awake() { - _gameConstants = new GameConstants(); - _valueByAction = new ValueByAction(); - _valueByAction.Initialize(); // 값 초기화 + if (Instance == null) + { + Instance = this; + DontDestroyOnLoad(gameObject); // 데이터값 유지용 + } + else + { + Destroy(gameObject); + } + _gameConstants = new GameConstants(); HealthStat = _gameConstants.baseHealth; TimeStat = _gameConstants.baseTime; ReputationStat = _gameConstants.baseReputation; } + + private void Start() + { + _valueByAction = new ValueByAction(); + _valueByAction.Initialize(); // 값 초기화 + } // 현재 체력으로 해당 행동이 가능한 지 확인 public bool CanPerformByHealth(ActionType actionType) diff --git a/Assets/KSH/ReHousing.unity b/Assets/KSH/ReHousing.unity index 68d04af1..71147c98 100644 --- a/Assets/KSH/ReHousing.unity +++ b/Assets/KSH/ReHousing.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed1eda5019f114f453e33368651d3e2e0efba570cdd4cae63844778e5d14149f -size 551146 +oid sha256:cd8639934b59522601780b9ad75366ad695d2517866f42ddc40ccc4bcb6b1fbb +size 558426 diff --git a/Assets/KSH/StatPanelController.cs b/Assets/KSH/StatPanelController.cs index 74aed0dc..74e93fbb 100644 --- a/Assets/KSH/StatPanelController.cs +++ b/Assets/KSH/StatPanelController.cs @@ -22,59 +22,57 @@ public class StatPanelController : MonoBehaviour [Header("Day")] [SerializeField] private TMP_Text dayCountText; - [Header("Player Stat Class")] - [SerializeField] private PlayerStats playerStats; - private GameConstants _gameConstants = new GameConstants(); private void Start() { - if (playerStats == null) - { - playerStats = FindObjectOfType(); - } - - playerStats.OnStatsChanged += UpdateStat; + PlayerStats.Instance.OnStatsChanged += UpdateStat; GameManager.Instance.OnDayChanged += UpdateDay; InitStats(); } + + private void OnDisable() + { + // 이벤트 구독 해제 + PlayerStats.Instance.OnStatsChanged -= UpdateStat; + GameManager.Instance.OnDayChanged -= UpdateDay; + } private void InitStats() { - healthBarImage.fillAmount = _gameConstants.baseHealth / _gameConstants.maxHealth; - healthText.text = $"{_gameConstants.baseHealth}/{_gameConstants.maxHealth}"; + var nowHealth = PlayerStats.Instance.HealthStat; + var nowReputation = PlayerStats.Instance.ReputationStat; + var nowTime = PlayerStats.Instance.TimeStat; - reputationBarImage.fillAmount = _gameConstants.baseReputation / _gameConstants.maxReputation; - reputationText.text = $"{_gameConstants.baseReputation}/{_gameConstants.maxReputation}"; - - clockTimeText.text = $"{_gameConstants.baseTime}:00"; - ampmText.text = "AM"; + SetStat(nowTime, nowReputation, nowHealth); } private void UpdateStat(PlayerStats.StatsChangeData statData) { - var timeVlaue = statData.Time; - var reputationVlaue = statData.Reputation; - var heathVlaue = statData.Health; - - healthBarImage.fillAmount = heathVlaue / _gameConstants.maxHealth; - healthText.text = $"{heathVlaue}/{_gameConstants.maxHealth}"; - - reputationBarImage.fillAmount = reputationVlaue / _gameConstants.maxReputation; - reputationText.text = $"{reputationVlaue}/{_gameConstants.maxReputation}"; + SetStat(statData.Time, statData.Reputation, statData.Health); + } - if (timeVlaue > 12) // 오후, 13부터 + private void SetStat(float time, float reputation, float health) + { + healthBarImage.fillAmount = health / _gameConstants.maxHealth; + healthText.text = $"{health}/{_gameConstants.maxHealth}"; + + reputationBarImage.fillAmount = reputation / _gameConstants.maxReputation; + reputationText.text = $"{reputation}/{_gameConstants.maxReputation}"; + + if (time > 12) // 오후, 13부터 { - timeVlaue -= 12; - clockTimeText.text = $"{timeVlaue}:00"; + time -= 12; + clockTimeText.text = $"{time}:00"; ampmText.text = "PM"; } else // 오전 { - clockTimeText.text = $"{timeVlaue}:00"; + clockTimeText.text = $"{time}:00"; ampmText.text = "AM"; } + dayCountText.text = GameManager.Instance.CurrentDay.ToString(); } private void UpdateDay(int day) diff --git a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs index 351d623d..3fc9ab58 100644 --- a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs +++ b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs @@ -7,7 +7,6 @@ using UnityEngine.Serialization; [RequireComponent(typeof(Rigidbody))] public class InteractionController : MonoBehaviour { - [SerializeField] PlayerStats playerStats; [SerializeField] LayerMask interactionLayerMask; [FormerlySerializedAs("housingCanvasManager")] [Header("UI 연동")] @@ -18,7 +17,7 @@ public class InteractionController : MonoBehaviour private void Start() { - playerStats.OnWorked += SuddenAfterWorkEventHappen; + PlayerStats.Instance.OnWorked += SuddenAfterWorkEventHappen; } // 상호작용 가능한 사물 범위에 들어올 때 @@ -60,10 +59,18 @@ public class InteractionController : MonoBehaviour housingCanvasController.ShowInteractionButton(interactionTexts.ActionText,interactionTexts.DescriptionText,()=> { - if (playerStats.CanPerformByHealth(interactionType)) + if (PlayerStats.Instance.CanPerformByHealth(interactionType)) { - playerStats.PerformAction(interactionType); - interactionAnimationPanelController.ShowAnimationPanel(interactionType,interactionTexts.AnimationText); + PlayerStats.Instance.PerformAction(interactionType); + + if (interactionType == ActionType.Dungeon) + { + GameManager.Instance.ChangeToGameScene(); + } + else + { + interactionAnimationPanelController.ShowAnimationPanel(interactionType,interactionTexts.AnimationText); + } } else { diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index 4fd912af..0915e1c0 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -6,8 +6,6 @@ using UnityEngine.SceneManagement; public partial class GameManager : Singleton { - [SerializeField] private PlayerStats playerStats; - private Canvas _canvas; // 게임 진행 상태 @@ -27,19 +25,7 @@ public partial class GameManager : Singleton { // 오디오 초기화 InitializeAudio(); - - // PlayerStats의 하루 종료 이벤트 구독 - if (playerStats == null) - { - playerStats = FindObjectOfType(); - } - - if (playerStats == null) - { - Debug.LogError("PlayerStats 컴포넌트를 찾을 수 없습니다."); - return; - } - playerStats.OnDayEnded += AdvanceDay; + PlayerStats.Instance.OnDayEnded += AdvanceDay; } #region 대화 관련 @@ -74,12 +60,12 @@ public partial class GameManager : Singleton public void ChangeToGameScene() { - SceneManager.LoadScene("Game"); // 던전 Scene + SceneManager.LoadScene("DungeonTestScene"); // 던전 Scene } public void ChangeToHomeScene() { - SceneManager.LoadScene("Housing"); // Home Scene + SceneManager.LoadScene("ReHousing"); // Home Scene } // TODO: Open Setting Panel 등 Panel 처리 @@ -94,10 +80,7 @@ public partial class GameManager : Singleton private void OnDestroy() { - if (playerStats != null) - { - playerStats.OnDayEnded -= AdvanceDay; // 이벤트 구독 해제 - } + PlayerStats.Instance.OnDayEnded -= AdvanceDay; // 이벤트 구독 해제 } private void OnApplicationQuit() diff --git a/Assets/Scripts/Common/GameUtility/EndingLogic.cs b/Assets/Scripts/Common/GameUtility/EndingLogic.cs index 40da11b9..045b5935 100644 --- a/Assets/Scripts/Common/GameUtility/EndingLogic.cs +++ b/Assets/Scripts/Common/GameUtility/EndingLogic.cs @@ -53,7 +53,7 @@ public partial class GameManager if (stageLevel < GameConstants.maxStage) // 현재 스테이지 1 혹은 2 return EndingType.Bad; - if (playerStats.ReputationStat >= happyEndReputation) // 평판이 일정 수치 이상 + if (PlayerStats.Instance.ReputationStat >= happyEndReputation) // 평판이 일정 수치 이상 return EndingType.Happy; return EndingType.Normal; diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 6bd469f2..a6e8a34f 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -6,9 +6,9 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/Scenes/Main.unity - guid: 99c9720ab356a0642a771bea13969a05 + path: Assets/KSH/ReHousing.unity + guid: b748e35b920bde64cbd6ffe5fdb43e23 - enabled: 1 - path: Assets/Scenes/Housing.unity - guid: 02daaec42d605494180038d387d4a776 + path: Assets/KSH/DungeonTestScene.unity + guid: 4563b107911b0e54cbdf659694a6f17a m_configObjects: {}