From b1dd559bc0141951491600f5d1c1ba1dcc0480ec Mon Sep 17 00:00:00 2001 From: Parkillhwan Date: Thu, 15 May 2025 13:35:49 +0900 Subject: [PATCH] =?UTF-8?q?DEG-167-=ED=83=88=EC=A7=84-=EC=B6=A9=EB=8F=8C-?= =?UTF-8?q?=EC=B6=A9=EB=8F=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/KSH/PlayerStats.cs | 21 ++++- .../Common/Dialogue/ChatWindowController.cs | 5 ++ Assets/Scripts/Common/GameManager.cs | 77 ++++++++++++++++++- 3 files changed, 101 insertions(+), 2 deletions(-) diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index fb3bb12c..6da6716a 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -91,6 +91,24 @@ public class PlayerStats : MonoBehaviour,ISaveable GameManager.Instance.SetEvents(); SceneManager.sceneLoaded += OnSceneLoaded; // 씬 전환 이벤트 _mealCount = 0; // 식사 횟수 0회 + + var panel = FindObjectOfType(); + if (panel != null) + { + PlayerStats.Instance.SetInteractionPanelController(panel); + } + } + + private void TriggerExhaustion() + { + if (HealthStat > 0) return; + + Exhaustion?.Invoke(); // 탈진 이벤트 발생 + } + + public InteractionAnimationPanelController GetInteractionPanelController() + { + return _interactionAnimation; } #region 말풍선(Bubble) 관련 @@ -373,7 +391,8 @@ public class PlayerStats : MonoBehaviour,ISaveable // 탈진 이벤트 발생 Debug.Log("탈진! 체력 0"); - Exhaustion?.Invoke(); + GameManager.Instance.gotoBed = true; + Invoke(nameof(TriggerExhaustion), 4f); } if (HealthStat > MaxHealth) diff --git a/Assets/Scripts/Common/Dialogue/ChatWindowController.cs b/Assets/Scripts/Common/Dialogue/ChatWindowController.cs index 43efa235..d71614e0 100644 --- a/Assets/Scripts/Common/Dialogue/ChatWindowController.cs +++ b/Assets/Scripts/Common/Dialogue/ChatWindowController.cs @@ -72,6 +72,11 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler _dialogueManager = new FairyDialogueManager(this); + onComplete = () => + { + GameManager.Instance.gotoBed = true; + }; + onComplete = () => { if (isTuto) { diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index cdb5df15..dd4d9ea6 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -28,6 +28,9 @@ public partial class GameManager : Singleton,ISaveable private TutorialManager tutorialManager; + [HideInInspector] + public bool gotoBed = false; + private void Start() { // 오디오 초기화 @@ -36,6 +39,13 @@ public partial class GameManager : Singleton,ISaveable //패널 매니저 생성 panelManager = Instantiate(Resources.Load("Prefabs/PanelManager")).GetComponent(); } + + private IEnumerator DelayedForcedSleep(float delay) + { + yield return new WaitForSeconds(delay); + PlayerStats.Instance.PerformAction(ActionType.ForcedSleep); + } + #region 대화 관련 @@ -46,6 +56,8 @@ public partial class GameManager : Singleton,ISaveable private IEnumerator StartNPCDialogueCoroutine(GamePhase phase) { + gotoBed = false; + if (chatWindowController == null) { yield return new WaitForSeconds(4.0f); // 씬 전환 대기 @@ -78,7 +90,8 @@ public partial class GameManager : Singleton,ISaveable public void SetEvents() { PlayerStats.Instance.OnDayEnded += AdvanceDay; // 날짜 변경 - PlayerStats.Instance.ZeroReputation += ZeroReputationEnd; // 평판 0 엔딩 + PlayerStats.Instance.ZeroReputation += ZeroReputationEnd; + PlayerStats.Instance.Exhaustion += ExhaustionToSleep; } // 날짜 진행 @@ -93,10 +106,61 @@ public partial class GameManager : Singleton,ISaveable TriggerTimeEnding(); } } + + // 탈진 + private void ExhaustionToSleep() + { + StartCoroutine(WaitOtherEvents()); + } + + private IEnumerator WaitOtherEvents() + { + yield return new WaitForSeconds(Time.deltaTime); + + // 로딩 중이거나 던전/메인 씬이면 탈진 실행 보류 + string currentScene = SceneManager.GetActiveScene().name; + if (currentScene != "ReHousing") + { + StartCoroutine(WaitOtherEvents()); // 다시 기다림 + yield break; + } + + if (gotoBed) + { + var panel = PlayerStats.Instance.GetInteractionPanelController(); + + if (panel != null) + { + panel.ShowAnimationPanel(ActionType.Sleep, "탈진했습니다"); + GameManager.Instance.StartCoroutine(DelayedForcedSleep(2.0f)); // 애니메이션 끝나고 강제 수면 처리 + } + else + { + PlayerStats.Instance.PerformAction(ActionType.ForcedSleep); + } + + gotoBed = false; + } + else + { + StartCoroutine(WaitOtherEvents()); + } + } public void ChangeToMainScene() { SceneManager.LoadScene("Main"); + StartCoroutine(CheckDungeonScene()); + } + + private IEnumerator CheckDungeonScene() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (SceneManager.GetActiveScene().name == "ReDungeon") + gotoBed = false; + else + StartCoroutine(CheckHomeScene()); } public void ChangeToGameScene() @@ -120,9 +184,20 @@ public partial class GameManager : Singleton,ISaveable if(isNewStart) // 아예 메인에서 시작 시 튜토리얼 출력 StartNPCDialogue(GamePhase.Intro); + StartCoroutine(CheckHomeScene()); if (tryStageCount >= 3) FailEnd(); // 엔딩 } + private IEnumerator CheckHomeScene() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (SceneManager.GetActiveScene().name == "ReHousing") + gotoBed = true; + else + StartCoroutine(CheckHomeScene()); + } + public IEnumerator StartTutorialCoroutine() { yield return new WaitForSeconds(0.5f);