From 7302efaebc0576e3a0de1eaf6652e2e42cca9ab9 Mon Sep 17 00:00:00 2001 From: Sehyeon Date: Thu, 17 Apr 2025 13:11:03 +0900 Subject: [PATCH] =?UTF-8?q?DEG-15=20[Fix]=20=EC=9D=8C=EC=88=98=20=EA=B0=92?= =?UTF-8?q?=20=EC=A0=9C=ED=95=9C=EA=B3=BC=20=EC=B2=B4=EB=A0=A5=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=ED=96=89=EB=8F=99=EC=9D=B4=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/KSH/GameManager.cs | 8 ++++ Assets/KSH/PlayerStats.cs | 60 ++++++++++++++++++-------- Assets/KSH/TestCode/PlayerStatsTest.cs | 6 +-- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/Assets/KSH/GameManager.cs b/Assets/KSH/GameManager.cs index 9be64878..6b1146df 100644 --- a/Assets/KSH/GameManager.cs +++ b/Assets/KSH/GameManager.cs @@ -72,6 +72,14 @@ public class GameManager : Singleton // _canvas = GameObject.FindObjectOfType(); } + private void OnDestroy() + { + if (playerStats != null) + { + playerStats.OnDayEnded -= AdvanceDay; // 이벤트 구독 해제 + } + } + private void OnApplicationQuit() { // TODO: 게임 종료 시 로직 추가 diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index 0dd56cfe..90cb3db6 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -8,9 +8,9 @@ public class PlayerStats : MonoBehaviour private GameConstants _gameConstants; private ValueByAction _valueByAction; - public float Time { get; private set; } - public float Health { get; private set; } - public float Reputation { get; private set; } + public float TimeStat { get; private set; } + public float HealthStat { get; private set; } + public float ReputationStat { get; private set; } public event Action OnDayEnded; @@ -20,9 +20,24 @@ public class PlayerStats : MonoBehaviour _valueByAction = new ValueByAction(); _valueByAction.Initialize(); // 값 초기화 - Health = _gameConstants.baseHealth; - Time = _gameConstants.baseTime; - Reputation = _gameConstants.baseReputation; + HealthStat = _gameConstants.baseHealth; + TimeStat = _gameConstants.baseTime; + ReputationStat = _gameConstants.baseReputation; + } + + // 현재 체력으로 해당 행동이 가능한 지 확인 + public bool canPerformByHealth(ActionType actionType) + { + ActionEffect effect = _valueByAction.GetActionEffect(actionType); + + if (HealthStat >= effect.healthChange) + { + return true; + } + else + { + return false; + } } // 행동 처리 메서드 @@ -46,20 +61,20 @@ public class PlayerStats : MonoBehaviour // 시간 리셋 if (isForced) { - Time = _gameConstants.baseTime; // 강제 수면일 시 아침 8시 기상 고정 + TimeStat = _gameConstants.baseTime; // 강제 수면일 시 아침 8시 기상 고정 } else { - Time -= _gameConstants.maxTime; + TimeStat -= _gameConstants.maxTime; } } // 행동에 따른 내부 스탯 변경 메서드 public void ModifyTime(float time) { - Time += time; + TimeStat += time; - if (Time >= _gameConstants.maxTime) + if (TimeStat >= _gameConstants.maxTime) { if (time == _gameConstants.forcedValue) { @@ -74,21 +89,32 @@ public class PlayerStats : MonoBehaviour public void ModifyHealth(float health) { - Health += health; - - if (Health > _gameConstants.maxHealth) + HealthStat += health; + + // 혹시 모를 음수 값 처리 + if (HealthStat < 0) { - Health = _gameConstants.maxHealth; + HealthStat = 0.0f; + } + + if (HealthStat > _gameConstants.maxHealth) + { + HealthStat = _gameConstants.maxHealth; } } public void ModifyReputation(float reputation) { - Reputation += reputation; + ReputationStat += reputation; - if (Reputation > _gameConstants.maxReputation) + if (ReputationStat < 0) { - Reputation = _gameConstants.maxReputation; + ReputationStat = 0.0f; + } + + if (ReputationStat > _gameConstants.maxReputation) + { + ReputationStat = _gameConstants.maxReputation; } } } diff --git a/Assets/KSH/TestCode/PlayerStatsTest.cs b/Assets/KSH/TestCode/PlayerStatsTest.cs index c16f496a..445d3f8b 100644 --- a/Assets/KSH/TestCode/PlayerStatsTest.cs +++ b/Assets/KSH/TestCode/PlayerStatsTest.cs @@ -63,9 +63,9 @@ public class PlayerStatsTest : MonoBehaviour // 참조 확인 후 스탯 업데이트 if (playerStats != null) { - currentTime = playerStats.Time; - currentHealth = playerStats.Health; - currentReputation = playerStats.Reputation; + currentTime = playerStats.TimeStat; + currentHealth = playerStats.HealthStat; + currentReputation = playerStats.ReputationStat; // GameManager에서 날짜 정보 가져오기 if (gameManager != null)