새 프롬프트를 짜줘. 각 스테이지별 버텨야 하는 시간 (Stage 테이블의 Time 컬럼에 입력한 초)을 버티는 데 성공하면 게임을 멈추고 Success가 써있는 패널을 띄워주는 것. 만약 버텨야 하는 시간을 버티지 못하고 사망하면 그 즉시 게임을 멈추고 Fail 이 써있는 패널을 띄워주는 것.
프롬프트
목표
- Stage 테이블의 Time(초) 값을 가져와 스테이지 생존 타이머로 사용한다.
- 남은 시간이 0이 되면 즉시 게임을 멈추고 “Success” 패널을 띄운다.
- 플레이어가 그 전에 사망하면 즉시 게임을 멈추고 “Fail” 패널을 띄운다.
- 중복 실행(성공/실패가 두 번 이상 호출) 방지 플래그를 둔다.
데이터/전제
- Stage.csv(또는 Stage 테이블)에 현재 스테이지의 Time(int, 초)이 있다. 컬럼명은 **Time**을 사용한다. (기존 DurationSec 사용 금지)
- StageManager(또는 동등 모듈)가 현재 StageId를 알고 있으며, Stage.Time을 읽을 수 있어야 한다.
- 결과 패널은 프리팹 또는 씬에 비활성화된 오브젝트로 존재:
- SuccessPanel (텍스트 “Success” 포함)
- FailPanel (텍스트 “Fail” 포함)
- TextMeshPro 사용 가능(선택). 패널은 UI(Canvas) 상단에 뜬다.
구현 지시
1) 타이머 관리
- StageManager(또는 StageTimerService)에 필드 추가:
- float remainingSeconds
- bool isStageEnded
- 스테이지 시작 시: remainingSeconds = Stage.Time; isStageEnded = false;
- 타이머는 **Time.deltaTime(스케일 적용)** 으로 감소시켜 일시정지(Time.timeScale=0) 중에는 흐르지 않게 한다.
- remainingSeconds <= 0 이 되는 프레임에서 `EndStage(success:true)` 호출.
2) 사망 감지
- PlayerHealth(또는 등가)에서 OnDeath 이벤트 발행.
- StageManager가 구독하여 즉시 `EndStage(success:false)` 호출.
3) EndStage(success)
- 가드: if (isStageEnded) return; → isStageEnded = true;
- 게임 멈춤: Time.timeScale = 0; (별도 PauseManager가 있으면 해당 API 사용)
- 입력/스폰/AI 등 게임플레이 루프 비활성화(필요 시 인터페이스로 일괄 정지)
- UI:
- success==true → SuccessPanel 활성화
- success==false → FailPanel 활성화
- 재시작/메인메뉴 버튼이 있다면 버튼 리스너 연결은 여기에서 처리(선택)
4) 이벤트/의존성 정리
- StageManager가 다음 이벤트를 발행(선택):
- OnStageStarted(float timeSec)
- OnStageTimerChanged(float remainingSec) // HUD 갱신용
- OnStageCleared() / OnStageFailed()
- 기존에 “예산 소진 시 즉시 클리어” 같은 다른 승리 조건이 있다면,
해당 지점에서도 `EndStage(success:true)` 를 호출하되 isStageEnded로 중복 방지.
5) 안전/성능
- 패널은 1회만 Instantiate 또는 SetActive(true) 하도록 설계. (중복 생성 금지)
- TimeScale=0 환경에서 돌아가면 안 되는 컴포넌트(투사체, 적 AI, 자석 등)는 scaled time을 사용하고 있는지 점검.
- 코루틴 대기 사용 시 `WaitForSeconds`(스케일 적용)를 사용하고, 실수로 `WaitForSecondsRealtime`(비스케일)을 쓰지 말 것.
수락 기준(테스트)
- Stage.Time=10일 때, 10초 생존하면 즉시 타임스케일 0, SuccessPanel 표시.
- 10초 이전에 플레이어 사망 시 즉시 타임스케일 0, FailPanel 표시.
- 두 조건 모두에서 중복 호출 없이 패널이 한 번만 뜸.
- 일시정지/재개(예: 레벨업 패널) 중에는 타이머가 줄지 않음.