using System; using System.Collections; using BlueWater.Uis; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Tycoons { [Serializable] public class MoneyCounter : InteractionFurniture { [SerializeField] private float _playerHoldingTime = 3f; [SerializeField] private PayMoneyUi _payMoneyUiObject; [SerializeField] private Vector3 _offset = new(0f, 1.5f, 0f); [SerializeField] private Sprite _empty; [SerializeField] private Sprite _level1; [SerializeField] private Sprite _level2; [SerializeField] private Sprite _level3; [field: Title("실시간 데이터")] [field: SerializeField] public int CurrentMoney { get; private set; } private SpriteRenderer _spriteRenderer; private Coroutine _gainAutoInstance; private bool _isPlayerInteracting; protected override void Awake() { base.Awake(); EventManager.OnAddedMoneyCounter += AddCurrentMoney; EventManager.OnGainAutoMoneyCounter += GainAuto; } protected override void OnEnable() { base.OnEnable(); Initialize(); } private void Update() { if (IsShowing) { EventManager.InvokeHoldInteracting(HoldingElapsedTime); } if (HoldingElapsedTime >= 1f) { GainMoney(); } if (_isPlayerInteracting) { HoldingElapsedTime += Time.deltaTime / _playerHoldingTime; } else { if (HoldingElapsedTime > 0f) { HoldingElapsedTime -= Time.deltaTime; } } } private void OnDestroy() { if (_gainAutoInstance != null) { StopCoroutine(_gainAutoInstance); _gainAutoInstance = null; } EventManager.OnAddedMoneyCounter -= AddCurrentMoney; EventManager.OnGainAutoMoneyCounter -= GainAuto; } public void Initialize() { _spriteRenderer = VisualLook.GetComponent(); } public override void Interaction() { _isPlayerInteracting = true; } public override void CancelInteraction() { _isPlayerInteracting = false; } public override bool CanInteraction() { return CurrentMoney > 0 && !GameManager.Instance.CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything(); } public void AddCurrentMoney(int money) { CurrentMoney += money; ChangeSprite(); } private void ChangeSprite() { var sprite = CurrentMoney switch { > 1000 => _level3, > 500 => _level2, > 0 => _level1, _ => _empty }; _spriteRenderer.sprite = sprite; } public void GainMoney() { _isPlayerInteracting = false; HoldingElapsedTime = 0f; var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); payMoneyUi.Initialize(CurrentMoney); CurrentMoney = 0; ChangeSprite(); } public void GainAuto(int waitTime) { Utils.StartUniqueCoroutine(this, ref _gainAutoInstance, GainAutoCoroutine(waitTime)); } private IEnumerator GainAutoCoroutine(int waitTime) { while (true) { yield return new WaitForSeconds(waitTime); if (CurrentMoney > 0) { GainMoney(); } } } } }