using UnityEngine; using UnityEngine.InputSystem; // New Input System 네임스페이스 public class PlayerInteraction : MonoBehaviour { [Header("Detection Settings")] [SerializeField] private float interactionRadius = 2.5f; [SerializeField] private LayerMask interactableLayer; private PlayerInputActions _inputActions; void Awake() { _inputActions = new PlayerInputActions(); } void OnEnable() { // Interact 액션이 수행되었을 때(버튼을 눌렀을 때) 실행될 함수 연결 _inputActions.Player.Interact.performed += OnInteractPerformed; _inputActions.Enable(); } void OnDisable() { // 이벤트 연결 해제 및 비활성화 _inputActions.Player.Interact.performed -= OnInteractPerformed; _inputActions.Disable(); } // Input Action 콜백 함수 private void OnInteractPerformed(InputAction.CallbackContext context) { Debug.Log("E 키 눌림!"); // <-- 이게 콘솔에 찍히나요? // 건설 모드 중일 때는 상호작용을 막고 싶다면 아래 조건 추가 if (BuildManager.Instance.IsBuildMode) return; CheckAndInteract(); } private void CheckAndInteract() { Collider[] colliders = Physics.OverlapSphere(transform.position, interactionRadius, interactableLayer); Debug.Log($"주변에서 {colliders.Length}개의 물체 감지됨"); // 0이 나오면 레이어나 콜라이더 문제 IInteractable nearestInteractable = null; float minDistance = Mathf.Infinity; foreach (var col in colliders) { // 부모까지 포함하여 IInteractable 인터페이스를 찾음 IInteractable interactable = col.GetComponentInParent(); if (interactable != null) { Debug.Log($"{col.name}에서 인터페이스 발견!"); float distance = Vector3.Distance(transform.position, col.transform.position); if (distance < minDistance) { minDistance = distance; nearestInteractable = interactable; } } } if (nearestInteractable != null) { nearestInteractable.Interact(gameObject); Debug.Log($"[Interaction] {nearestInteractable.GetInteractionText()} 실행"); } } private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, interactionRadius); } }