Unity

나이언틱 라이트쉽 관련 (AR)

Dean83 2022. 3. 24. 23:06

1. 개요
     - 나이언틱 라이트쉽이란, 유니티로 개발 가능한 AR 키트를 이야기함. 안드로이드 ios 둘다 지원함. 
     - 실시간으로 AR을 지원하며, 오브젝트를 분별함. 

2. 최소사양
    - 유니티 버전 2019.4 LTS 릴리즈 를 공식 지원함.
    - 유니티 닷넷 4.x 지원 및 URP 지원.
    - 안드로이드 버전 최소 24 이상 지원
    - xcode 12.2 부터 지원 

3. 개발 가이드
    - https://lightship.dev/docs/getting_started.html

4. 빌드 세팅
    4.1. 안드로이드
           - https://lightship.dev/docs/building_android.html
              - 그래픽 api 에서 불칸 제거, il2cpp 설정 등

     * 안드로이드 버전 11이상 (S21 같은 기기) 메니페스트를 수정해야함.
        또한, 구글 AR 서비스를 다운받아야 하는데 (자동설치) 플레이 스토어에 로그인을 해야지만 자동로그인 하는듯함. 
        즉, 새 기기에서 할경우 플레이 스토어에 로그인 후 앱 설치하여 테스트 할것. 

예시.
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature android:name="android.hardware.camera.ar" />
  <queries>
    <package android:name="com.google.ar.core" />
  </queries> 

추가

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly">
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature android:name="android.hardware.camera.ar" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true" android:supportsRtl="true" android:usesCleartextTraffic="true">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:excludeFromRecents="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
    <meta-data android:name="platform_high" android:value="0" />
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="false" />
  </application>
  <queries>
    <package android:name="com.google.ar.core" />
  </queries>  
</manifest>


         

5. 개발 순서
     - 나이언틱 홈페이지에서 라이센스 키 생성 : https://lightship.dev/account/dashboard 에서 생성
     - 유니티 프로젝트 생성 및 sdk 임포트 : https://lightship.dev/docs/importing_ardk.html
        - 씬에 있는 기본 카메라 삭제 및 ARDK -> Extensions -> Prefabs에 있는 ARSceneCamera를 추가
           * 각 캔버스 등 카메라를 사용하는 부분에 ARSceneCamera로 변경해줘야함
     - 인증키 설정 : https://lightship.dev/docs/authentication.html
     - AR 세선 코드 작성 : https://lightship.dev/docs/ar_session.html
        - 안드로이드는 Start 전 카메라 권한을 가져와야함. 
        - ARSessionManager를 추가하여 사용하는법 : https://lightship.dev/docs/class_niantic_1_1_a_r_d_k_1_1_extensions_1_1_a_r_session_manager.html
     - 하이어라키에 GameObject 추가 -> 인스펙터에 AR Plane Manager 와 Capability Checker 추가 필요. 
        - AR Plane Manager에 PlanePrefab을 설정해주고, Deteced Plane Types도 설정해 준다.
        - Capability Checker는 기기가 AR 서비스를 사용할 준비가 되었는지 체크하는것으로 failure 와 success에 함수연결해주면 콜백한다. 
          기능상 AR 기능 다운로드가 필요시 띄우는 기능도 있는듯 하다.

6. 그라운드 터치시 좌표 받아오기
     - update에서 터치시, ARSession의 현재 프레임에서 HitTest를 통해 좌표를 가져옴. 해당 좌표 위치에 오브젝트를 이동 혹은 배치. 
     - ARHitTester를 이용 할 수도 있음 (나이언틱에서 기본 제공하는 스크립트)
     

Start 등에서, 

ARSessionFactory.SessionInitialized += ARSessionFactory_SessionInitialized;
설정을 통해 세션을 받아와야함. 

   private void ARSessionFactory_SessionInitialized(Niantic.ARDK.AR.ARSessionEventArgs.AnyARSessionInitializedArgs args)
    {
        m_session = args.Session;
    }

업데이트문에서, 터치 이벤트 감지 후 함수 호출
private void Update()
    {
        if (m_session == null || m_avatar == null)
            return;

        if (PlatformAgnosticInput.touchCount <= 0)
        {
            return;
        }

        var touch = PlatformAgnosticInput.GetTouch(0);
        if (touch.phase == TouchPhase.Began)
        {
            TouchBegan(touch);
        }
    }

세션의 현재 프레임에서 hittest를 통한 좌표값 추출
private void TouchBegan(Touch touch)
    {
        var currentFrame = m_session.CurrentFrame;
        if (currentFrame == null)
        {
            return;
        }

        var results = currentFrame.HitTest
        (
          m_camera.pixelWidth,
          m_camera.pixelHeight,
          touch.position,
          ARHitTestResultType.ExistingPlaneUsingExtent
        );

        int count = results.Count;
        Debug.Log("Hit test results: " + count);

        if (count <= 0)
            return;

        // Get the closest result
        var result = results[0];

        var hitPosition = result.WorldTransform.ToPosition();

        Debug.Log("========== : " + hitPosition.x + "," + hitPosition.y + "," + hitPosition.z);

    }



7. URP 에서 사용시
    - 유니티 메뉴중 Edit -> Project Settings -> Graphics -> Scriptable Render Pipeline Settings에 설정된 asset의 위치 확인 (기본 UniversalRP-HighQuality)
    - 기본 위치는 Assets -> Settings 에 있음.
    - UniversalRP-HighQuality 선택 -> 인스펙터에서, General -> Renderer List 에 설정된 asset 확인 (기본 ForwardRenderer)
    - 해당 asset 클릭 -> 인스펙터에서 Add Renderer Feature 클릭 -> ARSesstionFeature 와 DepthMeshRendererFeature 추가