using System.Collections.Generic; using UnityEngine; public class RoomRouteManager : MonoBehaviour { public static RoomRouteManager Instance; [System.Serializable] public class RoomData { [Header("¹æ ¹øÈ£ ÀÔ·Â")] public int roomNumber; [Header("ÀÌ ¹æ¿¡ ÇØ´çÇÏ´Â Scene À̸§ ÀÔ·Â")] public string sceneName; } [Header("Àüü ¹æ Á¤º¸ ÀÔ·Â")] [SerializeField] private List rooms = new List(); [Header("½ÃÀÛ ¹æ ¹øÈ£ ÀÔ·Â")] [SerializeField] private int startRoomNumber; [Header("·£´ý ¼±ÅÃÁö °³¼ö")] [SerializeField] private int randomChoiceCount = 2; [Header("¸ðµç ¹æ ¹æ¹® ÈÄ À̵¿ÇÒ ¸¶Áö¸· Scene À̸§")] [SerializeField] private string finalSceneName; private int _currentRoomNumber; private readonly HashSet _visitedRooms = new HashSet(); public int CurrentRoomNumber => _currentRoomNumber; public int VisitedRoomCount => _visitedRooms.Count; public int TotalRoomCount => rooms.Count; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); _currentRoomNumber = startRoomNumber; if (startRoomNumber != 0) { _visitedRooms.Add(startRoomNumber); } } else { Destroy(gameObject); } } // ¹æ¹®ÇÏÁö ¾ÊÀº ¹æ Àüü ¹Ýȯ public List GetUnvisitedRooms() { List result = new List(); foreach (RoomData room in rooms) { if (!_visitedRooms.Contains(room.roomNumber)) { result.Add(room); } } return result; } // ´ëÈ­ ¼±ÅÃÁö¿¡ º¸¿©ÁÙ ·£´ý ¹æ ¸ñ·Ï ¹Ýȯ public List GetRandomNextRooms() { List unvisitedRooms = GetUnvisitedRooms(); List randomRooms = new List(); int count = Mathf.Min(randomChoiceCount, unvisitedRooms.Count); for (int i = 0; i < count; i++) { int randomIndex = Random.Range(0, unvisitedRooms.Count); randomRooms.Add(unvisitedRooms[randomIndex]); unvisitedRooms.RemoveAt(randomIndex); } return randomRooms; } // ¹öưÀ̳ª ´ëÈ­ ¼±ÅÃÁö¿¡¼­ È£Ãâ public void MoveToRoom(int roomNumber) { if (SceneLoadManager.Instance == null) { Debug.LogError("SceneLoadManager°¡ ¾À¿¡ ¾ø½À´Ï´Ù."); return; } if (SceneLoadManager.Instance.IsChangingScene) { Debug.Log("ÀÌ¹Ì ¾À À̵¿ ÁßÀÔ´Ï´Ù."); return; } RoomData targetRoom = GetRoomData(roomNumber); if (targetRoom == null) { Debug.LogWarning($"¹æ Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù. ¹æ ¹øÈ£: {roomNumber}"); return; } if (_visitedRooms.Contains(roomNumber)) { Debug.Log($"ÀÌ¹Ì ¹æ¹®ÇÑ ¹æÀÔ´Ï´Ù. ¹æ ¹øÈ£: {roomNumber}"); return; } if (string.IsNullOrEmpty(targetRoom.sceneName)) { Debug.LogWarning($"¹æ {roomNumber}ÀÇ Scene À̸§ÀÌ ºñ¾îÀÖ½À´Ï´Ù."); return; } _currentRoomNumber = roomNumber; _visitedRooms.Add(roomNumber); SceneLoadManager.Instance.RequestSceneChange(targetRoom.sceneName); } // ·£´ý ¹æ Çϳª·Î ¹Ù·Î À̵¿ÇÏ°í ½ÍÀ» ¶§ »ç¿ë public void MoveToRandomRoom() { List unvisitedRooms = GetUnvisitedRooms(); if (unvisitedRooms.Count <= 0) { Debug.Log("¹æ¹®ÇÏÁö ¾ÊÀº ¹æÀÌ ¾ø½À´Ï´Ù."); if (IsAllRoomsVisited()) { MoveToFinalScene(); } return; } int randomIndex = Random.Range(0, unvisitedRooms.Count); RoomData randomRoom = unvisitedRooms[randomIndex]; MoveToRoom(randomRoom.roomNumber); } public bool IsAllRoomsVisited() { return rooms.Count > 0 && _visitedRooms.Count >= rooms.Count; } public void MoveToFinalScene() { if (!IsAllRoomsVisited()) { Debug.Log("¾ÆÁ÷ ¸ðµç ¹æÀ» ¹æ¹®ÇÏÁö ¾Ê¾Ò½À´Ï´Ù."); return; } if (SceneLoadManager.Instance == null) { Debug.LogError("SceneLoadManager°¡ ¾À¿¡ ¾ø½À´Ï´Ù."); return; } if (SceneLoadManager.Instance.IsChangingScene) { Debug.Log("ÀÌ¹Ì ¾À À̵¿ ÁßÀÔ´Ï´Ù."); return; } if (string.IsNullOrEmpty(finalSceneName)) { Debug.LogWarning("¸¶Áö¸· Scene À̸§ÀÌ ºñ¾îÀÖ½À´Ï´Ù."); return; } SceneLoadManager.Instance.RequestSceneChange(finalSceneName); } public bool IsVisitedRoom(int roomNumber) { return _visitedRooms.Contains(roomNumber); } public void ResetVisitedRooms() { _visitedRooms.Clear(); _currentRoomNumber = startRoomNumber; if (startRoomNumber != 0) { _visitedRooms.Add(startRoomNumber); } } private RoomData GetRoomData(int roomNumber) { foreach (RoomData room in rooms) { if (room.roomNumber == roomNumber) { return room; } } return null; } }