CapersProject/Assets/02.Scripts/Ui/Combat/CombatItemInventoryUi.cs
Nam Tae Gun f1fcd10077 타이쿤 Ui 테스트용 기본 기능 추가
+ excel 수정
+ 테스트용 이미지 연결
2024-07-16 01:20:39 +09:00

254 lines
7.7 KiB
C#

using System;
using System.Collections.Generic;
using BlueWater.Items;
using Sirenix.OdinInspector;
using TMPro;
using UnityEngine;
namespace BlueWater.Uis
{
public class CombatItemInventoryUi : SwitchActionPopupUi
{
// Variables
#region Variables
// Components
[SerializeField, Required]
protected TMP_Dropdown SortingDropdown;
[SerializeField, Required]
protected TMP_Text CurrentWeight;
[SerializeField, Required]
protected Transform InstantiateLocation;
[SerializeField, Required]
protected DiscardPopupUi DiscardPopupUi;
[SerializeField, Required]
protected GameObject ItemSlotUiPrefab;
// Variables
[SerializeField]
private List<ItemSlotUi> _itemSlotUiList = new();
private List<ItemSlotUi> _selectedList = new();
private Inventory _inventory;
#endregion
// Unity events
#region Unity events
private void Awake()
{
InitializeInventory();
InventorySynchronization();
CalculateWeight();
}
private void OnEnable()
{
DiscardPopupUi.Close();
}
private void Start()
{
_inventory.OnChangeItemSlot += ChangedData;
}
private void OnDestroy()
{
_inventory.OnChangeItemSlot -= ChangedData;
}
#endregion
// Initialize methods
#region Initialize methods
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
SortingDropdown = transform.Find("ItemInventoryPanel/Popup Base - Concave/Top/SortingDropdown").GetComponent<TMP_Dropdown>();
CurrentWeight = transform.Find("ItemInventoryPanel/Popup Base - Concave/Top/CurrentWeight").GetComponent<TMP_Text>();
InstantiateLocation = transform.Find("ItemInventoryPanel/ScrollView/Viewport/Content");
DiscardPopupUi = transform.Find("DiscardPopupUi").GetComponent<DiscardPopupUi>();
}
private void InitializeInventory()
{
if (DataManager.Instance)
{
_inventory = DataManager.Instance.Inventory;
}
_itemSlotUiList.Clear();
foreach (Transform element in InstantiateLocation)
{
Destroy(element.gameObject);
}
}
private void InventorySynchronization()
{
foreach (var element in _inventory.ItemSlotList)
{
var newItemContent = Instantiate(ItemSlotUiPrefab, InstantiateLocation).GetComponent<ItemSlotUi>();
newItemContent.InitializeData(element);
_itemSlotUiList.Add(newItemContent);
}
}
#endregion
// Methods
#region Methods
public override void Close()
{
if (DiscardPopupUi.gameObject.activeSelf)
{
DiscardPopupUi.Close();
}
base.Close();
}
private void CalculateWeight()
{
if (float.IsPositiveInfinity(_inventory.WeightLimit))
{
CurrentWeight.text = _inventory.CurrentTotalWeight + " / ∞Kg";
}
else
{
CurrentWeight.text = _inventory.CurrentTotalWeight + " / " + _inventory.WeightLimit + "Kg";
}
CurrentWeight.color = _inventory.IsOverWeight ? Color.red : Color.white;
}
public void ChangedData(ItemSlot changedItemSlot, bool added)
{
if (added)
{
AddItem(changedItemSlot);
}
else
{
RemoveItem(changedItemSlot);
}
CalculateWeight();
}
private void AddItem(ItemSlot addItemSlot)
{
var existingItemSlotUi = _itemSlotUiList.Find(i => i.ItemSlot.Idx == addItemSlot.Idx);
if (existingItemSlotUi != null)
{
existingItemSlotUi.UpdateData(addItemSlot);
}
else
{
var newItemSlot = Instantiate(ItemSlotUiPrefab, InstantiateLocation).GetComponent<ItemSlotUi>();
newItemSlot.InitializeData(addItemSlot);
_itemSlotUiList.Add(newItemSlot);
}
}
private void RemoveItem(ItemSlot removeItemSlot)
{
var existingItemSlotUi = _itemSlotUiList.Find(i => i.ItemSlot.Idx == removeItemSlot.Idx);
if (existingItemSlotUi != null)
{
existingItemSlotUi.UpdateData(removeItemSlot);
if (existingItemSlotUi.ItemSlot.Quantity <= 0)
{
_itemSlotUiList.Remove(existingItemSlotUi);
Destroy(existingItemSlotUi.gameObject);
}
}
}
public void SelectAll()
{
foreach (var element in _itemSlotUiList)
{
element.ToggleOn();
}
}
public void DeselectAll()
{
foreach (var element in _itemSlotUiList)
{
element.ToggleOff();
}
}
public void DiscardButton()
{
_selectedList.Clear();
foreach (var element in _itemSlotUiList)
{
if (!element.ToggleIsOn) continue;
_selectedList.Add(element);
}
if (_selectedList.Count == 1)
{
DiscardPopupUi.DiscardMessage(_selectedList[0]);
}
else if (_selectedList.Count > 1)
{
DiscardPopupUi.DiscardAllMessage(_selectedList);
}
}
public void SortButton()
{
if (SortingDropdown.value == 0) return;
_inventory.SortItem((CombatInventorySortingType)SortingDropdown.value);
SortItemSlotUi((CombatInventorySortingType)SortingDropdown.value);
SortingDropdown.value = 0;
}
private void SortItemSlotUi(CombatInventorySortingType sortingType)
{
switch (sortingType)
{
case CombatInventorySortingType.None:
return;
case CombatInventorySortingType.Recent:
_itemSlotUiList.Sort((x, y) => y.ItemSlot.AcquisitionTime.CompareTo(x.ItemSlot.AcquisitionTime));
break;
case CombatInventorySortingType.Name:
_itemSlotUiList.Sort((x, y) =>
string.Compare(ItemManager.Instance.GetItemDataByIdx(x.ItemSlot.Idx).Name,
ItemManager.Instance.GetItemDataByIdx(y.ItemSlot.Idx).Name, StringComparison.Ordinal));
break;
case CombatInventorySortingType.Category:
_itemSlotUiList.Sort((x, y) =>
ItemManager.Instance.GetItemDataByIdx(x.ItemSlot.Idx).Type.CompareTo(ItemManager.Instance.GetItemDataByIdx(y.ItemSlot.Idx).Type));
break;
case CombatInventorySortingType.Count:
_itemSlotUiList.Sort((x, y) => y.ItemSlot.Quantity.CompareTo(x.ItemSlot.Quantity));
break;
default:
throw new ArgumentOutOfRangeException();
}
for (var i = 0; i < _itemSlotUiList.Count; i++)
{
_itemSlotUiList[i].transform.SetSiblingIndex(i);
}
}
#endregion
}
}