mogee.
<< BACK
#SpacePlus#Unity#Flutter#Android#3D드로잉#앱개발#개발후기#태블릿

안드로이드 3D 드로잉 앱 SpacePlus 개발 후기

DATE: 2026년 3월 24일TIME: 6분 읽기VIEWS: 10
Apple 맥북 네오 — A18 Pro칩

// RECOMMENDED GEAR

Apple 맥북 네오 — A18 Pro칩

입문 개발자를 위한 경제형 맥북. Flutter, React 개발에 충분한 성능.

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

안드로이드 3D 드로잉 앱 SpacePlus 개발 후기

왜 만들었나

아이패드에는 Feather라는 앱이 있다. 3D 공간 위에 선을 그을 수 있는, 기존 드로잉 앱과는 완전히 다른 경험을 주는 앱이다. 그런데 안드로이드 태블릿에는 비슷한 앱이 없었다. 갤럭시 탭과 샤오신 패드 같은 고성능 안드로이드 태블릿이 많아졌는데도 3D 드로잉 앱은 전무했다.

"내가 만들면 되겠다."

그렇게 SpacePlus 개발이 시작됐다.


기술 스택 선택 — Flutter + Unity

처음에는 Flutter로 전부 구현하려 했다. 하지만 3D 렌더링, 스타일러스 압력 감지, 복잡한 메시 처리를 Flutter만으로 하는 건 무리였다. 그래서 구조를 이렇게 나눴다.

  • Flutter: 홈 화면, 스케치 갤러리, 앱 전반 UX
  • Unity: 3D 드로잉 엔진 (스트로크, 카메라, 메시)

Unity를 Android Library로 익스포트해서 Flutter 앱 안에 내장하는 방식, 이른바 "Unity as a Library" 구조다. 두 프레임워크를 하나의 APK에 우겨넣는 건 생각보다 훨씬 까다로웠다.


개발 과정

1단계 — 기초 드로잉 시스템

가장 먼저 만든 건 드로잉 평면(DrawingPlane) 이었다. 3D 공간에서 어디에 그릴지 기준이 되는 가상의 평면이다. 선은 튜브 메시로 렌더링했고, 끝부분엔 엔드캡을 붙여 자연스럽게 마무리되도록 했다.

펜 압력은 두께에 반영했다.

baseWidth * (1 + pressure * pressureMultiplier)

처음엔 단순해 보이지만, 터치 입력 처리만 해도 함정이 많았다. Unity의 New Input SystemEnhancedTouch API를 써야 했고, 기존 Input.touchCount 방식은 완전히 배제해야 했다.

2단계 — 카메라와 제스처

3D 앱에서 카메라는 생명이다. 한 손가락으로 회전, 두 손가락으로 줌/이동, 360° 회전 시 자동 플립 처리까지 구현했다. 더블탭으로 평면 정면 뷰로 스냅되는 기능도 넣었다.

펜 모드가 핵심이었다. S Pen 같은 스타일러스로 그리는 동안 손가락은 카메라를 조작한다. 입력 소스를 자동으로 분리하는 이 구조가 실제 태블릿에서 사용감을 크게 높여줬다.

3단계 — 도형 인식 (Quick Shape)

선을 그리고 0.5초 유지하면 도형으로 스냅된다.

  • 열린 곡선 → 직선 또는 부드러운 곡선으로 스냅
  • 닫힌 곡선 → 원, 삼각형, 사각형, 오각형, 육각형, 별 중 선택

이 기능은 구현 난이도보다 UX 튜닝이 더 힘들었다. 인식 감도를 너무 높이면 의도치 않게 스냅되고, 너무 낮으면 아무 때도 안 됐다. 수십 번의 테스트 끝에 0.5초 홀드라는 타이밍을 정착시켰다.

4단계 — 선택, 지우개, 색채움

선택 시스템은 포인트 기반 감지로 구현했다. 탭 또는 드래그로 스트로크를 선택하고, 이동/회전/스케일/복사/삭제/색상 변경이 모두 가능하다.

