DEG-167-탈진-연출-충돌

This commit is contained in:
Parkillhwan 2025-05-15 13:17:41 +09:00
parent 19bf97bfb2
commit 0c6ce70612
3 changed files with 100 additions and 4 deletions

View File

@ -91,6 +91,24 @@ public class PlayerStats : MonoBehaviour,ISaveable
GameManager.Instance.SetEvents(); GameManager.Instance.SetEvents();
SceneManager.sceneLoaded += OnSceneLoaded; // 씬 전환 이벤트 SceneManager.sceneLoaded += OnSceneLoaded; // 씬 전환 이벤트
_mealCount = 0; // 식사 횟수 0회 _mealCount = 0; // 식사 횟수 0회
var panel = FindObjectOfType<InteractionAnimationPanelController>();
if (panel != null)
{
PlayerStats.Instance.SetInteractionPanelController(panel);
}
}
private void TriggerExhaustion()
{
if (HealthStat > 0) return;
Exhaustion?.Invoke(); // 탈진 이벤트 발생
}
public InteractionAnimationPanelController GetInteractionPanelController()
{
return _interactionAnimation;
} }
#region (Bubble) #region (Bubble)
@ -373,7 +391,8 @@ public class PlayerStats : MonoBehaviour,ISaveable
// 탈진 이벤트 발생 // 탈진 이벤트 발생
Debug.Log("탈진! 체력 0"); Debug.Log("탈진! 체력 0");
Exhaustion?.Invoke(); GameManager.Instance.gotoBed = true;
Invoke(nameof(TriggerExhaustion), 4f);
} }
if (HealthStat > MaxHealth) if (HealthStat > MaxHealth)

View File

@ -71,6 +71,10 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler
isTuto = false; isTuto = false;
_dialogueManager = new FairyDialogueManager(this); _dialogueManager = new FairyDialogueManager(this);
onComplete = () =>
{
GameManager.Instance.gotoBed = true;
};
onComplete = () => { onComplete = () => {
if (isTuto) if (isTuto)
@ -83,7 +87,7 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler
GameManager.Instance.ChangeToMainScene(); GameManager.Instance.ChangeToMainScene();
}; };
} }
// 외부 호출용 함수 (대화 시작) // 외부 호출용 함수 (대화 시작)
public void SetGamePhase(GamePhase phase) public void SetGamePhase(GamePhase phase)
{ {

View File

@ -26,6 +26,10 @@ public partial class GameManager : Singleton<GameManager>,ISaveable
private PanelManager panelManager; private PanelManager panelManager;
public PanelManager PanelManager => panelManager; public PanelManager PanelManager => panelManager;
//탈진 관련
[HideInInspector]
public bool gotoBed = false;
private TutorialManager tutorialManager; private TutorialManager tutorialManager;
private void Start() private void Start()
@ -36,11 +40,18 @@ public partial class GameManager : Singleton<GameManager>,ISaveable
//패널 매니저 생성 //패널 매니저 생성
panelManager = Instantiate(Resources.Load<GameObject>("Prefabs/PanelManager")).GetComponent<PanelManager>(); panelManager = Instantiate(Resources.Load<GameObject>("Prefabs/PanelManager")).GetComponent<PanelManager>();
} }
private IEnumerator DelayedForcedSleep(float delay)
{
yield return new WaitForSeconds(delay);
PlayerStats.Instance.PerformAction(ActionType.ForcedSleep);
}
#region #region
public void StartNPCDialogue(GamePhase phase) // intro, gameplay, end 존재 public void StartNPCDialogue(GamePhase phase) // intro, gameplay, end 존재
{ {
gotoBed = false;
StartCoroutine(StartNPCDialogueCoroutine(phase)); StartCoroutine(StartNPCDialogueCoroutine(phase));
} }
@ -78,7 +89,8 @@ public partial class GameManager : Singleton<GameManager>,ISaveable
public void SetEvents() public void SetEvents()
{ {
PlayerStats.Instance.OnDayEnded += AdvanceDay; // 날짜 변경 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<GameManager>,ISaveable
TriggerTimeEnding(); 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() public void ChangeToMainScene()
{ {
@ -105,6 +157,17 @@ public partial class GameManager : Singleton<GameManager>,ISaveable
var switchingPanel = PanelManager.GetPanel("SwitchingPanel").GetComponent<SwitchingPanelController>(); var switchingPanel = PanelManager.GetPanel("SwitchingPanel").GetComponent<SwitchingPanelController>();
switchingPanel.FadeAndSceneLoad("ReDungeon"); // 던전 Scene switchingPanel.FadeAndSceneLoad("ReDungeon"); // 던전 Scene
HandleSceneAudio("Dungeon"); 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) public void ChangeToHomeScene(bool isNewStart = false)
@ -115,10 +178,20 @@ public partial class GameManager : Singleton<GameManager>,ISaveable
if(isNewStart) // 아예 메인에서 시작 시 튜토리얼 출력 if(isNewStart) // 아예 메인에서 시작 시 튜토리얼 출력
StartNPCDialogue(GamePhase.Intro); // StartCoroutine(StartTutorialCoroutine()); StartNPCDialogue(GamePhase.Intro); // StartCoroutine(StartTutorialCoroutine());
StartCoroutine(CheckHomeScene());
if (tryStageCount >= 3) FailEnd(); // 엔딩 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() public IEnumerator StartTutorialCoroutine()
{ {
yield return new WaitForSeconds(0.5f); yield return new WaitForSeconds(0.5f);