ARCore Recording and Playplay APIを使って現地に行かずにImmersal開発をする
概要
- AR開発においては、どうしても現地に赴いての検証が増えてしまいイテレーションが回しづらい問題があります
- ARCoreでは、あらかじめ撮影した動画を使用してAR開発が行える Recording and Playplay APIという機能があります
- AR VPSとして知られるImmersalと
Recording and Playplay API
を組み合わせて、現地に行かずに開発する方法を紹介します
環境
- Unity 2021.3.1
- Immersal SDK 1.16.1
- AR Foundation 4.2.3
- ARCore XR Plugin 4.2.3
- (UniGLTF 1.27)
環境は上記のとおりです
今回glbからfbxへの変換にはUniGLTFを使用しました。
今回作成したプロジェクトはこちらにアップしてあります。なお、Mapファイルは含まれていませんのでご自身で用意をお願いします
Immersalが使えるようにする
- まずImmersalが使えるように撮影&Unityセットアップをします
- Immersalのセットアップに理解している方は読み飛ばしていただいて問題ありません
- セットアップに関しては下記の記事も詳しいです
今回は空プロジェクトにImmersal SDK/UniGLTFをインポートして構築しました
空シーンから構成する手順としては
- AR SessionとAR Session Originを作成
- ImmersalSDKのPrefabを設置
- AR Localizerをアタッチ
- AR Spaceを作成し、その配下にARMapを作成
- AR Mapにはbytesファイルを設定する
空プロジェクトから設定するにあたり、ハマった個所をリストアップしておきます。これらをしないとImmersalが正しく動きませんでした
-
Auto Graphics APIをOFFにしてVulkanを無効に
-
Scripting BackendをIL2CPPに。Internet AccessをRequireに設定
-
Allow 'unsafe' CodeをONに
Recording and Playplay APIを使えるようにする
-
Recording and Playplay APIのサンプルをAR Fundationのリポジトリから持ってきます
https://github.com/Unity-Technologies/arfoundation-samples/blob/main/Assets/Scenes/ARCore/ARCoreSessionRecorder.cs -
ARCoreSessionRecorder
をARSession
と同じ階層にアタッチします
-
このままビルドしてもRecording後、Playbackしようとしたときに落ちてしまいます
- ImmersalでLocalize中にPlaybackを実行してしまうとImmersal側でクラッシュしてしまうようです
- Playbackを実行する際にLocalizeが止められるようにUIを作成します
- SDKのLocalizerに
StartLocalizing()
とStopLocalizing()
があるのでボタンが押されたらそれらを呼ぶようにします
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LocalizeSwitch : MonoBehaviour
{
[SerializeField] Button startButton;
[SerializeField] Button stopButton;
private void Start()
{
this.startButton.onClick.AddListener(() =>
{
Immersal.ImmersalSDK.Instance.Localizer.StartLocalizing();
});
this.stopButton.onClick.AddListener(() =>
{
Immersal.ImmersalSDK.Instance.Localizer.StopLocalizing();
});
}
}
操作方法
1.アプリが立ち上がったら画面上部のStart recording
をタップ→撮影が開始される
2.ある程度撮ったらStop recording
をタップ
3.画面下部のLocalize Stop
をタップしLocalizeをいったん止める
4.画面上部のStart playback
をタップすると、先ほど撮影した動画が再生される
5.画面下部のLocalize Start
をタップしLocalizeを再開する→動画でImmersalが機能する
動画にしてしまうとわかりづらいですが、下記のGifはカメラではなくPlayback機能を使ってImmersalで位置合わせを行っています
上手くいくと動画でImmersalが機能するようになるので、あらかじめ現地で撮った動画を使用してデバッグをするといったことが可能になります
なお、サンプルでは1つの動画を使いまわす仕組みになっていますが、複数の動画をアプリ内に入れておいて、入れ替えながらPlaybackをすることも可能です
m_Mp4Path
で入出力の動画ファイル名を指定しているので、この辺を改造すれば実装可能です。
void Awake()
{
m_Session = GetComponent<ARSession>();
m_Mp4Path = Path.Combine(Application.persistentDataPath, "arcore-session.mp4");
}
参考記事
Discussion