Files
RunRunRunP/Assets/Code/GameplayServices/GameplayManager.cs
T
2026-05-04 22:36:24 +03:00

88 lines
2.4 KiB
C#

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();
}
}
}
}