Projext/Assets/Scripts/Player/Interaction/PlayerInteraction.cs

93 lines
5.7 KiB
C#
Raw Normal View History

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