[리듬게임 프로젝트 #2] 롱노트 추가와 어이없는 디버깅

2023. 6. 4. 01:08·프로젝트/리듬게임 프로젝트

 아직 노트의 판정 타이밍이나 기타 요소들에 대한 데이터를 저장하는 것 까진 아니지만 에디터상에서 롱노트를 생성하는 것 까지는 구현했다.

 박자를 변경해서 그때그때 더 세밀하거나 단순한 비트로 노트를 생성하는 것도 가능하게 간단한 UI도 짜뒀다. 아직 프로토타입이라고 부르기는 한참 멀었기 때문에 일반 노트 모드와 롱 노트 모드를 바꾸는 드롭다운은 아직 구현하지 않았고, 롱노트 모두에서 작업하며 디버깅했다. 해당 기능도 필히 다음 단계에서 구현해야할 것이다.

 

 개발하면서 기존 계획했던 사양과는 조금 달라진 부분도 있는데 원래는 롱노트가 존재하는 그 사이의 구간, 그러니까 위의 사진에서 파란색 막대기의 범위에서 노트 입력을 시도하면 아예 입력 자체가 될 수 없도록 막으려고 했다. 기존 구현이 Raycast2D를 이용해서 각각의 선 위의 콜라이더의 태그를 감지해 거기에 노트를 소환하는 방식이었는데, 파란색 막대부분에 콜라이더를 씌워서 입력을 막는 방식을 생각했다. 하지만 어떤 이유에선지 작동이 잘 되지 않았고(이유는 후술할 어이없는 디버깅 부분에 등장한다..) Osu 에디터를 다시 참고해 아예 롱노트 위에 입력을 시도하면 해당 노트를 삭제하고 다시 입력을 시작하는 방식으로 노선을 틀었다.

 

 이전에도 롱노트를 추가하면서 문제가 발생했기에 당연히 개발에는 일반적인 상황보다는 긴 시간을 들여야할 것이라고 생각했고 작업을 시작하면서도 어느정도 예상은 했다. 다음은 내가 이번 롱노트 오브젝트 생성을 구현하면서 겪은 문제들과 그 해결 과정이다..

 

롱노트 범위의 콜라이더가 작동 안하는 문제

 앞서 언급했듯이 롱노트의 시작과 끝 사이의 파란부분에 콜라이더를 추가했고, 가로 범위도 잘만 늘려주었다. 시작부분과 끝부분보다 뒤로 가야하기에 z좌표를 +1로 설정해 두었고, 대신 노트들이 생성될 게임 오브젝트는 z좌표를 -2로 설정해서 에디터에 붙여둔 콜라이더보다 앞에오게 해서 입력을 원천차단하고자 했다.

지금 보니 자동 생성된 마디들의 인덱싱이 안되있다.. 해당 부분도 수정해야할듯 하다.

 대충 저런식으로 아예 마디를 나타내주는 선들의 모음인 오브젝트들과 노트가 생성될 오브젝트를 분리해서 지난번과 같은 참사는 피할 수 있었다. 문제는 저렇게 하고보니 앞서 말한 것과 같이 파란색 기둥부분의 콜라이더가 작동을 안하는 것이다! Raycast2D를 이용한 마우스 입력을 통해 태그를 구분하는 방식에 문제가 있을 것이라고 생각해 아예 구현방향을 바꿔서 이미 사용한 생성 포인트의 콜라이더를 비활성화 시켰다가 노트를 삭제하면 다시 활성화 시킨다던가.. 별의 별 방법을 다써보다가 너무 복잡해져서 아예 노트를 삭제하는 방향으로 바꿨다.

 

 근데 이번에도 노트 삭제가 제대로 안되는 것이 아닌가! 파란 기둥에도 콜라이더를 씌워두었기에 파란기둥을 눌러도 삭제가 되어야 할 터였고, 실행해보았지만 아무일도 일어나지 않았다. 무슨일인가 한참을 생각해보다가 혹시나 싶어서 3D로 씬뷰를 돌려 콜라이더들의 배치를 보기로 했다. 그랬더니 다음과 같았다.

 이게 무슨일인가! 애초에 나는 z좌표를 서로 겹치는 일이 없도록 미리 설정해두지 않았던가? 왜 저 노트들은 z좌표가 자동으로 늘어나서 저런식으로 배치가 된걸까? 문제는 그냥 부모 오브젝트를 바꾸면서 같이 좌표도 자동으로 바뀐다는 것을 인지하지 못한 나의 실수였다.

 위의 코드와 같이 생성부의 콜라이더에 마우스 입력이 들어오면 해당 위치에 노트를 생성하고 노트를 모아두는 오브젝트를 부모오브젝트로 지정해주는 것이다. 여기서 주목할건, 내가 전혀 로컬 포지션에 대한 생각을 하지 않고 있다는 것이다. 월드 포지션, 즉 절대 좌표는 말그대로 어떤 일이 있어도 직접 움직이지 않는 이상 바뀌어선 안된다. 때문에 부모 오브젝트를 재지정 해준다 한들 절대좌표는 바뀌어선 안되기 때문에 상대좌표가 바뀌게 된다.

 

 근데 내가 노트들의 부모 오브젝트의 z좌표를 2만큼 움직여 두었다. 그렇기 때문에 절대 좌표를 맞추기 위해선 생성되는 노트들의 상대 좌표의 z좌표를 -2만큼 움직였고, 결국 그리드와 위치가 똑같아진 것이다.. 그렇기 때문에 생성부의 콜라이더보다 뒤로가게된 파란기둥의 콜라이더를 감지할 수 없었고 이 사단이 난 것이다.

 결국 해당 부분은 노트 생성 로직을 바꾸며 다음과 같은 코드로 변경해주었다. 애초에 절대 좌표를 -2로 설정해주면 부모 오브젝트가 바뀌어 들어가든말든 상관 없이 그리드보다 항상 앞에 있게 될 것 이다.

 

InputManager의 MouseButtonUp 미작동

 진짜 이건 너무 짜증이 났다. 필자는 입력을 InputManager를 통해 따로 받고있고, 대리자의 일종인 Action을 통해 Invoke로 함수들을 일괄 실행한다. 노트를 겹치게 생성하려고 하면 아예 노트를 삭제하고 다시 해당 좌표부터 생성하도록 바꿨고, 그 코드가 위에 다른 문제를 설명하면서 가장 마지막으로 썼던 코드다.

 

 이걸 구현을 어떻게 했냐면.. 파란 기둥의 콜라이더를 일단 꺼놓는다. 꺼두지 않으면 롱노트를 늘였다가 다시 줄일 때 뒤의 생성부 콜라이더를 감지할 수 없어지기 때문에 길이가 줄어들지를 않기 때문이다. 그리고 노트생성을 끝내서 마우스 버튼을 때면 그때서야 파란 기둥의 콜라이더를 활성화시켜 겹치게 누르면 해당 노트를 삭제한다.. 인데 다음과 같이 콜라이더가 켜질 때도 있고 안켜질 때도 생겨 겹쳐서 생성되는 현상이 생겨버렸다.

세 번째 줄에 롱노트가 세 개가 생성된게 아니라 두 개가 겹친 것이다..

 이게 차라리 겹칠거면 겹치고 안겹칠거면 겹치질 말아햐 하는데 양자역학도 아니고 어쩔땐 되고 어쩔땐 안됐다. 코드를 다시 읽어보고 디버깅 모드로 돌려보고 계속 유니티 문서를 찾아보았다. 혹시라도 Action을 매 프레임마다 불러와서 이게 문제가 되는건가? 하지만 대리자가 그정도로 심각한 문제를 가지고 있을리가 있나? Update가 아니라 FixedUpdate를 사용해야하나?

 

 장장 몇 시간 동안의 고뇌의 시간 끝에 드디어 그 원인을 찾을 수 있었다.

 위의 코드는 얼핏 보면 정상작동할듯 하다. 마우스 이벤트를 받고있고, 이벤트를 받아서 처리하되 누른 지점에 콜라이더가 없는 경우 메소드를 실행시키지 않는다. 딱 이렇게 작동하는 메소드다. MouseButtonUp에 해당하는 실행부분은 나오지 않았지만 당장 저 캡쳐의 다음인 95번째 행부터 기능이 있다. 이 캡처에 넣지 않은건 해당 기능에 문제가 없어서고..

 

 웃기게도, 콜라이더가 null인지 검사하는 저 부분이 문제였다.

이게 입력부 콜라이더의 배치인데, 저 사이사이의 공백이 보이는가? 저 부분을 누르면 노트 입력이 되지 않는다. 당연하게도 콜라이더가 없는 부분이기 때문이다! 그럼 입력을 저 공백부분에서 끝마치면 어떻게 될까? 당연히 위 코드의 메소드에서 마우스 입력은 들어오는데 콜라이더는 없으니 한무 return을 하게되고, 그 밑의 코드는 실행조차 되지 않는다.

 

 눌렀을 때와 누르고 있는 동안의 실행 내용은 상관이 없다. 어차피 각각 노트를 생성하는 순간, 다음 생성부를 인식하는 순간 실행되는 애들이기 때문이다. 하지만 마우스 버튼을 때는 순간 노트의 파란 기둥 콜라이더를 지워줘야하는데 단지 마우스 포인터가 저 공백들을 가르키고 있었기 때문에 해당 코드가 실행이 되지 않은 것이고, 이 때문에 문제가 발생했다. 공백 부분이 아닌 콜라이더 위에 포인터가 위치할 경우 return이 되지 않기 때문에 문제가 발생하기도, 발생하지 않기도 한 것이다!

 해당 부분은 결국 콜라이더의 정보를 필요로 하는 기능에만 각각 구현해 두었는데, 나중에 코드를 정리하면서 다시 메소드별로 나눠줘야할 듯 하다. 모종의 이유로 다시 비슷한 버그가 발생할 것만 같다..

'프로젝트 > 리듬게임 프로젝트' 카테고리의 다른 글

[리듬게임 프로젝트 #3] 현재까지의 진행상황 정리  (0) 2023.06.26
[리듬게임 프로젝트 #1-1] 유니티 엔진 크래시  (0) 2023.06.02
[리듬게임 프로젝트 #1] 노트 데이터 설계와 프로젝트 이름 결정  (0) 2023.05.29
[리듬게임 프로젝트 #0] 프로젝트 롤백 결정  (0) 2023.05.27
'프로젝트/리듬게임 프로젝트' 카테고리의 다른 글
  • [리듬게임 프로젝트 #3] 현재까지의 진행상황 정리
  • [리듬게임 프로젝트 #1-1] 유니티 엔진 크래시
  • [리듬게임 프로젝트 #1] 노트 데이터 설계와 프로젝트 이름 결정
  • [리듬게임 프로젝트 #0] 프로젝트 롤백 결정
ayuriK152
ayuriK152
주로 게임 클라이언트 개발 공부를 해요 상용엔진이나 알고리즘 포스팅도 해요
  • ayuriK152
    아유릭공방
    ayuriK152
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 공부 (19)
        • DirectX12 (11)
        • 유니티 (2)
        • 알고리즘(PS) (5)
      • 게임 (0)
        • 후기 (0)
      • 프로젝트 (5)
        • 리듬게임 프로젝트 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
ayuriK152
[리듬게임 프로젝트 #2] 롱노트 추가와 어이없는 디버깅
상단으로

티스토리툴바