89 lines
3.0 KiB
C#
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(); |