Unity Android 앱을 위한 CameraX 기반 네이티브 카메라 플러그인입니다. Unity(C#) 측에서 JNI 및 Reflection을 통해 이 플러그인의 기능을 직접 제어할 수 있습니다.
- 프리뷰 및 캡처: 백/프론트 카메라 프리뷰 지원 및 고해상도 사진 캡처
- 수동 카메라 제어: ISO, 노출 시간(Exposure Time), 초점 거리(Focus Distance) 조절
- 오토 포커스(AF) 복귀: 수동 초점 조절 후 다시 AF 모드로 전환
- 부가 기능: 플래시(Torch) 켜기/끄기, 화면 줌(Zoom) 제어
- 기기 호환성 우회 지원: 카메라가 1개인 특수 기기(산업용 태블릿 등)에서의 오류를 우회하는 옵션 제공
프로젝트 루트에서 다음 명령어를 실행하여 AAR 파일을 생성합니다.
./gradlew :app:assembleRelease빌드된 산출물은 app/build/outputs/aar/NativeCameraPlugin-release.aar 경로에 생성됩니다.
이 플러그인은 Unity Package Manager(UPM)를 통해 배포할 수 있도록 설계되었습니다. GitHub를 통해 배포되는 Unity 패키지의 권장 구조는 다음과 같습니다.
packages/work.ctrl3d.camerax/
├── package.json
├── README.md
├── CHANGELOG.md
├── LICENSE.md
├── Runtime/
│ ├── work.ctrl3d.camerax.asmdef
│ ├── AndroidNativeCameraBridge.cs
│ └── NativeCameraController.cs
├── Editor/
│ ├── work.ctrl3d.camerax.Editor.asmdef
│ └── NativeCameraPluginDependencies.xml
└── Plugins/Android/
├── NativeCameraPlugin-release.aar
└── libs/
├── arm64-v8a/liboes_renderer.so
└── armeabi-v7a/liboes_renderer.so
빌드된 NativeCameraPlugin-release.aar 파일은 패키지 내 Plugins/Android/ 경로에 배치하여 사용합니다.
Unity(C#) 스크립트에서는 AndroidJavaObject 또는 JNI 리플렉션을 사용하여 work.ctrl3d.camerax.NativeCameraPlugin 클래스의 static 메서드를 호출합니다.
// 프리뷰 시작/종료
@JvmStatic fun startPreview(width: Int, height: Int, useFront: Boolean): Int
@JvmStatic fun stopPreview()
@JvmStatic fun updateTexture(): Boolean
// 수동 제어
@JvmStatic fun setIso(iso: Int)
@JvmStatic fun setExposureTimeNs(nanos: Long)
@JvmStatic fun setFocusDistance(diopter: Float)
@JvmStatic fun setAutoExposure(enabled: Boolean)
@JvmStatic fun setAutoFocus()
@JvmStatic fun setTorchEnabled(enabled: Boolean)
@JvmStatic fun setZoomRatio(ratio: Float)
@JvmStatic fun setExposureCompensation(index: Int)
// 사진 촬영 및 지원 정보
@JvmStatic fun takePhoto(savePath: String)
@JvmStatic fun getCapabilitiesJson(): String
// 설정
@JvmStatic fun setSingleCameraWorkaround(enable: Boolean)
@JvmStatic fun setCallbackObjectName(name: String)takePhoto(savePath) 호출 시, 처리가 완료되면 Unity 측의 NativeCameraCallback 게임 오브젝트(기본값)로 성공 또는 실패 콜백이 전달됩니다.
- 성공 시:
OnPhotoSaved(String savePath) - 실패 시:
OnPhotoError(String errorMessage)