Unity ARFoundaitonを録画してUnity Editorで再生する方法

ARFoundationReplayというARを録画してUnity Editor上で再生するライブラリを開発中です。

GitHubリポジトリはこちら↓ github.com

ARFoundaitonReplayで出来ること

Unity Editor内で動作するAR Foundationです。ARを録画した専用動画をEditorで再生することが出来ます。私が普段参加するARプロジェクトでは、Unity Editor上でAR Foundaitonが動かないため、 #if UNITY_EDITORなどを用いて処理をまるっと分けることが思いです。しかしこの分岐が原因で実機でテストすると思わぬバグに出くわすことも多々あります。

このライブラリではUnity Editor上で録画したARをAR Foundationの上で動かすことで、そのような分岐をまるっとなくすことを目的としています。

仕組みはARを独自の映像フォーマットとして保存します。mp4は動画や音声を保存するフォーマットですが、字幕データを保存したり出来るように、実はバイナリデータも同時に保存できます。
UnityのKeijiroさん作Bibcamをベースに、タイムラインと同期する任意のバイナリを保存出来るようにしました。これは、ARCoreやARKitで行われているAR録画と似たような仕組みです。

Video Format for ARFoundaitonReplay

この動画フォーマットには6DOFのカメラ座標、認識した床や壁などの平面メッシュなどのARの再生に必要なメタデータが含まれているので、以下の動画のように、Unity Editor上で再生して、シミュレーションすることが出来ます。

どうして作った?

開発にあたりいくつかのライブラリを調査しました。

- AR Foundation Simuraiton

実はARFoundation5からは、ARFoundation内にARシュミレーション環境がつきました。 Unityで、3Dモデルで部屋を作って、その部屋の中でARを動かしているシュミレーションが出来ます。

Fig for ARFoundation Simulation

以前のUnity公式xRシミュレーションUnity Maseは一年600ドルという、中々手を出しづらい金額でしたが、こちらは無料です。AR Foundation公式という安心感もあります。

しかしVPS(ビジュアルポジショニングシステム)という屋外の自分のいる位置をGPSとカメラ画像などのセンサから推定するARが流行り始めて、私の実際の案件でもARFoundation Simulationでは対応できないケースが増え始めました。

- AR Foundation Remote 2.0

多くのAR開発者に実際に使われているソリューションとしては、AR Foundation Remote 2.0でしょうか。ほとんどの機能をサポートしていて、VPSも使えます。実際私も使っています。

かなり理想形なのですが、Unity Editorとつなげて録画が必要なので、開発者以外の人がARを録画するのが難しいという難点がありました。TestFlightで配布したアプリだけで録画できるとベストです。

- ARCore, ARKit ReplayData

ARFoundationは、Android ARCore, iOS ARKitのラッパーでもあります。そして、
iOS ARKitではReality ComposerというアプリからReplay Dataという動画ファイルを録画して、実機で再生できます。
Android ARCoreにも録画再生の仕組みがあります。更にAnrdoidでは独自の追加トラックもいれることが出来ます。

もちろんUnity製アプリでもビルドした状態で、これらの機能を使うことは出来ます。しかしこれらの機能はEditorからは使えません。Unityの良さのEditor上でアプリを動かしながら、いろんなパラメーターをいじって、開発のイテレーションを回すということができませんでした。


このような理由から、自分の理想に近かったUnity JapanのKeijiroさんの開発していたBibcamをベースに開発を始めました。

開発大変

去年の12月くらいにふと思いたち、手を動かし初めてみたものの、一歩でもUnityの内部挙動に踏み込んだ機能を作ろうとするとUnityのバグに突き当たり、開発が中断したりと大変でした…。私のライセンスではUnity内部のソースコードにアクセス出来なかったので、ただ修正を待つしかないのが辛かったです。Unreal Engineなら自分で直す余地もあるのですが。

いくつか起こった出来事を抜粋します。

  • M1 Macでフリーズする (修正済)

当初はM1 Mac上でを使うとフリーズする状態でした。AR Foundation Remoteの作者&コミュニティと私くらいしか困っていなかったけど、1年以上も進展がなかった後(AR Foundation Simulation機能を開発して気づいたのかもしれません)、修正されました。

  • UnityのVideoPlayerクラスがデグレーション (修正済)

URP14.0.2のバグ対応のためにUnityのバージョンを上げなくてはいけないけれども、アップデートしたUnityバージョンではVideo Playerがリニューアルされ、今まで動いていた動画ファイルが再生できない…という進むにも戻るにもできない状態になりました。 再現可能なミニマムプロジェクトを添付したバグレポを提出して2ヶ月修正を待ちました。(自分のターゲットにしている2022LTSにバックポートされるまでには半年待ちました。) - Unity Issue Tracker上のバグ詳細

  • XR SDKのドキュメントにない仕様

AR FoundationはUnity XR SDKというXR用のネイティブライブラリの元で動いているのですが、サンプルプログラムは動作するのに、自分のプロジェクトにサンプルプログラムをコピペすると全く動かない…という問題がありました。数日あーだこーだ悩んだ後、EditorでXR SDKを動かす場合は、package.jsonkeywordsxreditorsubsystemという文字が入っていないと認識しないという仕様でした…。XR SDKのドキュメントを見渡しても一切書いてなく、そのキーワードに言及しているのはAR Foundation Remoteの作者とNeedle Toolesの作者だけでした。package.jsonの設定項目じゃなくて検索用のkeywordsにこんな重要な設定項目をいれるなんて思いませんでした。

キーワード知ってないとこのリンクにもたどり着かないし、キーワードを知ってるということは解決済みという悲しいやつです。せめてこの記事を見つけた方に届きますように。

もし開発記録に興味があれば、Zennのスクラップに残しているのでご覧ください。 zenn.dev

まとめ

現在開発中のARFoundationReplayを紹介しました。

前回の記事で作ったARアプリでは、このライブラリを実際に使っています。別のAR案件では、Editor上では動くのに実機では動かないということが頻発することがよくありましたが、このプロジェクトではほぼその問題が起こりませんでした。実機のみで起こったの現象としてはAndroidでメモリが足りなくて落ちるくらいでした。

asus4.hatenablog.com

まだ自分が使うSubsystem部分しか作ってはいませんが、Unity Editor上で実機ARと同じデータがみれることで、ARアプリであるあるの実機で現場にテストした時に動かない…。現場でラップトップを開いてビルドし直す…。みたいなケースがほんの少しだけ減る気がします。 今後も、AR案件をやるたびにちまちま自分で使う機能を追加しようと思います。