AI 코딩 도구를 새 코드 짜는 데만 쓰고 있다면 절반만 쓰는 셈이다. Claude Code, Copilot, Cursor는 이미 작성된 코드를 읽고 문제를 짚어내는 데도 강하다. 특히 게임 코드처럼 "컴파일은 멀쩡히 되는데 프레임을 갉아먹는" 함정이 많은 영역에서 AI 리뷰는 사람이 눈으로 놓치기 쉬운 부분을 잘 잡는다.
문제는 기본 상태의 AI 리뷰가 너무 일반적이라는 점이다. 변수명, 널 체크, 예외 처리 같은 웹 백엔드식 지적만 잔뜩 내놓고, 정작 게임에서 치명적인 매 프레임 힙 할당이나 박싱은 그냥 지나친다. 게임 코드 리뷰는 게임의 룰로 한 번 길들여야 비로소 쓸모가 생긴다.
이 글에서는 Claude Code를 예로, 게임 전용 리뷰 기준을 파일로 박아두고 매 커밋 diff에 AI 리뷰어를 자동으로 붙이는 워크플로우를 정리한다. 핵심은 "무엇을 보라고 알려줄 것인가"와 "언제 자동으로 돌릴 것인가" 두 가지다.
1. 게임 전용 리뷰 기준을 파일로 고정하기
가장 먼저 할 일은 우리 프로젝트가 신경 쓰는 성능 함정을 글로 적어 한 파일에 모아두는 것이다. 프로젝트 루트에 review-rules.md 같은 파일을 만들고, AI에게 매번 이 기준으로 보라고 지시한다.
# 게임 코드 리뷰 체크리스트
- Update, LateUpdate, FixedUpdate 안의 GC 할당 (new, LINQ, 람다 클로저, 문자열 결합)
- 매 프레임 FindObjectsOfType, GetComponent 반복 호출
- IEnumerable로 캐스팅된 컬렉션 순회로 생기는 enumerator 박싱
- 거리 비교에 Vector3.Distance를 쓰는데 sqrMagnitude로 충분한 경우
- 핫패스에서 동기 Resources.Load, Instantiate, Destroy 호출
이렇게 기준을 코드와 같은 저장소에 두면 팀원과 AI가 같은 잣대를 공유하게 된다. 새 함정을 발견할 때마다 한 줄씩 추가하면 리뷰 품질이 누적된다.
2. diff에 AI 리뷰어 자동으로 붙이기
기준을 만들었으면 변경분에만 리뷰를 돌린다. 전체 코드를 통째로 넣지 않고 diff만 주는 것이 토큰도 아끼고 집중도도 높다.
git diff main...HEAD | claude -p \
"review-rules.md 기준으로 이 diff를 리뷰해줘. \
게임 핫패스 성능 위주로, 파일과 줄 번호를 붙여 지적해줘."
이 한 줄을 커밋 훅이나 CI 단계에 넣으면 매 PR마다 자동으로 리뷰가 달린다. 사람 리뷰어는 설계와 게임 디자인 의도에 집중하고, 기계적인 성능 함정 검출은 AI에게 맡기는 분업이 자연스럽게 만들어진다.
3. 실전: AI가 잡아낸 핫패스 할당
아래는 흔히 보이는 타겟팅 코드다. 컴파일도 되고 동작도 한다. 하지만 매 프레임 힙을 쓰레기로 채운다.
public class TargetingSystem : MonoBehaviour
{
public Transform target;
void Update()
{
var enemies = FindObjectsOfType<Enemy>()
.Where(e => e.IsAlive)
.OrderBy(e => Vector3.Distance(transform.position, e.transform.position))
.ToList();
if (enemies.Count > 0)
target = enemies[0].transform;
}
}
AI 리뷰는 이 코드에서 세 가지를 짚는다. 첫째 FindObjectsOfType는 매 프레임 씬 전체를 훑어 가장 비싸다. 둘째 Where, OrderBy, ToList는 프레임마다 리스트와 람다 클로저를 새로 할당한다. 셋째 정렬에 Vector3.Distance를 쓰는데 순서만 필요하므로 제곱근이 필요 없다.
수정본은 적 목록을 한 번만 캐싱하고, 할당 없는 단순 루프로 가장 가까운 적을 찾는다.
public class TargetingSystem : MonoBehaviour
{
public Transform target;
Enemy[] _enemies;
void Start() =>
_enemies = FindObjectsByType<Enemy>(FindObjectsSortMode.None);
void Update()
{
Vector3 p = transform.position;
float bestSqr = float.MaxValue;
Enemy best = null;
foreach (var e in _enemies)
{
if (!e.IsAlive) continue;
float sqr = (e.transform.position - p).sqrMagnitude;
if (sqr < bestSqr) { bestSqr = sqr; best = e; }
}
target = best ? best.transform : null;
}
}
덤으로 AI는 구식 FindObjectsOfType를 Unity 6 권장 API인 FindObjectsByType로 바꿔준다. 만약 적 목록이 런타임에 바뀌어 List로 들고 있어야 한다면, 최신 API인 CollectionsMarshal.AsSpan으로 enumerator 할당 없이 내부 배열을 직접 순회할 수 있다.
using System.Runtime.InteropServices;
foreach (var e in CollectionsMarshal.AsSpan(_enemyList))
{
// List 내부 배열을 Span으로 직접 순회, enumerator 박싱 없음
}
4. AI를 믿되 숫자는 사람이 확인한다
AI 리뷰는 "여기서 할당이 일어난다"까지는 잘 잡지만, 그게 실제로 몇 바이트이고 프레임에 얼마나 영향을 주는지는 추정일 뿐이다. 최종 판단은 Unity Profiler와 Memory Profiler로 직접 측정해 내려야 한다. AI가 과하게 지적하는 경우도 있다. 한 번만 도는 초기화 코드의 할당까지 핫패스처럼 경고하기도 하므로, 맥락은 사람이 걸러야 한다.
핵심은 AI를 자동 게이트가 아니라 빠른 1차 필터로 쓰는 것이다. 사람이 보기 전에 명백한 할당 실수를 먼저 솎아내면, 리뷰어는 정말 중요한 설계 판단에 시간을 쓸 수 있다.
정리
- 기본 AI 리뷰는 게임에 둔하다. 핫패스 할당, 박싱, 매 프레임 탐색 같은 게임 전용 기준을 파일로 박아두고 길들여야 한다.
- diff만 넣어 커밋 훅이나 CI에서 자동으로 돌리면, 성능 함정 검출이 매 PR마다 공짜로 따라온다.
- AI는 할당 위치를 잘 찾고 모던 API로 개선까지 제안하지만, 실제 비용은 Profiler로 사람이 확인해야 한다.
'AI 보조 게임 개발' 카테고리의 다른 글
| AI에게 Unity 성능 실험 루프 맡기기: 로그 수집부터 패치 후보까지 (0) | 2026.07.01 |
|---|---|
| AI 에이전트로 ScriptedImporter 만들기: 외부 포맷을 Unity 에셋으로 자동 변환하기 (0) | 2026.06.26 |
| AI 에이전트에게 세이브 데이터 마이그레이션 맡기기: 버전 변환 코드와 회귀 테스트를 한 번에 (0) | 2026.06.19 |
| Unity 에디터를 Claude Code에 연결하기: MCP 브리지로 AI가 씬을 직접 읽고 고치게 만들기 (0) | 2026.06.17 |
| Claude Code로 게임 밸런스 CSV -> ScriptableObject 임포터와 검증 테스트 한 번에 뽑아내기 (0) | 2026.06.12 |