using UnityEngine; // 스네어 위치의 "트리거 콜라이더"에 붙인다. // VR 스틱 끝(RhythmStickTip)이 이 트리거에 들어오면 RhythmManager.OnPlayerInput()을 호출한다. // → 키보드 입력과 완전히 동일한 진입점이라 판정/효과음/노트 소비는 RhythmManager가 그대로 처리한다. [RequireComponent(typeof(Collider))] public class RhythmDrumPad : MonoBehaviour { [SerializeField] private RhythmManager _manager; [Tooltip("이 속력(m/s) 미만으로 닿으면 무시. 스틱이 패드에 얹히거나 미세하게 떨릴 때 오발 방지. 0이면 비활성")] [SerializeField] private float _minHitSpeed = 0.5f; [Tooltip("한 번 타격 후 이 시간(초) 동안 재타격 무시. 트리거 체류·경계 떨림으로 인한 중복 입력 방지")] [SerializeField] private float _hitCooldown = 0.1f; private float _lastHitTime = float.NegativeInfinity; // 인스펙터에서 콜라이더를 트리거로 바꾸는 걸 깜빡하기 쉬워, 컴포넌트 추가 시 자동으로 켜 준다. private void Reset() { GetComponent().isTrigger = true; } private void OnTriggerEnter(Collider other) { if (_manager == null) return; // 닿은 게 스틱 끝인지 식별 (콜라이더가 자식이어도 부모 쪽까지 탐색) RhythmStickTip tip = other.GetComponentInParent(); if (tip == null) return; // 너무 약한 접촉(얹힘/떨림)은 무시 if (_minHitSpeed > 0f && tip.Speed < _minHitSpeed) return; // 짧은 시간 내 중복 타격 무시 if (Time.time - _lastHitTime < _hitCooldown) return; _lastHitTime = Time.time; _manager.OnPlayerInput(); // 키 입력과 동일 경로 → 가장 가까운 노트 판정 } }