노트판정은 떨어지는 노트를 보고 키 입력을 해서 누른 타이밍에 따라 판정하는 시스템이다.
판정을 구현하는 방법은
노트와 판정바와의 좌표를 비교하는 것과
노트의 시간값을 비교하는 것이 있다.
또 다른 방법이 있을지 모르겠지만, 나는 노트의 시간값을 토대로 구현하기로 결정했다.
좀 더 정확하게 판정할 수 있을거라고 생각했기 때문이다.
구현 방식을 간략하게 표현해보면
1. 각 레인에 해당하는 노트의 시간값을 큐에 저장.
2. 노트의 시간값(큐의 첫번째 값)과 현재 음악의 시간과 비교하여 판정 차등 부여(미스,굿,그레잇)
3. 판정이 이루어지면 DeQueue
4. 이하 과정 반복
노트 시간값이 담긴 리스트를 큐에 복사.
미스, 굿, 그레잇과 같은 판정이 정확히 어느때 이루어지는지 알 필요가 있다.
미스는 키를 입력하지 않을 때 발생하고
굿, 그레잇은 키를 입력했을 때 발생한다.
미스는 항상 체킹해야하므로 업데이트 메소드에서 구현되어야 한다.
그레잇과 굿판정은 키과 입력되었을 때만 체킹해야 한다.
이 조건이 달린 메소드는 키 입력을 받는 스크립트에 추가해주면 된다.
코드 구조는 이러하고, 자세하게 설명해보면
1번 레인의 판정 과정
judgeLane1 = {3, 6, 10...} 값이 들어있다고 가정.
currentNoteTime1 = judgeLane1.Peek();
큐에서 값을 제거하며 빼내지 않고, 값을 유지한채로 빼낸다.
현재 currentNoteTime1의 값은 3
3 에 missRate를 더한값과 현재 음악시간을 비교
missRate가 1초이고 현재 음악시간값이 2라면
3 + 1 <= 2
현재 음악시간값보다 작으므로 미스가 아님.
다시 음악시간값이 4라면
3 + 1 <= 4
값이 참이므로 미스 판정.
그리고 Dequeue() 로 값을 빼냄
반복
원리는 이렇다.
미스판정은 노트를 입력하지 않으면 일어나는 판정이다.
노트는 3초에 쳐야하지만, 사람이 어떻게 3초에 정확하게 칠 수 있는가.
그러므로 유예 시간을 추가로 주는 것이다.
1초를 추가해줌으로써 4초가 지날때까지는 봐준다는 이야기이다.
이제 이 안에서 같은 원리로 굿, 그레잇 판정을 하게 되는 것이다.
예를 들면
굿은 노트시간에 ± 0.7초
그레잇은 ± 0.4초
판정이 정확히 작동하는 것을 확인 할 수 있다.
'유니티 > 리듬게임' 카테고리의 다른 글
[개발일지13] 점수 (0) | 2019.06.07 |
---|---|
[개발일지12] 노트판정 재설계 (0) | 2019.06.07 |
[개발일지10] 키 입력받기 (0) | 2019.06.03 |
[개발일지8] 중간 진행 상황 (0) | 2019.05.31 |
[개발일지7] 메트로놈 재설계 (0) | 2019.05.26 |