using Unity.Netcode; using UnityEngine; public class PlayerEquipmentHandler : NetworkBehaviour { [SerializeField] private Transform toolAnchor; // 캐릭터 손의 소켓 위치 private PlayerInventory _inventory; private GameObject _currentToolInstance; // 현재 생성된 도구 모델 void Awake() { _inventory = GetComponent(); } public override void OnNetworkSpawn() { // 인벤토리의 슬롯 변경 이벤트 구독 // OnSlotChanged는 (이전 값, 새 값) 두 개의 인자를 전달합니다. _inventory.OnSlotChanged += HandleSlotChanged; // 게임 시작 시 처음에 들고 있는 아이템 모델 생성 UpdateEquippedModel(_inventory.SelectedSlotIndex); } private void HandleSlotChanged(int previousValue, int newValue) { UpdateEquippedModel(newValue); } private void UpdateEquippedModel(int slotIndex) { // 1. 기존 도구가 있다면 파괴 if (_currentToolInstance != null) { Destroy(_currentToolInstance); } // 2. 현재 선택된 슬롯의 데이터 확인 ItemData data = _inventory.GetItemDataInSlot(slotIndex); // 3. 도구인 경우에만 모델 생성 if (data != null && data.isTool && data.toolPrefab != null) { _currentToolInstance = Instantiate(data.toolPrefab, toolAnchor); // ItemData에 설정된 오프셋 적용 _currentToolInstance.transform.localPosition = data.equipPositionOffset; _currentToolInstance.transform.localRotation = Quaternion.Euler(data.equipRotationOffset); } } public override void OnNetworkDespawn() { // 이벤트 구독 해제 (메모리 누수 방지) if (_inventory != null) _inventory.OnSlotChanged -= HandleSlotChanged; } }