OGP

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 SessionAR 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 になっていれば成功しているはず.

session-tracking.png

平面を検出して表示する

試しに平面を検出して表示してみる.

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 に設定する.

ar-plane-manager.png

検出された平面にポリゴンが表示されるようになる.

plane-tracking.png

平面をタッチしてオブジェクトを置く

試しに適当なオブジェクトを平面の上に置いてみる.

いわゆる 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 を使わせてもらった.

ar-raycasting.png

まとめ・感想

Unity iOS で AR アプリ開発ことはじめとして,次のことをやってみた.

  • AR Foundation & ARKit をセットアップした
  • AR Plane Manager で平面検出し,デフォルトのビジュアライザで平面を表示した
  • AR Raycast Manager で AR Plane のどこをタッチしたのか判定した
  • タッチした場所に適当な 3D オブジェクトを表示した

AR Foundation によって AR を始めるための敷居はかなり低くなっている. 一方で Plane Manager の精度はデフォルトだと驚きがある程は高くなく,エッジがずれていたり,10cm ぐらいの段差が丸められていたりする. もしかして LiDAR が有効になっていない?のは今後の課題とする.

部屋中に木をわさわさ生やすと楽しい.

:herb:

References