[20260311-12] AR 실습

SmartBear·2026년 3월 13일

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의 공간 이해도와 유니티 물리 엔진의 실무적 적용법을 익힘.

profile
Python Dev with Infra -> Game Programmer

0개의 댓글