93 lines
5.7 KiB
C#
93 lines
5.7 KiB
C#
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<ArrowPickup>(out var arrowPickup)) // 조건이 맞으면 실행할거에요 -> 대상이 화살 아이템이라면
|
|
{
|
|
PickupArrow(arrowPickup); // 함수를 실행할거에요 -> 화살 줍기 함수 PickupArrow를
|
|
break; // 중단할거에요 -> 반복문을 (하나만 줍기 위해)
|
|
}
|
|
|
|
if (hit.TryGetComponent<EquippableItem>(out var item)) // 조건이 맞으면 실행할거에요 -> 대상이 장착 가능한 무기라면
|
|
{
|
|
EquipWeapon(item); // 함수를 실행할거에요 -> 무기 장착 함수 EquipWeapon을
|
|
break; // 중단할거에요 -> 반복문을
|
|
}
|
|
|
|
if (hit.TryGetComponent<HealthPotion>(out var potion)) // 조건이 맞으면 실행할거에요 -> 대상이 회복 물약이라면
|
|
{
|
|
potion.Use(GetComponent<PlayerHealth>()); // 함수를 실행할거에요 -> 물약 사용 함수 Use를
|
|
break; // 중단할거에요 -> 반복문을
|
|
}
|
|
|
|
if (hit.TryGetComponent<HealthAltar>(out var altar)) // 조건이 맞으면 실행할거에요 -> 대상이 회복 제단이라면
|
|
{
|
|
altar.Use(GetComponent<PlayerHealth>()); // 함수를 실행할거에요 -> 제단 사용 함수 Use를
|
|
break; // 중단할거에요 -> 반복문을
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// [MODIFIED] ArrowPickup을 직접 처리
|
|
/// 기존: ArrowItem 타입 → 변경: ArrowPickup 타입으로 통일
|
|
/// </summary>
|
|
private void PickupArrow(ArrowPickup arrowPickup) // 함수를 선언할거에요 -> 화살을 줍는 PickupArrow를
|
|
{
|
|
if (arrowPickup == null) return; // 조건이 맞으면 중단할거에요 -> 화살 아이템이 없다면
|
|
|
|
PlayerAttack playerAttack = GetComponent<PlayerAttack>(); // 컴포넌트를 찾을거에요 -> 플레이어 공격 스크립트를
|
|
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<PlayerStatsUI>()?.UpdateStatTexts(); // 실행할거에요 -> 스탯 UI 갱신을
|
|
}
|
|
|
|
public void ClearCurrentWeapon() // 함수를 선언할거에요 -> 현재 무기를 해제하는 ClearCurrentWeapon을
|
|
{
|
|
_currentWeapon = null; // 값을 비울거에요 -> 현재 무기 변수를
|
|
if (playerStats != null) // 조건이 맞으면 실행할거에요 -> 스탯 스크립트가 있다면
|
|
{
|
|
playerStats.weaponDamage = 0; // 값을 초기화할거에요 -> 무기 공격력을 0으로
|
|
FindObjectOfType<PlayerStatsUI>()?.UpdateStatTexts(); // 실행할거에요 -> 스탯 UI 갱신을
|
|
}
|
|
|
|
// [NEW] 무기 해제 시 화살도 초기화
|
|
PlayerAttack playerAttack = GetComponent<PlayerAttack>(); // 컴포넌트를 찾을거에요 -> 공격 스크립트를
|
|
if (playerAttack != null) // 조건이 맞으면 실행할거에요 -> 공격 스크립트가 있다면
|
|
{
|
|
playerAttack.ResetArrow(); // 실행할거에요 -> 화살 초기화 함수 ResetArrow를
|
|
}
|
|
}
|
|
} |