UnityでiOS向けのARアプリを開発する方法 ( AR Foundation + ARKit-XR-Plugin 導入編 )

# はじめに
## Unity-ARKit-Plugin から AR Foundation への変遷
従来、UnityでARKitプラグインを用いた開発を行う場合、Unity Technologies Inc. が提供している __「Unity-ARKit-Plugin ( Deprecated ) 」__ を Unity Assets Store からインストールすれば良かったのですが、2019年6月以降、こちらのプラグインが非推奨 ( Deprecated ) となりました。では今後、iOS ( ARKit ) 向けにARアプリケーションを開発を進めるためにはどうしたら良いのか？実は  __「AR Foundation (Preview) 」__ 、__「ARKit-XR-Plugin」__ が Unity Package Manager にて公開されているので、この2つのパッケージをインストールすることで開発を継続することが可能です __<font color="red">( ARKit 3.0 対応済 )</font>__

## Unityでスマホ向けARアプリケーションを開発する手法 ( Handheld )

主に、以下2種類の方法が存在します __<font color="red">( ※図1、赤枠で囲んだ範囲は既に廃止 )</font>__

- __[AR Foundation](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0/manual/)__ __を使って、iOS, Android 向けのアプリケーションを開発する方法__
- __[ARCore SDK for Unity](https://developers.google.com/ar/develop/unity/quickstart-ios)__ を使って、iOS, Android 向けのアプリケーションを開発する方法

> <a href="https://blogs.unity3d.com/jp/2018/12/18/unitys-handheld-ar-ecosystem-ar-foundation-arcore-and-arkit/?_ga=2.117997769.1981158098.1566289349-2040198668.1552376445"><img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/21/10862/f0e67bad-72f5-4c38-a014-b910206934db.png" width="750"></a> 
>
> __図1: [Unity Handheld's AR Ecosystem](https://blogs.unity3d.com/jp/2018/12/18/unitys-handheld-ar-ecosystem-ar-foundation-arcore-and-arkit/?_ga=2.117997769.1981158098.1566289349-2040198668.1552376445) より引用。__

※ 上記の手法以外に [__MRTKv2__](https://github.com/microsoft/MixedRealityToolkit-Unity) を使うことも可能ですが、今回は  __「AR Foundation / ARKit-XR-Plugin 」__ を活用して、iOS ( ARKit ) 向けのARアプリケーション開発を進めていきたいと思います。
  

# 開発環境
前提条件として、__Unityの基礎知識・操作方法__ を理解されている方を対象とします。

- __Surface Book 2__ ( Windows 10 pro )
  - Unity 2019.1.7f1
    - AR Foundation / ARKit XR Plugin ( Unity Package Manager )
- __Mac Book Pro__ ( macOS Mojave )
  - XCode 10.3
- __iPhone XS__ ( iOS 12.3 )

<font color="red">__※  Mac Book 上で Unity を動作させて開発を行うことも可能です。__</font>
 
# ARFoundation / ARKit-XR-Plugin 導入編
本セクションでは、__[arfoundation-samples ( GitHub ) ](https://github.com/Unity-Technologies/arfoundation-samples)__ 上にあるサンプルコードを元に、 iPhone XS ( iOS ) 向けにサンプルをデプロイするまでの一連の流れをご紹介したいと思います。大まかな作業内容を以下の通りです。<font color="red">__( ※ 各パッケージ、Unity等のバージョン違いで動作しない問題があるので注意してください。)__</font>

## 0. 手順 ( 概要 )

1. GitHub 上より ソースコードを Clone する
2. Unity プロジェクトを開き、パッケージをインストールする
3. Unity プロジェクトのビルド設定を変更する
4. XCode で対象プロジェクトを開き、端末にデプロイする



## 1. GitHub 上よりソースコードを Clone する。
Unity Techonologies Inc. が提供する [arfoundation-sample](https://github.com/Unity-Technologies/arfoundation-samples) を git clone します。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/66b19bd3-3a14-480e-a843-40cf8e380d93.png" width="750">


```cmd
$ git clone https://github.com/Unity-Technologies/arfoundation-samples.git
```

#### :warning:   ARKit 3.0 へのサポートについて
<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/a3f88ab5-28f1-4fa4-a899-c4616459f155.png" width="750">

git clone でローカルにダウンロードされるファイルは、masterブランチに存在するソースコードです。しかし、masterブランチは既に、ARKit 3.0 に対応済みで iOS 13 beta 5 ( ※インストールには、Apple Developer Program  への登録が必要 !? ) が必要になりますが、今回は対応端末が手元に無いため、ARKit 3.0 に対応する前の2.1 ブランチで検証を進めたいと思います。

```cmd
// リモートブランチをチェックアウト (tag:2.1)
$ git checkout -b arkit2 origin/2.1

// ブランチが切り替わったことを確認する
$ git branch
* arkit2
  master
```

ローカルにディレクトリが追加されていることが確認できます。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/833e3364-7d59-4b22-adbf-3a8f10372d36.png" width="550">

続いて、上記ディレクトリを Unity プロジェクトで開き、サンプルシーンをビルドしてみたいと思います。

## 2.  Unity プロジェクトを開き、パッケージをインストールする
先ほどのディレクトリを Unity プロジェクトとして開きます。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/b223fd71-e300-4d87-ba85-601e4908ee14.png" width="750">

Package Manager を使って、Unity Technologies Inc. が提供する以下2つのパッケージをインストールします。

- __ARKit XR Plugin ( preview.5 - 2.1.0 )__
- __AR Foundation ( preview.3 - 2.1.0 )__

### 2-1. Unity Package Manager 使い方
[Windows] > [Package Manager] を開き、対象のパッケージを名を検索します。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/a9d160f9-d423-49a0-820b-78d8f73f4d41.png" height="370">
<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/12338e1e-ad65-4b35-8b5d-96d2b4b6f88f.png" height="370">

対象パッケージを選択し、 [Install] ボタンを押下します。

 
### 2-2. Preview パッケージをインストールする方法

[Windows] > [Package Manager] >  [Advanced] > [Show Preview Packages] を押下。
__<font color="red">( Previw パッケージ 表示有効化 )</font>__

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/20/10862/3bd468a1-35d8-4b53-aafb-097deac98ab2.png" width="550">

### 2-3. __「Unity-ARKit-Plugin」を試す方法  <font color="red">( Deprecate )</font>__
2019.5 まで運用されていた ( ※現在は廃止 ) Unity-ARKit-Plugin を検証する方法です。2019.6.3 に Deprecated されており、今後のサポートは見込まれないので、今から開発を検討される場合は、「AR Foundation / ARKit-XR-Plugin」を活用する方向で進めるのが良いと思います。


GitBucketのコミットログを確認しても、[2019.6.3] に Deprecated の記載が追記されています。

<a href="https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/commits/94e47eae59546c1c824f1ebc345cedff21104259"><img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/21/10862/b49f006e-40d2-4d55-bef3-482b3b7faae7.png" width="750"></a>




## 3. Unity プロジェクトのビルド設定を変更する
ショートカット ( ``Ctrl + Shift + B`` )を使って、Build Settings を開きます。Build対象プラットフォームが「PC, Mac & Linux Standalone ( Default ) 」に設定されているので、「iOS」を選択し、「Switch Platform」ボタンを押下します。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/66598f54-38cb-46aa-8673-961ff7556b91.png" width="450">

変更完了後、左下にある「Player Settins ...」ボタンを押下し、プレイヤー設定を行います。Player Settings では、Build時に必要となるアプリケーションの設定を編集することが可能です。( アプリケーションの名前、アイコン設定、Target Device, Target SDK etc..  )

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/6779e182-ef77-40ec-a5c3-9b22fd433bc7.png" width="750">

今回は変更しないでそのまま閉じます。そして、Build Settings を開き、Scenes In Build リストの任意のシーン名にチェックを入れ、「Build」ボタンを押下します。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/ecd4530b-1092-4d3c-8e4a-42d2560c0a6c.png" width="450">

「Build」ボタンを押下すると、アウトプット先にディレクトリの選択を求められますが、「iOS」というディレクトリを新規作成し、Buildを実行すると良いと思います。 ( ※ 2回目のビルド以降、同一フォルダを指定すると差分ビルドとなり、Build時間を短縮することが可能です。 )

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/22/10862/2fd0ebbd-c1cb-4aff-af8c-e2000bd22ce5.png" width="750">



## 4. XCode で対象プロジェクトを開き、端末にデプロイする
対象プロジェクト ( Unity-iPhone.xcodeproj ) を XCode で開き、iPhone XS にアプリケーションをデプロイします。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/23/10862/e9e99421-e514-40ac-bfa1-e50da1ef90f1.png" width="750">

1. XCode上でプロジェクトが開くと、右上の「Unity-iPhone」を押下します。
2. Bundle Identifier はそのままだとエラーが出るので、[ 任意の値 ] へ変更しておきます。
3. デプロイ先となる端末を Mac Book にUSB接続します。
4. Signing > Team リストから3.で接続した端末を選択します。
5. 右上の再生ボタンを押せば、Build&Run が実行されます。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/23/10862/d3645c6e-18b8-411e-b238-5085705a85cc.png" width="750">



さらに詳しい手順は、以下@ITさんの記事に詳しい内容が書かれているので、初めての方は下記をご覧ください。

- [UnityでARKitアプリを開発するための環境構築チュートリアル (3/3)](https://www.atmarkit.co.jp/ait/articles/1801/10/news011_3.html)

### :warning:   信頼されていないデベロッパ

Apps Store 以外の方法でインストールしたアプリケーション ( 発行元不明 ) は、「信頼されていないデベロッパ」と表示され、アプリケーションを起動することはできません。( iPhone XS の場合 ) 設定 > 一般 > プロファイルとデバイス管理 > デベロッパAPP > デベロッパ ( ``Apple ID`` ) を信頼を選択後、アプリケーションを起動することが可能となります。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/23/10862/7bf17960-c0b0-41e9-85aa-415bbe037fbd.png" width="350">


詳しくは、以下のQiita記事に丁寧に記載されているので、そちらをご参照ください。

- [【iPhone】「信頼されていないデベロッパ」ダイアログが出た時の対処法](https://qiita.com/nonkapibara/items/d14c796ca69c8a4e58d2)


# 検証編
ビルドに成功したので、iPhone XS 上でアプリケーションを実行してみます。
今回試したのは  ``arfoundation-sample`` に含まれる __「SampleUXScene」__ です。

Unity 公式ブログで紹介されていた「[ARFoundation: Overview](https://www.youtube.com/watch?time_continue=221&v=ml9qVRdEH4k)」という動画の中でも登場するデモの1つです。

以下、実際に起動してみたアプリケーションの様子です。

<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/23/10862/4cef3e36-33f3-435d-9c42-bf4b9e0d670c.png" width="350">
<img src="https://img.esa.io/uploads/production/attachments/3505/2019/08/23/10862/cfcbab62-7967-4016-9b24-577285cfe233.png" width="350">

| 図 | 説明 |
| -------- | -------- |
| 図 (上)    | 起動直後、空間を認識している様子     |
| 図 (下)    | 空間認識後、球体を表示 ( 空間位置固定 )     |

動作しているアプリケーションの動画は、以下をご覧ください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ARFoundation / ARKit XR Plugin を使ったarfoundation-sampleのサンプルシーンを動かしてみた。( SampleUXScene ) <a href="https://twitter.com/hashtag/ARFoundation?src=hash&amp;ref_src=twsrc%5Etfw">#ARFoundation</a> <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a><a href="https://t.co/ZhMrrHpNAQ">https://t.co/ZhMrrHpNAQ</a> <a href="https://t.co/gbycbwMXGF">pic.twitter.com/gbycbwMXGF</a></p>&mdash; Futo Horio (@Futo_Horio) <a href="https://twitter.com/Futo_Horio/status/1164757111462481921?ref_src=twsrc%5Etfw">August 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 所感
Unity-ARKit-Plugin と ARFoundation の関係性、ロードマップを理解できれば、アプリを動かすことは比較的容易にできると思います。普段 HoloLens を触っているせいか空間を認識する精度は思ったより低いなという印象を受けましたが、垂直面(壁)、水平面(床)を手軽に検出できるのは凄く良いと思いました。また、HoloLensも同様ですが、真っ白な壁は特徴点が皆無に近く、認識できないのでアプリケーションを起動する場所をユーザーに知らせるための工夫は今後必要になってくると思います。いずれにせよ、どのようなアプリケーションにもAR対応の波が押し寄せてくると思うので、今から取り組んでおくと良いと思います。ちなみに、arfoundation-samples は、既にARkit 3.0に対応しているので、自分のiPhone XS　( iOS 12.4 ) が iOS 13 にアップデートされれば、試してみようと思います。( 今[GIZMODEさんのニュース](https://www.gizmodo.jp/2019/08/iphone-event-schedule-ios13.html)を調べたら9月10日じゃないかと言われています。 )
# 参考文献
本記事を執筆するにあたり、参考にさせていただいたサイトをまとめました。
筆者のみなさんありがとうございます。

__AR Foundation を用いた Unity AR アプリケーション開発について__

- [AR Foundation（ARKitとARCoreのマルチプラットフォームAR環境）の超入門](http://tsubakit1.hateblo.jp/entry/2018/11/21/211400)
- [AR Foundationを使いこなそう！](https://xr-hub.com/archives/15751)
- [AR Foundationについて ( Unity 公式  )](https://blogs.unity3d.com/jp/2018/12/18/unitys-handheld-ar-ecosystem-ar-foundation-arcore-and-arkit/?_ga=2.118532169.1981158098.1566289349-2040198668.1552376445)

__ARKit編 ( iOS )__

- [Unityで始めるARKit入門 セットアップ編](http://nn-hokuson.hatenablog.com/entry/2018/09/19/205354)

__ARCore編 ( Android )__

- [ARCore QuickStart ( Google 公式 )](https://developers.google.com/ar/develop/unity/quickstart-android)
- [ARCoreを簡単にUnityで始める](https://qiita.com/norihirosunada/items/4fad091c152249fe53f1)