79 lines
2.5 KiB
C#
79 lines
2.5 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using TMPro;
|
|
using Unity.Netcode;
|
|
using System.Collections.Generic;
|
|
|
|
public class QuickslotUI : MonoBehaviour
|
|
{
|
|
[Header("Dynamic Setup")]
|
|
[SerializeField] private GameObject slotPrefab; // 생성할 슬롯 프리팹
|
|
[SerializeField] private Transform slotContainer; // 슬롯들이 들어갈 부모 (HotbarPanel)
|
|
|
|
[Header("Weight UI")]
|
|
[SerializeField] private Slider weightSlider;
|
|
[SerializeField] private TextMeshProUGUI weightText;
|
|
|
|
private List<InventorySlotUI> _uiSlots = new List<InventorySlotUI>();
|
|
private PlayerInventory _linkedInventory;
|
|
|
|
public void BindInventory(PlayerInventory inventory)
|
|
{
|
|
_linkedInventory = inventory;
|
|
|
|
// 1. 기존에 있던 슬롯 UI들 모두 삭제 (초기화)
|
|
foreach (Transform child in slotContainer) Destroy(child.gameObject);
|
|
_uiSlots.Clear();
|
|
|
|
// 2. 인벤토리 데이터 크기(slotCount)만큼 UI 프리팹 생성
|
|
for (int i = 0; i < _linkedInventory.slotCount; i++)
|
|
{
|
|
GameObject newSlot = Instantiate(slotPrefab, slotContainer);
|
|
InventorySlotUI slotUI = newSlot.GetComponent<InventorySlotUI>();
|
|
_uiSlots.Add(slotUI);
|
|
}
|
|
|
|
// 3. 이벤트 등록 및 초기 갱신
|
|
_linkedInventory.Slots.OnListChanged += (e) => RefreshAll();
|
|
RefreshAll();
|
|
}
|
|
|
|
private void RefreshAll()
|
|
{
|
|
if (_linkedInventory == null) return;
|
|
|
|
for (int i = 0; i < _uiSlots.Count; i++)
|
|
{
|
|
var data = _linkedInventory.Slots[i];
|
|
_uiSlots[i].UpdateView(data.ItemID, data.Amount);
|
|
|
|
// 선택된 슬롯만 하이라이트 활성화
|
|
_uiSlots[i].SetSelection(i == _linkedInventory.SelectedSlotIndex);
|
|
}
|
|
UpdateWeightDisplay();
|
|
}
|
|
|
|
// 데이터 변경 이벤트 핸들러
|
|
private void OnInventoryDataChanged(NetworkListEvent<PlayerInventory.InventorySlot> changeEvent)
|
|
{
|
|
RefreshAll();
|
|
}
|
|
|
|
private void UpdateWeightDisplay()
|
|
{
|
|
if (_linkedInventory == null) return;
|
|
|
|
float current = _linkedInventory.CurrentWeight;
|
|
float max = _linkedInventory.maxWeight;
|
|
|
|
if (weightSlider != null) weightSlider.value = current / max;
|
|
if (weightText != null) weightText.text = $"{current:F1} / {max:F1} kg";
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
// 이벤트 구독 해제 (메모리 누수 방지)
|
|
if (_linkedInventory != null)
|
|
_linkedInventory.Slots.OnListChanged -= OnInventoryDataChanged;
|
|
}
|
|
} |