Unity/정보

[Unity] AR 튜토리얼

달시_Dalsi 2024. 8. 17. 21:09

Unity AR (튜토리얼) 소개

증강 현실(AR, Augmented Reality)은 현실 공간에 가상의 이미지를 겹쳐 보여주는 기술입니다. 스마트폰이나 태블릿 등을 통해 현실에 3D 오브젝트, 텍스트, 이미지 등을 추가할 수 있습니다.

AR 기술은 게임, 교육 등 다양한 분야에서 활용되고 있으며, Unity는 AR 개발을 간편하게 할 수 있는 기능을 제공합니다. 이번에는 Unity를 사용하여 간단한 AR 앱을 만들 예정입니다. 목표는 사용자가 화면을 터치할 때 화면 중앙에 오브젝트를 생성하는 것입니다.

 

사용법 안내

1. AR Foundation 패키지 설치

Package Manager에서 AR Foundation을 검색하여 설치합니다.

사용하는 기기가 안드로이드인 경우 Google ARCore XR Plugin을, iOS인 경우 Apple ARKit XR Plugin을 설치합니다.

 

 

 

2. AR 설정

프로젝트 세팅 하단의 XR Plug-in Management 탭에서 안드로이드 또는 iOS를 활성화해줍니다.

 

이번 테스트에서는 안드로이드를 사용하므로 Google ARCore XR Plugin만 설치하여 진행했습니다.

만약 자신의 프로젝트가 URP를 사용 중이라면, URP 렌더러에 AR Background Renderer Feature를 추가해주어야 합니다

 

3. 빌드 설정

1. 우선 사용할 플랫폼(안드로이드 또는 iOS)으로 교체합니다.

 

2. 다음으로 Other Settings에서 Auto Graphics API 체크를 해제한 후, Vulkan을 삭제합니다.

 

 

3. Minimum API Level을 API level 24 이상으로 설정해야 합니다.

 

 

4. Scripting Backend를 Mono에서 IL2CPP로 변경한 다음, 아래의 ARMv7과 ARM64를 체크해줍니다.

 

5. 마지막으로 JDK, SDK 등의 설정이 올바르게 입력되어 있는지 확인합니다.

 

4. 씬 구성

Main Camera를 삭제한 후, 아래 3개의 오브젝트를 배치합니다.

 

3개의 오브젝트의 역할은 다음과 같습니다.

 

  • XR Origin (AR Camera): 기본적인 좌표계를 설정하는 역할을 하며, XR Origin 내에 있는 카메라는 실제 공간과 Unity 공간을 연결해줍니다.
  • AR Session: AR 시스템의 핵심으로, 카메라 피드와 센서 데이터를 수집하고 처리합니다. 이 오브젝트는 씬에 하나만 생성해야 하며, AR Session을 활성화하거나 비활성화하여 세션을 시작하거나 중지할 수 있습니다.
  • AR Default Plane: 시스템이 감지한 평면을 시각적으로 표시하는 데 사용됩니다.

 

 

 

 

 

XR Origin 오브젝트에 아래 2개의 컴포넌트를 추가합니다. 또한, Plane Manager에 앞서 생성한 AR Default Plane을 추가해줍니다.

 

5. 스크립트 작성 및 프리팹 생성

아래와 같이 스크립트를 작성한 후, 빈 오브젝트에 추가하여 사용합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;

public class ARManager : MonoBehaviour
{
    public GameObject objectToPlace; // 화면 터치시 생성할 오브젝트
    public ARRaycastManager ar_raycastManager; // ARRaycastManager를 참조하여 AR 세션에서 평면을 탐지하고, 터치시 오브젝트를 배치하는 데 사용됩니다.

    void Update()
    {
        UpdateCursor();

        if (Input.touchCount> 0 && Input.GetTouch(0).phase==TouchPhase.Began) // 터치시 오브젝트 생성 조건
        {
            Instantiate(objectToPlace, transform.position, Quaternion.identity);
        }
    }

    void UpdateCursor() // 화면 중앙의 좌표를 가져와 해당 위치에서 평면 탐지
    {
        Vector2 screenPosition = Camera.main.ViewportToScreenPoint(new Vector2(0.5f, 0.5f));
        List<ARRaycastHit> hits = new List<ARRaycastHit>();
        ar_raycastManager.Raycast(screenPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.Planes); // 평면을 탐지

        if (hits.Count > 0)
        {
            transform.position = hits[0].pose.position;
            transform.rotation = hits[0].pose.rotation;
        }
    }
}

 

 

스크립트를 보면 알 수 있듯이, objectToPlace 오브젝트를 생성하기 위해서는 생성할 오브젝트를 프리팹으로 만들어야 합니다. 기본 Sphere를 사용하여 프리팹을 만들고, 해당 값을 objectToPlace로 설정합니다. 또한, ar_raycastManager에는 앞서 생성한 AR Raycast Manager를 추가해줍니다.

 

6. 빌드 및 테스트

빌드하기 전에 해당 씬이 빌드 설정에 추가되어 있는지 확인한 후, 빌드를 진행합니다.

 

 

아래가 실행 화면입니다.

평면으로 인식된 곳에는 표시가 나타나며, 이때 화면을 터치하면 앞서 생성한 프리팹이 화면의 정중앙에 생성됩니다.

 

 

마무리

Unity에서 AR Foundation을 사용하여 아주 간단한 AR 앱을 구현해 보았습니다.

평면을 탐지하고, 탐지된 평면에 오브젝트를 배치하는 기능을 구현하면서 AR 기술의 기본적인 원리를 이해할 수 있었습니다.