콘텐츠로 이동

슬롯 포팅 점검 절차를 Claude Code 스킬로 만들기

슬롯 게임의 슬롯 포팅 작업에서 확인해야 할 항목을 Claude Code 스킬로 정리했다. /slot-porting [슬롯번호]를 실행하면 에이전트가 단계별로 파일을 점검하고 체크리스트를 채운다.

/slot-porting 73

스킬은 $ARGUMENTS로 슬롯 번호를 받고, 번호가 없으면 사용자에게 묻는다.

  • 해당 슬롯 폴더(Assets/.../SLOTS/<번호>/) 아래 전체에서 .md 기획서를 찾는다.
  • 기획서가 있으면 이후 단계의 비교 기준을 뽑아 둔다. 없으면 코드 기준으로만 점검한다.
추출 항목 활용 단계
릴 구조(릴 수 × 행 수) 1단계: 상수 파일과 비교
특수 피처 목록(프리스핀, 잭팟, 스티키 등) 1단계: 보조 파일 구성과 비교
심볼 목록과 분류 2단계: 심볼 상수 ID와 비교
Win 영역 상태별 문구 5단계: 하단 UI 호출 흐름과 비교
게임 속도 모드(Normal/2배/Fast/Turbo) 2단계: SetSpeed 오버라이드와 비교
  • Scripts/*.cs 목록을 확인한다.
  • 작업 문서가 없으면 템플릿으로 만든다. 템플릿에는 핵심 파일 경로와 이슈별 변경 이력(증상, 원인, 변경, 변경 파일)을 두고, 이슈를 고칠 때마다 이력을 추가하게 한다.
SlotXX.cs - 핵심 로직 (오버라이드 메서드) [필수]
SlotXX.Const.cs - 상수 (REEL_COUNT, ROW_COUNT 등) [선택]
SlotXX.Test.cs - 테스트/치트 [선택]
SlotXX_*.cs - 보조 컴포넌트 (GaugeUI, Symbol, Popup 등)
SlotXX.XXX.cs - 점(.) 구분 partial class (게임별로 다름)

상수 파일과 테스트 파일은 없어도 오류가 아니다. 상수 파일이 없으면 2단계에서 매직 넘버 직접 사용 여부를 추가로 본다.

override 키워드로 오버라이드된 메서드를 나열하고 각각을 점검한다.

점검 항목 확인 방법
베이스 클래스 조건 분기 누락 베이스 클래스의 원본 메서드 확인
백킹 필드 직접 세팅 프로퍼티 setter로 접근하는지 확인
base.Method() 호출 필요 여부 로직 추가면 base 활용, 전면 대체면 베이스 로직을 직접 파악
while 루프 안의 yield return null tight loop 방지
SetSpeed 오버라이드 릴 물리 속도 설정과 하단 UI 속도 설정을 양쪽 다 호출하는지 확인

SetSpeed에서 한쪽만 호출하면 릴 물리 속도와 UI 판정 상태가 어긋난다. 그러면 감속 종료 코루틴(SlowDownEndRoutine)이 건너뛰어져 감속 종료 핸들러(OnSlowDownEnd)가 호출되지 않는 버그가 생길 수 있다.

보조 컴포넌트에서 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 갱신이 있으면 재입장 처리 끝에서 직접 호출한다. 오버라이드가 없으면 베이스 클래스가 처리하므로 생략한다.

결과 상태(ResultState 계열)를 오버라이드했다면 하단 UI 메서드 호출 순서를 확인한다.

메서드 당첨 금액 표시 라인당 베팅 표시
ShowWinAmount() 그대로 숨김
ShowLineBet() 그대로 표시
ClearWinAmount() 숨김 숨김

ShowLineBet()은 당첨 금액 표시를 끄지 않는다. 호출 전에 당첨 금액이 켜져 있으면 두 요소가 함께 보이는 이중 노출 버그가 생기므로 호출 조건에 가드를 넣는다. base.ResultState()를 그대로 호출하면 베이스가 처리하므로 생략한다.

Win 영역 문구가 코드에 직접 없으면 베이스 클래스나 로컬라이제이션 파일에서 처리하고 있을 수 있다. 이 경우 게임을 실행해 기획서 문구와 일치하는지 확인한다.

점검 결과로 아래 체크리스트를 채워 보여 주고, 발견한 문제는 파일명과 라인, 수정 방법과 함께 보고하게 했다.

오버라이드

  • 오버라이드 메서드의 베이스 구현 확인, 분기 누락 없음
  • 백킹 필드 대신 프로퍼티로 접근
  • 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 이중 노출)을 중심으로 잡았다.
  • 기획서가 있으면 교차 검증할 항목을 처음에 뽑아 두고, 없으면 코드 기준으로만 진행하도록 분기했다.
  • 선택 파일이나 오버라이드가 없을 때 오류로 보지 않도록 각 단계에 “없으면 생략” 조건을 명시했다.