UnityでAR Foundationでユニティちゃんを表示してみた

本記事はサムザップ <a href="https://qiita.com/advent-calendar/2020/sumzap2">サムザップ Advent Calendar 2020 #2 </a> の12/23の記事です。
昨日の記事は@ohbashunsukeさんの『<a href="https://qiita.com/ohbashunsuke/items/4c8689410138e07a3461">【Unity】新規ゲームのUI開発で気をつけた39のTips後編。</a>』でした

今回は、以前から興味があったUnity AR Foundationを触ってみたいと思います

# Unity AR Foundationとは
Unityが開発しているマルチプラットフォームのAR開発フレームワークです。
特徴としては、ARKitとARCoreのマルチプラットフォームARを簡単に作ることができます。
https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@2.1/manual/index.html

主な機能は
- World tracking : 物理空間でのデバイスの位置と方向を追跡。
- Plane detection : 水平および垂直面の検出。
- Point cloud : 特徴点の検出。
- Reference point : デバイスが追跡する任意の位置と方向の検出。
- Light estimation : 物理空間の光源と輝度の推定。
- Face tracking : 人間の顔の検出。
- Image tracking : 2D画像の検出。
- Object tracking : 3Dオブジェクトの検出。

# 開発環境
- MacBook Pro Catalina10.15.7
- Unity 2019.4.16f1
- XCode 12.xx

# 準備
- <a href="https://unity-chan.com/download/releaseNote.php?id=UnityChan">UnityChan公式のユニティちゃん</a>の
3Dモデルデータを使いたいのでダウンロードしておいてください

# 簡単なARアプリを作成してみよう
1.サンプル用のプロジェクトを作成する　今回はARFoundationSampleとします
![スクリーンショット 2020-12-22 2.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/cb54fa75-4bd9-cdad-7e55-08d941848507.png)

2.window>Package ManagerにてARFoundationをインストールする
![スクリーンショット 2020-12-22 2.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/244bd300-0d7c-11e6-2626-dc749a6f187c.png)
同じようにXR Pluginなどもインストールします。

・AR Foundation 2.2.10
・AR Subsystems 
・ARCore XR Plugin（Androidで必要）
・ARKit XR Plugin 2.1.0（iOSで必要）
・ARKit Face Tracking（iOSで必要）

![スクリーンショット 2020-12-22 2.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/76dd2a85-2252-2d46-dad3-f9d0c632447e.png)


3.Main Camera 、DirectionalLightを削除して、代わりにAR Cameraを導入します。

4.GameObjectをヒエラルキーに追加して、
GameObject > XR > AR Aession Originと
GameObject > XR > AR Session
を追加してください

## AR Aessionとは？
ARエクスペリエンスのライフサイクルを制御するオブジェクト

## AR Aession Originとは？
ARアプリ開始時の端末の位置の原点となるオブジェクトです。
このオブジェクトの子ノードとして、AR空間内のカメラや3Dオブジェクトを配置します。

![スクリーンショット 2020-12-21 17.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/7d984a68-496f-2364-ea59-9f8bc5c69810.png)

5.先ほどDownloadしておいたUnityChan_1_2_1.unitypackageをimoportする
とりあえず気にせずに全て追加する
![スクリーンショット 2020-12-21 21.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/0c590185-cba8-f63b-55e7-523eba8f7608.png)

6.一旦ビルドしてみると以下のようなエラーが出るので
System.Security.Policyのクラスを利用していないため、using節からSystem.Security.Policyを削除しておいてください
![スクリーンショット 2020-12-21 21.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/58c4f885-a313-764b-5bc4-c09262393c5b.png)

7.サンプルシーンにいるUnityChanをヒエアルキーに追加する
![スクリーンショット 2020-12-21 23.36.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/8d40273d-beee-866d-3356-f336f9cd01c3.png)

8.UnityChanをunpack Prefabしてプレハブ化してください
![スクリーンショット 2020-12-21 23.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/f3f2254c-7103-b893-59cc-baa257725d89.png)

9.ヒエアルキーからフォルダにドラッグアンドドロップする
![スクリーンショット 2020-12-21 23.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/728a7921-faaa-ded8-8ba0-301223a4d907.png)

10.Unitychanを置くために、AR Session Origin >Inspector>Add ComponentでARRaycast Managerを追加する。
![スクリーンショット 2020-12-21 23.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/8337bd4e-f3ff-7bed-1ee1-33f4862e0d16.png)

11.AR空間のタッチした位置に3Dオブジェクトを配置する機能を追加してみます
今回は、ARManager.csというスクリプトを作成します

```
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.XR.ARFoundation;

[RequireComponent(typeof(ARRaycastManager))]
public class ARManager : MonoBehaviour
{
    //配置したいオブジェクト
    [SerializeField]
    GameObject modelPrefab;
    private ARRaycastManager raycastManager;
    private List<ARRaycastHit> raycastHitList = new List<ARRaycastHit>();

    void Start()
    {
        raycastManager = GetComponent<ARRaycastManager>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (raycastManager.Raycast(Input.GetTouch(0).position, raycastHitList))
            {
                Instantiate(modelPrefab, raycastHitList[0].pose.position, Quaternion.identity);
            }
        }
    }
}
```

12.作成したスクリプトをAR Session Origin オブジェクトにアタッチする。
![スクリーンショット 2020-12-21 23.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/5b2d2ec0-ee87-f940-7c27-2b315c3c9d60.png)

13.手順9で作成したUnitychanのprefabをアタッチする。
![スクリーンショット 2020-12-22 0.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/678ce041-690b-f1b0-624a-12c4d8d8d333.png)

# ビルド
iOS向けにビルドする。
※今回手持ちのAndroid端末でARCoreのバージョンに対応していなかったのでAndroidは今回割愛させていただきます。

(1) メニュー「File → Build Setting → Player Settings」を選択。
(2)「Player」の「Other Settings」で以下の設定を行う。

・Camera Usage Description : AR機能にカメラを使います。
・Target minimum iOS Version : 12.0
・Architecture : ARM64

![スクリーンショット 2020-12-23 3.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/bfd35064-6352-7e3e-7e86-dafc84647258.png)

# 実機で確認してみよう
こんな感じで表示させることができました。
![Screen Shot 2020-12-23 at 3.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/c68948dd-8327-5c40-1105-51a5c2947370.png)

実際はアニメーションさせて、動いたり、ダンスしたりなどモーションが欲しいところですが、そこまで知識がないので今回は単純に表示させるところでこの記事を終わりたいと思います。

# まとめ
今回AR Foundationを使うことで、コードをほぼ書かずとしても簡単にAR空間上にモデル表示させることができました。
まだまだAR Foundationには顔認識などいろいろ機能があるのでまた別の機会に触ってみたいと思います。

明日は @m-nakayama さんの番です。

なお、このコンテンツは、<a herf="https://unity-chan.com/contents/license_jp/">『ユニティちゃんライセンス』</a>で提供されています
![imageLicenseLogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96091/4a8c441d-2b8c-5d98-9983-3faaf51470fc.png)