/
user2458
/
TheMysticMirage
Обзор
Документация
Войти
/
user2458
/
TheMysticMirage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
UpgradeSystem.cs
205 строк
7 KB
user2458
Скрипты
29 май 2025, 00:38
29 май 2025, 00:38
7bf75db
Код
Авторство
О чём код?
// UpgradeSystem.cs using UnityEngine; using TMPro; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; using UnityEngine.UI; using System.Drawing; public class UpgradeSystem : MonoBehaviour { [Header("UI")] [Tooltip("Корневая панель меню апгрейдов")] public GameObject upgradeMenuUI; [Tooltip("Текст на кнопках: Health‑Knives‑Melee‑Ranged‑Resist")] public TMP_Text[] buttonTexts; [Tooltip("Кнопка закрытия меню апгрейдов")] public Button closeButton; public static UpgradeSystem Instance { get; private set; } PlayerStats stats; readonly int[] healthCost = { 5, 10, 20 }; readonly int[] knifeCost = { 5, 10, 20 }; readonly int[] meleeCost = { 5, 10, 20 }; readonly int[] rangedCost = { 5, 10, 20 }; readonly int[] resistCost = { 5, 10, 20 }; readonly float[] resistValues = { 0.1f, 0.2f, 0.3f }; void OnEnable() => SceneManager.sceneLoaded += SceneLoaded; void OnDisable() => SceneManager.sceneLoaded -= SceneLoaded; void SceneLoaded(Scene _, LoadSceneMode __) { if (upgradeMenuUI) upgradeMenuUI.SetActive(false); stats = null; } void Awake() { if (closeButton != null) closeButton.onClick.AddListener(CloseMenu); if (Instance == null) Instance = this; else Destroy(gameObject); } void Update() { if (stats == null) { var pc = PlayerController.Instance; if (pc) stats = pc.GetComponent<PlayerStats>(); } if (stats != null && Keyboard.current.eKey.wasPressedThisFrame) ToggleMenu(); } void ToggleMenu() { // нельзя открывать апгрейд, если стоит пауза if (Time.timeScale == 0f || upgradeMenuUI == null || stats == null) return; bool isNowOpen = !upgradeMenuUI.activeSelf; upgradeMenuUI.SetActive(isNowOpen); UpdateButtonTexts(); if (PlayerController.Instance != null) { if (isNowOpen) PlayerController.Instance.DisableInput(); else PlayerController.Instance.EnableInput(); } } bool TrySpend(int cost) { if (stats.diamonds < cost) return false; stats.diamonds -= cost; stats.RaiseDiamondsChanged(); int nextIdx = SceneManager.GetActiveScene().buildIndex + 1; SaveManager.Instance.SaveProgress(stats, nextIdx); return true; } void UpdateButtonTexts() { if (buttonTexts.Length < 5) return; int healthLvl = stats.healthLevel; int knifeLvl = stats.knifeLevel; int meleeLvl = stats.meleeLevel; int rangedLvl = stats.rangedLevel; int resistLvl = stats.damageResistLevel; buttonTexts[0].text = healthLvl < healthCost.Length ? $"+{(healthLvl == 0 ? 15 : healthLvl == 1 ? 25 : 35)} HP ({"<color=#8B2C2C>" + healthCost[healthLvl] + "</color>"} diamonds)" : "Max HP"; buttonTexts[1].text = knifeLvl < knifeCost.Length ? $"+{knifeLvl + 1} Knive ({"<color=#8B2C2C>" + knifeCost[knifeLvl] + "</color>"} diamonds)" : "Max Knives"; buttonTexts[2].text = meleeLvl < meleeCost.Length ? $"+{(meleeLvl + 1) * 10}% Melee ({"<color=#8B2C2C>" + meleeCost[meleeLvl] + "</color>"} diamonds)" : "Max Melee"; buttonTexts[3].text = rangedLvl < rangedCost.Length ? $"+{(rangedLvl + 1) * 20}% Ranged ({"<color=#8B2C2C>" + rangedCost[rangedLvl] + "</color>"} diamonds)" : "Max Ranged"; buttonTexts[4].text = resistLvl < resistCost.Length ? $"-{(int)(resistValues[resistLvl] * 100)}% Inc. dmg ({"<color=#8B2C2C>" + resistCost[resistLvl] + "</color>"} diamonds)" : "Max Resistance"; } public void CloseMenu() { if (upgradeMenuUI != null && upgradeMenuUI.activeSelf) { upgradeMenuUI.SetActive(false); if (PlayerController.Instance != null) PlayerController.Instance.EnableInput(); } } public void UpgradeHealth() { if (stats == null || stats.healthLevel >= healthCost.Length) return; if (!TrySpend(healthCost[stats.healthLevel])) return; int bonus = stats.healthLevel switch { 0 => 15, 1 => 25, _ => 35 }; stats.maxHealth += bonus; stats.curHealth = Mathf.Min(stats.curHealth + bonus, stats.maxHealth); var dmg = stats.GetComponent<Damageable>(); if (dmg) { dmg.MaxHealth = stats.maxHealth; dmg.Health = stats.curHealth; } stats.healthLevel++; UpdateAndSave(); } public void UpgradeKnives() { if (stats == null || stats.knifeLevel >= knifeCost.Length) return; if (!TrySpend(knifeCost[stats.knifeLevel])) return; int add = stats.knifeLevel + 1; stats.maxKnives += add; stats.curKnives += add; stats.RaiseKnivesChanged(); stats.knifeLevel++; UpdateAndSave(); } public void UpgradeMeleeDamage() { if (stats == null || stats.meleeLevel >= meleeCost.Length) return; if (!TrySpend(meleeCost[stats.meleeLevel])) return; stats.meleeLevel++; stats.meleeMultiplier = 1f + 0.1f * stats.meleeLevel; CharacterStats.MeleeDamageMultiplier = stats.meleeMultiplier; UpdateAndSave(); } public void UpgradeRangedDamage() { if (stats == null || stats.rangedLevel >= rangedCost.Length) return; if (!TrySpend(rangedCost[stats.rangedLevel])) return; stats.rangedLevel++; stats.rangedMultiplier = 1f + 0.2f * stats.rangedLevel; CharacterStats.RangedDamageMultiplier = stats.rangedMultiplier; UpdateAndSave(); } public void UpgradeDamageResistance() { if (stats == null || stats.damageResistLevel >= resistCost.Length) return; if (!TrySpend(resistCost[stats.damageResistLevel])) return; stats.damageReduction = resistValues[stats.damageResistLevel]; stats.damageResistLevel++; UpdateAndSave(); } void UpdateAndSave() { UpdateButtonTexts(); int nextIdx = SceneManager.GetActiveScene().buildIndex + 1; SaveManager.Instance.SaveProgress(stats, nextIdx); } }