반갑습니다 인디 게임 개발자 여러분.


레일형 리듬 게임 Witch's Lounge를 개발하고 있는 일상일상입니다.


우선 저희의 새 PV!!



영상 제작 외주가 엄청나게 비싸서... 1차 PV를 제작해 주신 분께 싹싹 빌어서 2차 PV를 제작했습니다.

기본적인 연출 주문은 넣긴 했지만, 제 의도보다 더 잘 해주셔서 감사할 따름...

개인적으로 넣고 싶었던 연출도 잘 들어가고 신규 OST도 들어가서 아주 마음에 듭니다.



74f3c028e2f206a26d81f6e04e817169f9

그리고, 오는 2월 4일부터 2년 가까이 개발 중인 Witch's Lounge의 오픈 베타를 게시하게 되었습니다.


스팀 상점 페이지 링크 : https://store.steampowered.com/app/4073850/Witchs_Lounge/

(상점 페이지에서 베타 신청 가능!)


불과 얼마 전에 처음으로 알파 테스트를 진행하면서 엄청난 피드백에 깨졌었는데 감개무량...


최근 2달 정도는 3시에 자고 7시 기상 9시에 출근해서 오후 8시 귀가, 다시 3시까지 작업하는 루틴이었는데요,(중간에 우주 쓰레기 게임 전장 한 판씩 함)

오픈 베타를 배포하고 나면 한 숨 돌릴것 같습니다.

할 일이야 여전히, 혹은 지금까지 이상으로 많겠지만,

오픈 베타를 준비하는 기간 동안에는 발등에 불이 떨어진 기분이라 도저히 일찍 잘 수가 없었거든요.


게을러서 일지를 안쓰는 동안 많은 변경점들이 있었는데


우선 UI를 더욱 개선했습니다.




아무래도 시간과 리소스의 문제로 엄청난 고퀄리티까지는 어려웠지만, UI 대선생님께서 힘써주신 덕분에 무척이나 보기 좋아졌습니다.


그리고 영상과 같이 한국어 외의 현지화 작업도 진행했습니다.


이것도 공부다 싶어서 유니티 기본 현지화 툴이 아닌 자체 제작한 현지화 컴포넌트를 사용했는데,


아 ㅋㅋ 난 그냥 키값을 각 나라 언어로 퉁쳐주면 되는 줄 알았다고 ㅋㅋ


왜 이렇게 버그가 많이 나는지... ㅠㅠ


그래도 한국어, 영어, 일본어, 중국어 간체, 번체를 지원하게 되면서 좀 더 글로벌한 접근을 할 수 있기를 기대합니다.




(이 아래는 써놓고 보니 내용이 다소 난잡해서 GPT한테 정리해 달라고 했습니다. 정리 잘 해줌...)


이번 업데이트에서 가장 크게 바뀐 부분은 인게임 싱크 시스템입니다.

기존에도 FMOD와 Unity 엔진이 서로 다른 사이클로 동작하는 문제 때문에 시간 오차를 잡는 데 많은 노력이 필요했습니다. 단순히 “DSP 시간을 쓰면 되지 않나?” 수준으로 해결되는 문제가 아니었고, 실제 플레이 환경에서는 생각보다 다양한 예외 상황이 발생했습니다.

그래서 이번에는 임시 보정이 아닌, 시간 시스템 자체를 다시 설계하는 방향으로 접근했습니다.

기존 방식: 자체 플레이 타임 계산 + DSP 시간 추종

기존 시스템은 FMOD의 DSP 시간이 일정하지 않다는 문제 때문에,
게임 시작 시점과 현재 시점의 차이를 계산해 ‘플레이 타임’을 직접 산출하는 방식을 사용했습니다.

여기에 FMOD의 DSP 시간을 어느 정도 따라가도록 만드는 하이브리드 구조였습니다.

성능 문제가 없는 상황에서는 굉장히 매끄럽게 동작했습니다. 하지만 아래와 같은 상황에서 미세한 오차가 발생했습니다.

  • 프레임 드랍

  • 일시 정지 및 재개

이유는 단순했습니다.

게임이 멈춘 시간과 FMOD가 멈춘 시간이 서로 다르기 때문입니다.


발생했던 문제들1. 프레임 드랍

