おもちゃラボ

Unityで遊びを作ってます

【AR Foundation】平面上にモデルを置く

前回はAR Foundationを使って平面を検出しました。今回は検出した平面上にARのオブジェクトを配置する方法を紹介します。アプリを起動し、検出した平面をタップすると、タップした場所にオブジェクトが表示されます。

f:id:nn_hokuson:20200731152019j:plain

作成の流れは次のようになります。

AR Foundationの基礎になっているARKitについては「swiftで作る ARKit超入門」がオススメです!ぜひご参照ください。
booth.pm

AR Foundationのセットアップ

Unityを起動して、3Dのプロジェクトを作成します。プロジェクトが出来たらPackage ManagerからAR FoundationとARKIt XR Pluginをインストールして下さい。AR Foundationのインストール手順については、次の記事で詳しく説明しているので、こちらを参照下さい。

nn-hokuson.hatenablog.com

AR Foundationがインストールできたら、シーンにAR SessionとAR Session Originを追加します。ヒエラルキーウインドウの「+」をクリックして「XR→AR Session Origin」と「XR→AR Session」を追加しましょう。

f:id:nn_hokuson:20200706161216p:plain:w300 f:id:nn_hokuson:20200706161241p:plain:w300

AR Session Originの子要素にはAR用のカメラが追加されているため、最初からあるMain Cameraは不要です。削除しておきましょう。これで、UnityでAR Foundationを使うための準備が整いました。

平面検出

次にAR Foundationで平面を検出できるようにします。AR Session Originオブジェクトを選択して、インスペクタのAdd Componentボタンをクリックし、AR Plane Managerコンポーネントをアタッチします。

f:id:nn_hokuson:20200706161519p:plain:w300

今回、Plane PrefabはNoneのままにしておきましょう。これをNoneにすると、AR Foundationでは内部的に平面が行われるようになり、検出した平面は表示されなくなります。

タップした場所にオブジェクトを配置する

次にタップした場所にうさぎのモデルを配置するためのスクリプトを作成します。プロジェクトウィンドウで右クリックして、「Create→C# Script」を選択し、Spawnという名前で保存して下さい。

f:id:nn_hokuson:20200731113814p:plain:w240

ファイルができたら、次のスクリプトを入力して下さい。

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コンポーネントも自動的にアタッチされます。

f:id:nn_hokuson:20200731132233j:plain

モデルの準備

表示するモデルには、自分の好きなPrefabを指定できます。とりあえず試したい方ようにうさぎのPrefabを用意しました。次のリンクからダウンロードできます。

https://app.box.com/s/cuuoaqejxr9w4xztudm9folrassfi9hl

パッケージがダウンロードできたら、ダウルクリックしてプロジェクトに追加しておきましょう。Assets/Rabbit/RabbitPrefabが今回使用するPrefabです。これを先程のスクリプトのSpawnObject欄にドラッグ&ドロップして下さい。

f:id:nn_hokuson:20200731130912j:plain

また今回、平面をタップしたことを検出したいので、SpawnコンポーネントのType欄には「Plane Within Bounds」を設定しておきましょう。

f:id:nn_hokuson:20200731130242p:plain:w350

ビルドする

最後にプロジェクトをビルドして、スマートフォンにインストールしましょう。ビルドするための設定は次ページの「ビルドする」の項目を参照して下さい。

nn-hokuson.hatenablog.com

インストールできたらアプリを起動して、端末を動かして平面を検出します。次に検出した平面をタップすると、そこに指定したモデルが表示されることを確認して下さい。

f:id:nn_hokuson:20200731151654g:plain