using System; using System.Collections.Generic; using UI; using UnityEngine; using UnityEngine.Events; namespace Level { public class LevelManager : MonoBehaviour { private static LevelManager _instance = null; public static LevelManager Instance { get { if (_instance == null) { GameObject gameObject = new GameObject("Level Manager"); _instance = gameObject.AddComponent(); _instance.Initialize(); } return _instance; } } private Dictionary _levels = null; public Dictionary Levels { get { if (_levels == null) Initialize(); return _levels; } } private Level currentLevel = null; public Level CurrentLevel => currentLevel; public UnityEvent OnLevelChanged = new UnityEvent(); private void Awake() { if (_instance == null) _instance = this; if (_instance != this) Destroy(this); } public GameObject Player { get; private set; } = null; private void Initialize() { GameObject[] levelPrefabs = Resources.LoadAll("Levels/"); Transform levelContainer = new GameObject("Levels").transform; _levels = new Dictionary(levelPrefabs.Length); System.Array.Sort(levelPrefabs, (x, y) => Int32.Parse(x.name).CompareTo(Int32.Parse(y.name))); GameObject levelInstance = null; Level level = null; foreach (GameObject levelPrefab in levelPrefabs) { levelInstance = new GameObject(levelPrefab.gameObject.name); levelInstance.transform.SetParent(levelContainer); level = levelInstance.AddComponent(); level.SetLevel(System.Int32.Parse(levelPrefab.name)); _levels.Add(System.Int32.Parse(levelPrefab.gameObject.name), level); } Player = GameObject.FindWithTag("Player"); if (Player == null) Player = (GameObject)Instantiate(Resources.Load("Playable/Player"), transform.position, Quaternion.identity); Player.SetActive(false); } public void SwitchToLevel(int levelNumber) { DisableAllLevels(); if (!Levels.ContainsKey(levelNumber)) { UIManager.Instance.SwitchToCanvas("Level Selection Menu"); return; } currentLevel = Levels[levelNumber]; currentLevel.Enable(); Player.SetActive(true); Player.transform.position = currentLevel.StartingPoint.position; Player.GetComponent().velocity = Vector2.zero; UIManager.Instance.CloseAllCanvases(); OnLevelChanged?.Invoke(); } public void DisableAllLevels() { Player.SetActive(false); currentLevel = null; foreach (Level level in Levels.Values) level.Disable(); } public bool IsLevelUnlocked(int levelNumber) { levelNumber -= 1; if (levelNumber == 0) return true; return PlayerPrefs.GetInt(levelNumber.ToString(), 0) != 0; } [ContextMenu("Lock All Levels")] public void LockAllLevels() => PlayerPrefs.DeleteAll(); } }