UnityでAR入門(AR Foundation編)


概要

UnityでARと言えばVuforiaですが、Unity製のAR Foundationもあります。VuforiaもAR FoundationもARKit/ARCoreを(全て対応しているわけではありませんが...)サポートしているもののVuforiaを用いてアプリをストアに申請する際に有料ライセンスが必要で、ARコンテンツをUnityで開発する際は、今まではVuforiaだったもののおそらく今後、AR Foundationが要件に入ってくる案件がありそうですよね。

VuforiaとAR Foundationの違い

なんといってもVuforia(PTC社)は、Unity 4.xぐらいの頃からAR技術をUnityでサポートしてきた老舗なので、圧倒的にサポート類が違い、特にSDKの機能が豊富であることかなという所感です。

AR Foundationでは、開発者自身で対応しなければならないことがVuforiaでの対応よりも多く、Unityを触って日が浅い方は、圧倒的に挫折するため最初はVuforiaでのAR開発をオススメします。
どうしてもAR Foundationを触るのであれば、まずはVuforiaでAR技術に触れつつAPI・SDKについて理解し、VuforiaがなぜAR FoundationよりもSDKの機能が豊富なのかを把握すると良いでしょう。

さらにAR Foundationが、サポートしているデバイスよりもVuforiaの方が圧倒的に多くのデバイスをサポートしているため、作ることだけでなく、作った後のこともセットに考えましょう。

前提

本記事では、ARについてやUnityの基本的な(入門関連の書籍に載ってあるような)内容は、割愛して解説していきます。
そのため、次の項目を考慮してませんのでご注意ください。

  • ARの概要について
    • Vuforia, AR Foundation, ARKit, ARCore, ...etc
  • Unityの基本的な詳細について
    • 基礎知識やアプリビルドなど

 
ARについて知りたい方は、「Unity AR 入門」などでググれば次のような記事が見つかるのでこちらなどでキャッチアップされてください。

 
また、現在2020年3月上旬時点でまとめているため、詳細が一部古くなります。

特にAR Foundation/ARKit/ARCoreは、2,3ヶ月に数回アップデートが行われているため、本記事をそのまま鵜呑みにされず、あくまでも参考程度にお願いします。

環境

  • MacBookPro Mojave 10.14
  • Unity 2019.2.9f1
    • AR Foundation 2.0.2
    • ARCore XR Plugin 2.0.2
    • ARKit XR Plugin 2.0.1
  • Test Device
    • Galaxy note8 Android 9.0

ゴール

今回は、AR Foundationを用いてUnityChanをARで表示させることです。
おそらく「UnityChan AR」などでググるとほとんどVuforiaでのAR対応が多く、AR Foundationでキャラクターを表示させる記事は少ないと思います(2020年3月上旬時点)。

この作品はユニティちゃんライセンス条項の元に提供されています

準備

次の作業を行うこと

  • UnityChan公式ユニティちゃん 3Dモデルデータのリンク先にある.unitypackageをダウンロード
  • 新規Unityプロジェクトを作成した後にPackage Managerから「AR Foundation」「ARCore XR Plugin」「ARKit XR Plugin」をインストールしておく
  • UnityChanの.unitypackageデータを開いて作成したプロジェクトにインポートする

 
今回扱うUnityChanのデータは、「Locomotion」以外のどれか好きなサンプルシーンを丸っとフル活用します。
初めて触る方は、事前にUnityChanを確認される際に間違ってわからずに何か変更して保存しないように注意しておきましょう。

AR Foundation入門

最初から全部作ることは効率が悪いため、まずAR Foundationに慣れることが必要です。

去年のAdvent Calendarで @shun-shun123さん がUnityのARFoundationでAR空間に豆腐を召喚するという記事を書かれており、ここで解説されている内容=AR Foundation入門という感じなのでやってみましょー!

ハマりポイント

上記の記事でAR Foundation入門した際にハマったポイントを紹介します。
今回はAndroidだけで検証したため、別の機会にiOSも試して情報を載せられたら追加しますmm

