• トップ
  • ブログ一覧
  • 【Unity】ARFoundation入門~機能解説から平面検知の実装まで~
  • 【Unity】ARFoundation入門~機能解説から平面検知の実装まで~

    広告メディア事業部広告メディア事業部
    2021.02.23

    IT技術

    ARFoundationとは?

    今回は、Unity を使った AR 開発の導入部分について、解説していきたいと思います!

    ARFoundation とは、Unity が開発している、AR 開発用のフレームワークです。

    イメージ的には、iOS と Android で別々の実装をしなくてもいい、というとても便利なもの。

    iOS でビルドするときは ARKit で、Android でビルドするときは ARCore で動作するようにしてくれます。

    では早速、見ていきましょう!

    ARFoundationの導入

    まずは、ARFoundation を使用するためのセットアップをしていきましょう!

    ここでは、「Unity2019.4.9f1」「iOS ビルド環境」で進めていきます。

    ビルド環境は、Android でも操作に違いはありません。

    プラグインのインストール

    3D プロジェクトを立ち上げて、必要なプラグインをインストールしていきます。

    Window → Package Manager」から進めていきましょう!

    プラグインのインストール

    次に、Package Manager ウィンドウから、以下の3つをインストールしていきます。

    1. ARFoundation
    2. ARkit XR Plugin
    3. ARCore XR Plugin
    Package Manager ウィンドウから3つをインストール

    ARFoundation をインストールすると、必要なプラグインが、同時にインストールされます。

    ARkit と ARCore は、必要に応じて、どちらか片方でも構いません。

    ( ARkit は iOS、ARCore は Android )

    シーンのセットアップ

    次に、シーン内のセットアップをしていきましょう!

    まずは、デフォルトで Hierarchy に入っている、Main Camera を削除します。

    今、Hierarchy には、Directional Light だけがある状態です。

    次に、「AR Session」と「AR Session Origin」を加えます。

    手順は、まず Hierarchy 上で右クリック して、「XR → AR Session、AR Session Origin」と進みます。

    シーンのセットアップ

    これで、ARFoundation で開発するための準備が完了しました!

    AR SessionとAR Session Origin

    先ほど追加した2つの項目は、AR 開発において欠かせないものです。

    では、この2つについて、簡単に説明していきます。

    ARSession

    AR シーンには、ARSession コンポーネントを含める必要があります。

    ARSession は、AR のライフサイクルを制御するコンポーネントです。

    Session は、AR 環境の「プロセス」という意味もあり、AR シーンのプロセスの管理をすると言った方が、イメージしやすいかもしれません。

    ARSession Origin

    ARSesion Origin も、AR シーンには欠かせないコンポーネントです。

    デバイスを通して、読み込まれた現実空間の情報は、Session Space で管理されます。

    Session Space の情報を、Unityシーンの「位置・方向・スケール」に変換するのが、ARSession Origin です。

    また、現実空間では、シーンが開始されたときのデバイスの位置が座標の原点となります。

    ですが、Unity シーンでは、ARSession Origin が原点となるのです。

    デフォルトで、「ARCamera」が子オブジェクトに含まれていて、それが AR アプリでのカメラになります。

    人によるかと思いますが、この ARCamera のタグを、MainCamera に変えておくと便利かもしれません。

    ARCamera のタグを、MainCamera に変えておく

    平面検知を実装しよう!

    セットアップが終わったら、現実空間の平面を検知して、そこにオブジェクトを配置してみましょう!

    今回は、タップした平面上の位置に、オブジェクトを配置するようにしていきます。

    オブジェクトは、お好みで作ってもらって構いませんが、ここでは赤いキューブを使用します。

    使用するオブジェクトは、Prefab を作成し、Hierarchy からは削除しておいてください。

    また、オブジェクトを作る際は大きさに注意してください。

    Unity シーンでの1ユニットは現実空間では1メートルになります。

    平面検知を実装しよう

    ARPlane ManagerとARRaycast Managerの追加

    Unity で、平面検知をするのに、コードを書く必要はありません。

    ARPlane Maneger コンポーネントを、ARSession Origin に加えるだけで、自動的に平面検知を行ってくれます。

    今回は、Raycast を使用するので、ARRaycast Manager コンポーネントも必要になります。

    それでは、ARPlane Manager と、ARRaycast Manager を加えていきましょう。

    1. ARSessionOrigin を選択
    2. Add Component
    3. AR で検索
    4. ARPlane Manager, ARRaycast Manager

    の順に進めていきます。

    ARPlane ManagerとARRaycast Managerの追加

    ARPlane Maneger コンポーネントを見ると、ARPlane Prefab の項目が空になっています。

    ARPlane は、検知した平面を、デバイス上で可視化するのに必要なものです。

    次は、これを作って、ARPlane Manager にアタッチしましょう。

    まず、Hierarchy 上で右クリックをして「XR → AR Default Plane」の順に進めていきます。

    Hierarchy 上で右クリックをして「XR → AR Default Plane」の順に進めていく

    AR Default Plane のプレハブ化は、ARPlane Manager の ARPlane Prefab の項目にアタッチします。

    AR Default Plane のプレハブ化は、ARPlane Manager の ARPlane Prefab の項目にアタッチ

    ここまでできたら、平面が検知され、画面上に表示されるようになります。

    スクリプトの作成

    検知された平面に、オブジェクトを配置するコードを書いていきましょう!

    ここでは、「SpawnManager」という名前のスクリプトを、以下のように作成しました。

    1using System.Collections.Generic;
    2using UnityEngine;
    3
    4//ARFoundationを使用する際に追加するネームスペース
    5using UnityEngine.XR.ARFoundation;
    6using UnityEngine.XR.ARSubsystems;
    7
    8public class SpawnManager : MonoBehaviour
    9{
    10    [SerializeField] GameObject redCube;//生成するオブジェクト
    11    private ARRaycastManager arRaycastManager;
    12    private List<ARRaycastHit> hits = new List<ARRaycastHit>();
    13     
    14
    15    void Start()
    16    {
    17        arRaycastManager = GetComponent<ARRaycastManager>();
    18    }
    19    
    20    void Update()
    21    {
    22        if(Input.touchCount > 0)
    23        {
    24            Touch touch = Input.GetTouch(0);
    25            if(touch.phase == TouchPhase.Began)  //画面に指が触れた時に処理する
    26            {
    27                if (arRaycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon))
    28                {
    29                    Pose hitPose = hits[0].pose;  //RayとARPlaneが衝突しところのPose
    30                    Instantiate(redCube, hitPose.position, hitPose.rotation);  //オブジェクトの生成
    31                }
    32            }
    33        }
    34    }
    35
    36    
    37}

    タッチした場所に、すぐにオブジェクトが生成され、そこから動くことがないようなコードが書いてあります。

    ですが、Touch.phase によって処理を変えると、オブジェクトの生成の仕方を変えることもできます。

    AR シーンで、Raycast を使用するときは、Physics.Raycast ではなく ARRaycastManager.Raycast を使用する点に注意してください。

    また、Raycast の最後の引数にある TrackableType は、XR でデバイスが追跡可能なオブジェクトのタイプを指定します。

    このスクリプトでは、ポリゴンを用いて、平面と Ray の衝突を追跡するようになっています。

    コードを書き終えたら、シーンに戻って、できたスクリプトを ARSession Origin に追加しましょう。

    そしたら、RedCube の項目に、作っておいたプレハブをアタッチしてください。

    RedCube の項目に、作っておいたプレハブをアタッチ

    Build Settingを変更する

    最後に、Build Setting を変更していきましょう。

    この章では、iOS と Android に分けて、説明していきます。

    以下は、ProjectSettings の Player 項目の内容です。

    iOSの場合

    まずは、Other Setting を開き、以下の順で進めていきましょう。

    1. Require ARKit Support にチェック
    2. Target minimum iOS Version を、11以上に変更
    3. Architecture を ARM64 に変更
    iOSの場合

    Require ARKit Support にチェックを入れると、Camera Usage Description に、自動でコメントが追加されます。

    Require ARKit Support にチェックを入れると、Camera Usage Description に、自動でコメントが追加される

    Androidの場合

    Android の場合は、まず Other Setting を開き、Minimum API Level を7.0以上に変更してください。

    Androidの場合

    次に、Graphics APIs から Vulkan を削除します。

    Graphics APIs から Vulkan を削除

    以上で、セッティングは完了となります!

    実機で確認してみよう!

    Build Setting まで終わったら、ビルドをして、実機で動かしてみてください。

    以下のような動きがみられれば、成功です!

    実機で確認してみよう

    さいごに

    今回は、ARFoundation 入門として、機能解説から平面検知の実装までを紹介していきました。

    思っていたほど、むずかしくはなかったのではないでしょうか?

    では今回も、最後まで読んでいただきありがとうございました!

    この記事が、ARFundation を使ってみようという方にとって、少しでもお役に立てれば嬉しいです!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background