그림도 소리도 Python으로 — Unity 게임 에셋을 스크립트로 생성한 방법
32x32 픽셀 캐릭터 8종, 효과음 6종, 배경음악, 한글 폰트 서브셋, 앱 아이콘과 스토어 그래픽까지 「오늘 누가 쏘냐?」의 에셋은 전부 Python 스크립트가 만든다. 생성 코드와 Unity 쪽 임포트 설정, 이 방식의 장단점을 정리했다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET·Docker·메일서버를 직접 운영하며 겪은 문제와 해결 과정을 기록합니다.
32x32 픽셀 캐릭터 8종, 효과음 6종, 배경음악, 한글 폰트 서브셋, 앱 아이콘과 스토어 그래픽까지 「오늘 누가 쏘냐?」의 에셋은 전부 Python 스크립트가 만든다. 생성 코드와 Unity 쪽 임포트 설정, 이 방식의 장단점을 정리했다.
프리팹도 씬 편집도 없이 화면 20여 개를 코드로만 만든 구조. 진입점 Bootstrap, UI 헬퍼 UIFactory, 화면 전환 ScreenBase, 그리고 갤럭시 폴드에서 화면 아래가 잘린 문제를 CanvasScaler 한 줄로 고친 이야기.
커피 내기용 파티게임 「오늘 누가 쏘냐?」를 Unity 6로 보름 동안 만든 기록. 사다리 하나로 시작해 게임 15개, 서버 없는 여러 폰 대전, Play 스토어 비공개 테스트까지 온 과정을 연재 첫 글로 정리했다.
블로그에 방문 통계를 직접 만들었다. IP와 User-Agent는 저장하지 않고 무작위 ID 쿠키 하나로 방문자를 구분한다. 요청 처리 중에는 DB를 건드리지 않도록 메모리 큐에 쌓았다가 5초마다 일괄 저장한다. 수집 대상 거르기, 유입 경로 분류까지 설계를 정리했다.
블로그 디자인을 Bootstrap 5에서 Tailwind CSS v4로 바꿨다. dotnet build에 CSS 빌드를 끼워 넣은 방법과, 마크다운 표의 class="table" 충돌, 코드 블록 이중 배경, 관리자 표의 sr-only 때문에 모바일 폭이 넓어진 문제를 정리했다.
.NET Framework 4.8 MVC 5로 만들어 운영에 올린 블로그를 같은 날 ASP.NET Core 10으로 옮겼다. URL, 운영 DB, 관리자 비밀번호를 그대로 둔 채 프레임워크만 바꾸기 위해 정한 원칙과, EF6가 만든 기존 스키마를 EF Core 10이 이어받게 한 방법을 정리했다.
디자인 개편을 운영 서버에 배포하다 동기화가 실패했고, 사이트가 2~3분 동안 503을 냈다. Web Deploy의 AppOffline 규칙이 올려 둔 app_offline.htm이 실패한 배포 뒤에 그대로 남은 것이 원인이었다. 동작 원리와 재시도로 바꾼 배포 스크립트를 정리했다.
배포 스크립트에 비밀번호 마스킹 코드를 넣어 두었는데도, 배포가 실패하자 비밀번호가 평문으로 출력됐다. msdeploy가 실패 시 인수를 그대로 다시 찍는 동작과 PowerShell의 $ErrorActionPreference = 'Stop'이 만나 생긴 일이다. 원인과 수정 코드, 사고 뒤 처리를 정리했다.
잘 돌던 사이트가 MySQL 재시작 직후 모든 페이지에서 500 오류를 냈다. 원인은 MySQL 8의 기본 인증 방식 caching_sha2_password가 재시작 뒤 비암호화 연결을 거부하는 동작이었다. 증상, 원리, 세 가지 해결책 비교와 최종 선택을 정리했다.
.NET Framework 4.8 + EF6 + MySQL Connector 조합으로 Code First 마이그레이션을 만들다 만난 세 가지 문제. 인덱스 이름 따옴표 누락, dbo. 접두사로 인한 Down() 실패, 무시되는 기본값과 각각의 해결 방법을 정리했다.