CapersProject/Assets/02.Scripts/Ui/Tycoon/Bill.cs
2024-10-08 22:44:20 +09:00

127 lines
4.1 KiB
C#

using System;
using System.Collections;
using BlueWater.Npcs.Customers;
using DG.Tweening;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
namespace BlueWater
{
public class Bill : MonoBehaviour
{
[SerializeField]
private RectTransform _rect;
[SerializeField]
private AnimationController _animationController;
[SerializeField]
private Slider _slider;
[SerializeField]
private Image _filledImage;
[SerializeField]
private Image _orderImage;
[SerializeField]
private GameObject _tableNumberImageObject;
[SerializeField]
private TMP_Text _tableNumberText;
[SerializeField]
private Color _startColor = Color.green;
[SerializeField]
private Color _endColor = Color.red;
public BillInfo BillInfo { get; private set; }
public void Initialize(Customer customer, Vector3 spawnPosition)
{
_slider.onValueChanged.AddListener(OnSliderValueChanged);
_rect.anchoredPosition = spawnPosition;
_slider.value = 1f;
_orderImage.sprite = customer.OrderedCocktailData.Sprite;
var sliderSequence = DOTween.Sequence();
sliderSequence.Append(_slider.DOValue(0f, customer.CurrentLevelData.HurryTime)
.From(1f)
.SetEase(Ease.Linear)
.SetDelay(customer.CurrentLevelData.WaitTime)
.SetAutoKill(true));
}
private void OnDestroy()
{
_slider.onValueChanged.RemoveListener(OnSliderValueChanged);
}
private void OnSliderValueChanged(float value)
{
_filledImage.color = Color.Lerp(_endColor, _startColor, value);
}
public void Move(BillInfo billInfo)
{
if (BillInfo != null)
{
BillInfo.IsEmpty = true;
}
BillInfo = billInfo;
BillInfo.IsEmpty = false;
// 트윈 이동
var moveSequence = DOTween.Sequence();
moveSequence.Append(_rect.DOLocalMoveX(BillInfo.Position.x, 1f));
moveSequence.Join(_rect.DOLocalRotate(new Vector3(0, 0, 40f), 0.2f));
moveSequence.Join(_rect.DOPunchRotation(new Vector3(0f, 0f, 5f), 0.8f, 3, 0.2f)
.SetDelay(0.2f)
.SetEase(Ease.InOutBounce));
moveSequence.AppendCallback(OnArrivedTarget);
}
private void OnArrivedTarget()
{
var randomZ = Random.Range(-15f, 15f);
var arrivedSequence = DOTween.Sequence();
arrivedSequence.Append(_rect.DOLocalRotate(Vector3.zero, 0.2f).SetEase(Ease.InQuad));
arrivedSequence.Append(_rect.DOPunchRotation(new Vector3(0f, 0f, -20f), 1f, 5, 0.5f)
.SetEase(Ease.InOutBounce));
arrivedSequence.Append(_rect.DOLocalRotate(new Vector3(0f, 0f, randomZ), 0.2f).SetEase(Ease.InQuad));
}
public void OrderResult(bool isSucceed, Action onDestroyAction)
{
_slider.gameObject.SetActive(false);
_orderImage.gameObject.SetActive(false);
_tableNumberImageObject.SetActive(false);
StartCoroutine(WaitForAnimation(isSucceed, onDestroyAction));
}
private IEnumerator WaitForAnimation(bool isSucceed, Action onDestroyAction)
{
_animationController.SetAnimationParameter("isOrderedSucceed", isSucceed);
_animationController.SetAnimationParameter("isAnimationTrigger", true);
var animationName = isSucceed ? "OrderedSucceed" : "OrderedFail";
var animationStarted = false;
yield return StartCoroutine(_animationController.WaitForAnimationToRun(animationName,
success => animationStarted = success));
if (!animationStarted)
{
Debug.LogError("애니메이션 오류");
}
BillInfo.IsEmpty = true;
onDestroyAction?.Invoke();
Destroy(gameObject);
}
}
}