0%

Unity

셀프 카메라로 찍은 내 얼굴에, 오늘의 감정 한 가지를 꾹 눌러 담을 수 있다면 어떨까요.

전*원··수정됨 2026.07.21

셀프 카메라로 찍은 내 얼굴에, 오늘의 감정 한 가지를 꾹 눌러 담을 수 있다면 어떨까요.

관람객의 표정이 곧 전시물이 되는 순간, 그리고 그 순간들이 하나의 갤러리로 흘러가는 체험. 이번 포스팅에서는 셀프 카메라 기반 감정 기록 전시물 '감정과 생각'의 기술적인 구현 과정을 공유합니다.

아키텍처_01_전체구조.png

1. 시스템 아키텍처 개요

본 프로젝트는 크게 세 가지 단계로 구성됩니다.

전면 카메라 촬영: 안드로이드 태블릿의 전면 카메라를 1920x1440@30fps 로 열어 5초 카운트다운 후 Texture2D 에 캡처합니다.

감정 스티커 태깅: 9종(HAPPY, ANGER, DISMAIS, SURPRISE, PETULANCE, EXCITED, FEAR, BOREDEM, SHAME) 중 하나를 선택하면 해당 스프라이트가 캡처 이미지 위에 오버레이됩니다.

갤러리 저장 및 재로드: 최종 화면을 PNG 로 저장하고 네이티브 갤러리 플러그인으로 비트맵(Bitmap)을 다시 불러와 3행 × 9칸 그리드에 배치합니다.

전체 환경은 Unity 2023.2 와 Android 키오스크 모드로 구성되어 단일 씬에서 동작합니다.

2. 주요 기술적 구현

2.1 카메라 프리뷰와 5초 캡처 InGameManager.cs)

FindForntCameraAndCreateWebCamTexture() 에서 전면 카메라를 탐색해 WebCamTexture 로 1920x1440, 30fps 스트림을 엽니다. AdjustRawImageToCamera()videoRotationAnglevideoVerticallyMirrored 를 반영해 RawImage 를 Aspect Fill 방식으로 회전·미러링 보정합니다. CaptureCam() 은 5초 타이머가 0에 도달하는 시점에 Texture2D.ReadPixels 로 화면을 읽어 captureImage 에 꽂아줍니다.

2.2 감정 스티커 오버레이 AddEmotionButton.cs)

9개의 감정 버튼은 각각 ESTIKERTYPE enum 값을 들고 있고, onClick 시 InGameManager.AddSticker(ESTIKERTYPE) 를 호출합니다. 이 함수는 emotionSprites[9] 배열에서 해당 인덱스의 스프라이트를 뽑아 emotions 오브젝트 하위의 모든 Image.sprite 에 일괄 적용합니다. 즉 한 번의 클릭이 여러 위치의 스티커 프레임을 동시에 바꿔주는 구조입니다.

2.3 비동기 갤러리 로드와 무한 스크롤 AndroidManager.cs)

StartCaptureScreen() 이 PNG 를 Android Pictures 디렉토리에 저장하면 MediaScannerConnection.scanFile 이 시스템 갤러리를 즉시 갱신합니다. 이어서 ReloadImagesUntilReady() 가 Java 플러그인의 LoadGalleryImages 를 호출해 27장이 모두 채워질 때까지 0.5초 간격으로 폴링합니다. 불러온 사진은 gridObject_0/1/2 세 행에 9장씩 분배되고, GrideMove.cs 가 초당 50픽셀 속도로 가로 스크롤을 돌리다가 -1790px 에 도달하면 3730px 위치로 리셋합니다.

3. 사용자 경험(UX) 최적화

촬영 리듬을 만드는 카운트다운 : 5초 카운트다운과 CAPTURE/TAG/RECAPTURE/SHARE 네 단계 버튼 전환으로, 관람객이 "찍고, 꾸미고, 남긴다"는 행위의 리듬을 자연스럽게 체감하도록 구성했습니다.

키오스크 잠금 모드 : Android startLockTaskKioskDeviceAdminReceiver 를 이용해 태블릿이 다른 앱으로 빠져나가지 않도록 고정하고, 종료 버튼 10회 연타(60초 내)라는 히든 동작으로만 종료되도록 만들어 전시 운영 안정성을 확보했습니다.

관람객이 만드는 갤러리의 흐름 : 촬영한 사진이 즉시 갤러리에 반영되고, 초당 50픽셀의 가로 스크롤로 앞서 다녀간 다른 관람객의 감정들이 함께 흘러가면서 체험의 연속성을 만듭니다.

무입력 자동 복귀 : resetReturnToTitleTime 동안 입력이 없으면 타이틀로 복귀하고 갤러리를 다시 로드해, 다음 관람객이 언제든 깨끗한 상태에서 체험을 시작할 수 있도록 했습니다.

4. 마치며

한 장의 셀프 사진에 '감정'이라는 레이블을 직접 붙여보는 행위는, 단순한 기념 촬영을 넘어 관람객이 자신의 감정을 객관화해 바라보게 만드는 전시적 장치입니다. 기술적으로는 Unity WebCamTexture, 커스텀 Android 갤러리 플러그인, 그리고 가로 무한 스크롤 UI 를 하나의 키오스크 흐름으로 엮어낸 작업이었습니다.

향후에는 GetPixelBilinear 루프로 구현된 이미지 리사이즈를 Graphics.Blit + RenderTexture 기반의 GPU 파이프라인으로 교체해 27장 로드 지연을 크게 단축하고, 하드코딩된 스크롤 리셋 좌표(-1790, 3730)를 화면 해상도에 따라 자동 계산하도록 리팩터링해 다양한 태블릿 규격을 지원할 계획입니다.

읽기 도구

5분 읽기

이 글이 도움이 되었나요?

다음으로 읽기