지우개는 두 종류다.

  • 스트로크 지우개: 터치한 스트로크 전체 삭제
  • 부분 지우개: 원형 가이드 안에 들어오는 부분만 삭제

색채움 도구는 점을 찍어 다각형을 만드는 Fill Tool과, 드로잉 평면 위를 범람 채우기하는 Paint Bucket 두 가지로 나눴다.

5단계 — 플레이백 시스템

모든 편집 액션을 자동으로 기록해두고, 나중에 재생할 수 있다. 스트로크, 다각형, 변환, 색상 변경은 물론 카메라 이동까지 기록된다.

재생 속도는 0.5x~4x, 2초 이상 빈 구간은 자동으로 건너뛰는 idle time skip도 구현했다.

6단계 — 영상 내보내기 (가장 힘든 구간)

이 부분이 개발하면서 가장 많이 고생한 구간이다. Unity에서 Android MediaCodec으로 H.264 인코딩을 하는데, 색상 포맷 문제로 영상이 이상하게 나오는 버그를 며칠 동안 잡았다. I420 포맷에서 NV12 포맷으로 바꾸고 나서야 해결됐다.

최종적으로는 재생하면서 실시간 녹화하는 방식으로 구현했다.

  • 해상도: 720p/1080p 선택
  • 속도: 4배속 고정 (빠른 렌더링)
  • Time.captureFramerate = 30으로 부드러운 캡처
  • 갤러리 저장 + 안드로이드 공유 기능

7단계 — Flutter + Unity 통합

두 프레임워크를 연결하는 과정이 생각보다 복잡했다.

Flutter HomeScreen
    → MethodChannel
    → MainActivity.kt
    → Unity Activity (:unity 프로세스)
    → 저장 & 종료
    → onActivityResult
    → Flutter로 복귀

프로세스가 분리되어 있어서 데이터 전달은 파일 기반으로 처리했다. unity_launch_params.json으로 파라미터를 넘기고, 내부 스토리지로 스케치 데이터를 공유하는 방식이다.

Unity를 Export할 때마다 AndroidManifest.xml을 수동으로 수정해야 하는 번거로움이 있었는데, 결국 이 작업을 쉘 스크립트로 자동화했다.

8단계 — 이미지 첨부 기능

갤러리나 카메라에서 사진을 가져와 드로잉 평면에 붙이는 기능이다. 선택, 이동, 회전, 스케일, 삭제를 지원하고, 저장/불러오기와 Undo/Redo, 플레이백/영상 내보내기에도 포함된다.


Play Store 배포

개발을 마무리하고 Fastlane으로 Play Store 자동 배포를 세팅했다. Google Cloud 서비스 계정을 만들고, Play Console Admin 권한을 부여해서 fastlane supply 명령 하나로 AAB 업로드가 가능하다.

첫 배포는 2025년 1월 5일, 현재 버전은 v1.0.11이다.


남은 과제

아직 완성하지 못한 것들도 있다.

  • 스케치 카드 썸네일 자동 캡처
  • S Pen 압력 감도 정밀 감지
  • 타원 도형 인식
  • 스트로크 색상 변경 (빌드에서 셰이더 속성 문제)

후기

안드로이드에 3D 드로잉 앱이 없다는 이유 하나로 시작한 프로젝트였다. Flutter와 Unity를 하나로 묶는 것, 3D 입력 시스템을 처음부터 설계하는 것, 영상 인코딩 버그를 잡는 것... 하나하나가 쉽지 않았다.

그래도 결국 내 태블릿에서 3D 공간에 직접 선을 긋고, 그 과정을 영상으로 내보낼 수 있는 앱이 완성됐다. 총 179개의 커밋, 수백 시간의 작업이 담긴 결과물이다.

아직 마켓에서 큰 반응을 얻은 건 아니지만, 안드로이드 태블릿 유저라면 한 번쯤 써볼 만한 앱이라고 생각한다. 앞으로도 조금씩 다듬어 나갈 예정이다.

이 글 공유하기

[X] X에 공유

// SPONSORED

[>]댓글

아직 댓글이 없어요. 첫 댓글을 남겨보세요!