프레임 드랍이 발생하면 게임 시간과 FMOD 시간이 크게 벌어집니다.
이때 강제 보정이 들어가면서 싱크는 돌아오지만, 캐릭터가 순간적으로 크게 흔들리며 이동합니다.

결과적으로 싱크를 맞추는 것이 아니라, 유저 입장에서는 화면이 심하게 끊기는 것처럼 보였습니다.

2. 일시 정지

게임과 FMOD에 같은 타이밍에 정지 명령을 보내도,
FMOD 엔진 내부로 명령이 전달되는 데에는 미세한 지연이 존재합니다.

그래서 정지 후 재개했을 때, 다시 싱크가 벌어지는 문제가 발생했습니다.


근본적인 원인: DSP 시간은 ‘정확’하지만 ‘부드럽지 않다’

FMOD의 DSP 시간은 실제 음원 재생 시간을 정확하게 가리킵니다.
하지만 그 값이 사람이 기대하는 것처럼 일정하게 흐르지는 않습니다.

실제로 프레임마다 받아오는 DSP 시간 값을 보면:

  • 증가 폭이 들쭉날쭉하고

  • 심지어 역행하는 경우도 있습니다

즉, FMOD 내부 오디오 처리를 위한 시간이지,
게임 로직에서 직접 사용하기에 ‘부드러운 시간’은 아니었습니다.


이번에 적용한 방식: DSP 시간 + 보간 레이어

이번에는 접근을 완전히 바꿨습니다.

DSP 시간을 기준으로 삼되, 그 값을 그대로 사용하지 않습니다.

중간에 보간 레이어를 하나 두어, 실제 게임에서 사용하는 시간은
항상 일정하고 균일한 간격으로 증가하도록 만들었습니다.

또한 프레임 드랍 등으로 시간이 벌어지면 DSP 값을 더 강하게 추종하고,

미세하게 캐릭터의 속도가 빠르거나 느려지게 해서 결과적으로 일정하게 진행하는 것처럼 보이게 했습니다.

정리하면 다음과 같습니다.

  • 기준은 FMOD DSP 시간

  • 실제 사용하는 시간은 보간을 거친 ‘안정된 시간’


이 방식으로 해결된 점
  1. 프레임 드랍이나 일시 정지 이후에도 싱크가 틀어지지 않음

  2. 강제 보정으로 인한 캐릭터 튐 현상 제거

  3. 기존의 여러 보정 레이어를 제거하고 단일 레이어 구조로 단순화

  4. FMOD와 게임 시스템 간의 싱크 간극이 크게 줄어듦

  5. 처리 비용도 오히려 가벼워짐

DSP 시간을 추종하기 때문에, 게임이 멈춰도 오디오 기준 시간은 유지되고,
재개 시에도 자연스럽게 이어집니다.


그리고 남은 과제

이 변경으로 인해, 기존 시스템 기준으로 패턴 싱크를 맞춰두었던 패턴팀에서
오픈 베타에 맞춰 많은 수정 작업을 진행해 주고 계십니다.

시간 시스템을 근본부터 바꾸는 일은 항상 다른 시스템에 영향을 주는 작업이라는 것을 다시 한 번 체감하고 있습니다.


이번 작업을 통해 느낀 점은,

“오디오 시간”과 “게임 시간”은 겉보기에는 같아 보여도,
그 성격이 완전히 다르다는 것이었습니다.

FMOD의 DSP 시간을 그대로 믿는 것도,
게임 시간을 자체 계산하는 것도,
둘 다 완전한 해답은 아니었고,

결국 두 시간의 성격을 이해한 뒤,
그 사이를 매끄럽게 이어주는 레이어를 두는 것이 가장 현실적인 해법이었습니다.


이렇게 해서 오픈 베타 준비를 계속 하고 있습니다.
거의 다 되었다고 생각하면 꼭 어디서 문제가 나는게 골치 아프네요 ㅠㅠ


다른 개발자 분들도 화이팅입니다!

마지막으로 이번 오픈 베타에 추가되는 수록곡의 일러스트 모음 남겨두고 갑니다.


74ebd275e7d368fe3aea82ec1086776eae5055b1c1db1ef175e59ed1cd6d93b5c278868eebd1f4aeae5c474b0a33b48f2710d63a5c8091e1