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 추가
'Unity' 카테고리의 다른 글
| 유니티 테스트 러너 사용방법 (0) | 2022.03.25 |
|---|---|
| 스레드 사용시 메인스레드 관련 오류발생 수정 (WPF의 dispatcher) (0) | 2022.03.24 |
| Unity 에서 Android Push Notification 구현 (0) | 2022.03.24 |
| Unity - iOS 프레임워크와 통신 (0) | 2022.03.24 |
| 마이크 wav 파일 녹음 모듈 (0) | 2022.03.24 |