using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using NaughtyAttributes; using Variables; public class LevelManager : MonoBehaviour { [SerializeField, Header("References")] Reference m_isPlayerDead; [SerializeField] Reference m_freezePlayer; [SerializeField] Reference m_isVictory; [SerializeField] Reference m_timer; [SerializeField, BoxGroup("Level Settings")] private string m_levelName = "Level 1"; [SerializeField, BoxGroup("Level Settings")] private float m_timeInLevel = 10; [SerializeField] private float m_resetTime = 1; [SerializeField] private string m_nextSceneToLoad = "Level 2"; private IResettable[] m_allResetable; private void Start() { m_allResetable = FindObjectsOfType().OfType().ToArray(); m_timer.Value = m_timeInLevel; foreach (IResettable resettable in m_allResetable) { resettable.OnLevelLoad(); } } private void Update() { if (!m_freezePlayer) m_timer.Value -= Time.deltaTime; } private void OnEnable() { m_isPlayerDead.OnValueChanged += OnPlayerDeadChange; m_isVictory.OnValueChanged += OnPlayerVictoryChange; } private void OnDisable() { m_isPlayerDead.OnValueChanged -= OnPlayerDeadChange; m_isVictory.OnValueChanged -= OnPlayerVictoryChange; } private IEnumerator DeathRoutine() { m_freezePlayer.Value = true; m_timer.Value = m_timeInLevel; foreach (IResettable resettable in m_allResetable) StartCoroutine(resettable.OnResetStart(m_resetTime)); yield return new WaitForSeconds(m_resetTime); foreach (IResettable resettable in m_allResetable) resettable.OnResetEnd(); m_freezePlayer.Value = false; } private void OnPlayerDeadChange(bool value) { if (value) { StartCoroutine(DeathRoutine()); } } private void OnPlayerVictoryChange(bool value) { } }