前回はAR Foundationを使って平面を検出しました。今回は検出した平面上にARのオブジェクトを配置する方法を紹介します。アプリを起動し、検出した平面をタップすると、タップした場所にオブジェクトが表示されます。
作成の流れは次のようになります。
AR Foundationの基礎になっているARKitについては「swiftで作る ARKit超入門」がオススメです!ぜひご参照ください。
booth.pm
AR Foundationのセットアップ
Unityを起動して、3Dのプロジェクトを作成します。プロジェクトが出来たらPackage ManagerからAR FoundationとARKIt XR Pluginをインストールして下さい。AR Foundationのインストール手順については、次の記事で詳しく説明しているので、こちらを参照下さい。
AR Foundationがインストールできたら、シーンにAR SessionとAR Session Originを追加します。ヒエラルキーウインドウの「+」をクリックして「XR→AR Session Origin」と「XR→AR Session」を追加しましょう。
AR Session Originの子要素にはAR用のカメラが追加されているため、最初からあるMain Cameraは不要です。削除しておきましょう。これで、UnityでAR Foundationを使うための準備が整いました。
平面検出
次にAR Foundationで平面を検出できるようにします。AR Session Originオブジェクトを選択して、インスペクタのAdd Componentボタンをクリックし、AR Plane Managerコンポーネントをアタッチします。
今回、Plane PrefabはNoneのままにしておきましょう。これをNoneにすると、AR Foundationでは内部的に平面が行われるようになり、検出した平面は表示されなくなります。
タップした場所にオブジェクトを配置する
次にタップした場所にうさぎのモデルを配置するためのスクリプトを作成します。プロジェクトウィンドウで右クリックして、「Create→C# Script」を選択し、Spawnという名前で保存して下さい。
ファイルができたら、次のスクリプトを入力して下さい。
using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; [RequireComponent(typeof(ARRaycastManager))] public class Spawn : MonoBehaviour { [SerializeField] GameObject objectPrefab; public TrackableType type; ARRaycastManager raycastManager; List<ARRaycastHit> hitResults = new List<ARRaycastHit>(); void Start() { raycastManager = GetComponent<ARRaycastManager>(); } void Update() { if (Input.GetMouseButtonDown(0)) { if (raycastManager.Raycast(Input.GetTouch(0).position, hitResults, TrackableType.All)) { Instantiate(objectPrefab, hitResults[0].pose.position, Quaternion.identity); } } } }
このスクリプトではAR Raycast Managerコンポーネントを使用するため、classの宣言の手前にRequireComponentを使ってARRaycastManagerを指定しています。こうすることで、このスクリプトをアタッチしたときに、自動的にAR Raycast Mangerコンポーネントもアタッチされるようになります。
タップした場所にモデルを配置するため、ARRaycastManagerクラスのRaycastメソッドを使用しています。このメソッドは画面上のタップした座標を指定すると、そこからRayを飛ばして平面とぶつかった座標をARRaycastHitのリストに詰めて返してくれます。
第三引数で指定しているTrackableTypeでは、Rayが当たる対象を指定できます。指定できる値には次のようなものがあります。
Type | 意味 |
---|---|
None | 検出しない |
PlaneWithinPolygon | 形状に沿った平面 |
PlaneWithinBounds | 矩形平面 |
PlaneWithinInfinity | 無限遠の平面 |
Planes | すべての種類の平面 |
FeaturePoint | 特徴点 |
All | 全てのタイプを検出 |
スクリプトが入力できたら、AR Session Originオブジェクトにドラッグ&ドロップしてアタッチしておきましょう。RequireComponentを指定したので、ARRaycastManagerコンポーネントも自動的にアタッチされます。
モデルの準備
表示するモデルには、自分の好きなPrefabを指定できます。とりあえず試したい方ようにうさぎのPrefabを用意しました。次のリンクからダウンロードできます。
https://app.box.com/s/cuuoaqejxr9w4xztudm9folrassfi9hl
パッケージがダウンロードできたら、ダウルクリックしてプロジェクトに追加しておきましょう。Assets/Rabbit/RabbitPrefabが今回使用するPrefabです。これを先程のスクリプトのSpawnObject欄にドラッグ&ドロップして下さい。
また今回、平面をタップしたことを検出したいので、SpawnコンポーネントのType欄には「Plane Within Bounds」を設定しておきましょう。
ビルドする
最後にプロジェクトをビルドして、スマートフォンにインストールしましょう。ビルドするための設定は次ページの「ビルドする」の項目を参照して下さい。
インストールできたらアプリを起動して、端末を動かして平面を検出します。次に検出した平面をタップすると、そこに指定したモデルが表示されることを確認して下さい。