8/30にGoogleがARCoreという、Tango以外でも使えるAR用SDKを公開した。
現在はpreview版で、PixelかPixel XLかGalaxy S8でしか使えない。
それ以外の端末で実行しようとしても、
﹁This device does not support ARCore.﹂
と出て、アプリが終了してしまう。
ただ、Pixelは日本で手に入らないし、Tango対応のZenFone ARとかPhab 2ならまだしも、何故かS8縛りとか、Daydream対応で何かあったんじゃないのって色々思うところがあるので、どうしても別の端末で動かしたくて、やってみて、とりあえず動いたので、その方法を記載する。
環境
今回ARCoreを動かした端末はNexus6PでAndroid7.1.2。(よくよく考えると、これも手に入らないね。) 開発環境は、Windows10 x64 Pro、Unity2017.2.0b9。環境構築
公式サイトの手順の通り。 https://developers.google.com/ar/develop/unity/getting-startedAndroid SDK
AndroidSDKでAPI24以降でビルドできるようにしておく。 もしインストールしていないなら、AndroidStudioを入れて、SDK ManagerでAPI24以降の Build Tools等を入れておく。Unity
Unity2017.2.0b9以降をインストールする。 インストール時に﹁Android Build Support﹂を含める(チェックを入れる)ようにする。 なお、Unityはインストール先のフォルダ名を変えておくと、複数バージョンを共存させることができる。 もし既にUnityをインストールしているなら、今回使用するのはベータ版なので、共存させるようにインストールしておくと後々面倒ごとがなくなると思う。 (特にUnity2017では色々あるみたい。って僕も引っかかったことあるから...)ARCore SDK for Unity
パッケージファイルを直接ダウンロードするか、Githubから取ってくる。ARCore Service
端末にARCore Serviceをインストールする。プロジェクト
新規プロジェクト作成
Unityを起動し、新規プロジェクトを3Dで作成する。 今回は公式サイト通り、HelloARというプロジェクト名にした。インポート
メニューから、Aseets > Import Package > Custom Package を選択し、 ダウンロードしておいた、arcore-unity-sdk-preview.unitypackageを選択してインポートする。シーンの読み込み
Projectビューから、Aseets > GoogleARCore > HelloARExample > Scenes を選択し、HelloARシーンをダブルクリックして読み込む。ビルド
メニューから、File > Build Settings を選択する。Build Settingsダイアログが表示される。 PlatformリストからAndroidを選択し、下部のSwitch Platformボタンを押下して、切り替える。 Add Open Scenesボタンを押下する。 HelloARシーンがリストに追加される。 Player Settingsボタンを押下する。 Inspectorビューから、 ●Other Settings > Multithreaded Rendering のチェックをはずす。 ●Other Settings > Package Name の内容を変更する。とりあえず公式サイトの例のようにcom.example.helloARにした。 ●Other Settings > Minimum API Level をAndroid 7.0以降にする。 ●Other Settings > Target API Level をAndroid 7.0以降にする。 ●XR Settings > Tango Supported のチェックを入れる。 Build Settingsダイアログに戻り、端末をPCにつなぎ(開発者モード、USBデバッグは有効にしておくこと)、Build And Runボタンを押下すればインストールされ、起動直後に﹁This device does not support ARCore.﹂と出て、残念な気持ちになる。ARCoreのソースをいじる
﹁This device does not support ARCore.﹂と出力しているのは、HelloARController.csの_QuitOnConnectionErrorsメソッドのようだった。HelloARController.cs
private void _QuitOnConnectionErrors()
{
// Do not update if ARCore is not tracking.
if (Session.ConnectionState == SessionConnectionState.DeviceNotSupported)
{
_ShowAndroidToastMessage("This device does not support ARCore.");
Application.Quit();
}
...
}
Session.ConnectionState が SessionConnectionState.DeviceNotSupported になると上記エラーを出力するので、SessionConnectionState.DeviceNotSupportedを設定しないようにする。
SessionConnectionState.DeviceNotSupportedを設定しているのは、SessionComponent.csのConnectメソッドのisSupportedを見ている個所のようだった。
このif文をまるごとコメントアウトして保存する。
SessionComponent.cs
public AsyncTask<SessionConnectionState> Connect(SessionConfig sessionConfig)
{
...
bool isSupported;
ApiServiceErrorStatus status = TangoClientApi.TangoService_IsSupported(out isSupported);
if (status.IsTangoFailure())
{
ARDebug.LogError("There was an error accessing the ARCore API.");
SessionManager.ConnectionState = SessionConnectionState.ConnectToServiceFailed;
return new AsyncTask<SessionConnectionState>(SessionManager.ConnectionState);
}
//if (!isSupported)
//{
// ARDebug.LogError("Device does not support ARCore.");
// SessionManager.ConnectionState = SessionConnectionState.DeviceNotSupported;
// return new AsyncTask<SessionConnectionState>(SessionManager.ConnectionState);
//}
...
}