슬롯 포팅 점검 절차를 Claude Code 스킬로 만들기
슬롯 게임의 슬롯 포팅 작업에서 확인해야 할 항목을 Claude Code 스킬로 정리했다. /slot-porting [슬롯번호]를 실행하면 에이전트가 단계별로 파일을 점검하고 체크리스트를 채운다.
/slot-porting 73스킬은 $ARGUMENTS로 슬롯 번호를 받고, 번호가 없으면 사용자에게 묻는다.
스킬 구성
섹션 제목: “스킬 구성”0단계: 기획서와 파일 로드
섹션 제목: “0단계: 기획서와 파일 로드”- 해당 슬롯 폴더(
Assets/.../SLOTS/<번호>/) 아래 전체에서.md기획서를 찾는다. - 기획서가 있으면 이후 단계의 비교 기준을 뽑아 둔다. 없으면 코드 기준으로만 점검한다.
| 추출 항목 | 활용 단계 |
|---|---|
| 릴 구조(릴 수 × 행 수) | 1단계: 상수 파일과 비교 |
| 특수 피처 목록(프리스핀, 잭팟, 스티키 등) | 1단계: 보조 파일 구성과 비교 |
| 심볼 목록과 분류 | 2단계: 심볼 상수 ID와 비교 |
| Win 영역 상태별 문구 | 5단계: 하단 UI 호출 흐름과 비교 |
| 게임 속도 모드(Normal/2배/Fast/Turbo) | 2단계: SetSpeed 오버라이드와 비교 |
Scripts/*.cs목록을 확인한다.- 작업 문서가 없으면 템플릿으로 만든다. 템플릿에는 핵심 파일 경로와 이슈별 변경 이력(증상, 원인, 변경, 변경 파일)을 두고, 이슈를 고칠 때마다 이력을 추가하게 한다.
1단계: 파일 구조 확인
섹션 제목: “1단계: 파일 구조 확인”SlotXX.cs - 핵심 로직 (오버라이드 메서드) [필수]SlotXX.Const.cs - 상수 (REEL_COUNT, ROW_COUNT 등) [선택]SlotXX.Test.cs - 테스트/치트 [선택]SlotXX_*.cs - 보조 컴포넌트 (GaugeUI, Symbol, Popup 등)SlotXX.XXX.cs - 점(.) 구분 partial class (게임별로 다름)상수 파일과 테스트 파일은 없어도 오류가 아니다. 상수 파일이 없으면 2단계에서 매직 넘버 직접 사용 여부를 추가로 본다.
2단계: 오버라이드 메서드 점검
섹션 제목: “2단계: 오버라이드 메서드 점검”override 키워드로 오버라이드된 메서드를 나열하고 각각을 점검한다.
| 점검 항목 | 확인 방법 |
|---|---|
| 베이스 클래스 조건 분기 누락 | 베이스 클래스의 원본 메서드 확인 |
| 백킹 필드 직접 세팅 | 프로퍼티 setter로 접근하는지 확인 |
base.Method() 호출 필요 여부 |
로직 추가면 base 활용, 전면 대체면 베이스 로직을 직접 파악 |
while 루프 안의 yield return null |
tight loop 방지 |
SetSpeed 오버라이드 |
릴 물리 속도 설정과 하단 UI 속도 설정을 양쪽 다 호출하는지 확인 |
SetSpeed에서 한쪽만 호출하면 릴 물리 속도와 UI 판정 상태가 어긋난다. 그러면 감속 종료 코루틴(SlowDownEndRoutine)이 건너뛰어져 감속 종료 핸들러(OnSlowDownEnd)가 호출되지 않는 버그가 생길 수 있다.
3단계: 풀링 오브젝트 점검
섹션 제목: “3단계: 풀링 오브젝트 점검”보조 컴포넌트에서 StartCoroutine을 직접 호출하는 곳을 찾는다. 점검 대상은 다음과 같다.
Symbol을 상속한 클래스: 릴 심볼 풀에서 재활용된다.- ObjectPool로 명시적으로 관리되는 FX 오브젝트
이런 클래스가 자기 자신에서 StartCoroutine을 호출하면 위험 패턴이다. 게임 속도가 빠를 때(터보·패스트 모드) SetActive(false)가 코루틴보다 먼저 실행되면 코루틴이 멈추고 콜백이 누락된다.
// 위험public void Move(Action onMoveEnd) { StartCoroutine(MoveCo(onMoveEnd));}
// 올바른 패턴public void Move(Action onMoveEnd, MonoBehaviour host) { host.StartCoroutine(MoveCo(onMoveEnd));}Symbol은 릴에서 풀링되므로 스핀 중에 코루틴이 강제 종료될 수 있다. 코루틴 내용이 단순 딜레이와 UI 갱신이더라도 원칙적으로 위험 패턴으로 본다.
4단계: 재입장(이어하기) 흐름 점검
섹션 제목: “4단계: 재입장(이어하기) 흐름 점검”프리스핀 재입장 처리(ReenterFreeSpinRoutine)를 오버라이드했다면 정상 진입 흐름과 비교한다.
정상 진입: FreeSpinIntroRoutine() → OnFreeSpinWon() → UI 갱신재입장: ReenterFreeSpinRoutine() → IdleState() → Spin() ↑ FreeSpinIntroRoutine()가 실행되지 않음 → UI 갱신 누락 가능누락된 UI 갱신이 있으면 재입장 처리 끝에서 직접 호출한다. 오버라이드가 없으면 베이스 클래스가 처리하므로 생략한다.
5단계: 하단 UI 갱신 순서 점검
섹션 제목: “5단계: 하단 UI 갱신 순서 점검”결과 상태(ResultState 계열)를 오버라이드했다면 하단 UI 메서드 호출 순서를 확인한다.
| 메서드 | 당첨 금액 표시 | 라인당 베팅 표시 |
|---|---|---|
ShowWinAmount() |
그대로 | 숨김 |
ShowLineBet() |
그대로 | 표시 |
ClearWinAmount() |
숨김 | 숨김 |
ShowLineBet()은 당첨 금액 표시를 끄지 않는다. 호출 전에 당첨 금액이 켜져 있으면 두 요소가 함께 보이는 이중 노출 버그가 생기므로 호출 조건에 가드를 넣는다. base.ResultState()를 그대로 호출하면 베이스가 처리하므로 생략한다.
Win 영역 문구가 코드에 직접 없으면 베이스 클래스나 로컬라이제이션 파일에서 처리하고 있을 수 있다. 이 경우 게임을 실행해 기획서 문구와 일치하는지 확인한다.
6단계: 체크리스트
섹션 제목: “6단계: 체크리스트”점검 결과로 아래 체크리스트를 채워 보여 주고, 발견한 문제는 파일명과 라인, 수정 방법과 함께 보고하게 했다.
오버라이드
- 오버라이드 메서드의 베이스 구현 확인, 분기 누락 없음
- 백킹 필드 대신 프로퍼티로 접근
-
base.Method()호출 여부 결정
코루틴 / ObjectPool
- 모든 while 루프에
yield return null포함 - while 루프 탈출 조건이 모든 실행 경로에 존재
- 풀링 오브젝트와
Symbol상속 클래스에서host.StartCoroutine()사용 - 콜백 순서: 상태 변경 → pool.Return
하단 UI 갱신
- 갱신 메서드 호출 전 현재 활성 요소 파악
- 이중 노출 케이스에 가드 조건 적용
재입장
- 정상 진입 대비 누락된 UI 갱신 파악
- model 값 기준으로 재입장 시 UI 직접 복원
코드 품질
- 매직 넘버를 상수 파일로 분리
- 주석 처리된 코드 제거(이력은 git이 관리)
- null 체크(스핀 결과, 심볼, UI 컴포넌트)
기획서 교차 검증(기획서가 있는 경우)
- 릴 구조(REEL_COUNT × ROW_COUNT)가 기획서와 일치
- 특수 피처별 보조 파일이 모두 존재
- 심볼 상수 ID가 기획서 심볼 목록과 대응
- 잭팟 타입 이름이 기획서와 코드 상수 양쪽에서 일치(SUPER vs MEGA 같은 이름 차이 주의)
- Win 영역 문구(대기/스핀 중/당첨/프리스핀 상태별)가 기획서와 일치
- 게임 속도 모드 지원 범위가 기획서와 일치
-
SetSpeed오버라이드에서 하단 UI 속도 설정 누락 여부
설계에서 신경 쓴 점
섹션 제목: “설계에서 신경 쓴 점”- 점검 항목은 실제 버그로 이어지는 패턴(풀링 오브젝트의 자기 코루틴, 재입장 시 건너뛰는 연출, 두 곳에 나뉜 속도 상태, 하단 UI 이중 노출)을 중심으로 잡았다.
- 기획서가 있으면 교차 검증할 항목을 처음에 뽑아 두고, 없으면 코드 기준으로만 진행하도록 분기했다.
- 선택 파일이나 오버라이드가 없을 때 오류로 보지 않도록 각 단계에 “없으면 생략” 조건을 명시했다.