Переделал магазин турелей

This commit is contained in:
2026-05-27 22:48:59 +03:00
parent 8ad1ddd874
commit 920ec74d61
5 changed files with 68 additions and 143 deletions
-15
View File
@@ -4,7 +4,6 @@ public class Debugger : MonoBehaviour
{
[SerializeField] private GameManager _gameManager;
[SerializeField] private SandPathBuildService _sandPathBuildService;
[SerializeField] private TurretsShop _turretShop;
[SerializeField] private SpawnDeathEnemyController _spawnDeathControl;
[SerializeField] private Tower _tower;
@@ -12,8 +11,6 @@ public class Debugger : MonoBehaviour
{
_gameManager.OnStateChanged += OnGameStateChanged;
_sandPathBuildService.OnBuildComplete += OnBuildComplete;
_turretShop.OnTurretSelected += OnTurretSelected;
_turretShop.OnTurretDeselected += OnTurretDeselected;
_spawnDeathControl.OnLastEnemyDestroyed += OnLastEnemyDestroyed;
_tower.OnGameOver += OnGameOver;
}
@@ -22,8 +19,6 @@ public class Debugger : MonoBehaviour
{
_gameManager.OnStateChanged -= OnGameStateChanged;
_sandPathBuildService.OnBuildComplete -= OnBuildComplete;
_turretShop.OnTurretSelected -= OnTurretSelected;
_turretShop.OnTurretDeselected -= OnTurretDeselected;
_spawnDeathControl.OnLastEnemyDestroyed -= OnLastEnemyDestroyed;
_tower.OnGameOver -= OnGameOver;
}
@@ -38,16 +33,6 @@ public class Debugger : MonoBehaviour
print("Build complete");
}
private static void OnTurretSelected(TurretShopItem item)
{
print("Turret selected: " + item.TurretPrefab.name);
}
private static void OnTurretDeselected()
{
print("Turret deselected");
}
private void OnLastEnemyDestroyed()
{
print("Last enemy destroyed");
-17
View File
@@ -5,7 +5,6 @@ using UnityEngine.UI;
public class TurretUpdater : MonoBehaviour
{
[SerializeField] private BlockDetector _blockDetector;
[SerializeField] private TurretsShop _shop;
[SerializeField] private Wallet _wallet;
[SerializeField] private Button _sellButton;
[SerializeField] private Button _upgradeButton;
@@ -40,15 +39,11 @@ public class TurretUpdater : MonoBehaviour
private void OnEnable()
{
_blockDetector.OnBlockClicked += OnBlockClicked;
_shop.OnDestroyTurretSelected += OnDestoyTurretSelected;
_shop.OnDestroyTurretDeselected += OnDestroyTurretDeselected;
}
private void OnDisable()
{
_blockDetector.OnBlockClicked -= OnBlockClicked;
_shop.OnDestroyTurretSelected -= OnDestoyTurretSelected;
_shop.OnDestroyTurretDeselected -= OnDestroyTurretDeselected;
}
private void Start()
@@ -69,18 +64,6 @@ public class TurretUpdater : MonoBehaviour
ClickedTurret = block.GetComponent<Turret>();
}
private void OnDestoyTurretSelected()
{
_isDestroyingTurret = true;
ClickedTurret = null;
}
private void OnDestroyTurretDeselected()
{
_isDestroyingTurret = false;
ClickedTurret = null;
}
private void UpgradeTurret()
{
if (ClickedTurret == null || _wallet.Money < ClickedTurret.UpgradeCost)
+46 -88
View File
@@ -5,91 +5,48 @@ using UnityEngine.InputSystem;
public class TurretsShop : MonoBehaviour
{
[SerializeField] private GameManager _gameManager;
[SerializeField] private Wallet _wallet;
[SerializeField] private BlockDetector _blockDetector;
[SerializeField] private Transform _turretsHolder;
[SerializeField] private InputAction _deselectAction;
[SerializeField] private TurretShopItem[] _turretShopItems;
[SerializeField] private UnityEvent<TurretShopItem> _onTurretSelected;
[SerializeField] private UnityEvent _onTurretDeselected;
[SerializeField] private UnityEvent _onDestroyTurretSelected;
[SerializeField] private UnityEvent _onDestroyTurretDeselected;
public event UnityAction<TurretShopItem> OnTurretSelected
{
add => _onTurretSelected.AddListener(value);
remove => _onTurretSelected.RemoveListener(value);
}
public event UnityAction OnTurretDeselected
{
add => _onTurretDeselected.AddListener(value);
remove => _onTurretDeselected.RemoveListener(value);
}
public event UnityAction OnDestroyTurretSelected
{
add => _onDestroyTurretSelected.AddListener(value);
remove => _onDestroyTurretSelected.RemoveListener(value);
}
public event UnityAction OnDestroyTurretDeselected
{
add => _onDestroyTurretDeselected.AddListener(value);
remove => _onDestroyTurretDeselected.RemoveListener(value);
}
[SerializeField] private UnityEvent<BlockScript> _onBlockSelected;
[SerializeField] private UnityEvent _onBlockDeselected;
public IReadOnlyCollection<TurretShopItem> TurretShopItems => _turretShopItems;
private TurretShopItem _selectedTurret;
private bool _isTurretSelected = false;
private bool _isDestroySelected = false;
public void SelectTurret(TurretShopItem item)
public event UnityAction<BlockScript> OnBlockSelected
{
_isTurretSelected = _wallet.Money >= item.Price;
if (!_isTurretSelected)
return;
if (_isDestroySelected)
DeselectDestroyTurret();
_selectedTurret = item;
_onTurretSelected?.Invoke(item);
add => _onBlockSelected.AddListener(value);
remove => _onBlockSelected.RemoveListener(value);
}
public void DeselectTurret()
public event UnityAction OnBlockDeselected
{
_isTurretSelected = false;
_onTurretDeselected?.Invoke();
add => _onBlockDeselected.AddListener(value);
remove => _onBlockDeselected.RemoveListener(value);
}
public void SelectDestroyTurret()
{
if (_isTurretSelected)
DeselectTurret();
_isDestroySelected = true;
_onDestroyTurretSelected?.Invoke();
}
public void DeselectDestroyTurret()
{
_isDestroySelected = false;
_onDestroyTurretDeselected?.Invoke();
}
private BlockScript _selectedBlock;
private void OnEnable()
{
_deselectAction.Enable();
_deselectAction.performed += DeselectActionPerformed;
if (_deselectAction != null)
{
_deselectAction.Enable();
_deselectAction.performed += DeselectActionPerformed;
}
_blockDetector.OnBlockClicked += OnBlockClicked;
}
private void OnDisable()
{
_deselectAction.performed -= DeselectActionPerformed;
_deselectAction.Disable();
if (_deselectAction != null)
{
_deselectAction.performed -= DeselectActionPerformed;
_deselectAction.Disable();
}
_blockDetector.OnBlockClicked -= OnBlockClicked;
}
@@ -100,40 +57,41 @@ public class TurretsShop : MonoBehaviour
_turretsHolder = transform;
}
private void DeselectActionPerformed(InputAction.CallbackContext _)
{
if (_isTurretSelected)
DeselectTurret();
else if (_isDestroySelected)
DeselectDestroyTurret();
}
private void OnBlockClicked(BlockScript block)
{
if (block.Type == BlockScript.BlockType.Turret)
if (_selectedBlock == block)
{
DestroyTurret(block.GetComponent<Turret>());
DeselectBlock();
return;
}
if (!block.CompareTag("GrassBlock") || !_isTurretSelected || _selectedTurret.Price > _wallet.Money)
return;
var pos = block.transform.position;
pos.y += 1;
Instantiate(_selectedTurret.TurretPrefab, pos, Quaternion.identity, _turretsHolder);
_wallet.TakeMoney(_selectedTurret.Price);
if (_wallet.Money < _selectedTurret.Price)
DeselectTurret();
if (_gameManager.CurrentState != GameManager.GameState.BuildingPath &&
block.CompareTag("GrassBlock"))
SelectBlock(block);
}
private void DestroyTurret(Turret turret)
public void BuyTurret(TurretShopItem item)
{
if (turret == null || !_isDestroySelected)
if (_selectedBlock == null || _wallet.Money < item.Price)
return;
_wallet.AddMoney(turret.SellPrice);
Destroy(turret.gameObject);
_wallet.TakeMoney(item.Price);
Instantiate(item.TurretPrefab, _selectedBlock.transform.position + Vector3.up, Quaternion.identity, _turretsHolder);
DeselectBlock();
}
public void SelectBlock(BlockScript block)
{
_selectedBlock = block;
_onBlockSelected?.Invoke(block);
}
public void DeselectBlock()
{
_selectedBlock = null;
_onBlockDeselected?.Invoke();
}
private void DeselectActionPerformed(InputAction.CallbackContext _) =>
DeselectBlock();
}
+14 -7
View File
@@ -7,7 +7,6 @@ public class TurretsShopViewer : MonoBehaviour
{
[SerializeField] private TurretsShop _shop;
[SerializeField] private Wallet _wallet;
[SerializeField] private GameManager _gameManager;
[SerializeField] private Button _buttonPrefab;
private Animator _animator;
@@ -29,7 +28,7 @@ public class TurretsShopViewer : MonoBehaviour
icon.sprite = item.Icon;
}
button.onClick.AddListener(() => _shop.SelectTurret(item));
button.onClick.AddListener(() => _shop.BuyTurret(item));
_buttons.Add(button, item);
}
}
@@ -41,25 +40,33 @@ public class TurretsShopViewer : MonoBehaviour
private void OnEnable()
{
_gameManager.OnStateChanged += OnGameStateChanged;
_wallet.OnMoneyChanged += OnMoneyChanged;
_shop.OnBlockSelected += OnBlockSelected;
_shop.OnBlockDeselected += OnBlockDeselected;
}
private void OnDisable()
{
_gameManager.OnStateChanged -= OnGameStateChanged;
_wallet.OnMoneyChanged -= OnMoneyChanged;
_shop.OnBlockSelected -= OnBlockSelected;
_shop.OnBlockDeselected -= OnBlockDeselected;
}
private void OnGameStateChanged(GameManager.GameState state)
private void OnBlockSelected(BlockScript block)
{
if (!_hidden || state != GameManager.GameState.BuildingTurrets)
if (!_hidden)
return;
_animator.Play(_showAnimation);
_animator.CrossFade(_showAnimation, 0.1f);
_hidden = false;
}
private void OnBlockDeselected()
{
_animator.CrossFade(_hideAnimation, 0.1f);
_hidden = true;
}
private void OnMoneyChanged(int money)
{
foreach (var (button, item) in _buttons)