모래게임 Sandrop TIL 17
소리를 넣었더니 음악이 끊겼다
효과음이 날 때마다 배경음악이 끊겼다
Suno로 만든 4분짜리 배경음악(BGM)을 게임 내내 은은하게 깔고, 버튼·집기·승리·실패·얼음 깨짐 같은 효과음을 한 벌 넣었다. 그런데 효과음이 날 때마다 배경음악이 뚝 끊겼다. 고칠 방법을 몇 가지 돌려 가며 시험했다.
원인은 오디오 포커스(안드로이드에서 소리를 낼 때 “지금은 내 소리가 우선”이라고 잡는 우선권)였다. 효과음이 우선권을 잡으면 같은 앱의 배경음악이라도 밀려난다. 캐주얼 게임은 포커스를 아예 안 잡는 게 보통이라, 게임 소리가 우선권을 잡지 않게 하니 끊기지 않았다.
그 전에 시험한 방법 중 하나는 배경음악과 효과음을 서로 다른 재생 엔진(백엔드)에 나눠 싣는 것이었다. Claude가 둘을 떼어 놓으면 부딪히지 않을 거라며 나누겠다고 해서 그러라고 했다. 포커스를 고치고 나니 그 분리는 필요 없어져서 다시 하나로 합쳤다. 합치고 나니 한쪽 엔진이 Windows 빌드에서 음악을 조용히 안 내던 문제도 같이 사라졌다.
- 증상을 피하려고 구조를 둘로 나누면 관리할 것이 둘이 된다. 원인을 찾았으면 우회는 걷어낸다
첫 실행에는 음악이 아예 안 나왔다
앱을 처음 켜면 배경음악이 안 나왔다. 오디오를 준비하는 단계 중 하나가 오류로 멈췄고, 그 뒤에 있던 음악 재생까지 실행이 안 된 것이다. 멈춘 단계는 iOS용 설정이었는데 안드로이드에서 돌려도 똑같이 막혔다.
설정을 고치는 것과 별개로 순서를 바꿨다. 배경음악 재생을 준비 과정 맨 앞으로 당기고, 진동이나 효과음 준비가 실패해도 음악은 나오게 단계를 나눴다.
- 여러 단계를 줄 세워 두면 한 단계의 실패가 뒤를 전부 막는다. 가장 중요한 것을 맨 앞에 둔다
- 곁가지 기능의 실패가 핵심 기능을 끌고 들어가지 않게 떼어 둔다
붓기 소리를 붓는 그림에 맞추기
모래가 안 부어지는데 붓기 소리가 났다
처음에는 바구니가 레일에 올라오는 순간 붓기 소리를 냈다. 화면에서는 아직 모래가 안 부어지고 있어서 소리와 그림이 어긋났다. 짧게 붓는 바구니는 소리가 남고, 길게 붓는 바구니는 소리가 먼저 끊겼다.
그래서 소리를 실제로 모래가 채워지는 순간에 붙였다. 매 순간 “지금 붓고 있는 바구니 목록”을 받아 새로 붓기 시작한 바구니는 소리를 켜고, 끝난 바구니는 끈다.
- 소리의 기준은 게임 안의 사건이 아니라 플레이어 눈에 보이는 장면이다. 레일 도착은 사건이고 붓기는 장면이다
여러 개를 동시에 부으면 소리도 두꺼워지게
여러 바구니가 동시에 부어질 때 소리도 여러 겹으로 두꺼워지길 원했다. 바구니마다 소리를 하나씩 따로 켜니 동시에 붓는 수만큼 겹쳤다. 대신 겹치는 수에 상한(6개)을 둬서 너무 많이 붓는 순간에도 소리가 뭉개지지 않게 했다.
붓기가 끝나면 소리가 뚝 끊기지 않고 짧게 줄어들며 사라지게 했다(페이드아웃). 다만 150ms로 짧게 잡았다. 소리가 그림보다 오래 남으면 이미 끝난 붓기가 계속되는 것처럼 들린다.
- 겹침은 양을 들려주는 수단이다. 대신 상한이 없으면 소음이 된다
- 끝을 부드럽게 하는 처리도 그림보다 길면 안 된다
크기와 세기
볼륨은 dB로 정했다
효과음이 배경음악을 덮지 않게 소리마다 크기를 낮췄다. 승리·실패 −15dB, 클릭 −10dB, 얼음 −5dB, 자물쇠 −10dB.
dB(데시벨)는 소리 크기를 사람 귀가 느끼는 방식에 맞춰 비율로 나타낸 단위다. 귀는 차이가 아니라 비율로 듣기 때문에, 0~1 사이의 볼륨 값으로 말하는 것보다 “몇 dB 낮춘다”로 말하는 편이 들리는 차이와 맞는다. −10dB가 볼륨 값으로는 약 0.32다.
- 소리 크기는 귀가 듣는 단위로 정한다. 그래야 “조금 더 낮춰”가 숫자로 옮겨진다
진동은 세 순간에만
진동(햅틱)은 못 나가는 곳을 탭할 때, 승리, 실패 세 순간에만 넣었다. 못 나가는 탭은 짧고 약하게, 승리는 중간, 실패는 길고 강하게 세기를 나눴다.
- 진동은 드물어야 신호가 된다. 모든 동작에 붙이면 아무것도 알려 주지 않는다
- 세기와 길이만으로도 “안 됨·잘함·실패”를 구분해 전할 수 있다
도안 소재
노토 이모지가 바닥나서 Kenney를 재 봤다
도안은 노토 이모지로 만들어 왔는데, 쓸 수 있는 것이 589종에서 더 안 늘었다. 1000종을 채우려면 새 소재가 필요했다.
Claude에게 쓸 만한 소재를 추천해 달라고 했더니 Kenney(게임 에셋 무료 배포처)를 골라 왔다. 받기 전에 라이선스부터 확인하라고 했다. 팩마다 페이지에서 CC0(저작권을 포기해 출처 표기 없이 쓸 수 있는 라이선스)인지 확인하고 나서 받았다.
그다음은 실제로 도안이 되는 비율이다. 기존 도안과 같은 변환·검사를 그대로 태웠더니 Claude가 통과율이 낮다며 이미지가 작아서라고 했다. 그럼 키워서 넣으라고 했다. 키워서 다시 재 보니 물고기 팩은 28장 중 25장(89%), 음식 팩은 200장 중 135장(67%)이 통과했다. 킷 4~5개면 1000종에 닿는다는 계산이 나왔다.
앞선 TIL 3에서 라이선스가 열린 소재는 양이 문제가 안 되고 출처 표기 방식을 먼저 정해 두면 된다고 했는데, CC0는 그 표기 부담마저 없다.
- 새 소재는 들이기 전에 라이선스와 통과율부터 잰다. 받고 나서 못 쓰는 걸 알면 이미 늦다
- 기존 검사를 그대로 태울 수 있으면 새 소재도 같은 잣대로 비교가 된다
- 통과율이 낮을 때는 소재가 나쁜지 크기 같은 조건이 안 맞는지부터 가른다. 조건이면 맞춰 주면 된다