Переделал систему прокачки туррелей

This commit is contained in:
2026-05-22 16:22:28 +03:00
parent 145cda9435
commit 102cb2b9c2
8 changed files with 108 additions and 16 deletions
@@ -1,10 +1,22 @@
using UnityEngine;
[CreateAssetMenu(fileName = "TurretLvl_", menuName = "Scriptable Objects/Turret Upgrade")]
[CreateAssetMenu(fileName = "Lvl_", menuName = "Scriptable Objects/Turret Upgrade")]
public class TurretUpgrade : ScriptableObject
{
// TODO: инкапсулировать поля
public float UpgradeDamageMultiplier = 1.5f;
public float UpgradeDistanceMultiplier = 1.5f;
public float UpgradeReloadTimeMultiplier = 0.75f;
[Tooltip("Процент стоисти от базовой цены турели для улучшения")]
[SerializeField] private float _upgradeCostMultiplier = 0.2f;
[Tooltip("null, чтобы не менять префаб пули")]
[SerializeField] private TurretBullet _bulletPrefab;
[Tooltip("-1, чтобы не менять урон")]
[SerializeField] private float _upgradeDamageMultiplier = -1f;
[Tooltip("-1, чтобы не менять дальность")]
[SerializeField] private float _upgradeDistanceMultiplier = -1f;
[Tooltip("-1, чтобы не менять время перезарядки")]
[SerializeField] private float _upgradeReloadTimeMultiplier = -1f;
public float UpgradeConstMultiplier => _upgradeCostMultiplier;
public TurretBullet BulletPrefab => _bulletPrefab;
public float UpgradeDamageMultiplier => _upgradeDamageMultiplier;
public float UpgradeDistanceMultiplier => _upgradeDistanceMultiplier;
public float UpgradeReloadTimeMultiplier => _upgradeReloadTimeMultiplier;
}
+34 -9
View File
@@ -12,8 +12,6 @@ public class Turret : MonoBehaviour
[Header("Economy")]
[SerializeField] private int _price;
[SerializeField] private float _sellingMultiplier = 0.5f;
[SerializeField] private float _upgradeCostMultiplier = 0.2f;
[SerializeField] private float _upgradeCostMultiplierIncrement = 0.1f;
[Header("Upgrade")]
[SerializeField] TurretUpgrade[] _upgrades;
@@ -24,8 +22,19 @@ public class Turret : MonoBehaviour
public float Damage => _damage;
public float Distance => _distance;
public int SellPrice => Mathf.RoundToInt(_price * _sellingMultiplier);
public int UpgradeCost => Mathf.RoundToInt(_price * _upgradeCostMultiplier);
public bool IsMaxLevel => _lvl >= _upgrades.Length - 1;
public int UpgradeCost
{
get
{
if (IsMaxLevel)
return 0;
return Mathf.RoundToInt(_price * _upgrades[_lvl].UpgradeConstMultiplier);
}
}
public bool IsMaxLevel => _lvl >= _upgrades.Length;
public int Level => _lvl + 1;
public int MaxLevel => _upgrades.Length;
private void Start()
{
@@ -39,11 +48,27 @@ public class Turret : MonoBehaviour
return;
var upgrade = _upgrades[_lvl++];
// TODO: исправить умножение на 0
_damage *= upgrade.UpgradeDamageMultiplier;
_distance *= upgrade.UpgradeDistanceMultiplier;
_reloadTime *= upgrade.UpgradeReloadTimeMultiplier;
_upgradeCostMultiplier += _upgradeCostMultiplierIncrement;
if (upgrade.BulletPrefab != null)
_bulletPrefab = upgrade.BulletPrefab;
if (upgrade.UpgradeDistanceMultiplier != -1)
{
if (_damage == 0)
_damage = upgrade.UpgradeDamageMultiplier;
else
_damage *= upgrade.UpgradeDamageMultiplier;
}
if (upgrade.UpgradeDistanceMultiplier != -1)
{
if (_distance == 0)
_distance = upgrade.UpgradeDistanceMultiplier;
else
_distance *= upgrade.UpgradeDistanceMultiplier;
}
if (upgrade.UpgradeReloadTimeMultiplier != -1)
_reloadTime *= upgrade.UpgradeReloadTimeMultiplier;
}
private void Update()
+11 -2
View File
@@ -10,6 +10,7 @@ public class TurretUpgradeViewer : MonoBehaviour
[SerializeField] private TMPro.TextMeshProUGUI _upgradeCostText;
private int _upgradeCost;
private bool _isMaxLevel;
private void OnEnable()
{
@@ -27,7 +28,7 @@ public class TurretUpgradeViewer : MonoBehaviour
private void OnMoneyChanged(int newMoney)
{
_upgradeButton.interactable = newMoney >= _upgradeCost;
_upgradeButton.interactable = newMoney >= _upgradeCost && !_isMaxLevel;
}
private void OnTurretClicked(Turret turret)
@@ -44,8 +45,16 @@ public class TurretUpgradeViewer : MonoBehaviour
private void UpdateBtn(Turret turret)
{
_isMaxLevel = turret.IsMaxLevel;
if (_isMaxLevel)
{
_upgradeCostText.text = "MAX";
_upgradeButton.interactable = false;
return;
}
_upgradeCost = turret.UpgradeCost;
_upgradeCostText.text = _upgradeCost.ToString();
_upgradeButton.interactable = _wallet.Money >= _upgradeCost && !turret.IsMaxLevel;
_upgradeButton.interactable = _wallet.Money >= _upgradeCost;
}
}