CapersProject/Assets/02.Scripts/Restaurant/FoodBalloonUi.cs
Nam Tae Gun 87aa509cfc #7, #8 타이쿤 손님 테이블 상호작용 및 손님 Ai 추가
+ ItemTable excel, json, so 수정
+ 손님 추가 -> 빈 자리 찾기 -> 음료 주문 -> 퇴장 구현
+ 일부 BehaviorTree Action 변경
2024-06-19 03:16:19 +09:00

127 lines
3.7 KiB
C#

using BlueWater.Items;
using BlueWater.Npcs.Customers;
using DG.Tweening;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.UI;
namespace BlueWater
{
public class FoodBalloonUi : MonoBehaviour
{
[field: Title("컴포넌트")]
[field: SerializeField, Required]
public Image FillImage { get; private set; }
[field: SerializeField, Required]
public Image FoodImage { get; private set; }
[SerializeField]
private Customer _customer;
[SerializeField]
private Vector3 _offset = new(-0.2f, 1.5f, 0f);
[Title("주문 정보")]
[SerializeField, Tooltip("주문을 시작하고나서, 재촉하지 않는 최소한의 기다리는 시간")]
private float _defaultWaitTime = 5f;
[SerializeField, DisableIf("@true"), Tooltip("_defaultWaitTime시간이 지나고, 재촉하는 시간")]
private float _customerWaitTime;
[SerializeField, DisableIf("@true")]
private bool _isOrdered;
[SerializeField, DisableIf("@true")]
private bool _isWaitTimeOver;
[SerializeField, DisableIf("@true")]
private bool _isFoodReceived;
private Tween _tween;
private TableSeat _tableSeat;
private ItemData _orderItemData;
private void Awake()
{
InitializeComponents();
}
private void LateUpdate()
{
if (!gameObject.activeSelf || !_customer) return;
transform.position = _customer.transform.TransformPoint(_offset);
}
private void OnDestroy()
{
_tween.Kill();
}
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
FillImage = transform.Find("Background/FillImage").GetComponent<Image>();
FoodImage = transform.Find("FoodImage").GetComponent<Image>();
}
public void Initialize(Customer customer, TableSeat tableSeat)
{
_customer = customer;
_tableSeat = tableSeat;
HideUi();
}
public void ShowUi() => gameObject.SetActive(true);
public void HideUi() => gameObject.SetActive(false);
private void SetFoodImage(int foodIdx)
{
_orderItemData = ItemManager.Instance.GetItemDataByIdx(foodIdx);
if (_orderItemData == null)
{
Debug.LogError($"{foodIdx} 해당 음식을 등록할 수 없습니다.");
return;
}
if (_orderItemData.Sprite == null)
{
Debug.LogWarning($"{_orderItemData.Sprite} 해당 음식의 이미지가 없습니다.");
}
FoodImage.sprite = _orderItemData.Sprite;
}
public void OrderFood(int foodIdx, float waitTime)
{
_isOrdered = true;
_isWaitTimeOver = false;
_isFoodReceived = false;
SetFoodImage(foodIdx);
_customerWaitTime = waitTime;
ShowUi();
_tween = FillImage.DOFillAmount(1f, _customerWaitTime)
.SetEase(Ease.Linear)
.SetDelay(_defaultWaitTime)
.OnComplete(OnTweenComplete)
.SetAutoKill(false);
_tween.Restart();
}
private void OnTweenComplete()
{
_isWaitTimeOver = true;
HideUi();
}
public bool IsWaitTimeOver() => _isOrdered && _isWaitTimeOver;
public bool IsFoodReceive() => _isFoodReceived;
public void CancelOrder()
{
_tableSeat.UnreserveSeat();
_tableSeat.VacateSeat();
}
}
}