- ToonPostProcess.shader: 횃불 고딕 스타일 후처리 쉐이더 (Built-in RP) - ToonCameraEffect.cs: 카메라 자동 부착 후처리 스크립트 - 중복 UI 스크립트 제거 (MenuIntroController, ToggleCustom) - 씬, 프리팹, 애니메이션 등 전체 업데이트 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
98 lines
6.2 KiB
C#
98 lines
6.2 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; // 중단할거에요 -> 반복문을
|
|
}
|
|
|
|
// HealthAltar 감지 — 자기 자신 또는 부모에서 찾기
|
|
// 제단은 Environment 레이어(충돌용) + 자식 Item 레이어(감지용) 구조라서
|
|
// OverlapSphere가 자식(AltarTrigger)을 잡을 수 있어요 → 부모까지 탐색!
|
|
HealthAltar altar = hit.GetComponent<HealthAltar>(); // 가져올거에요 -> 자기 자신에서 HealthAltar를
|
|
if (altar == null) altar = hit.GetComponentInParent<HealthAltar>(); // 없으면 가져올거에요 -> 부모에서 HealthAltar를
|
|
if (altar != null) // 조건이 맞으면 실행할거에요 -> 제단을 찾았으면
|
|
{
|
|
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를
|
|
}
|
|
}
|
|
} |