はじめに
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 OriginにAR 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 Assets → Open 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にしてください。
スクリプトは以下のようにします。
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 Object、Ar CameraにはHierarchyに配置済みのRobot kyleとAR 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で動かしたいのでPlatformをiOSにしてSwith Platformします。
※結構時間かかります。

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