From 0c6ce706120242b6bcdbc69e31b6fe663d6cb96e Mon Sep 17 00:00:00 2001 From: Parkillhwan Date: Thu, 15 May 2025 13:17:41 +0900 Subject: [PATCH] =?UTF-8?q?DEG-167-=ED=83=88=EC=A7=84-=EC=97=B0=EC=B6=9C-?= =?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 | 6 +- Assets/Scripts/Common/GameManager.cs | 77 ++++++++++++++++++- 3 files changed, 100 insertions(+), 4 deletions(-) diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index a5ef57bf..bb2fbd4a 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..4b07f8ec 100644 --- a/Assets/Scripts/Common/Dialogue/ChatWindowController.cs +++ b/Assets/Scripts/Common/Dialogue/ChatWindowController.cs @@ -71,6 +71,10 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler isTuto = false; _dialogueManager = new FairyDialogueManager(this); + onComplete = () => + { + GameManager.Instance.gotoBed = true; + }; onComplete = () => { if (isTuto) @@ -83,7 +87,7 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler GameManager.Instance.ChangeToMainScene(); }; } - + // 외부 호출용 함수 (대화 시작) public void SetGamePhase(GamePhase phase) { diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index 3e819e6f..44c97c64 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -26,6 +26,10 @@ public partial class GameManager : Singleton,ISaveable private PanelManager panelManager; public PanelManager PanelManager => panelManager; + //탈진 관련 + [HideInInspector] + public bool gotoBed = false; + private TutorialManager tutorialManager; private void Start() @@ -36,11 +40,18 @@ 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 대화 관련 public void StartNPCDialogue(GamePhase phase) // intro, gameplay, end 존재 { + gotoBed = false; StartCoroutine(StartNPCDialogueCoroutine(phase)); } @@ -78,7 +89,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;// 평판 0 엔딩 } // 날짜 진행 @@ -93,6 +105,46 @@ 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() { @@ -105,6 +157,17 @@ public partial class GameManager : Singleton,ISaveable var switchingPanel = PanelManager.GetPanel("SwitchingPanel").GetComponent(); switchingPanel.FadeAndSceneLoad("ReDungeon"); // 던전 Scene HandleSceneAudio("Dungeon"); + StartCoroutine(CheckDungeonScene()); + } + + private IEnumerator CheckDungeonScene() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (SceneManager.GetActiveScene().name == "ReDungeon") + gotoBed = false; + else + StartCoroutine(CheckHomeScene()); } public void ChangeToHomeScene(bool isNewStart = false) @@ -115,10 +178,20 @@ public partial class GameManager : Singleton,ISaveable if(isNewStart) // 아예 메인에서 시작 시 튜토리얼 출력 StartNPCDialogue(GamePhase.Intro); // StartCoroutine(StartTutorialCoroutine()); - + 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);