2026 · 회사
MetaForest Unity 클라이언트Unity · Photon · Agora
Unity 6로 리메이크한 클라이언트를 PC와 모바일에서 같은 방에 넣고 돌렸습니다
배경
운영 중인 메타버스 상담 클라이언트(Unity)입니다. 음성은 Agora, 룸 동기화는 Photon, 코드는 Plastic SCM으로 관리합니다.
음성 두절 장애: 증상과 원인이 달랐다
- 증상: 상담 중 음성이 30초 동안 끊기는 일이 31분에 6회.
- 처음 의심한 것: Agora. 하지만 로그를 보니 Photon의 순간적인 끊김(PlayerTtl=0) 때마다
OnPlayerLeftRoom에서 즉시LeaveChannel을 호출하고 있었습니다. 1초짜리 끊김이 30초짜리 음성 두절로 증폭된 것입니다. - 수정: 판정 소스를 바꾸는 게 아니라 디바운스였습니다. 상대 퇴장 시 즉시 LeaveChannel 대신 유예 후 퇴장, 유예 중 복귀하면 예약 퇴장을 취소합니다.
- 유예 15초 → 45초: 8/6 장애의 두절이 회당 29
38초였고, 이는 “자리 비운 시간 + 음성 재입장 58초”의 합이라 상대 복귀까지 실제로 21~33초가 걸린 셈입니다. 유예가 그보다 짧으면 먼저 나가 두절이 그대로 남으므로 관측된 최악 케이스를 덮도록 올렸습니다. 실기기 검증 후 병합합니다. - 같이 잡은 것: 재입장 중 JoinRoom이 실패하면 로딩 화면에 영구히 갇히던 문제. 원인은 blockOFFLoading을 켠 채 씬 로드를 무한 WaitUntil로 기다리던 코루틴이었고, 재입장 코루틴 회수(AbortRejoin)와 타임아웃(로비 15초·씬 30초)으로 고쳤습니다.
Agora 비용: 인원 게이팅
2명 이상일 때만 음성 채널을 유지하도록 바꿨습니다. 혼자 있는 방에서도 채널이 열려 있던 과금을 없앴습니다. 중복 세션의 진짜 원인은 클라이언트가 아니라 백엔드 webhook의 레이스였고, 이는 백엔드에서 따로 고쳤습니다.
보안: 같은 브랜치에서 정리한 것
클라이언트에 남아 있던 보안 항목을 한 브랜치에서 정리했습니다. 진단 로그에 비밀값이 그대로 실리던 것은 로그를 일괄로 끄는 대신 값만 마스킹해서 막았습니다. 장애 원인 규명에 쓰던 진단 수단을 함께 잃지 않기 위해서였습니다. 빌드 산출물에 비밀값이 섞여 나가던 경로는 제거하고, 다시 켤 때 서버를 거치도록 경로를 남겼습니다. 쓰이지 않지만 되살아나면 운영 빌드를 잘못된 곳으로 보낼 수 있던 죽은 코드도 지웠습니다.
개별 항목의 내용은 지금도 사용자 기기에 설치된 앱과 이어져 있어 적지 않습니다.
Unity 6 리메이크 (2025.11 –)
2025년 11월 새 저장소(Metaforest_2022)에서 시작한 Unity 6 클라이언트입니다. 5년치 코드를 새 저장소로 옮기는 작업이라 읽어야 할 코드가 많았고, 구버전 코드 분석과 미사용 기능 정리, 라이브러리 교체 같은 반복 작업에 AI 에이전트를 붙여 진행했습니다. 결과는 빌드와 실기기 확인으로 검증했고, 리메이크한 클라이언트는 그대로 운영 배포됐습니다. 체크인 기록을 월별로 정리하면: 11월 Photon 교체, OpenCV·Dlib 제거 후 MediaPipe 얼굴 인식 이식, 동물 캐릭터, PDF·유튜브 공유 정리. 12월 상담실 씬 8종 라이팅 재빌드, SKT 플러그인 제거, 3.1.6 운영 배포. 1월 Sentry 도입, 웹뷰, MediaPipe 버전업, Android 16KB 페이지 정렬 대응 시작, Cursor로 긴급 최적화. 2월 딥링크 빠른 상담, Photon 서버 지역 자동 선택, 안드로이드 화상채팅 음성 수정. 3월 16KB 정렬 해결, 얼굴 크게 보기, NPOT→POT 컨버터. 4월 Unity 6000.3.10 → 3.12 업그레이드, 음성 Agora 전면 전환, 채팅창 UI 개편. 5월 3.3.3 핫픽스, 보이스 필터. 6월 인원 게이팅·스피커폰 라우팅·자동 재연결.
그 밖에
- 쓰이지 않으면서 빌드에만 남아 있던 축어록 AI 요약 코드를 제거했습니다.
- Agora가 상위 3명만 보고한다는 점을 모르고 만든 화자 표시가 5명 이상에서 멈추던 버그를 수정했습니다.