using System.Threading; using Alchemy.Inspector; using Code.Audio; using Code.UI; using Cysharp.Threading.Tasks; using UnityEngine; namespace Code.GameplayServices { public class GameplayManager : MonoBehaviour { public static GameplayManager Instance { get; private set; } private bool _onPause = true; public bool OnPause => _onPause; [TabGroup("Gameplay")] [SerializeField] [Range(0f, 30f)] private float gameSpeed; [TabGroup("Gameplay")] [SerializeField] [Range(0f, 30f)] private float gameSpeedIncrement; [TabGroup("UI")] [SerializeField] private RestartPanel restartPanel; private float _currentGameSpeed; private float _incrementedGameSpeed; public float GameSpeed => _currentGameSpeed > 0.1f ? _currentGameSpeed + _incrementedGameSpeed : _currentGameSpeed; private void Awake() { Instance = this; _currentGameSpeed = gameSpeed; } public void RestartGame() { ResetGame(); ResumeGame(); } public void PlayerDied() { PauseGame(); restartPanel.gameObject.SetActive(true); PlayerScoreService.Instance.ResetScore(); AudioManager.Instance.PlayGameOver(); } public void PauseGame() { _onPause = true; _currentGameSpeed = 0f; AudioManager.Instance.StopMusic(); _cycleTokenSource.Cancel(); } public void ResumeGame() { _onPause = false; _currentGameSpeed = gameSpeed; AudioManager.Instance.StartMusic(); DifficultyCycle().Forget(); } private void ResetGame() { _incrementedGameSpeed = 0f; PassingObjectsManager.Instance.ResetObjects(); } private CancellationTokenSource _cycleTokenSource; private async UniTaskVoid DifficultyCycle() { _cycleTokenSource = new(); try { while (true) { await UniTask.WaitForSeconds(10).AttachExternalCancellation(_cycleTokenSource.Token); _incrementedGameSpeed += gameSpeedIncrement; } } catch { _cycleTokenSource.Dispose(); } } } }