0%

Unity

"오징어게임이 뭐 별거야?" — 달고나 게임 만든 개발 생존기

김*겸··수정됨 2026.07.21

"오징어게임이 뭐 별거야?" — 달고나 게임 만든 개발 생존기

시작은 단순했다

체험 부스에 놓을 인터랙티브 달고나 뽑기 게임을 만들기로 했다. 별, 동그라미, 세모, 네모 — 4가지 모양 중 하나를 고르고, 화면에서 바늘을 터치로 끌어서 60초 안에 깎아내면 성공. 실패하면 달고나가 쪼개진다.

게임 흐름은 명쾌했다.

시작 화면 → 설명 영상 → 모양 선택 → 바늘로 깎기 → 결과

이 정도면 금방 만들겠지? 바늘 드래그하고, 포인트 위에 3초 올려놓으면 초록불 들어오고, 다 깎으면 성공. 구조 자체는 심플하다.

그렇게 생각한 게 문제였다.


이펙트를 넣는 순간, 지옥문이 열렸다

게임이 너무 밋밋했다. 바늘로 긁는데 아무 반응이 없으면 누가 재밌겠나. 그래서 이펙트를 넣기 시작했다. 바늘이 긁을 때 파편이 튀고, 성공하면 폭죽이 터지고, 실패하면 조각이 기울어지며 떨어지고, 배경이 흔들리고...

이펙트만 9개를 만들었다. 그리고 문제가 터졌다.

폭죽이 엉뚱한 데서 터진다. 성공해서 신나게 축하해줘야 하는데, 어딜 눌러도 화면 한가운데서만 파티클이 뿜어져 나왔다. 게임 세계의 좌표계랑 UI 캔버스의 좌표계가 뒤섞이면서, 파티클 위치가 전부 원점으로 빨려 들어간 거다. 별도의 오버레이 캔버스를 분리하고 렌더링 순서를 잡아주고 나서야 겨우 해결했다.

그리고 귀신같은 버그 하나. 첫 판은 완벽하다. 흔들림 효과도 잘 되고, 조각 이동도 부드럽다. 그런데 두 번째 판부터 흔들림이 죽어버린다. 첫 판에서 결과 화면 보여줄 때 "흔들림 멈춰"라고 명령은 내렸는데, 게임이 리셋되고 나서 "이제 다시 흔들려도 돼"라는 신호를 안 보내고 있었다. 플래그 하나 빠진 거다. 딱 하나. 그걸 찾느라 몇 시간을 날렸다.


"4개 화면에서 동시에 돌려주세요"

이 프로젝트에서 가장 극적인 순간이다.

체험 부스에 모니터가 4개 있다. 각 화면에서 서로 다른 사람이 동시에 달고나를 깎을 수 있어야 한다는 요구사항이 들어왔다.

문제는 게임 전체를 관리하는 GameManager를 딱 하나만 존재하는 구조로 만들어놨다는 거다. 편했다. 어디서든 GameManager 하나만 부르면 됐으니까. 근데 이게 4개 화면에서 동시에 돌아가야 한다면?

화면 A에서 시작 버튼을 누르면 화면 B, C, D도 같이 넘어간다. 화면 C에서 성공하면 4개 화면 전부에 "성공!"이 뜬다. 하나의 두뇌를 4개의 몸이 공유하고 있으니 당연한 결과였다.

설계를 뒤엎었다.

GameManager를 각 화면마다 독립적으로 하나씩 배치하고, 모든 컨트롤러가 자기 화면의 GameManager만 바라보도록 연결을 전부 다시 했다. 공유되던 변수도 전부 걷어냈다. 커밋 메시지에는 "아키텍처 개선"이라고 점잖게 썼지만, 실제로는 전면 재작성에 가까웠다.

처음부터 확장성을 고려했으면 이런 대공사는 필요 없었다. "설마 여러 개 돌릴 일이 있겠어?"라는 안일한 판단이 부른 참사였다.


무인 부스의 함정

체험 부스에 놓을 거니까 한 가지 더 생각해야 할 게 있었다. 누군가 게임 시작하고 그냥 가버리면? 화면이 게임 도중에 멈춰서 다음 사람이 처음부터 시작할 수가 없다.

30초 동안 터치가 없으면 자동으로 처음 화면으로 돌아가는 시스템을 넣었다.

간단할 줄 알았다. 타이머 하나면 되지 않나?

아니었다. 성공해서 "축하합니다!" 뜨고 있는데 갑자기 화면이 홈으로 튕기면 황당하잖나. 결과 보여주는 동안은 자동 리셋을 멈춰야 하고, 결과를 다 보여준 다음에야 리셋이 들어가야 한다.

결국 타이머가 3단계로 꼬리를 물었다. 게임 끝 → 달고나 결과 10초 표시 → 최종 결과 10초 표시 → 자동 리셋. 이 흐름을 제어하기 위해 상태 플래그 4개가 매 프레임 돌아가는 구조가 됐다.

우아하진 않다. 근데 돌아간다. 실전에서는 이론적으로 완벽한 설계보다 지금 당장 돌아가는 코드가 필요한 순간이 있다.


밟은 함정 총정리

비슷한 프로젝트를 만들 사람을 위해, 내가 밟은 함정들을 정리해둔다.

"하나면 충분해"의 저주. 관리자 객체를 딱 하나만 만들어놓으면 처음엔 편하다. 근데 "하나 더 추가해주세요"라는 말 한마디에 전체 구조가 무너진다. 확장 가능성이 1%라도 있으면, 처음부터 여러 개 돌아가는 구조로 만들자.

좌표계는 반드시 꼬인다. 화면 터치 좌표, 게임 세계 좌표, UI 캔버스 좌표 — 이 셋이 만나는 지점에서 반드시 버그가 난다. 특히 UI 요소가 회전되어 있으면 영역 판정이 엉망이 된다. 꼭짓점 4개를 직접 가져와서 계산해야 했다.

이펙트는 넣는 건 쉽고 관리가 지옥이다. 이펙트 하나일 때는 간단한데, 9개가 되면 "게임 끝났을 때 전부 멈춰" "다시 시작할 때 전부 살려"를 각각 처리해야 한다. 하나라도 놓치면 두 번째 플레이부터 미묘하게 이상해진다. 이런 버그가 제일 찾기 어렵다.

무인 운영은 별개의 게임이다. 사람이 앞에서 지켜보는 게임이랑, 아무도 안 봐도 알아서 돌아가야 하는 게임은 완전히 다른 프로젝트다. 자동 리셋, 타임아웃, 결과 화면 중 예외 처리 — 이것만으로 코드량이 두 배가 됐다.


마무리

스크립트 15개. 이펙트 9종. 코드 약 2,000줄.

최종적으로 모니터 4대에서 독립적으로 돌아가고, 무인으로 운영 가능한 달고나 뽑기 게임이 완성됐다.

처음엔 "터치하면 바늘 움직이는 거 뭐 얼마나 어렵겠어"라고 시작했다. 좌표계에서 막히고, 이펙트 동기화에서 막히고, 구조를 통째로 뒤엎고, 타이머 지옥에 빠졌다.

근데 그래서 재밌었다. 간단해 보이는 게임 하나에 이렇게 많은 함정이 숨어있다는 걸, 직접 밟아봐야 안다.


읽기 도구

6분 읽기

이 글이 도움이 되었나요?

다음으로 읽기