From 6f9f18628ccaa4103fc552db29e7c6346f8baca3 Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Sun, 16 Feb 2025 19:40:04 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=8A=A4=ED=85=8C=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9E=85=EC=9E=A5=20=EC=8B=9C=20=ED=95=98=ED=8A=B8=20=EC=86=8C?= =?UTF-8?q?=EB=AA=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9E=AC=EC=B6=A9=EC=A0=84=20=EC=8B=9C=EA=B0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Character/Heart/HeartDataManager.cs | 45 ++++++++++++++----- .../Scripts/Character/Heart/HeartSystem.cs | 12 ++--- .../Gameton/Scripts/GameData/HeartData.cs | 18 +------- .../Assets/Gameton/Scripts/UI/PauseUI.cs | 2 + 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs index 048330db..abf9b8e0 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs @@ -12,9 +12,10 @@ namespace TON public HeartData currentHeartData { get; private set; } private int characterId; + public int maxHearts = 3; + public int heartRechargeTime = 600; + public int GetCurrentHearts() => currentHeartData.currentHearts; - public int GetMaxHearts() => currentHeartData.maxHearts; - public int GetHeartRechargeTime() => currentHeartData.heartRechargeTime; public DateTime GetLastHeartTime() => DateTime.Parse(currentHeartData.lastHeartTime); @@ -24,6 +25,11 @@ namespace TON LoadHeartData(); } + public void Initalize() + { + LoadHeartData(); + } + private void LoadHeartData() { if (heartDatas != null) @@ -55,6 +61,7 @@ namespace TON if (characterId > -1) { currentHeartData = heartDatas[characterId]; + Debug.Log(currentHeartData.ToString()); if (currentHeartData != null) { RechargeHearts(); @@ -83,41 +90,55 @@ namespace TON // 게임이 다시 실행될때 마지막 하트 소모 시간과 현재 시간을 계산해서 하트 충전량을 반영 public void RechargeHearts() { - if (currentHeartData.currentHearts >= currentHeartData.maxHearts) return; + if (currentHeartData.currentHearts >= maxHearts) return; DateTime lastTime = DateTime.Parse(currentHeartData.lastHeartTime); TimeSpan timePassed = DateTime.Now - lastTime; - int heartsToRecover = (int)(timePassed.TotalSeconds / currentHeartData.heartRechargeTime); + + int heartsToRecover = (int)(timePassed.TotalSeconds / heartRechargeTime); if (heartsToRecover > 0) { - currentHeartData.currentHearts = Mathf.Min(currentHeartData.currentHearts + heartsToRecover, currentHeartData.maxHearts); - currentHeartData.lastHeartTime = DateTime.Now.ToString(); + int newHearts = Mathf.Min(currentHeartData.currentHearts + heartsToRecover, maxHearts); + + // 충전된 하트 수만큼 lastHeartTime을 재조정 + currentHeartData.currentHearts = newHearts; + + // 남은 충전 시간 유지: 충전된 만큼 lastHeartTime을 앞으로 이동 + currentHeartData.lastHeartTime = lastTime.AddSeconds(heartsToRecover * heartRechargeTime).ToString(); SaveHeartData(); } } - // 하트 소모 시 데이터 및 화면 UI를 업데이트트 + // 하트 소모 시 데이터 및 화면 UI를 업데이트 public void UseHeart() { if (currentHeartData.currentHearts > 0) { currentHeartData.currentHearts--; - currentHeartData.lastHeartTime = DateTime.Now.ToString(); - SaveHeartData(); + // 재충전 중일 경우 lastHeartTime을 유지 + DateTime lastTime = DateTime.Parse(currentHeartData.lastHeartTime); + TimeSpan timePassed = DateTime.Now - lastTime; + + if (timePassed.TotalSeconds >= heartRechargeTime || currentHeartData.currentHearts == maxHearts - 1) + { + currentHeartData.lastHeartTime = DateTime.Now.ToString(); + } + + SaveHeartData(); FindObjectOfType().UpdateHeartUI(); // UI 업데이트 } } - // 데이터 파일에 저장된 마지막 하트 사용시간과 동기화화 + // 데이터 파일에 저장된 마지막 하트 사용시간과 동기화 public int GetRemainingRechargeTime() { - if (currentHeartData.currentHearts >= currentHeartData.maxHearts) return 0; + if (currentHeartData.currentHearts >= maxHearts) return 0; DateTime lastTime = DateTime.Parse(currentHeartData.lastHeartTime); TimeSpan timePassed = DateTime.Now - lastTime; - int timeLeft = currentHeartData.heartRechargeTime - (int)timePassed.TotalSeconds; + int timeLeft = heartRechargeTime - (int)timePassed.TotalSeconds; return Mathf.Max(0, timeLeft); } diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs index 6cfc836d..2da0468f 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs @@ -12,15 +12,17 @@ namespace TON public List heartImages; // 하트 UI 리스트 public Sprite fullHeartSprite; // 채워진 하트 public Sprite emptyHeartSprite; // 빈 하트 - private HeartData heartData; - public TextMeshProUGUI timerText; // 하트 충전 타이머 UI - private void Start() + private void OnEnable() { UpdateHeartUI(); // 시작 시 UI 갱신 - InvokeRepeating(nameof(UpdateTimer), 0, 1f); // 1초마다 업데이트 + } + + private void FixedUpdate() + { + UpdateTimer(); } public void UpdateHeartUI() @@ -35,7 +37,7 @@ namespace TON private void UpdateTimer() { - if (HeartDataManager.Singleton.GetCurrentHearts() >= HeartDataManager.Singleton.GetMaxHearts()) + if (HeartDataManager.Singleton.GetCurrentHearts() >= HeartDataManager.Singleton.maxHearts) { timerText.text = "0:00"; return; diff --git a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs index 7501e306..c6d182ef 100644 --- a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs +++ b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs @@ -12,28 +12,14 @@ namespace TON public int characterId; // 현재 하트 개수 public int currentHearts; - public int maxHearts = 3; - public int heartRechargeTime = 600; // 10분 public string lastHeartTime; // 캐릭터 생성시 하트 데이터 생성자 public HeartData(int characterId) { this.characterId = characterId; - currentHearts = maxHearts; - } - // 하트 소모 시 변경할 객체 생성자자 - public void UseHeart() - { - if (currentHearts > 0) - { - currentHearts--; - lastHeartTime = DateTime.UtcNow.ToString(); // 마지막 사용 시간 갱신 - } - else - { - Debug.Log("하트가 부족합니다!"); - } + // currentHearts = maxHearts; } + } } diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/PauseUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/PauseUI.cs index 05ce7dc5..09626778 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/PauseUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/PauseUI.cs @@ -25,6 +25,8 @@ namespace TON public void OnClickHomeButton() { + UIManager.Hide(UIList.PauseUI); + Time.timeScale = 1f; Main.Singleton.ChangeScene(SceneType.Lobby); }