Projext/Assets/Scripts/Obsession/RoomManager.cs
2026-02-22 22:37:34 +09:00

89 lines
3.0 KiB
C#

using UnityEngine;
public class RoomManager : MonoBehaviour
{
[Header("이 방에 있는 몬스터들")]
[Tooltip("이 방에 속한 몬스터들을 전부 등록하세요.")]
public MonsterClass[] monstersInRoom; // 인스펙터에서 드래그해서 채우기
[Header("보상 설정")]
[SerializeField] private int clearXP = 20; // 방 클리어 기본 XP
[SerializeField] private int noHitBonusXP = 10; // 무피격 보너스 XP
private bool roomCleared = false;
private bool playerTookDamageThisRoom = false; // 이 방에서 플레이어가 한 번이라도 맞았는지
private void Start()
{
roomCleared = false;
playerTookDamageThisRoom = false;
}
private void Update()
{
if (roomCleared) return;
// [테스트용] C 키를 누르면 몬스터가 없어도 강제로 방 클리어!
if (Input.GetKeyDown(KeyCode.C))
{
Debug.Log("[Room Test] 몬스터 무시하고 강제 클리어(C키)");
ClearRoom(); // 복잡한 코드 싹 지우고 그냥 함수를 직접 부릅니다!
return; // 클리어 했으니 아래 로직은 실행 안 함
}
// 몬스터가 등록되어 있지 않으면 아래의 '몬스터 죽음 체크'를 할 필요가 없음
if (monstersInRoom == null || monstersInRoom.Length == 0)
return;
// 모든 몬스터가 죽었는지 체크
bool allDead = true;
foreach (var mob in monstersInRoom)
{
if (mob != null && !mob.IsDead)
{
allDead = false;
break;
}
}
if (allDead)
{
ClearRoom();
}
}
// 이 방을 클리어했을 때 한 번만 호출
// 이 방을 클리어했을 때 한 번만 호출
private void ClearRoom()
{
roomCleared = true;
Debug.Log($"[Room] {gameObject.name} 클리어!");
if (ObsessionSystem.instance != null)
{
// ⭐ 1) 방 클리어 전용 XP 바구니에 넣기
ObsessionSystem.instance.AddStageClearXP(clearXP);
// ⭐ 2) 무피격 보너스 전용 XP 바구니에 넣기
if (!playerTookDamageThisRoom)
{
ObsessionSystem.instance.AddPerfectClearXP(noHitBonusXP);
Debug.Log($"[Room] 무피격 클리어! +{noHitBonusXP}XP");
}
// 3) 방 클리어 카운트 증가 (사망 보너스용)
ObsessionSystem.instance.NotifyRoomCleared();
}
}
// TODO: 여기서 문 열기, 포탈 활성화, 다음 방 트리거나 연출 넣으면 됨
// ex) if (door != null) door.Open();
// PlayerHealth에서 호출할 함수: 이 방에서 플레이어가 데미지를 처음 입었을 때
public void NotifyPlayerDamaged()
{
playerTookDamageThisRoom = true;
}
}
// TODO: 여기서 문 열기, 포탈 활성화, 다음 방 트리거나 연출 넣으면 됨
// ex) if (door != null) door.Open();