【Unity】ARFoundationを使ってオブジェクトを配置する


はじめに

ARFoundationを使って、平面にARオブジェクトを配置するスタンダードなアプリを作ります。
オブジェクトのデバック用に使うことも多いので備忘録として残しておきます。

初学者にも分かり易いようなUnity×ARのHelloWorld的記事に仕上げましたので、
手を動かしながら作ってみるといいかもです。

環境

MacBook Pro : Catalina 10.15.5
Unity : 2019.4.0f1
Xcode : 11.5
iPhone 11Pro : 13.5.1

ARプロジェクトの準備

Packageのインストール

ファイルメニューのWindow > Package Managerから以下の2つをインポートします。
・AR Foundation(4.0.2)
・ARKit XR Plugin(4.0.1)
※「AR」で検索すると見つかりやすいです。

AR Session Origin、 AR Sessionコンポーネントの配置

Hierarchyウインドウで右クリックし、以下の2つを追加します。
・XR -> AR Session
・XR -> AR Session Origin
※Packageが正しくインストールされていると「XR」の項目が追加されています。

Main Cameraの削除

ARプロジェクトではAR Cameraを利用するのでMain Cameraは削除しておきます。

検出した平面の可視化

AR Plane Manager.csというスクリプトを使用して、検出した平面を可視化させます。
不必要な場合はこのセクションを飛ばしてしまっても問題ありません。

AR Default PlaneのPrefab化

もう一度Hierarchyウインドウで右クリックし、AR Default Planeを追加します。
・XR -> AR Default Plane

追加したらAR Default PlaneをPrefab化してHierarchyからは削除します。

AR Plane Managerをアタッチ

Hierarchyに配置済みのAR Session OriginAR Plane Manager.csをアタッチします。
InspectorのPlane Prefabには、先ほどPrefab化したAR Default Planeをアタッチしましょう。
Detection Modeを変更することで、水平や垂直のみを検出するように変更が可能です。

タップ位置にARオブジェクトを配置する

AR Placement Manager.csというスクリプトを作成し、タップした位置にrayを照射して、平面にぶつかった場合のみARオブジェクトを配置します。
今回はAsset Storeからインポートした、ロボットをARで出現させます。

ロボットのインポート

下記URLからロボットをインポートします。
Add to My AssetsOpen in Unityボタンとクリックすると、「Unityを開きますか?」とポップアップが出現するので許可をします。
https://assetstore.unity.com/packages/3d/characters/robots/space-robot-kyle-4696

UnityのPackage Managerに飛ぶのでインポートをクリックします。
ProjectのAssets直下にRobot Kyleが追加されていれば大丈夫です。

シーンにロボットを追加

Assets -> Robot Kyle -> Model -> Robot Kyleをシーンにドラッグアンドドロップします。
シーンに追加されたRobot KyleはInspectorからチェックを外し、非アクティブにしておきましょう。
また、Animationも利用しないためチェックを外しておきます。

※ARで表示させたいオブジェクトが大きすぎると、モデルの内側にカメラが埋まってしまい、モデルを確認できない場合があります。必要に応じてScaleを変更しておきましょう。
今回は(0.1, 0.1, 0.1)に変更します。

AR Placement Managerの作成

ARオブジェクトの配置を管理するAR Placement Manager.csを作成します。
Project内で右クリック、Create -> C# Script で名前はARPlacementManagerにしてください。
スクリプトは以下のようにします。

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

//ゲームオブジェクトにアタッチすると、ARRaycastManager.csを必要な依存関係として自動的に加える。
[RequireComponent(typeof(ARRaycastManager))]
public class ARPlacementManager : MonoBehaviour
{
    [SerializeField]
    GameObject arObject;            //ARで表示するオブジェクト
    [SerializeField]
    private GameObject arCamera;    //ARで利用するカメラ
    ARRaycastManager raycastManager;
    List<ARRaycastHit> hitResults = new List<ARRaycastHit>();

    void Awake()
    {
        //RequireComponentで追加されたARRaycastManager.csを代入する。
        raycastManager = GetComponent<ARRaycastManager>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {

            //rayを照射して平面に当たっていた場合。
            if (raycastManager.Raycast(Input.GetTouch(0).position, hitResults))
            {

                //arObjectが非アクティブの場合、アクティブにする。
                if (arObject.activeSelf == false)
                {
                    arObject.SetActive(true);
                }

                //キャラクターがarカメラを向く。
                arObject.transform.position = hitResults[0].pose.position;
                Quaternion lookRotation = Quaternion.LookRotation(arCamera.transform.position - arObject.transform.position, Vector3.up);
                lookRotation.z = 0;
                lookRotation.x = 0;
                arObject.transform.rotation = Quaternion.Lerp(arObject.transform.rotation, lookRotation, 1);
            }
            else
            {
                return;
            }
        }
    }
}

作成したスクリプトは、Assets直下にScriptsフォルダ作って管理すると良さそうです。

AR Placement Managerのアタッチ

AR Session Originに、作成したAR Plane Manager.csをアタッチします。
InspectorのAr ObjectAr CameraにはHierarchyに配置済みのRobot kyleAR Cameraをアタッチします。

Project Settings

カメラの利用許可

カメラの利用を許可しないと、ビルド後にiPhoneのカメラが使えません。
Xcodeでも記述できますが、Unity側で設定してしまいましょう。

ファイルメニューのEdit -> Project Settingsを選択し、Project Settingsを開きます。
Player -> Configuration -> Camera Usage Discriptionにテキストを記入することで、カメラの利用許可を求められるようになります。

XR Plug-in Management

ARFoundation4.0からPlug-in Providersの設定が必要になりました。
XR -> XR Plug-in Management -> Plug-in Providers -> ARKitにチェックを入れましょう。

Build

ファイルメニューのEdit -> Build Settingsを選択し、Add Open Scenesをクリックして作成したシーンをScenes In Buildに追加します。
今回はiPhoneで動かしたいのでPlatformiOSにしてSwith Platformします。
※結構時間かかります。

Swith Platformが終了したらBuildしましょう。Unityでの作業は以上になります。

動作確認

タップ時に正面を向いてくれるように配置されれば完成です。
お疲れ様でした!