using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을 public class PlayerInteraction : MonoBehaviour // 클래스를 선언할거에요 -> MonoBehaviour를 상속받는 PlayerInteraction을 { [Header("--- 설정 ---")] // 인스펙터 창에 제목을 표시할거에요 -> --- 설정 --- 을 [SerializeField] private float interactRange = 3f; // 변수를 선언할거에요 -> 상호작용 거리인 interactRange를 [SerializeField] private LayerMask itemLayer; // 변수를 선언할거에요 -> 아이템 레이어인 itemLayer를 [SerializeField] private Transform handSlot; // 변수를 선언할거에요 -> 무기 장착 위치인 handSlot을 [SerializeField] private Stats playerStats; // 변수를 선언할거에요 -> 플레이어 스탯 스크립트인 playerStats를 private EquippableItem _currentWeapon; // 변수를 선언할거에요 -> 현재 장착된 무기인 _currentWeapon을 public EquippableItem CurrentWeapon => _currentWeapon; // 프로퍼티를 선언할거에요 -> 현재 무기를 반환하는 CurrentWeapon을 public void TryInteract() // 함수를 선언할거에요 -> 상호작용을 시도하는 TryInteract를 { Collider[] hits = Physics.OverlapSphere(transform.position, interactRange, itemLayer); // 배열을 만들거에요 -> 주변 아이템들을 감지해서 hits에 foreach (var hit in hits) // 반복할거에요 -> 감지된 모든 아이템에 대해 { // [MODIFIED] ArrowItem 제거 → ArrowPickup으로 통일 if (hit.TryGetComponent(out var arrowPickup)) // 조건이 맞으면 실행할거에요 -> 대상이 화살 아이템이라면 { PickupArrow(arrowPickup); // 함수를 실행할거에요 -> 화살 줍기 함수 PickupArrow를 break; // 중단할거에요 -> 반복문을 (하나만 줍기 위해) } if (hit.TryGetComponent(out var item)) // 조건이 맞으면 실행할거에요 -> 대상이 장착 가능한 무기라면 { EquipWeapon(item); // 함수를 실행할거에요 -> 무기 장착 함수 EquipWeapon을 break; // 중단할거에요 -> 반복문을 } if (hit.TryGetComponent(out var potion)) // 조건이 맞으면 실행할거에요 -> 대상이 회복 물약이라면 { potion.Use(GetComponent()); // 함수를 실행할거에요 -> 물약 사용 함수 Use를 break; // 중단할거에요 -> 반복문을 } if (hit.TryGetComponent(out var altar)) // 조건이 맞으면 실행할거에요 -> 대상이 회복 제단이라면 { altar.Use(GetComponent()); // 함수를 실행할거에요 -> 제단 사용 함수 Use를 break; // 중단할거에요 -> 반복문을 } } } /// /// [MODIFIED] ArrowPickup을 직접 처리 /// 기존: ArrowItem 타입 → 변경: ArrowPickup 타입으로 통일 /// private void PickupArrow(ArrowPickup arrowPickup) // 함수를 선언할거에요 -> 화살을 줍는 PickupArrow를 { if (arrowPickup == null) return; // 조건이 맞으면 중단할거에요 -> 화살 아이템이 없다면 PlayerAttack playerAttack = GetComponent(); // 컴포넌트를 찾을거에요 -> 플레이어 공격 스크립트를 if (playerAttack != null) // 조건이 맞으면 실행할거에요 -> 공격 스크립트가 있다면 { // ArrowPickup.Pickup() 내부에서 // playerAttack.SetCurrentArrow(ArrowData)를 호출합니다 arrowPickup.Pickup(playerAttack); // 실행할거에요 -> 화살 아이템의 줍기 함수를 } } private void EquipWeapon(EquippableItem item) // 함수를 선언할거에요 -> 무기를 장착하는 EquipWeapon을 { if (_currentWeapon != null) _currentWeapon.OnDropped(transform.forward); // 조건이 맞으면 실행할거에요 -> 이미 든 무기가 있다면 떨구기를 _currentWeapon = item; // 값을 저장할거에요 -> 새 무기를 현재 무기로 _currentWeapon.OnPickedUp(handSlot); // 실행할거에요 -> 무기의 줍기 함수 OnPickedUp을 if (playerStats != null) // 조건이 맞으면 실행할거에요 -> 플레이어 스탯이 있다면 { playerStats.weaponDamage = item.Config.BaseDamage; // 값을 설정할거에요 -> 무기 공격력을 스탯에 반영하기를 } FindObjectOfType()?.UpdateStatTexts(); // 실행할거에요 -> 스탯 UI 갱신을 } public void ClearCurrentWeapon() // 함수를 선언할거에요 -> 현재 무기를 해제하는 ClearCurrentWeapon을 { _currentWeapon = null; // 값을 비울거에요 -> 현재 무기 변수를 if (playerStats != null) // 조건이 맞으면 실행할거에요 -> 스탯 스크립트가 있다면 { playerStats.weaponDamage = 0; // 값을 초기화할거에요 -> 무기 공격력을 0으로 FindObjectOfType()?.UpdateStatTexts(); // 실행할거에요 -> 스탯 UI 갱신을 } // [NEW] 무기 해제 시 화살도 초기화 PlayerAttack playerAttack = GetComponent(); // 컴포넌트를 찾을거에요 -> 공격 스크립트를 if (playerAttack != null) // 조건이 맞으면 실행할거에요 -> 공격 스크립트가 있다면 { playerAttack.ResetArrow(); // 실행할거에요 -> 화살 초기화 함수 ResetArrow를 } } }