Unity iOS の AR アプリ開発をはじめる
Unity iOS で AR アプリの開発をはじめるためのセットアップ方法のメモ. AR Foundation の提供する仕組みの範囲で,簡単な平面検出と 3D モデルの配置をやってみる.
概要
Unity iOS で AR アプリ開発ことはじめとして,次のことをやってみる.
- AR Foundation & ARKit をセットアップする
- AR Plane Manager で平面検出し,デフォルトのビジュアライザで平面を表示する
- AR Raycast Manager で AR Plane のどこをタッチしたのか判定する
- タッチした場所に適当な 3D オブジェクトを表示する
環境
- Unity 2020.1.17f1
- AR Foundation 4.1.1
- ARKit XR Plugin 4.1.1
- iOS 14.3
Unity で ARKit を使う準備をする
パッケージのインポート
まずは Unity で AR を使うための準備をする. Package Manager を開いて,次のパッケージをインポートする.
- AR Foundation (Version 4.1.1)
- ARKit XR Plugin (Version 4.1.1)
Unity はマルチプラットフォームの AR アプリ開発をサポートしている. AR Foundation は各プラットフォームをまとめて抽象化するラッパーで,各プラットフォームごとの実装は plugin として分離されている.
ARKit の有効化
インポートが完了したら Project Settings を開いて ARKit を有効化する.
- XR Plug-in Management
- iOS > Plug-in Providers > ARKit にチェックを入れる
- XR Plug-in Management > ARKit
- Requirement を Required にする
- Player > iOS > Other Settings
- Target minimum iOS Version を適当なものにする
- Requires ARKit support にチェックを入れる
- Camera Usage Description に適当な文言を入れる
AR Session の配置
Scene に AR Session
と AR Session Origin
を配置する.ただそれだけ.
AR Session State の表示
Session が動いているのか分かるように,状態を画面に表示しておく.
using System.Collections;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class AppController : MonoBehaviour
{
[SerializeField] private ARSession session;
[SerializeField] private Text sessionStateText;
private void Awake()
{
ARSession.stateChanged += OnARStateChanged;
}
IEnumerator Start()
{
if (ARSession.state == ARSessionState.None || ARSession.state == ARSessionState.CheckingAvailability)
yield return ARSession.CheckAvailability();
if (ARSession.state == ARSessionState.Unsupported)
yield break;
session.enabled = true;
}
private void OnARStateChanged(ARSessionStateChangedEventArgs args)
{
sessionStateText.text = args.state.ToString();
}
}
ここまでできたら iOS アプリをビルドして実機で実行してみる.
カメラが表示できて,Session の状態が SessionTracking
になっていれば成功しているはず.
平面を検出して表示する
試しに平面を検出して表示してみる.
AR Foundation は何種類かの Trackable Managers を提供している. その中の AR Plane Manager を使うと,その名のとおり平面の検出ができる.
Plane Manager の Plane Prefab
には任意の prefab を設定できるが,今回は出来合いの AR Default Plane
を使う.GameObject > XR > AR Default Plane を一旦 scene に配置してから prefab 化し,prefab を Plane Manager に設定する.
検出された平面にポリゴンが表示されるようになる.
平面をタッチしてオブジェクトを置く
試しに適当なオブジェクトを平面の上に置いてみる.
いわゆる Raycasting が必要になるが,AR Foundation の提供する AR Raycast Manager を使えば簡単にできる.
AR Raycast Manager
を AR Session Origin にコンポーネントとして追加する.
Raycast Prefab
は任意なので None のままにする.
適当なクラスを作り,Raycast Manager を使って AR Plane との交点を検出し,そこに適当なオブジェクトを置いてみる.
public class AppController : MonoBehaviour
{
[SerializeField] private ARRaycastManager raycastManager;
[SerializeField] private GameObject arObjectPrefab;
private readonly List<ARRaycastHit> _raycastHits = new List<ARRaycastHit>();
private void Update()
{
if (Input.touchCount != 1) return;
var touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Ended)
{
if (raycastManager.Raycast(touch.position, _raycastHits, TrackableType.PlaneWithinPolygon))
{
var hit = _raycastHits.First();
if (hit.trackable is ARPlane)
{
Instantiate(arObjectPrefab, hit.pose.position, hit.pose.rotation);
}
}
}
}
}
少し注意するべき点としては,Raycast()
するときに TrackableType.PlaneWithinPolygon
を指定するようにする.
デフォルトだと All
になるようで,全ての平面が対象になるかつ Polygon に閉じない無限平面上で当たり判定されてしまう(違う,そうじゃない).
3D モデルは Unity Asset Store から Low-Poly Simple Nature Pack を使わせてもらった.
まとめ・感想
Unity iOS で AR アプリ開発ことはじめとして,次のことをやってみた.
- AR Foundation & ARKit をセットアップした
- AR Plane Manager で平面検出し,デフォルトのビジュアライザで平面を表示した
- AR Raycast Manager で AR Plane のどこをタッチしたのか判定した
- タッチした場所に適当な 3D オブジェクトを表示した
AR Foundation によって AR を始めるための敷居はかなり低くなっている. 一方で Plane Manager の精度はデフォルトだと驚きがある程は高くなく,エッジがずれていたり,10cm ぐらいの段差が丸められていたりする. もしかして LiDAR が有効になっていない?のは今後の課題とする.
部屋中に木をわさわさ生やすと楽しい.