/
dedikins
/
Clicker
Обзор
Документация
Войти
/
dedikins
/
Clicker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/GameManager.cs
333 строки
7 KB
dedikins
Полная переработка системы магазина
28 май 2026, 22:48
28 май 2026, 22:48
e83cd74
Код
Авторство
О чём код?
using UnityEngine; using System.IO; public class GameManager : MonoBehaviour { public static GameManager Instance; public PlayerProgress Progress; private float passiveTimer; private float saveTimer; private const float SaveInterval = 5f; private string SavePath => Path.Combine(Application.persistentDataPath, "save.json"); private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; Load(); } private void Update() { HandlePassiveIncome(); HandleAutoSave(); } private int ProcessClick() { int reward = Progress.ClickPower; bool crit = false; bool doubled = false; // ===== ���� ===== if (Random.value <= Progress.CritChance) { crit = true; reward = Mathf.RoundToInt( reward * Progress.CritMultiplier); } // ===== DOUBLE COINS ===== if (Random.value <= Progress.DoubleCoinsChance) { doubled = true; reward *= 2; } // ===== GLOBAL MULTIPLIER ===== reward = Mathf.RoundToInt( reward * Progress.CoinsMultiplier); Progress.Coins += reward; Debug.Log( $"Reward: {reward} | Crit: {crit} | Double: {doubled}"); return reward; } public void Click() { ProcessClick(); Progress.TotalClicks++; AudioManager.Instance?.PlayClick(); CheckAchievements(); NotifyChanged(); } public bool SpendCoins(int amount) { if (Progress.Coins < amount) return false; Progress.Coins -= amount; NotifyChanged(); return true; } public void AddClickPower(int amount) { Progress.ClickPower += amount; NotifyChanged(); } public void AddAutoIncome(int amount) { Progress.AutoIncome += amount; NotifyChanged(); } private void CheckAchievements() { Check100Clicks(); Check1000Coins(); CheckAllSkins(); } private void Check100Clicks() { if (Progress.Achievement100Clicks) return; if (Progress.TotalClicks >= 100) { Progress.Achievement100Clicks = true; Progress.ClickPower += 1; Debug.Log("���������� 100 ������ ������"); if (AchievementNotification.Instance != null) { AchievementNotification.Instance.Show( "������ ����", "�������: +1 � �����"); AudioManager.Instance?.PlayAchievement(); } Debug.Log("����������: ������ ����"); } } private void Check1000Coins() { if (Progress.Achievement1000Coins) return; if (Progress.Coins >= 1000) { Progress.Achievement1000Coins = true; Progress.AutoIncome += 2; AchievementNotification.Instance.Show( "�����", "�������: +2 ����������"); AudioManager.Instance?.PlayAchievement(); Debug.Log("����������: �����"); } } private void CheckAllSkins() { if (Progress.AchievementAllSkins) return; bool allBought = PlayerPrefs.GetInt("Skin1", 0) == 1 && PlayerPrefs.GetInt("Skin2", 0) == 1 && PlayerPrefs.GetInt("Skin3", 0) == 1 && PlayerPrefs.GetInt("Skin4", 0) == 1; if (!allBought) return; Progress.AchievementAllSkins = true; Progress.ClickPower += 5; AchievementNotification.Instance.Show( "������������", "�������: +5 � �����"); AudioManager.Instance?.PlayAchievement(); Debug.Log("����������: ������������"); } public UpgradeState GetUpgrade(string id) { foreach (var upgrade in Progress.Upgrades) { if (upgrade.Id == id) return upgrade; } UpgradeState state = new() { Id = id, Level = 0 }; Progress.Upgrades.Add(state); return state; } private void HandlePassiveIncome() { if (Progress.AutoIncome <= 0 && Progress.AutoClickPower <= 0) return; passiveTimer += Time.deltaTime * Progress.AutoIncomeSpeed; if (passiveTimer >= 1f) { int ticks = Mathf.FloorToInt(passiveTimer); passiveTimer -= ticks; int income = Progress.AutoIncome * ticks; income = Mathf.RoundToInt( income * Progress.CoinsMultiplier); Progress.Coins += income; // ===== ���������� ===== for (int i = 0; i < Progress.AutoClickPower * ticks; i++) { ProcessClick(); } CheckAchievements(); NotifyChanged(); } } private void HandleAutoSave() { saveTimer += Time.deltaTime; if (saveTimer >= SaveInterval) { saveTimer = 0f; Save(); } } public void ResetProgress() { Progress = new PlayerProgress(); for (int i = 1; i <= 4; i++) PlayerPrefs.DeleteKey($"Skin{i}"); PlayerPrefs.SetInt("SelectedSkin", 0); Save(); SkinManager.Instance.Refresh(); NotifyChanged(); } public void NotifyChanged() { UIController.Instance.Refresh(); ShopController.Instance.Refresh(); AchievementUI achievementUI = FindFirstObjectByType<AchievementUI>(); if (achievementUI != null) achievementUI.Refresh(); } public void CheckAchievementsManually() { CheckAchievements(); } public void Save() { string json = JsonUtility.ToJson(Progress, true); File.WriteAllText(SavePath, json); } public void Load() { if (!File.Exists(SavePath)) { Progress = new PlayerProgress(); return; } string json = File.ReadAllText(SavePath); Progress = JsonUtility.FromJson<PlayerProgress>(json) ?? new PlayerProgress(); } private void OnApplicationPause(bool pause) { if (pause) Save(); } private void OnApplicationQuit() { Save(); } }