UbuntuでUnity+ARCoreを使ったAndroid用アプリ開発

Unity+ARCoreを使ったAndroid用アプリを開発していますが、Ubuntuで開発している記事があまり見当たらなかったので、主に環境構築についてまとめました。
現時点（2020/12/30）時点で、極力新しいバージョンのUnityとARCoreを使用しました。

# 開発したアプリ
「[はじめようARCore in 札幌](https://www.slideshare.net/ssuserc0d7fb/arcore-in)」で解説されている、画面をタップしたらその場所にオブジェクトを置くアプリを開発しました。
ただし、こちらの記事で使用しているARCoreのバージョンは少し古るいため、一部最新に合わせて変更しました。

# 環境
- 開発マシン
  - Ubuntu 16.04
- Unity Hub v2.0.0
- Unity 2019.4.17f1 (LTS)
- ARCore v1.22.0 [Download link](https://github.com/google-ar/arcore-unity-sdk/releases/tag/v1.22.0)
- Gradle v5.6.4
- 検証デバイス
  - Xperia 5 (J9210)

# 開発環境構築
UbuntuへのUnityのインストール方法は、他にも解説記事があるため詳細は説明しません。
## Unityのインストール
1. [ダウンロードページ](https://unity3d.com/jp/get-unity/download)から、Unity Hubをダウンロードします
    1. 「***Unity Hub の詳細はこちら***」を選択
    2. 「***Unity Unity Hub v2.0.0 Release***」を探して選択
    3. **Download Link**の中から「***Hub for Linux***」を選択してダウンロード
    4. *UnityHub.AppImage*というファイルがダウンロードされます
2. 実行権限の付与  `$ chmod +x UnityHub.AppImage`
3. Unity Hubの実行 `$ ./UnityHub.AppImage`
4. Unityのインストール
  1. 左のメニューで「インストール」を選択し、右上の「インストール」ボタンを選択
  2. Unity 2019.4.17f1 (LTS)
  3. ダウンロードするプラグインで「***Android Build Support***」を追加

しばらく待つとインストール完了です。

## ARCoreのインストール
1. 必要なパッケージのインストール  
  「Window -> Package Manager」を選択し、以下パッケージをインストールします
    - Multiplayer HLAPI
    - XR Legacy Input Helper
2. パッケージを[「ここ」](https://github.com/google-ar/arcore-unity-sdk/releases/tag/v1.22.0)からダウンロードします  
  arcore-unity-sdk-1.22.0.unitypackage
3. Unityプロジェクトを開いた後、パッケージを追加します
  1. 「Assets -> Import Package -> Custom Package」と選択
  2. 上記でダウンロードした*arcore-unity-sdk-1.22.0.unitypackage*を選択

## Gradleのインストール
Unityのインストール時に*Android Build Support*を追加しておけばGradleもインストールされますが、ARCoreではversion 5.6.4以上が要求されます。
自分の環境ではデフォルトでインストールされたGradleのバージョンがこれより古くビルドエラーがでたため、追加でインストールしました。
自分がインストールしたのは*version 5.6.4*です。

1. Gradleのダウンロード
  1. 「[こちらのページ](https://gradle.org/releases/)」からv5.6.4を探し *Downlowd*で*complete*を選択します
  2. **gradle-5.6.4-all.zip**というファイルがダウンロードされます
2. ファイルの移動、展開
  1. ダウンロードしがファイルを任意のディレクトリに移動します。自分はUnityがダウンロードしたGradleが入っているディレクトリと同じディレクトリに移動しました  
    `$ mv gradle-5.6.4-all.zip ~/Unity/Hub/Editor/2019.4.17f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools`
  2. 展開  
    `$ unzip gradle-5.6.4-all.zip`

# Unityのビルド設定
こちらも詳しく解説した記事が他にあるため簡単に記述します。以下はUnityのプロジェクトでの設定となります。

- PlatformをAndroidに変更
  - *File -> Build Settings*で「Android」を選択し「Switch Platform」を押下
- Gradleのパス設定
  - *Edit -> Preferences -> External Tools -> Android -> Gradle* でRecommendedのチェックを外し、追加インストールしたGradleのフォルダを選択する  
    (自分の環境の場合): `/home/{ユーザ}/Unity/Hub/Editor/2019.4.17f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools/gradle-5.6.4`
- Playerの設定
  - *Edit - > Player Settings -> Player*
    - Other Settings
      - Graphics APIからVulkanを削除
      - Minimum API Levelを7.0以上
    - XR Settings
      - ARCore Supportedにチェック
    - Publishing Settings
      - Custom Main Gradle Templateにチェック
      - Custom Launcher Gradle Templateにチェック


# Android deviceの認識
UbuntuにAndroid deviceを接続してアプリをインストールするには、以下設定が必要になります。
初めにPCにAndroidデバイスを接続した後、ベンダーID確認のため`lsusb`コマンドを実行します

```
$ lsusb
Bus 001 Device 015: ID 0fce:520a Sony Ericsson Mobile Communications AB
```
複数のUSBデバイスがPCに接続されているときは、その数だけ結果が出力されます。その中からAndroidデバイスを探します。列の最後がメーカー名で、それから分かると思います。
上記は自分の環境で、Xperia 5を接続した時の結果です。この中の*0fce*というのがベンダーIDです。
この値を使って、デバイスの接続ルールを追加します。

```
$ sudo vi /etc/udev/rules.d/51-android.rules
# 以下をファイルに記述する。Vendor IDは環境に応じて変更する
UBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev"
```

# アプリ実装
「[はじめようARCore in 札幌](https://www.slideshare.net/ssuserc0d7fb/arcore-in)」のP.50 ~ P.88の内容をほぼそのまま実装しましたが、ARCoreのバージョンに合わせて下記だけ変更しました。

- P.52
  - AndyGreenDiffuseがなかったため、*Assets -> GoogleARCore -> Examples -> Common -> Prefabs*の*ARCorePawn*を代わりに使用しました。



# 参考
UbuntuへのUnityのインストール
- [Ubuntu20.04にUnity2020.1をインストールしたのでメモ](http://pineplanter.moo.jp/non-it-salaryman/2020/08/09/unity-ubuntu/)

Gradle関連
- [Build for Android 11 with Unity](https://developers.google.com/ar/develop/unity/android-11-build#unity_20193_and_20194)
- [Gradleのダウンロード]{https://gradle.org/releases/}

Unityアプリ実装
- [はじめようARCore in 札幌](https://www.slideshare.net/ssuserc0d7fb/arcore-in)
- [Unity2019でARCoreの環境構築と平面検出](https://qiita.com/atsonic/items/42e284a0dc91c3a73d10)

Android deviceの認識
- [Ubuntu で Android の実機の接続に関する設定](https://www.kkaneko.jp/pro/js/udevadm.html)