Turtle
아기 거북이로 바다를 탐험해 조력자를 모아 엄마 거북이를 구하는 수중 하이브리드 캐주얼 2D 게임
개요
- 종류
- 모바일 2D 게임
- 기간
- 2026.05 ~ 06
- 인원
- 2인
- 내 역할
- 기획 리드 및 게임 시스템 전체, 팀원 코드 리팩토링 및 통합
- 기술 스택
- Unity 6 (URP 2D)C#Unity Profiler
핵심 성과
1. Profiler 기반 대량 오브젝트 병목 분석 및 최적화
- 상황:
- 물고기가 3~7마리씩 무리 지어 배회하는 시스템 (평소 기준 5마리로 측정)
- 문제:
- 물고기 무리를 3~7마리에서 500마리로 늘린 과부하 조건을 만들어 측정했습니다.
- 게임 화면 한 장(1프레임)을 처리하는 데 걸린 CPU 시간이 5마리일 때 3.44ms에서 500마리일 때 54.47ms(약 18FPS)로 늘었습니다. 60FPS를 유지하려면 16.67ms 안에 끝나야 합니다.
- 원인 분석: 측정 전 예상한 원인 3개를 Profiler로 하나씩 확인했습니다.
| 예상한 원인 |
측정 결과 |
물고기 500개의 개별 Update() 호출 |
약 1.5ms. 병목 아님 |
| 사망·리스폰 시 생성/파괴로 인한 GC |
리스폰 시점에만 실행, 평상시 프레임과 무관 |
| 물리 연산 (Physics2D) |
37.14ms, 한 프레임 처리 시간(54.47ms)의 약 70%. 그중 충돌 후보 탐색(FindNewContacts)이 23.11ms로 최대 |
- 해결:
- 물고기는 서로 밀어낼 필요가 없고, 플레이어, 장애물과의 접촉만 알면 됩니다. 그래서 물고기를 물리 연산에서 빼고 직접 판정하도록 바꿨습니다.
- 이동: 위치를 직접 계산
- 플레이어 피격: 거리 비교, 접촉을 시작한 순간 1회만 판정
- 벽: 물고기마다 감지하는 대신, 무리가 새 목표를 정할 때 경로에 레이캐스트 1회
- 성과:
- 물고기 수나 밀집도와 관계없이 물리 비용이 늘지 않는 구조가 됐습니다.
- 측정은 에디터 기준이며, 12.33ms 중 약 7ms는 에디터 자체 오버헤드입니다. 게임 코드 실행 시간은 2.08ms입니다.
| |
최적화 전 |
최적화 후 |
| 물리 연산 |
37.14ms |
0ms |
| CPU 프레임 시간 |
54.47ms (약 18FPS) |
12.33ms (약 81FPS) |
최적화 전: 물고기 500마리, CPU 54.47ms. Physics2D.FindNewContacts 23.11ms
최적화 후: CPU 12.33ms, 게임 코드(PlayerLoop) 2.08ms
2. 버튼 없이 한 동작에서 의도를 읽는 조작
- 문제:
- 모바일에서 이동과 공격 버튼을 따로 두면 화면이 좁아지고 조작이 끊깁니다.
- 해결:
- 화면 어디서든 당겼다 놓으면 반대 방향으로 튕겨 나가는 플릭 조작을 만들었습니다.
- 누른 시간이 0.4초 이상이고 체력 조건을 충족하면 공격 모드로 전환해, 한 제스처 안에서 이동과 공격을 구분합니다.
- 너무 짧은 드래그는 오입력으로 걸러 터치 오반응을 줄였습니다.
- 모바일 터치와 에디터 마우스를 같은 로직으로 처리해 에디터에서 바로 테스트할 수 있게 했습니다.
- 적 행동도 간단한 수식으로 의도를 정확히 구현:
- 게의 방어: 공격 방향과 게의 정면 방향의 내적이 0.3보다 크면 가드합니다. 정면 공격만 막고 측면·후방 공격은 통과합니다.
- 게의 옆걸음: 이동 방향을 게 기준 로컬 좌표로 바꾼 뒤 가로 성분을 우선해 꽃게 특유의 움직임을 재현했습니다.
3. 팀원 코드 통합과 결합도 정리
- 문제:
- 게·물고기·해파리를 각자 따로 구현하면서 피격 처리, 색상 깜빡임, 적→조력자 전환 코드가 세 벌로 중복됐습니다.
- 구역 오브젝트가 다른 오브젝트를 직접 찾아 호출해서, 씬 구성이 바뀌면 깨지고 2인 병렬 작업 중 씬 수정이 충돌했습니다.
- 해결:
- 공통 로직을 추상 클래스
BaseEnemy 하나로 묶고, 각 적은 자기 행동(게의 가드, 해파리의 전기 모드 등)만 덧붙이게 했습니다.
- 구역은 이벤트를 발행만 하고 각 시스템이 구독하는 방식(
GameEvents)으로 바꿔 직접 참조를 없앴습니다.
- 적을 공략하면 같은 오브젝트가 조력자 모드로 바뀌어 거북이를 따라오고, 베이스캠프에 돌아오면 순찰 모드로 바뀝니다. 삭제·재생성 없이 모드 전환만으로 처리했습니다.
- 성과:
- 새 적을 추가할 때 고유 행동만 작성
- 씬 구성을 바꿔도 다른 시스템이 깨지지 않아 2인 병렬 작업 중 씬 충돌 방지
- 그 외 해결한 문제:
- 리스폰 후 체력이 예상보다 빨리 변하던 버그: 기존 자동 회복·감소 코루틴을 멈추지 않고 새로 시작해 두 개가 동시에 돌고 있었습니다. 코루틴 핸들을 보관해 정지 후 재시작하도록 고쳤습니다.
AI와 협업 방식
- 역할 분담
- 기획, 구조 결정, 측정, 테스트, 커밋은 제가 합니다.
- 반복 패턴 코드는 AI에 맡깁니다.
- 이벤트 구조 설계, 귀환 시에만 영구 저장하는 2단계 저장 타이밍,
BaseEnemy 통합 범위, 이벤트 구독 위치 결정(씬 로드 순서 문제)은 직접 했습니다.
- 측정으로 검증
- AI가 제안한 해결책도 Profiler 수치로 확인한 뒤에 채택합니다.