Files
WhaleAdventure_VR/Assets/02_Scripts/Rhythm/RhythmDrumPad.cs

43 lines
1.8 KiB
C#

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<Collider>().isTrigger = true;
}
private void OnTriggerEnter(Collider other)
{
if (_manager == null) return;
// 닿은 게 스틱 끝인지 식별 (콜라이더가 자식이어도 부모 쪽까지 탐색)
RhythmStickTip tip = other.GetComponentInParent<RhythmStickTip>();
if (tip == null) return;
// 너무 약한 접촉(얹힘/떨림)은 무시
if (_minHitSpeed > 0f && tip.Speed < _minHitSpeed) return;
// 짧은 시간 내 중복 타격 무시
if (Time.time - _lastHitTime < _hitCooldown) return;
_lastHitTime = Time.time;
_manager.OnPlayerInput(); // 키 입력과 동일 경로 → 가장 가까운 노트 판정
}
}