using UnityEngine; using System.Collections.Generic; using UnityEngine.Events; using UnityEngine.InputSystem; public class TurretsShop : MonoBehaviour { [SerializeField] private Wallet _wallet; [SerializeField] private BlockDetector _blockDetector; [SerializeField] private Transform _turretsHolder; [SerializeField] private InputAction _deselectAction; [SerializeField] private float _sellingCoefficient = 0.5f; [SerializeField] private TurretShopItem[] _turretShopItems; [SerializeField] private UnityEvent _onTurretSelected; [SerializeField] private UnityEvent _onTurretDeselected; public event UnityAction OnTurretSelected { add => _onTurretSelected.AddListener(value); remove => _onTurretSelected.RemoveListener(value); } public event UnityAction OnTurretDeselected { add => _onTurretDeselected.AddListener(value); remove => _onTurretDeselected.RemoveListener(value); } public IReadOnlyCollection TurretShopItems => _turretShopItems; private TurretShopItem _selectedTurret; private bool _isTurretSelected = false; public void SelectTurret(TurretShopItem item) { _isTurretSelected = _wallet.Money >= item.Price; if (!_isTurretSelected) return; _selectedTurret = item; _onTurretSelected?.Invoke(item); } public void DeselectTurret() { _isTurretSelected = false; _onTurretDeselected?.Invoke(); } private void OnEnable() { _deselectAction.Enable(); _deselectAction.performed += DeselectActionPerformed; _blockDetector.OnBlockClicked += OnBlockClicked; } private void OnDisable() { _deselectAction.performed -= DeselectActionPerformed; _deselectAction.Disable(); _blockDetector.OnBlockClicked -= OnBlockClicked; } private void Start() { if (_turretsHolder == null) _turretsHolder = transform; } private void DeselectActionPerformed(InputAction.CallbackContext _) => DeselectTurret(); private void OnBlockClicked(BlockScript block) { if (block.Type == BlockScript.BlockType.Turret) { DestroyTurret(block.GetComponent()); 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(); } private void DestroyTurret(Turret turret) { // TODO: проверять нажата ли кнопку продажи туррелей if (turret == null) return; _wallet.AddMoney(Mathf.RoundToInt(turret.Price * _sellingCoefficient)); Destroy(turret.gameObject); } }