|
|
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEngine.SceneManagement;
- using NaughtyAttributes;
- using Variables;
-
- public class LevelManager : MonoBehaviour
- {
- [SerializeField, Header("References")]
- Reference<bool> m_isPlayerDead;
-
- [SerializeField]
- Reference<bool> m_freezePlayer;
-
- [SerializeField]
- Reference<bool> m_isVictory;
-
- [SerializeField]
- Reference<float> m_timer;
-
- [SerializeField]
- Reference<float> m_light;
-
- [SerializeField]
- Reference<bool> m_manualDarkness;
-
- [SerializeField]
- private Image m_backGround;
-
-
- [SerializeField, BoxGroup("Level Settings")]
- public string levelName = "Level 1";
-
- [SerializeField, BoxGroup("Level Settings")]
- private float m_timeInLevel = 10;
-
- [SerializeField, BoxGroup("Level Settings")]
- public string levelPrompt = "Get to the Chest";
-
- [SerializeField,BoxGroup("Default Settings")]
- private float m_resetTime = 1;
-
- [SerializeField, BoxGroup("Default Settings")]
- private float m_nextSceneWaitTime = 3;
-
- [SerializeField, BoxGroup("Level Settings")]
- private string m_nextSceneToLoad = "Level 2";
-
-
- private IResettable[] m_allResetable;
-
- private void Start()
- {
- m_allResetable = FindObjectsOfType<MonoBehaviour>(true).OfType<IResettable>().ToArray();
- m_timer.Value = m_timeInLevel;
-
- m_isVictory.Value = false;
-
- foreach (IResettable resettable in m_allResetable)
- {
- resettable.OnLevelLoad();
- }
- }
-
- private void Update()
- {
- if (!m_freezePlayer)
- m_timer.Value -= Time.deltaTime;
-
- if (m_timer <= 0 && !m_isPlayerDead)
- {
- m_isPlayerDead.Value = true;
- }
-
- }
-
-
-
- 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;
-
- yield return new WaitForSeconds(1);
-
-
-
- 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 IEnumerator VictoryRoutine()
- {
- yield return new WaitForSeconds(m_nextSceneWaitTime);
-
- m_manualDarkness.Value = true;
-
- float elapsedTime = 0;
- float fadeTime = 1;
- while (elapsedTime < fadeTime)
- {
- m_light.Value = 1 - elapsedTime / fadeTime;
- yield return new WaitForEndOfFrame();
- elapsedTime += Time.deltaTime;
- }
- m_light.Value = 0;
-
- yield return new WaitForSeconds(1);
-
- elapsedTime = 0;
- fadeTime = 2;
-
-
- Color color = m_backGround.color;
- m_backGround.gameObject.SetActive(true);
-
- while (elapsedTime < fadeTime)
- {
- color.a = elapsedTime / fadeTime;
- m_backGround.color = color;
-
- yield return new WaitForEndOfFrame();
- elapsedTime += Time.deltaTime;
- }
-
- yield return new WaitForSeconds(1);
-
-
- m_manualDarkness.Value = false;
- SceneManager.LoadScene(m_nextSceneToLoad);
-
-
- }
-
-
-
- private void OnPlayerDeadChange(bool value)
- {
- if (value)
- {
- StartCoroutine(DeathRoutine());
- }
-
-
- }
-
- private void OnPlayerVictoryChange(bool value)
- {
- if (value)
- {
- StartCoroutine(VictoryRoutine());
- }
- }
-
-
-
-
-
-
-
-
- }
|