CapersProject/Assets/02.Scripts/Prop/Tycoon/MoneyCounter.cs
Nam Tae Gun 57b21c004f 0.3.4.0
2024-11-15 16:28:13 +09:00

165 lines
4.1 KiB
C#

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<SpriteRenderer>();
}
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, false);
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();
}
}
}
}
}