ARKitとARCoreを共通のシーンで両方の環境に対応したビルドを作成できる、Unityのライブラリを作成しました。こちらにて公開しているのでご活用してください。
https://github.com/TakuKobayashi/UnityARKitAndARCoreCommon
unitypackageにしたものをご希望でしたら、こちらからダウンロードしてください。
https://github.com/TakuKobayashi/UnityARKitAndARCoreCommon/releases
また、上記ライブラリの中にそれぞれ、ARKit、ARCoreが入っていますが、双方とも頻繁にバージョンアップされます。本ライブラリでもバージョンアップはしていきますが、バージョンアップが必要な場合は適宜バージョンアップをお願いします。(バージョンアップする場合の注意事項は下記に記載します)
なお、ARCore単体についての詳しい説明などはこちらをご覧ください。
ARCore 取扱説明書
最新のAR(一般論)
AR
ARとは拡張現実(Augmented Reality)という意味で人が知覚する現実環境をコンピュータにより拡張する技術、およびコンピュータにより拡張された現実環境そのものです。
【参考】 拡張現実
人間の視覚 → カメラ
人間の聴覚 → マイク
がそれぞれコンピュータにおける入力であり、大半が視覚(カメラ)に映し出されたものに合わせて拡張したものがARと呼ばれます。
近年、技術発展が著しいXR(VR/MR/AR)の内、ARはスマートフォン単体で利用可能で、追加のハードウェアがいらない点も特徴の一つです。
これまでのAR
ARKit、ARCoreが出る以前にも、AR技術を利用したものは存在しました。これまでのARは大きく分けると2種類に分類されます。
・ 特徴となる画像(マーカー)を用意し、その画像を検出してものを出す。(例:QRコードリーダー, Vuforia など)
・ カメラ以外のセンサーで検出したものを元にカメラ画面の上に検出してものを出す。(例:セカイカメラ、ポケモンGo)
最新のARとは?
ARKit、ARCoreをはじめとした最新のARでは以下の特徴を活かした開発をすることが可能です。
- 端末のセンサーを駆使した空間認識
- マーカーとなる画像が不要
また最新のARではVRの技術も応用しているため、「実際の現実空間を認識している」ことが一部可能となっています。
例えば、以下のように、実際の地面を検出し、そこにものやキャラクターを表示していくといったことが可能となっています。
ARKit、ARCore
ARKitとは、AppleによるiOS向けのARアプリ開発フレームワークです。Androidでは利用することができません。
ARKitのAndroid版がARCoreです。ARKitで実現できることの多くはARCoreでも実現できます。ARCoreはiOSでは利用することができません。(GoogleはTangoプロジェクトにてARの研究開発をしていました。TangoプロジェクトをARCoreに統合したため、ARKitの後追いではないではありません)
ARKitで具体的にどんなことができそうなのかということはこちらを参照してください。(ARCoreとできることの違いはありますが大体同様のことができます。)
ARCoreの導入方法など、詳しい説明はこちらを参照してください。
ARCore 取扱説明書
以降ではARKitについて中心的に紹介します。
ARKitの開発環境とライブラリのダウンロード先
開発環境 | ライブラリ |
---|---|
XCode | ARKit |
Unity | Unity-ARKit-Plugin |
Unreal Engine4 | UE4ARKit |
web | arkit-web, WebARonARKit |
以降にUnityへの導入方法を記述します。
UE4への導入についてはこちらを参照してください。
ARKitをUnityに導入
基本的にUnity ARKit PluginのunitypackageをUnityのプロジェクトに導入するだけです。
サンプルなどはExamplesの中にあるsceneをいくつか開いて、実行してみてください。Unity ARKit PluginはAssetStoreとBitbucketの両方があり、どちらからでもダウンロードし、インストールすることができます。
※下記に記載しますが、Unity ARKit Pluginのインストールの仕様の関係上、
ARCoreと両方に対応した環境を構築する場合、注意が必要な部分があります。
また、その他詳しい説明などはこちらなどを参考にしてください。
UnityでiOSのARKitを動かす手順
課題
現状、ARKit、ARCoreではそれぞれiOS、Androidで対応しているプラットフォームが分かれています。ARKit、ARCoreともにUnityにて開発可能ですが、プラットフォームごとにそれぞれ全て個別に対応する必要があります。今回、この開発のしにくさを極力解消するために共通のSceneでARKit、ARCore両方の環境に対応できるものを開発できるようなライブラリを作りました。
マルチプラットフォーム開発の手引き
今回、作成したUnityライブラリ(UnityARKitAndARCoreCommon)
こちらの導入と開発方法をベースに解説していきます。
まず動かしてみる
iOS, Androidそれぞれ、Switch Platformするところまで、以下の手順のように共通で行います。
- こちら から最新のunitypackageをダウンロードしてきて展開する。
- File->Build Settingsを選択して、Build Settingsを開く
Build Settingsを開いた後はiOS, AndroidそれぞれのプラットフォームにてBuildを行います。
iOS
Build Settingsを開いた後、iOSのプラットフォームに切り替え、ビルドし、実機にインストールします。
なお、iOSの場合、実機(端末)の他にXcodeのダウンロード・インストールやApple Developer Programに登録し、iOSの実機にインストールするための諸々の事前準備が必要になります。やり方などは以下なども参考にしてください。
- Platformの中の「iOS」を選択して、「Switch Platform」ボタンを押す。
- Platformが変更されたら、「Player Settings...」ボタンを押してPlayerSettingsを開く
- PlayerSettingsを開いたら、「Bundle Identifier」をApple Developer Programに登録したもの(Xcodeでのビルドが可能なもの)に変更する(後で設定することもできます)
- 「Camera Usage Description」に何かしら文字列が入っていることを確認する。これは実機にビルドした時にカメラを使用することの許可を促すものです。ここで入力したものはその許可を促すダイアログのタイトルとして表示されます。(「Camera Usage Description」を空欄にするとカメラの仕様許可をも求めるダイアログが出ず、カメラを使うこともできません)
- Build Settingsに戻り、「Build」ボタンを押します。しばらくするとXcodeプロジェクトが出力されます。
Xcodeプロジェクトが出来上がったら、Unity-iPhone.xcodeprojを選択し、XcodeプロジェクトをXcodeにて開きます。
- プロジェクトのプロジェクト設定を開く。
- General > Identity > Bundle Identifier がApple Developer Programに登録し、ビルドして端末にインストールすることができる値が設定されているか確認する
- General > Signing > Team で任意Teamを選択(Apple Developer Programにビルドしてインストールする端末が登録されているTeam)
- ビルドする対象の端末を選択肢、▶︎ボタンを押してビルドする。(ビルドできたらそのまま実機にインストールされます)
上記ARSceneは、iOSとAndroid共通で使用することができるSceneです。ARKitにのみに対応したSceneはARKitSceneになります。
Android
Build Settingsを開いた後、Android端末で実行するためにビルドします。
- Platformの中の「Android」を選択して、「Switch Platform」ボタンを押す。
- Platformが「Android」に切り替わったら、「Scenes In Build」の中の「ARScene」にチェックが入っていることを確認して、「Build」または「Build And Run」ボタンを押してビルドします。「Build」ボタンを押した場合、しばらくするとapkファイルができあがります。「Build And Run」ボタンを押した場合は実機のAndroid端末とつながっていればそのままapkファイルをAndroid端末にインストールし、実行します。
上記ARSceneは、iOSとAndroid共通で使用することができるSceneです。ARCoreにのみに対応したSceneはARCoreSceneになります。
どうなっているの?
基本的にARCoreのサンプルプロジェクトである、HelloAR.scene(GoogleARCore/Examples/HelloAR/HelloAR.scene)で行われていることを基準にARKitでも同様のことができるようにしています。ARKit, ARCoreそれぞれで共通できる処理をまとめ、共通できない部分はそれぞれで分離するようにしました。以降では具体的な処理の中身について説明します。
どうやって開発していけばいい?
このプロジェクトではARKitで使用するものをARKitController.prefabで, ARCoreで使用するものをARCoreController.prefabでそれぞれ使用できるようにし,SwitchARController.prefabではPlatformに応じたそれぞれのprefabを用いるようにしています。
ARKitにあって、ARCoreにはない機能の処理を実装したい
ARKitController.prefabにはARKitController.csのスクリプトを適用しています。ARKitController.cs内にARKitにのみ適用した処理を記述していくことで、ARKit専用の処理を実装することができます。また、ARKitController.prefabに設定していくことで、ARKitでのみ使えるパラメータを設定することができます。
ARCoreにあって、ARKitにはない機能の処理を実装したい
ARCoreController.prefabにはARCoreController.csのスクリプトを適用しています。
ARKit, ARCore両方ともに対応する処理を実装したい
ARCore, ARKit両方ともに共通して使うことができるような処理や設定情報は全て、ARControllerBase.csに記述しています。(ARKitController.cs, ARCoreController.csともにARControllerBase.csを継承しています。)
ARControllerBase.csに処理を記述していくことで、ARCore, ARKit両方に対応されます。
prefabなどの設定はそれぞれに設定できるようにしています。
ARKit, ARCoreそれぞれのバージョンアップ
このライブラリではARKit, ARCore、それぞれ個別にバージョンをアップする方法と同様の方法でバージョンアップできるように作っています。
しかし特にARKitのライブラリの仕様の関係上、バージョンアップする場合、以下の点を留意してバージョンを上げる必要があります。
ProjectSettings.assetとEditorBuildSettings.assetは更新しない
Unity-ARKit-Pluginをインストールする場合、環境設定で設定した変数も更新してしまいます。そのため、上記のように、該当ファイルのチェックを外し、更新しないようにする必要があります。
ProjectSettings.assetとは?
EditorBuildSettings.assetとは?
上記、ビルドする時に指定するSceneの情報を登録している部分です。
もし更新しちゃったら?
ProjectSettings.assetにおいては特にAndroidの環境設定において、上記の印をつけた箇所の修正をするようにし、
ARCore Supportedにチェックを入れる。
EditorBuildSettings.assetについては各自、ビルドに含めたいsceneを追加していってください。
そもそもなんでUnityなの?
ARKit, ARCoreともにUnity(UE4でもですが)で開発する場合であっても、実機にビルドしないと実行結果を確認することができません。Unityの▶︎を押しEditor上での動作の確認は基本的できません。(ARKitにある、ARKitRemoteの機能を使えば確認はできますがその場合であっても実機にBuildする必要はあります。)
しかし、Unity(UE4もですが)最大の強みは3Dファイルの読み込み、計算、制御が簡単にできることにあります。3Dについて説明はこちらを参照。
3D入門
まとめ
今時のARについての説明とARKit,ARCoreの両方に対応したライブラリの紹介をしました。
今時のARを実装するにあたり、どうしてもARKit,ARCoreのiOS, Android両方の環境に対応したものを手軽に作りたいというニーズがあったのでライブラリを作成しました。
今回、可能な限り簡単に開発でき、共通のソースコードで開発できるようにしました。
また、ARKit,ARCoreそれぞれのアップデートが簡単にできるように作ってみました。
もしよかったら使ってください。また、issue, Pull Reqeust,あとスターもいただけたらと思います。