using System; using System.Collections.Generic; using BlueWater.Items; using Sirenix.OdinInspector; using TMPro; using UnityEngine; namespace BlueWater.Uis { public class InventoryUi : MonoBehaviour { [Title("컴포넌트")] [SerializeField, Required] private TMP_Dropdown _inventoryFilterSortDropdown; [SerializeField, Required] private TMP_Dropdown _inventorySortDropdown; [Title("프리팹 생성 위치")] [SerializeField, Required] private Transform _tycoonItemSlotLocation; [Title("프리팹")] [SerializeField, Required] private TycoonItemSlotUi _tycoonItemSlotUi; private List _tycoonItemSlotUis = new(); private ItemManager _itemManager; private DataManager _dataManager; private Inventory _inventory; private void Awake() { InitializeInventory(); InventorySynchronization(); } private void Start() { _dataManager.Inventory.OnChangeItemSlot += ChangedData; } private void OnDestroy() { _dataManager.Inventory.OnChangeItemSlot -= ChangedData; } private void InitializeInventory() { _itemManager = ItemManager.Instance; _dataManager = DataManager.Instance; _inventory = _dataManager.Inventory; _tycoonItemSlotUis.Clear(); foreach (Transform element in _tycoonItemSlotLocation) { Destroy(element.gameObject); } } private void InventorySynchronization() { foreach (var element in _inventory.ItemSlotList) { var newItemContent = Instantiate(_tycoonItemSlotUi, _tycoonItemSlotLocation).GetComponent(); newItemContent.SetItemSlot(element); _tycoonItemSlotUis.Add(newItemContent); } } public void ChangedData(ItemSlot changedItemSlot, bool added) { if (added) { AddItem(changedItemSlot); } else { RemoveItem(changedItemSlot); } } private void AddItem(ItemSlot addItemSlot) { var existingItemSlotUi = _tycoonItemSlotUis.Find(i => i.ItemSlot.Idx == addItemSlot.Idx); if (existingItemSlotUi) { existingItemSlotUi.SetItemSlot(addItemSlot); } else { var newItemSlot = Instantiate(_tycoonItemSlotUi, _tycoonItemSlotLocation).GetComponent(); newItemSlot.SetItemSlot(addItemSlot); _tycoonItemSlotUis.Add(newItemSlot); } } private void RemoveItem(ItemSlot removeItemSlot) { var existingItemSlotUi = _tycoonItemSlotUis.Find(i => i.ItemSlot.Idx == removeItemSlot.Idx); if (existingItemSlotUi) { existingItemSlotUi.SetItemSlot(removeItemSlot); if (existingItemSlotUi.ItemSlot.Quantity <= 0) { _tycoonItemSlotUis.Remove(existingItemSlotUi); Destroy(existingItemSlotUi.gameObject); } } } public void InventoryFilterSortButton() { if (_inventoryFilterSortDropdown.value == 0) return; InventoryFilterSortItemSlotUi((InventoryFilterSortingType)_inventoryFilterSortDropdown.value); _inventoryFilterSortDropdown.value = 0; } private void InventoryFilterSortItemSlotUi(InventoryFilterSortingType inventoryFilterSortingType) { switch (inventoryFilterSortingType) { case InventoryFilterSortingType.None: break; case InventoryFilterSortingType.Total: foreach (var element in _tycoonItemSlotUis) { element.ShowUi(); } break; case InventoryFilterSortingType.Ingredient: foreach (var element in _tycoonItemSlotUis) { // if (_itemManager.ItemDataSo.GetDataByIdx(element.ItemSlot.Idx).Type == ItemType.FoodIngredient) // { // element.ShowUi(); // } // else // { // element.HideUi(); // } } break; default: throw new ArgumentOutOfRangeException(nameof(inventoryFilterSortingType), inventoryFilterSortingType, null); } } public void InventorySortButton() { if (_inventorySortDropdown.value == 0) return; InventorySortItemSlotUi((InventorySortingType)_inventorySortDropdown.value); _inventorySortDropdown.value = 0; } private void InventorySortItemSlotUi(InventorySortingType inventorySortingType) { // switch (inventorySortingType) // { // case InventorySortingType.None: // break; // case InventorySortingType.PriceUp: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Price. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Price)); // break; // case InventorySortingType.PriceDown: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Price. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Price)); // break; // case InventorySortingType.TypeUp: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Type. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Type)); // break; // case InventorySortingType.TypeDown: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Type. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Type)); // break; // case InventorySortingType.IngredientTypeUp: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).IngredientType. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).IngredientType)); // break; // case InventorySortingType.IngredientTypeDown: // _tycoonItemSlotUis.Sort((x, y) => // _itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).IngredientType. // CompareTo(_itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).IngredientType)); // break; // case InventorySortingType.NameUp: // _tycoonItemSlotUis.Sort((x, y) => // string.Compare(_itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Name, // _itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Name, StringComparison.Ordinal)); // break; // case InventorySortingType.NameDown: // _tycoonItemSlotUis.Sort((x, y) => // string.Compare(_itemManager.ItemDataSo.GetDataByIdx(y.ItemSlot.Idx).Name, // _itemManager.ItemDataSo.GetDataByIdx(x.ItemSlot.Idx).Name, StringComparison.Ordinal)); // break; // case InventorySortingType.AcquisitionTimeUp: // _tycoonItemSlotUis.Sort((x, y) => // x.ItemSlot.AcquisitionTime. // CompareTo(y.ItemSlot.AcquisitionTime)); // break; // case InventorySortingType.AcquisitionTimeDown: // _tycoonItemSlotUis.Sort((x, y) => // y.ItemSlot.AcquisitionTime. // CompareTo(x.ItemSlot.AcquisitionTime)); // break; // default: // throw new ArgumentOutOfRangeException(); // } // // for (var i = 0; i < _tycoonItemSlotUis.Count; i++) // { // _tycoonItemSlotUis[i].transform.SetSiblingIndex(i); // } } } }