1. 서론: 왜 시작했는가? (Intro)
- 목표: 15시간(2일) 안에 간단하지만 완성도 있는 AR 인터랙션 구현.
- 제약 사항: 실외 이동 불가(GPS 제외), 방 안에서 테스트 가능한 평면 인식 기반 컨텐츠.
- 핵심 기능: 화면 터치로 공을 던지고, 손가락 회전에 따라 공이 휘어지는 물리(Magnus Effect) 구현.
2. 기술 스택 (Tech Stack)
- Engine: Unity 6000.3.xx + AR Foundation
- Input: New Input System (InputAction)
- Physics: Rigidbody, Magnus Effect Simulation
3. 핵심 구현 내용 (Core Logic)
① Spawner와 Camera의 관계
- AR 월드 좌표는 기기를 켜는 순간 결정되므로, 유저를 항상 따라다니는 '절대 공간' 느낌을 위해 Spawner를 카메라의 자식(또는 부드러운 추적 스크립트)으로 배치.
② 데이터 샘플링: Queue 활용
- 터치 좌표(Vector2)를 월드 좌표(Vector3)로 변환 후 Queue에 저장.
- 큐에 쌓인 데이터의 시작점과 끝점을 비교해 투척 속도와 방향을 계산.
③ 커브볼 알고리즘 (핵심)
- 회전량 수집: 터치 중 좌우 이동량(deltaX)을 누적하여 _totalSpin 계산.
- 물리적 보정: FixedUpdate에서 외적(Vector3.Cross)을 통해 진행 방향의 수직 벡터를 구하고, 지속적으로 옆구리를 밀어주는 힘(AddForce)을 가함.
- 비주얼 피드백: transform.Rotate로 공을 회전시키고, Trail Renderer로 궤적 시각화.
4. 트러블슈팅 (Troubleshooting) - 중요!
🚨 NullReferenceException 검거
- 문제: 공 스폰 시 Camera.main 참조 오류 발생.
- 원인: AR 환경 초기화 시 카메라 태그 참조 시점의 문제.
- 해결: ARDebugger 스크립트를 제작해 실시간으로 폰 화면에 로그와 변수 상태(Stack Trace)를 출력하여 범인(줄 번호)을 특정함.
🚨 급격한 궤적 이탈
- 문제: 커브볼 힘이 너무 강해 공이 화면 밖으로 튕겨나감.
- 해결: ForceMode.VelocityChange 대신 질량의 영향을 받는 ForceMode.Force를 사용하고, 시간에 따라 _curveAmount를 감쇄(Lerp)시켜 자연스러운 포물선 유도.
5. 최종 코드 및 결과 (Conclusion)
성취
짧은 시간 안에 AR의 공간 이해도와 유니티 물리 엔진의 실무적 적용법을 익힘.