using System.Linq; using DG.Tweening; using GameAnalyticsSDK; using Panels; using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } public static bool IsGameStarted { get; private set; } [SerializeField] private GameObject[] levels; [SerializeField] private CameraFollow followSystem; [SerializeField] private Transform escapeVan; [SerializeField] private AudioSource detectedAudioSrc; [SerializeField] private AudioSource bustedAudioSrc; [SerializeField] private GameObject fireworksEffect; [SerializeField] private GameObject ragdoll; [SerializeField] private GameObject explosionEffect; [Header("GAME UI")] [SerializeField] private HUDPanel gameHud; [SerializeField] private LevelCompletePanel levelCompletePanel; [SerializeField] private GameOverPanel gameOverPanel; private int _currentLevel; private int _obstacleCount; private int _targetObstacles; private int _obstaclesCollected; public bool IsGameOver { get; private set; } private void Awake() { if (Instance == null) Instance = this; else if (Instance != this) Destroy(gameObject); } private void Start() { IsGameStarted = false; _currentLevel = PlayerPrefs.GetInt("Level", 0); if (_currentLevel >= levels.Length) _currentLevel = 0; levels[_currentLevel].SetActive(true); IsGameOver = false; _obstacleCount = GameObject.FindGameObjectsWithTag("Obstacle").Count(go => go.activeInHierarchy); _targetObstacles = _obstacleCount - 3; gameHud.BindData(_targetObstacles, _currentLevel + 1); } private void LevelCompleted() { if (_obstaclesCollected > _targetObstacles) { PlayerPrefs.SetInt("Level", _currentLevel + 1); levelCompletePanel.BindData(_obstaclesCollected * 10); levelCompletePanel.OpenPanel(); AnalyticsSystem.SendProgressionEvent(GAProgressionStatus.Complete, $"Level_{_currentLevel}_Complete"); return; } gameOverPanel.UpdateResult(false); gameOverPanel.OpenPanel(); AnalyticsSystem.SendProgressionEvent(GAProgressionStatus.Fail, $"Level_{_currentLevel}_Failed_notEnoughCash"); } public void GameOver(Transform player) { if (IsGameOver) return; IsGameOver = true; player.gameObject.SetActive(false); var dead = Instantiate(ragdoll, player); dead.transform.SetParent(null); Instantiate(fireworksEffect, dead.transform); bustedAudioSrc.Play(); gameOverPanel.UpdateResult(true); gameOverPanel.OpenPanel(); AnalyticsSystem.SendProgressionEvent(GAProgressionStatus.Fail, $"Level_{_currentLevel}_Failed_busted"); } public void StartGame() { followSystem.StartSystem(); IsGameStarted = true; } public void Retry() => SceneManager.LoadScene("Game"); public void AdReset() => UnityAdController.PlayAd(AdType.Interstitial, Retry); public void ShowReward() { UnityAdController.PlayAd(AdType.Rewarded, () => { PlayerPrefs.SetInt("Level", _currentLevel + 1); Retry(); }); } public void UpdateScore() { _obstaclesCollected += 1; gameHud.UpdateProgress(_obstaclesCollected); } public void EscapeLevel() { IsGameOver = true; escapeVan.DOMoveX(-35, 1f) .SetDelay(.25f) .SetEase(Ease.InSine) .OnStart(SetExplosion) .OnComplete(LevelCompleted); return; void SetExplosion() => explosionEffect.SetActive(true); } public void SoundWhistle() => detectedAudioSrc.Play(); }