追加: iOSビルド

下記リンク先を参考にされてくださいー

Unityで認識した平面をポータル化して異世界を覗く【ARFoundation編】 - @ippo

1. ARCoreがサポートしているGalaxy note8がunsupported devicesとなる

同じ問題について書かれてあったフォーラムの記事を見つけ、単純にARCore XR Pluginをインストールしていないことが原因でした笑汗

AR FoundationでiOS/AndroidをターゲットにARアプリを開発される際は、必ずAR FoundationだけではなくARKit XR PluginとARCore XR Pluginも必要です(片方であれば上記記事の解説通りです)。

2. 1の対応で再度アプリビルドするとビルドエラー

次のエラー内容でエラー内容をそのままググるとIntroducing ARCore: An Android AR SDK for Unityというフォーラムの記事を見つけ、ここで解説されている設定をそのまま対応するとエラーが解消されましたー🙆‍♂️

ちなみにXR Settingsのところは特に触らなくてよく、逆にARCore Supportedにチェックをつけてしまうとまた別のエラーになります。
詳細まで追ってないので今回はスルーして別で調査しようと思いますー

UnityChan for AR

① 上記で作ったシーンをコピー
② サンプルシーンにいるUnityChan(今回使用するUnityChanは『unitychan_dynamic』になります)をコピーして1のシーンにペースト
③ 持ってきたUnityChanをunpack Prefabして新しくプレハブ化

 
 

AR Session OriginにAddComponentしているPlaceOnPlaneに付けているCubeを3で作ったUnityChanのプレハブに変更する(分かりやすいように変数名も変更)

 

⑤ スクリプトの調整

// unitychan_dynamicを使用した場合
// IdleChanger.cs

// void OnGUI()
// {
//     GUI.Box(new Rect(Screen.width - 110, 10, 100, 90), "Change Motion");
//     if (GUI.Button(new Rect(Screen.width - 100, 40, 80, 20), "Next"))
//         anim.SetBool("Next", true);
//     if (GUI.Button(new Rect(Screen.width - 100, 70, 80, 20), "Back"))
//         anim.SetBool("Back", true);
// }

public void NextAnim()
{
    anim.SetBool("Next", true);
}

public void BackAnim()
{
    anim.SetBool("Back", true);
}

⑥ uGUIでButtonを用意してNextAnimメソッドとBackAnimメソッドを登録

using UnityEngine;
using UnityEngine.UI;

public class UiManager : MonoBehaviour
{
    [SerializeField] private Button nextAnimBtn;
    [SerializeField] private Button backAnimBtn;

    public void Show(GameObject unitychan)
    {
        if (!nextAnimBtn.gameObject.activeSelf && !backAnimBtn.gameObject.activeSelf)
        {
            var script = unitychan.GetComponent<UnityChan.IdleChanger>();
            nextAnimBtn.onClick.AddListener(script.NextAnim);
            nextAnimBtn.gameObject.SetActive(true);
            backAnimBtn.onClick.AddListener(script.BackAnim);
            backAnimBtn.gameObject.SetActive(true);
        }
    }
}

PlaceOnPlane.csにスクリプトを追加

// フィールド
[SerializeField] UiManager uiManager;

// Updateメソッド 36行目あたり
// Instantiateの後にスクリプトを追加
spawnedObject = Instantiate(unitychan, hitPose.position, unitychan.transform.rotation);
uiManager.Show(spawnedObject);

Inspectorの対応と用意したButtonはDisebleに設定

ビルド結果

 

まとめ

これでAR FoundationでARアプリを作る入りが分かったんじゃないかなと思います。

ARは最初からGameObjectを配置しないため、Instantiateで生成する形になるのでARで表示させたいキャラクターなどにAddComponentしているコンポーネントにアクセスしたい時や今回のようなUI操作の場合、Instantiate後にあれこれ制御する手間がかかるなぁという所感でした。