using System.Collections; using System.Collections.Generic; using BlueWater.Items; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Uis { public class ItemLootUi : MonoBehaviour { [SerializeField] private List _itemLootInfoUis = new(3); [ShowInInspector] private Queue<(ItemData, int, int)> _waitingLootInfoUis = new(); private Coroutine _waitingQueueCoroutineInstance; private readonly WaitForSeconds _coroutineRestartTime = new(0.5f); private void Awake() { var itemLootInfoUis = GetComponentsInChildren(); foreach (var element in itemLootInfoUis) { _itemLootInfoUis.Add(element); } } public void ShowLootInfoUi(ItemData itemData, int count) { var totalItemCount = DataManager.Instance.Inventory.GetItemByIdx(itemData.Idx).Quantity; if (_waitingLootInfoUis.Count > 0) { _waitingLootInfoUis.Enqueue((itemData, count, totalItemCount)); return; } foreach (var element in _itemLootInfoUis) { if (element.IsShowing) continue; SetItemLootInfo(element, itemData, count, totalItemCount); return; } _waitingLootInfoUis.Enqueue((itemData, count, totalItemCount)); Utils.StartUniqueCoroutine(this, ref _waitingQueueCoroutineInstance, WaitingQueueCoroutine()); } private void SetItemLootInfo(ItemLootInfoUi element, ItemData itemData, int count, int totalItemCount) { var itemNameText = $"+{count} {itemData.Name}"; var totalItemCountText = $"({totalItemCount})"; element.SetInfo(itemData.Sprite, itemNameText, totalItemCountText); element.ShowUi(); } private IEnumerator WaitingQueueCoroutine() { while (_waitingLootInfoUis.Count > 0) { foreach (var element in _itemLootInfoUis) { if (element.IsShowing) continue; var lootInfoUi = _waitingLootInfoUis.Dequeue(); SetItemLootInfo(element, lootInfoUi.Item1, lootInfoUi.Item2, lootInfoUi.Item3); break; } yield return _coroutineRestartTime; } _waitingQueueCoroutineInstance = null; } } }