43 lines
1.8 KiB
C#
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(); // 키 입력과 동일 경로 → 가장 가까운 노트 판정
|
|
}
|
|
}
|