
AI 개발 규칙 프롬프트
요약
Unity 6.0과 Meta Quest 플랫폼을 활용한 XR 개발 가이드입니다. Vulkan API 기반의 Passthrough 설정, Meta Building Blocks 활용법, 그리고 차량 이동 유스케이스를 위한 계층 구조 설계 방식을 다룹니다.
핵심 포인트
- Unity 6.0 및 Meta Quest 타겟의 Vulkan API 필수 사용
- Meta Building Blocks를 통한 Camera Rig 및 Passthrough 구축
- 차량 이동 대응을 위한 헤드 추종 및 통과 오브젝트 계층 분리
- Editor 디버깅을 위한 키보드 에뮬레이션 및 방어적 코드 구현
- Thin-Cube 기반의 커스텀 곡면 Mesh 생성 방식 적용
- 엔진: Unity 6.0 (6000.x 계열)
- 타겟: Meta Quest 플랫폼 (Platform Browser에서 선택)
※ 범용 Android 빌드로의 전환이나 제안은 일관되게 "NG"로 한다. - XR 플러그인: Unity OpenXR Plugin + Unity OpenXR: Meta 패키지
※ Oculus XR Plugin은 권장되지 않으므로 일절 사용하지 않는다. - 렌더링: URP (Universal Render Pipeline) + Vulkan API
※ 패스스루 (Passthrough) 동작에 Vulkan이 필수적이다. OpenGL ES는 사용할 수 없다.
-
기본 방침: 카메라 리그 (Camera Rig)나 패스스루 (Passthrough) 등 주요 XR 기능은 Meta 공식 Building Blocks (
Window > Meta XR > Building Blocks
)
)를 사용하여 씬에 배치 및 구축할 것. - 사용하는 주요 블록: -
[Camera Rig] : OVRCameraRig 기반의 카메라 기반 구조
-
[Passthrough] : URP/Vulkan 환경용 패스스루 자동 설정
-
구현 필수 요구사항:
① 메인 카메라 (CenterEyeAnchor) 설정: Clear Flags = Solid Color, Background alpha = 0 (완전 투명)으로 설정할 것.
② AR Camera Manager 컴포넌트를 메인 카메라에 반드시 부착할 것.
③ 패스스루 (Passthrough)의 ON/OFF 전환은 AR Camera Manager.enabled의 true/false로 제어할 것. - 디버그 제한: 개발 PC가 Link를 지원하지 않으므로, Unity Editor 상 (Play 모드)에서는 패스스루 영상이 표시되지 않는다 (배경은 투과용 컬러로 그려짐). 위치 맞춤이나 실물과의 합성 확인은 반드시 Android 빌드 (.apk)를 실기기에 전송하여 수행할 것.
차를 타고 이동하는 유스케이스에 대응하기 위해, 오브젝트의 성질에 따라 계층 구조 (Hierarchy)를 엄격히 분리할 것.
- 헤드 (Head)를 추종하는 오브젝트 (차량 내부 환경, UI, 인테리어 등):
Building Blocks로 생성된 Camera Rig 내의 TrackingSpace 자식 요소로 배치한다. 이를 통해 차량의 이동이나 머리의 움직임에 자동으로 완전 추종하게 한다. - 통과하는 오브젝트 (차량 외부 환경, 가상 장애물, 파이프 등):
Camera Rig의 외곽 (루트 계층)에 배치한다. 차량의 진행 (의사 전진 로직 등)에 맞춰 이 오브젝트들이나 플레이어 측의 위치를 상대적으로 이동시킴으로써 "통과"를 표현한다.
-
기본 방침: 현재 프로젝트에서 안정적으로 동작하고 있는 OVRInput을 기반으로 구현을 유지한다 (Building Blocks 환경에서도 OVRInput을 그대로 사용).
-
Editor 디버그 대응: Link 미지원 PC에서의 Editor 실행 시 (Application.isEditor)에도 주요 기능 (이동, 통과, 로그 시작, 패스스루 전환 등)의 테스트가 가능하도록 키보드 입력을 할당한 에뮬레이트 로직을 공존시킬 것.
-
예외 처리: Null 참조나 XR 초기화 타이밍의 버그를 방지하기 위해, Editor 실행 시에는 OVRInput의 생데이터 (컨트롤러 연결 체크 등)를 안전하게 바이패스하는 방어적 코드를 철저히 할 것.
-
구현 접근 방식: Thin-Cube (얇은 큐브)를 기반으로 MeshFilter + MeshRenderer를 사용하며, 코드에서 정점을 원호 모양으로 변형하여 곡면 Mesh를 생성할 것.
※ XR Composition Layers의 Cylinder Layer는 사용 금지 (동작하지 않은 실적이 있음). - 제어 파라미터: 정점 계산은 Mathf.Sin / Mathf.Cos로 원호를 근사하며, 세그먼트 수, 곡률 반경, UV 좌표를 인수로 동적으로 제어할 수 있는 설계로 할 것. 영상 텍스처의 왜곡을 방지하기 위해 UV 좌표 (u값)는 원호의 호 길이에 대해 등간격으로 매핑할 것.
-
렌더링 방법: 영상이나 텍스처는 VideoPlayer + RenderTexture를 경유하여 대상 Material에 할당할 것.
-
구현 방법: 씬 내의 파이프 오브젝트 (차량 외부에 배치되어 통과 대상이 되는 것 등)의 변형이나 조작에는 ProBuilderMesh API를 이용한 스크립트 구현을 제안 및 사용할 것.
-
저장 경로 (Save Path): Android 10 이후의 Scoped Storage 제약을 회피하기 위해, 반드시 Application.persistentDataPath를 사용할 것
※ /sdcard/ 직하와 같은 커스텀 경로(Custom Path)로의 저장 제안은 "일관되게 금지" (쓰기 불가 에러가 발생하기 때문). AndroidManifest.xml에 WRITE_EXTERNAL_STORAGE를 추가할 필요도 없음
※ 실제 기기 경로 예시: /sdcard/Android/data/<패키지명>/files/log_yyyyMMdd_HHmmss.csv - 파일 관리 (File Management): DateTime.Now를 사용하여 날짜와 시간을 포함한 유니크한 파일명으로 생성함으로써, 세션마다 별도의 파일로 축적할 것
- 쓰기 부하 대책 (Write Load Mitigation): 매 프레임 발생하는 I/O로 인한 처리 저하 (Spike)를 방지하기 위해, 메모리(List 또는 StringBuilder)에 버퍼링(Buffering)하고, 세션 종료 시 또는 일정 시간마다 일괄·비동기(Asynchronous) 쓰기를 수행할 것
- PC로의 추출: PC와 USB로 연결하여, 다음의 ADB 명령어를 사용하여 추출할 것
adb pull /sdcard/Android/data/<패키지명>/files/ ./logs
-
언어·API: C# (Unity 6 대응 네임스페이스 사용). 주석은 모두 일본어로 작성할 것
-
정보의 최신성: 2025년 이후의 정보·문서를 최우선으로 함 (Meta XR SDK는 v74 이후를 전제). 오래된 정보나 레거시 API (Legacy API)를 제시할 경우에는 "구버전용"이라고 명시하여 경고를 넣을 것
-
목적 설명
-
구현 절차 (글머리 기호)
-
코드 예시
-
참고 문서 URL (존재하는 경우)
불확실한 정보는 "확인 필요"라고 명시하고, 오래되었을 가능성이 있는 내용에는 경고를 붙일 것.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기