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)

2. 버튼 없이 한 동작에서 의도를 읽는 조작

  • 문제:
    • 모바일에서 이동과 공격 버튼을 따로 두면 화면이 좁아지고 조작이 끊깁니다.
  • 해결:
    • 화면 어디서든 당겼다 놓으면 반대 방향으로 튕겨 나가는 플릭 조작을 만들었습니다.
    • 누른 시간이 0.4초 이상이고 체력 조건을 충족하면 공격 모드로 전환해, 한 제스처 안에서 이동과 공격을 구분합니다.
    • 너무 짧은 드래그는 오입력으로 걸러 터치 오반응을 줄였습니다.
    • 모바일 터치와 에디터 마우스를 같은 로직으로 처리해 에디터에서 바로 테스트할 수 있게 했습니다.
  • 적 행동도 간단한 수식으로 의도를 정확히 구현:
    • 게의 방어: 공격 방향과 게의 정면 방향의 내적이 0.3보다 크면 가드합니다. 정면 공격만 막고 측면·후방 공격은 통과합니다.
    • 게의 옆걸음: 이동 방향을 게 기준 로컬 좌표로 바꾼 뒤 가로 성분을 우선해 꽃게 특유의 움직임을 재현했습니다.

3. 팀원 코드 통합과 결합도 정리

  • 문제:
    • 게·물고기·해파리를 각자 따로 구현하면서 피격 처리, 색상 깜빡임, 적→조력자 전환 코드가 세 벌로 중복됐습니다.
    • 구역 오브젝트가 다른 오브젝트를 직접 찾아 호출해서, 씬 구성이 바뀌면 깨지고 2인 병렬 작업 중 씬 수정이 충돌했습니다.
  • 해결:
    • 공통 로직을 추상 클래스 BaseEnemy 하나로 묶고, 각 적은 자기 행동(게의 가드, 해파리의 전기 모드 등)만 덧붙이게 했습니다.
    • 구역은 이벤트를 발행만 하고 각 시스템이 구독하는 방식(GameEvents)으로 바꿔 직접 참조를 없앴습니다.
    • 적을 공략하면 같은 오브젝트가 조력자 모드로 바뀌어 거북이를 따라오고, 베이스캠프에 돌아오면 순찰 모드로 바뀝니다. 삭제·재생성 없이 모드 전환만으로 처리했습니다.
  • 성과:
    • 새 적을 추가할 때 고유 행동만 작성
    • 씬 구성을 바꿔도 다른 시스템이 깨지지 않아 2인 병렬 작업 중 씬 충돌 방지
  • 그 외 해결한 문제:
    • 리스폰 후 체력이 예상보다 빨리 변하던 버그: 기존 자동 회복·감소 코루틴을 멈추지 않고 새로 시작해 두 개가 동시에 돌고 있었습니다. 코루틴 핸들을 보관해 정지 후 재시작하도록 고쳤습니다.

AI와 협업 방식

  • 역할 분담
    • 기획, 구조 결정, 측정, 테스트, 커밋은 제가 합니다.
    • 반복 패턴 코드는 AI에 맡깁니다.
    • 이벤트 구조 설계, 귀환 시에만 영구 저장하는 2단계 저장 타이밍, BaseEnemy 통합 범위, 이벤트 구독 위치 결정(씬 로드 순서 문제)은 직접 했습니다.
  • 측정으로 검증
    • AI가 제안한 해결책도 Profiler 수치로 확인한 뒤에 채택합니다.