using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; namespace Game { public class InGameManager : MonoBehaviour { [SerializeField] private Volume gameVolume; [SerializeField] private Volume pausedVolume; [SerializeField] private bool isPaused; // [SerializeField] //private float pauseTransitionDuration = 1f; [SerializeField] private Canvas gameCanvas; [SerializeField] private Canvas pausedCanvas; [SerializeField] private List sounds = new(); private readonly List initSoundVolumes = new(); private bool isTransitioning; public bool IsPaused => isPaused; [SerializeField] private Scriptable.GameState state; // Start is called before the first frame update private void Start() { isPaused = false; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = isPaused; gameVolume.weight = 1; pausedVolume.weight = 0; gameCanvas.gameObject.SetActive(true); pausedCanvas.gameObject.SetActive(false); foreach (var source in sounds) initSoundVolumes.Add(source.volume); } // Update is called once per frame private void Update() { state.IsPaused = isPaused; if (Input.GetButtonDown("Pause")) TogglePause(); if (isTransitioning || true) { if (isPaused) { //transition into pause //gameVolume.weight = Mathf.Lerp(gameVolume.weight, 0, Time.deltaTime); //pausedVolume.weight = Mathf.Lerp(pausedVolume.weight, 1, Time.deltaTime); //gameVolume.weight = gameVolume.weight < 0.1 ? 0 : gameVolume.weight; //pausedVolume.weight = pausedVolume.weight > 0.9 ? 1 : pausedVolume.weight; gameVolume.weight = 0; pausedVolume.weight = 1; } else { //transition out of pause gameVolume.weight = 1; pausedVolume.weight = 0; } } } public void TogglePause() { if (!isTransitioning) { isPaused = !isPaused; Cursor.visible = isPaused; if (!isPaused) Cursor.lockState = CursorLockMode.Locked; else Cursor.lockState = CursorLockMode.None; StartCoroutine(pauseTransition()); } } public void UnPause() { if (!isTransitioning) { isPaused = false; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = isPaused; StartCoroutine(pauseTransition()); } } public void Pause() { if (!isTransitioning) { isPaused = true; Cursor.lockState = CursorLockMode.None; Cursor.visible = isPaused; StartCoroutine(pauseTransition()); } } private IEnumerator pauseTransition() { if (pausedCanvas.gameObject.activeInHierarchy && !isPaused) pausedCanvas.gameObject.SetActive(false); if (gameCanvas.gameObject.activeInHierarchy && isPaused) gameCanvas.gameObject.SetActive(false); isTransitioning = true; yield return new WaitForSeconds(0); isTransitioning = false; print("Unpause canvas?" + isPaused + "," + pausedCanvas.gameObject.activeInHierarchy); if (!pausedCanvas.gameObject.activeInHierarchy && isPaused) pausedCanvas.gameObject.SetActive(true); if (!gameCanvas.gameObject.activeInHierarchy && !isPaused) gameCanvas.gameObject.SetActive(true); } public void SetVolume(float volume) { for (var i = 0; i < sounds.Count; i++) sounds[i].volume = initSoundVolumes[i] * volume; } public void ExitToMenu() { SceneManager.LoadScene(0); } } }