CapersProject/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs
2024-11-21 20:05:59 +09:00

186 lines
4.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using BlueWater.Uis;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Tycoons
{
[Serializable]
public class MoneyCounter : InteractionFurniture
{
[SerializeField]
private float _playerHoldingTime = 1f;
[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;
[SerializeField]
private Sprite _empty;
[SerializeField]
private Sprite _level1;
[SerializeField]
private Sprite _level2;
[SerializeField]
private Sprite _level3;
private Queue<int> _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();
}
if (_isPlayerInteracting)
{
HoldingElapsedTime += Time.deltaTime / _playerHoldingTime;
}
else
{
if (HoldingElapsedTime > 0f)
{
HoldingElapsedTime -= Time.deltaTime;
}
}
}
private void OnDestroy()
{
if (_gainAutoInstance != null)
{
StopCoroutine(_gainAutoInstance);
_gainAutoInstance = null;
}
EventManager.OnGainAutoMoneyCounter -= GainAuto;
}
public void Initialize()
{
_spriteRenderer = VisualLook.GetComponent<SpriteRenderer>();
}
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);
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;
}
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();
}
}
}
}
}