using System; using System.Collections; using System.Collections.Generic; using System.Linq; using DDD.Uis; using DDD.Utility; using Sirenix.OdinInspector; using TMPro; using UnityEngine; namespace DDD.Tycoons { [Serializable] public class MoneyCounter : InteractionFurniture { [SerializeField] private TMP_Text _totalGoldText; [SerializeField] private float _playerHoldingTime = 1f; [Title("연출")] [SerializeField] private PayMoneyUi _payMoneyUiObject; [SerializeField] private Vector3 _offset = new(0f, 1.5f, 0f); [SerializeField] private float _delay = 0.2f; [SerializeField] private float _payMoneyUiDuration = 0.5f; [Title("이미지")] [SerializeField] private Sprite _empty; [SerializeField] private Sprite _level1; [SerializeField] private Sprite _level2; [SerializeField] private Sprite _level3; private Queue _addedGolds = new(); private SpriteRenderer _spriteRenderer; private Coroutine _gainAutoInstance; private bool _isPlayerInteracting; private bool _isGainGoldCoroutine; protected override void Awake() { base.Awake(); EventManager.OnGainAutoMoneyCounter += GainAuto; } protected override void OnEnable() { base.OnEnable(); Initialize(); } private void Update() { if (IsShowing) { EventManager.InvokeHoldInteracting(HoldingElapsedTime); } if (HoldingElapsedTime >= 1f) { GainMoney(); } float playerHoldingDeltaTime = Time.deltaTime / _playerHoldingTime; if (_isPlayerInteracting) { HoldingElapsedTime += playerHoldingDeltaTime; } else { if (HoldingElapsedTime > 0f) { HoldingElapsedTime -= playerHoldingDeltaTime; } } } protected override void OnDestroy() { if (_gainAutoInstance != null) { StopCoroutine(_gainAutoInstance); _gainAutoInstance = null; } EventManager.OnGainAutoMoneyCounter -= GainAuto; } public void Initialize() { _spriteRenderer = VisualLook.GetComponent(); _totalGoldText.text = _addedGolds.Sum().ToString(); } public override void Interaction() { _isPlayerInteracting = true; } public override void CancelInteraction() { _isPlayerInteracting = false; } public override bool CanInteraction() { return _addedGolds.Count > 0 && !GameManager.Instance.CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything(); } public void AddCurrentGold(int gold) { _addedGolds.Enqueue(gold); _totalGoldText.text = _addedGolds.Sum().ToString(); ChangeSprite(); } private void ChangeSprite() { var sprite = _addedGolds.Sum() switch { > 1000 => _level3, > 500 => _level2, > 0 => _level1, _ => _empty }; _spriteRenderer.sprite = sprite; } public void GainMoney() { if (_isGainGoldCoroutine) return; StartCoroutine(GainGoldCoroutine()); } private IEnumerator GainGoldCoroutine() { _isGainGoldCoroutine = true; _isPlayerInteracting = false; HoldingElapsedTime = 0f; WaitForSeconds delay = new WaitForSeconds(_delay); while (_addedGolds.Count > 0) { var addedGold = _addedGolds.Dequeue(); var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); payMoneyUi.Initialize(addedGold, false, _payMoneyUiDuration); yield return delay; } _totalGoldText.text = _addedGolds.Sum().ToString(); ChangeSprite(); _isGainGoldCoroutine = false; } 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 (_addedGolds.Count > 0) { GainMoney(); } } } } }