종강기념 주저리 글.
지난 노트판정 개발일지에서 두가지의 구현방식을 예를 들었는데
1. 노트와 판정선의 거리를 검사해 판정
2. 노트의 시간값을 검사해 판정
거리를 체크한다는 말은 노트의 trasform.position과 판정선의 transform.position을 비교하게 되는 것인데
(또는 콜라이더 를 통해 충돌 체크가 있겠으나, 이러한 물리연산은 부담이 크기 때문에 판정의 오차가 중요한 게임에서는 사용을 자제하는게 좋을 것이다.)
Update 메소드안에서 돌고, Time.deltaTime값이 리듬게임 같이 매우 정확한 시간을 요구하는 게임에서는 부적절 하기 때문에(밀림 현상발생) 메트로놈을 다시 만들 때 당시, 오디오파일의 PCM샘플값을 이용했었다.
유니티 레퍼런스상에서는 Time보다는 정밀한 타이밍을 사용할 수 있다고 설명하고 있고, 실제로 적용시켜 실행시켜봤을 때 정말로 정밀한 시간을 사용할 수 있게 되었다.
그래서 별다른 이유없이 정밀한 시간값을 활용할 수 있고, 또한 그것을 잘 다룰수 있고, 적어도 차후 판정에서 문제가 발생하지 않을 것 같아서 시간값을 검사한 판정 구현을 했다. (이것 또한 어떤 변수가 생길지는 모르나 적어도 거리 검사보다는 나을 것이라고 생각했다)
아무튼 이 글을 작성한 진짜 목적은 다른방식이 그 방식이 아니라 스크립트 방식이였다.
노트데이터를 기록하는 표기법이 게임마다 상이한데
노트의 위치를
일종의 좌표로 기록하거나 예) 어느 좌표에 첫번째 마디에 첫번째 노트(BMS가 그랬던것 같다)
또는
시간값을 기록 예) 어느 좌표에 몇초에 등장
현재 하이퍼링크는 시간값 기록형식이기 때문에
노트 시간값을 파싱해온 것을 큐에 바로 저장해버리면 끝인데, 시간값 기록이 아닌 스크립트 형식은 데이터를 변환을 해줘야 할 것이다. (시간값 검사 판정에서는)
그렇게 어려운 일은 아니다.
곡의 정보
BPM 120, 4/4
의 첫번째 마디의 의 세번째 노트의 (4비트기준)시간값을 구해보면?
1. 한박자당 시간값을 계산 60/120 = 0.5초
2. 한박자 시간값 * 3 = 1.5초인데 0초부터 첫번째 노트라서 0.5를 빼줘야한다. 그래서 1초
그런데 리듬게임이 4비트만 주구장창 누르는 게임도 아니고 8비트 16비트 나오면 어떡하죠? 라고 한다면
그것도 마찬가지로 계산하면 그만이다.
4비트 기준 0.5초이니
8비트는 2로 한번 더 나눈값인 0.25초 일것이고
16비트는 또 한번 2를 나눈값인 0.125초이다.
이렇게 계산된 비트당 시간값에 노트의 위치만큼 곱해서 사용하면 되는 것이다.
예) 첫번째 마디의 16비트 기준 12번째의 노트 라고 하면
16비트 시간값 * 12 = 1.5인데 역시 마찬가지로 0초부터 시작하기 때문에 0.125를 한번 빼줘야한다.
그래서 1.375초
추가로 오프셋을 0초를 두고 했기때문에 오프셋값이 있다면 오프셋값을 더해줘야한다.
오프셋값이 필요한 이유는 오디오파일마다 노래의 시작점이 다르기 때문이다.
음악파일을 열면 바로 음악이 나오는 파일이 있는 반면 미세한 차이를 두고 음악이 나오는 파일이 있다.
정확한 이유는 모르겠으나 음악이 바로 나오는 것을 방지하고자는 이유가 있을 것이다.
어떤 음악을 틀어야되는데 바로 들려주면 안되는 상황(파일을 열자마자 일시정지를 해야되는 상황)
만약에 오프셋이 없다면 일시정지를 누를세도 없이 음악이 흘러나올 것이다.
그래서 리듬게임에서 첫번째 박자의 정확한 타이밍을 잡기 위해서 사용한다.
오프셋값이 0.3초라면 일반적으로 음악의 첫번째 박자가 0.3초에 시작하기 때문에
위의 예시에서 첫번째 노트의 시간값은 0초가 아닌 0.3초이다.
그런 이유로 3번째 노트는 1.3초이다.
아무튼, 시간값을 기록하지 않는 노트 스크립트형식은 이런식으로 풀면 된다.
라고 하지만 사실 그런 노트 스크립트를 가지고 파싱해 노트를 생성한 정도면 알아서 다 했을 것이라고 생각한다.
'유니티 > 리듬게임' 카테고리의 다른 글
[개발일지17] 업데이트 계획 (0) | 2019.10.09 |
---|---|
[개발일지16] 노트 배속 변경기능 추가 (0) | 2019.07.08 |
[개발일지15] 플레이 영상 (0) | 2019.06.09 |
[개발일지14] 간단하게 UI (0) | 2019.06.08 |
[개발일지13] 점수 (0) | 2019.06.07 |