본문 바로가기

블로그 / 기술

게임 세 개가 물려받은 도구들: 복사해서 고쳐 쓴 스크립트 정리

Salmonholic에서 만든 배포 스크립트, 경량 엔진 빌드, 봇 플레이 모드가 다른 게임으로 어떻게 넘어갔는지 정리했다. 도구별로 처음 만든 곳, 가져간 곳, 고친 점을 표로 남긴다.

Salmonholic ·· 5분 읽기

AvoidNow 데모 모드에서 봇이 플레이하는 장면, 콤보와 버텨냈다 +300 문구가 보인다

게임을 하나 더 시작할 때마다 같은 질문이 나온다. “지난번에 만든 그거, 여기서도 쓸 수 있나?” 나는 공용 라이브러리를 만들지 않았다. 대신 앞 게임의 스크립트를 복사해서 새 게임에 맞게 고쳤다. AvoidNow 문서 첫머리에는 이렇게 적혀 있다. “SR의 인프라와 넷코드를 복사해 개조한다. 게임 로직은 새로 작성. SR 원본 저장소는 수정하지 말 것.” SR은 Salmonholic의 코드명이다.

왜 공용 라이브러리가 아니라 복사인가

게임 셋의 기술 스택이 다르다. Salmonholic과 AvoidNow는 Godot 4.7.2와 GDScript, 랜선포차는 React와 PixiJS, PallMark는 Unity와 C#이다. 서버도 Salmonholic은 DO와 Node, 랜선포차는 Node만 쓴다. 공용 패키지를 두면 한 게임을 고칠 때 다른 게임이 깨질 수 있다. 특히 Salmonholic은 CrazyGames에 올라가 운영 중이라 건드리면 안 되는 상태였다. 복사하면 중복이 생기지만 서로를 깨뜨리지 않는다. 대신 스크립트 머리나 배포 문서에 “선례: 어느 저장소의 어느 파일”을 적어서 출처를 남긴다.

도구 목록

도구 처음 만든 곳 가져간 곳 하는 일
경량 엔진 템플릿 빌드 Salmonholic (9/23) AvoidNow 안 쓰는 엔진 기능을 끄고 웹 템플릿을 다시 빌드
스테이징 스크립트 Salmonholic AvoidNow 압축, 버전 파일, 캐시용 이름 붙이기
VM 재배포 + SSH 래퍼 Salmonholic AvoidNow, 랜선포차 서버 폴더 전송 후 Docker 재시작
재접속 점검 Salmonholic 랜선포차 재접속, 방치, 요청 제한, 드레인을 실제 서버로 확인
sprite-gen 스프라이트 파이프라인 Salmonholic에서 처음 사용 AvoidNow 마젠타 배경 시트 → 투명화 → 아틀라스
봇 플레이 모드 Salmonholic AvoidNow(발상만 가져와 새로 작성) 사람 대신 봇이 플레이, 녹화와 시험에 사용
헤드리스 브라우저 클릭 AvoidNow — 좌표 클릭 시나리오와 스크린샷

경량 엔진 빌드: 한 번 고생하고 두 번 쓴다

Godot 웹 기본 템플릿은 wasm이 39.5MB다. 3D, 물리, 고급 GUI를 끄고 다시 빌드하면 20.9MB로 줄어든다. Salmonholic에서 처음 할 때 문서에 없는 함정이 있었다. 빌드 프로필 파일에 target을 적어도 무시되고 디버그 템플릿이 나왔다. 명령줄 인자로만 덮을 수 있었다. 이런 내용을 측정 문서에 적어 둔 덕에 AvoidNow에서는 스크립트를 복사하고 설정만 바꿨다. AvoidNow는 OGG 재생이 필요해서 그 모듈을 켰다. 새 엔진 기능을 쓰면 여기서 모듈을 켜고 다시 빌드하라는 메모도 함께 남겼다. 한 번 빌드에 2~7분이 걸린다.

봇 플레이 모드와 녹화

사람 없이 게임을 돌려 보는 모드는 거의 모든 검증의 바탕이다. AvoidNow에는 실행 인자가 네 가지 있다.

  • --demo: 봇이 대신 플레이한다. 최고 기록은 저장하지 않는다.
  • --demo --god: 봇이 죽지 않는다. 판 후반의 분위기와 이벤트를 녹화할 때 쓴다.
  • --gallery: 위험 패턴을 종류별로 3초마다 하나씩 띄운다.
  • --netbot=coop: 봇이 온라인 빠른 매칭에 들어간다. 두 개 띄우면 온라인 시험이 된다.

여기에 Godot의 --write-movie를 붙이면 30fps로 화면을 PNG로 떨군다. 이 글의 커버와 아래 사진이 그렇게 뽑은 프레임이다. 새 패턴을 넣으면 코드를 읽는 것보다 프레임을 넘겨 보는 게 빠르다.

AvoidNow 데모 녹화 프레임 두 장, 거대 공룡 다리 옆 원시인과 게임오버 화면 봇 녹화에서 뽑은 프레임. 왼쪽은 8초, 오른쪽은 돌에 맞아 끝난 판의 결과 화면이다

티라노 돌진 경고가 칸마다 다른 방향으로 그려진 확인용 가로 띠 이미지 티라노 돌진 예고를 칸별로 뽑아 본 확인 이미지. 돌진 예고를 손본 9월 27일 커밋 c375910 무렵에 만들었다

작지만 자주 쓰는 것들

로컬 한 번에 띄우기. AvoidNow의 play_local.sh는 웹 빌드와 Node 게임 서버를 함께 띄운다. 같은 와이파이의 휴대폰 주소도 출력해 줘서, 폰과 PC로 멀티플레이까지 바로 해 볼 수 있다.

모든 스크립트 컴파일 확인. check_scripts.gd는 프로젝트의 모든 .gd를 불러 오류 수를 센다. 규칙 시험(sim_test)은 화면 코드를 안 불러서 UI 파일의 문법 오류를 놓쳤기 때문에 따로 만들었다.

임시 효과음 합성. gen_audio.py는 파이썬으로 효과음 15개와 북 BGM을 합성했다. 결정 문서에서 CC0 무료 에셋으로 바꾸기로 정하기 전까지 쓴 자리표시자다.

Unity 쪽. PallMark는 원본 Godot 판과 프로토콜 정수가 같은지 대조하는 protocol_parity.py와 Steam 업로드 스크립트를 둔다. 엔진이 달라 위 도구들을 가져가진 못했지만 “사람 없이 돌리고 화면으로 확인한다”는 방식은 같다.

도구로 무엇을 확인하는지는 혼자 돌리는 QA와 E2E 글에서 이어 적는다. 배포 스크립트의 자세한 순서는 배포 파이프라인 글에 있다. 이 도구들로 만든 게임은 AvoidNow와 Salmonholic 페이지에서 해 볼 수 있다.

#개발 도구#자동화#Godot#스크립트#1인 개발

함께 읽으면 좋은 글

전체 글 →