UnityでARKit3を動かすためにAR Foundationを使ってみる


前置き

最近何かとARKit3が話題ですね。ARKit3をUnityで使いたい場合はどうすればいいでしょうか?

ARKit2.0まではUnity-ARKit-Pluginを用いることでUnityでARKitを使うことができましたが、ARKit3についてUnity-ARKit-Pluginの公式ページには以下のように書かれています。

This plugin will not be updated to support ARKit 3 features. Please use AR Foundation in order to access all ARKit features going forward.

Unity-ARKit-Pluginではなく、今後はAR Foundationにてサポートしていくようです。そのため来たるARKit3公式リリースに備え、AR Foundationを使ってみましょう。

※ARKit3はiOS13でしか動作せず、iOS13はまだApple Developer Programの開発者にのみ公開されたベータ版で、NDAに基づき情報が公開できないため、公式リリースしたら別途まとめたいと思います。

AR Foundationとは?

「ARKit・ARCoreをUnityで用いるためのマルチプラットフォーム API」
という認識で良いと思います。今後も対応プラットフォームは増えるそうです。

公式ページには以下のように記述されています。

AR 開発に伴う様々な難しい問題の解決に役立つマルチプラットフォーム API とユーティリティを開発しました。私たちはこれを AR Foundation と名付けました。

AR Foundationについて詳しくは以下のページが参考になるかと思います。(というかほぼ内容一緒です。。)
【Unity】AR Foundation(ARKitとARCoreのマルチプラットフォームAR環境)の超入門

AR Foundationの導入方法

Package Managerを使って導入します。
ファイルメニューからWindow > Package Managerを開き、
- AR Foundation (2.2.0)
- ARKit XR Plugin (2.1.0)
をインストールします。

ARKit XR PluginのChangelogを見てみると、2.2.0からARKit 3の機能が含まれてしまうため、iOS13でない場合、実機でエラーが出てしまいます。そのため、ARKit XR Pluginはバージョン2.1.0を使いました。
https://docs.unity3d.com/Packages/[email protected]/changelog/CHANGELOG.html

(Unityのバージョンは2019.1.5f1を使用しました。)

ARに必要なコンポーネントの配置

新しくシーンを開きます。デフォルトで配置されているMain Cameraは削除しましょう。

続いて、ファイルメニューから
- GameObject > XR > AR SessionOrigin
- GameObject > XR > AR Session
を選択してシーンに追加します。

ここでARSessionOriginはARCameraや検出した平面・point cloudなどのARのセットアップに必要なオブジェクトをまとめる親オブジェクトです。

ARSessionはAR体験のライフサイクルを制御します。ARSessionは開始、停止、再開、終了が行えます。

検出した平面を表示する

検出した平面を表示してみます。

ヒエラルキーのAR Session OriginオブジェクトにARPlaneManager.csをアタッチします。
Detection Mode はEverythingにしましょう。Horizontal,Verticalを同時に検出します。

続いて検出した平面を可視化するPlaneを作成します。
ファイルメニューから GameObject > XR > AR Default Planeを選択してシーンに追加後、プロジェクトウインドウにドラッグ&ドロップしPrefab化します。
作成したAR Default Plane PrefabをAR Session OriginオブジェクトのARPlaneManager.csコンポーネントのPlane Prefabにドラッグアンドドロップします。

AR空間のタッチした位置にオブジェクトを配置

平面上のタッチした位置にCubeを置いてみましょう。
画面のタッチされた位置から検出した平面までRayを飛ばす必要があります。
Rayを飛ばすためにAR Session OriginオブジェクトにARRaycastManager.csをアタッチします。

ここで、以下のスクリプトを作成します。

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

[RequireComponent(typeof(ARRaycastManager))]
public class CreateObject : MonoBehaviour
{
    [SerializeField]
    GameObject objectPrefab;

    ARRaycastManager raycastManager;
    List<ARRaycastHit> hitResults = new List<ARRaycastHit>();

    void Awake()
    {
        raycastManager = GetComponent<ARRaycastManager>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (raycastManager.Raycast(Input.GetTouch(0).position, hitResults))
            {
                Instantiate(objectPrefab, hitResults[0].pose.position, Quaternion.identity);
            }
        }
    }
}

作成した CreateObject.csAR Session Origin オブジェクトにアタッチします。
CubeなどのPrefabを作成し、Object Prefabにドラッグ&ドロップでアタッチします。

実機で確認

XCodeプロジェクトにビルドし、実機で確認してみます。

画像のように平面を検出し、タッチした位置にオブジェクトを配置できました。

AR Foundationを触ってみた所感

導入がすごく楽です。今まではBitbucketからzipをダウンロードしてインポートの流れでしたが、Package Managerからぽちぽちでインストールできるので大変楽です。ARKitRemoteのようにUnity Editor上でARの動作のデバッグができないのが難点でしょうか。

ARKit3を扱う場合

導入方法の項でも書きましたが、ARKit XR Pluginはバージョンを2.2.0にあげればARKit3の機能を扱うことができます。
そしてApple Developer Programに登録し、XCode11をダウンロード、実機のOSをiOS13にアップデートする必要があります。XCode11だけなら無料の開発者アカウントでもダウンロードできますが、iOS13にアップデートするには年間登録料99米ドルを支払ってメンバーシップを変更する必要があります。

以下の公式レポジトリにサンプル集があります。masterブランチにはARKit3のサンプルも含まれており、Apple Developer Programの開発者は実機にて動作させることができますので、そちらで実際にARKit3を体験することができます。
https://github.com/Unity-Technologies/arfoundation-samples

参考ページ

http://tsubakit1.hateblo.jp/entry/2018/11/21/211400
https://docs.unity3d.com/Packages/[email protected]/manual/index.html