Unity ARFoundationをレコーディングできるようにしたい
まだ途中だけどリポジトリだけ公開設定に
新しいXRInputSubsystemだけUnityEngine.InputSystemと結合していて、使い方がわからん
やりたいこと
- ARアプリをUnityで作るのに毎回実機ビルド面倒くさいので、ビルド無しでシミュレーションできるようにしたい。
- 私個人的に100%リモートワークなので、現地でしか動かないようなARを、録画ファイルを送ってもらって、Unity Editor上で再現する見たいなことをしたい。
- Geospatial APIのような、公式ARFoundationにはないオプション情報もExtra Trackとしてタイムラインに埋め込みたい。
- Machine Learningの画像認識とかと連動できるように、ARKitとARCoreの画像と同じフォーマットで再生できると嬉しいが… (ARKitはYCrCbで、2枚のテクスチャ、ARCoreはRGBのテクスチャが飛んでくる。)
リサーチ
AR-Testing
AR Foundation Editor Remote, AR Simulation, Unity MARSの比較をしてくれているのでとりあえずここをみると良さそう
AR Foundation Remote 2.0
第一候補。
Pros
- エディタ専用でUnityとつなげたiPhone(ARKit), Android(ARCore)を録画する機能がある。多くのAR機能を録画してくれる。実際に仕事で使っている。
- 値段と節約できる時間を考えるとARやるひとはみんな買っても良さそう
Cons
- 録画できる画質とフレームレートが荒いので、Maschine Lerningで画像認識できなくもないが、認識精度も体験もかなり劣る感じ
Unity MARS
Unity公式のAR, XRシュミレーター
Cons
- サブスクで$50/month。
- ARFoundationの上に更にMARSのWrapperを乗っけて、xRグラスとかも含めた抽象化してる。
- 画像認識のシュミレーションとかはできなそう
- ar-simulationのGitHubでも言及されているように、抽象的で分厚いWrapperじゃなくて、ただARFoundationをUnity Editor上で実行したいだけなのに、どうしてこうなった感。
ARKitとARCoreの公式機能
-
ARKitはReality Composerをつかい、Xcode上でレコーディングしたファイルを指定する。
-
ARCoreは[https://developers.google.com/ar/develop/unity-arf/recording-and-playback/developer-guide]はUnityのARFoundation上での再生にも公式に対応している。
- Geospatial APIも録画してくれるって書いてる → link
-
ARKitはUnity Editor上での再生には対応してない。ARCoreもおそらく…一度試す。
ARKitStreamer
Pros
- 自分で作ったので自分の欲しい機能を足せる
Cons
- ARCoreには対応してない
- URP対応まだしてない
- NDIをつかっているため、iOSはNDIライブラリのインストールが必須。Unity Cloud Buildできない。(プライベート案件ならソースコードに入れちゃってもいい気がするけど、OSSなので)
- この制約のせいで、Unity CloudBuildなどのCIに組み込めないのが個人的につらい。CI大好き
- 録画機能ない
- 動画とその他情報を別々に送っているので、若干タイムラインにずれがある。
Bibcam by Keijiro
別リポジトリでAvfiというミニマムなrecording/playbackの仕組みも用意してくれている。使いやすそう。
Pros
- 動画の中にAR上のカメラの座標、回転メタデータを埋め込むことで完全同期
- フレームレートも早い
Cons
- 大量のデータを埋め込めない
- ARFoundationの上に作られてはいないので、シミュレーションをできるわけでは無い
ちなみにARFoundation 5.0.0からEditor上でのシミュレーション機能がついたっぽい。Unity Editorで3Dモデルを配置して、それに対してのplaneを取得できるってやつなので、Unity MARSと似た機能。ユーザーリサーチしてほしいっす。
自分で作るとしたら
keijiroさんのBibCamの仕組みをベースにして、動画にメタデータをエンコードするのではなく、meta data timelineとして、mp4に埋め込みたいかな。
Unityで再生する仕組みを用意しないといけなくなるけど…。
AVFoundationでバイナリデータのトラックを追加するのはこのへんで行けそうな
AppleのARKitをXcode上でシミュレーションための動画を録画するアプリReality Composerで録画した動画の中身を
ffmpeg -i sample.mov
でみてみると、以下のように大量のMetadataストリームを確認した。これはARKitのメタデータを上述の仕組みで埋め込んでいるやつだと思う。
13:35:21
ffmpeg version 4.4.1-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample.mov':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2022-05-30T04:13:49.000000Z
com.apple.framework.state.MOVStreamIO: <?xml version="1.0" encoding="UTF-8"?>
: <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
: <plist version="1.0">
: <dict>
: <key>default_options</key>
: <dict>
: <key>MIOBitrateMultiplier</key>
: <real>1</real>
: <key>MIOBitrateOverride</key>
: <integer>0</integer>
: <key>MIOBossMode</key>
: <false/>
: <key>MIODisableFrameReordering</key>
: <false/>
: <key>MIOForce10bitMonoByVT</key>
: <false/>
: <key>MIOForceColorLossless</key>
: <false/>
: <key>MIOForceLossless8bitMonoByVT</key>
: <false/>
: <key>MIOLogAppendTimeStamps</key>
: <false/>
: <key>MIOLogPrepareRecording</key>
: <false/>
: <key>MIOSkipSourceHint</key>
: <false/>
: </dict>
: <key>version</key>
: <string>3.17.10b</string>
: </dict>
: </plist>
:
com.apple.framework.state.MOVKit: {"extrinsicsSWToW":[0.9999387264251709,-0.0010817100992426276,-0.011017407290637493,-8.9610586166381836,0.0010484313825145364,0.99999487400054932,-0.0030258949846029282,16.653076171875,0.011020624078810215,0.0030141586903482676,0.99993473291397095,-1.6000
com.apple.recordingEnvironment: {"extrinsicsSWToW":[0.9999387264251709,-0.0010817100992426276,-0.011017407290637493,-8.9610586166381836,0.0010484313825145364,0.99999487400054932,-0.0030258949846029282,16.653076171875,0.011020624078810215,0.0030141586903482676,0.99993473291397095,-1.6000
Duration: 00:00:54.39, start: 0.000000, bitrate: 115785 kb/s
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, smpte170m/bt709/bt709), 1920x1440, 39827 kb/s, 59.96 fps, 60 tbr, 16800 tbn, 16800 tbc (default)
Metadata:
rotate : 90
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Video
vendor_id : [0][0][0][0]
encoder : HEVC
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(und): Data: none (mebx / 0x7862656D), 252 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:2(und): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, smpte170m/bt709/bt709), 640x480, 4433 kb/s, 10 fps, 10 tbr, 16800 tbn, 16800 tbc (default)
Metadata:
rotate : 90
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Video
vendor_id : [0][0][0][0]
encoder : HEVC
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:3(und): Data: none (mebx / 0x7862656D), 42 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:4(und): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, smpte170m/bt709/bt709), 1280x720, 13303 kb/s, 59.90 fps, 59.94 tbr, 16800 tbn, 16800 tbc (default)
Metadata:
rotate : 90
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Video
vendor_id : [0][0][0][0]
encoder : HEVC
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:5(und): Data: none (mebx / 0x7862656D), 238 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:6(und): Data: none (mebx / 0x7862656D), 14138 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:7(und): Data: none (mebx / 0x7862656D), 16981 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:8(und): Data: none (mebx / 0x7862656D), 131 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:9(und): Data: none (mebx / 0x7862656D), 570 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:10(und): Data: none (mebx / 0x7862656D) (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:11(und): Data: none (mebx / 0x7862656D), 552 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:12(und): Data: none (mebx / 0x7862656D) (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:13(und): Data: none (mebx / 0x7862656D), 237 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:14(und): Data: none (mebx / 0x7862656D) (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:15(und): Data: none (mebx / 0x7862656D), 1854 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:16(und): Data: none (mebx / 0x7862656D) (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:17(und): Data: none (mebx / 0x7862656D), 654 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:18(und): Data: none (mebx / 0x7862656D), 5394 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:19(und): Data: none (mebx / 0x7862656D), 8637 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
Stream #0:20(und): Data: none (mebx / 0x7862656D), 8637 kb/s (default)
Metadata:
creation_time : 2022-05-30T04:13:50.000000Z
handler_name : Core Media Metadata
AVAssetWriterInputMetadataAdaptor
の使い方発見。
恐らく、videoのタイムラインに同期したmetadataをmp4に同梱するところまではできた。
次のステップはmp4の再生機能。videoをUnityのテクスチャに反映 & Raw byte dataを送信する
ffmpeg -i record_0707_1737_00.MP4 17:37:48
ffmpeg version 4.4.1-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'record_0707_1737_00.MP4':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2022-07-07T15:37:01.000000Z
Duration: 00:00:11.42, start: 0.000000, bitrate: 7762 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 7744 kb/s, 58.25 fps, 240 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2022-07-07T15:37:01.000000Z
handler_name : Core Media Video
vendor_id : [0][0][0][0]
encoder : H.264
Stream #0:1(und): Data: none (mebx / 0x7862656D), 11 kb/s (default)
Metadata:
creation_time : 2022-07-07T15:37:01.000000Z
handler_name : Core Media Metadata
At least one output file must be specified
Unityのテクスチャにbyte arrayをネイティブ側で突っ込む事例
メタデータを受け取るには2種類の方法があるらしい。
There are a few different ways to retrieve timed metadata from a QuickTime movie, depending on what an application wants to do:
For offline processing of media (such as an export operation), an AVAssetReader can be used. In this case, an AVAssetReaderOutputMetadataAdaptor provides AVTimedMetadataGroups from metadata tracks in the QuickTime movie. This technique is demonstrated by the AVLocationPlayer sample code.
AVMetadataRecordPlay demonstrates how to visualize timed metadata during realtime playback. The app implements a class conforming to the AVPlayerItemMetadataOutputPushDelegate protocol, which creates an AVMutableComposition, and plays the composition with an AVPlayerItem. Detected face metadata is shown by drawing bounding boxes on the video where faces were detected. Video orientation metadata is "visualized" as the app updates the video track's display layer's transform property. Location (GPS) metadata is shown as a string in a UI label.
動画からMetadata trackを読み込むことに成功した。
次はUnity Integration
Unity Integration動いた!macOS, iOSどちらでも動作確認。
次はフレーム単位の同期かな…。ARKitのレコーディングもしたいな。
久々に向き合う。
フレーム単位の同期を実装できたと思う。
最新のARFoundationへの組み込みを試している。
CHANGELOGを追う感じ、ARFoundation 5.0.2から、ARBackgroundRendererFeatureをUnityEditorでも実行してくれるようになったのはいいが、M1 macでフリーズするという問題があり、解決したとか言われているが、全然再現するぞ…。
ARFoundation 5.0.2の大きな変更点として、Overdrawを避けるために、Opaquesパスの後にカメラのバックグランドを表示する機能。ってのがあるらしい。
この辺の内容↓
でもURPで以前のBeforeOpaquesを使おうとすると、Clear()を挟まれて、何も描画されなくなるというバグがある。誰も気にしてないのかな…。クリーンなプロジェクトでも再現する。
調べた感じXRInputSubsystemはネイティブプラグインを読み込むことが前提になってるぽい。ARFoundation, XRのAPI設計はモジュール化を意識しすぎたあまり、冗長になり、逆にちょっとこういったツールを作りたいときに拡張性がない。
ネイティブプラグイン化しなきゃだめなSubsystems
C#からも登録できるようにしてくれてもいいのに。
動画問題がなんとかなりそうなので、これを見てみる。
XR SDKをこちらで登録してダウンロードが必要みたい
ARFoundation 5.0.2で、シュミレーター機能がついた。これのおかげで、XRTextureDescriptor
などのプロパティが全部プライベートになっていたstructにコンストラクタがついて、C#からも生成できるようになったのは良い。
以前はネイティブ側からしかstruct生成できないので、Unityシュミレーターを作ろうとすると少しトリッキーな生成をする必要があった。
以前使っていた方法↓
Unity 2022.2.0 ベータ 、VideoPlayerがエディタでフリーズするという致命的なバグにあたった。
URP Version 14.0.2はバグがあるから、Unityを最新に上げたいものの、最新にあげるとVideoPlayerが動かないという積んでるやつ。
Avfiから出力した動画がVideoPlayerで動かないの調査。
カラースペース設定されてないよってWarningが出ていたので、
https://www.youtube.com/watch?v=IXYKhZdGF6s
この辺を参考にベーシックなカラースペースっぽい ITU_R BT.709
を設定。カラースペースの警告は消えたが、依然直らず。
// Add color property settings
NSDictionary* colorPropertySettings =
@{
AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_709_2,
AVVideoYCbCrMatrixKey: AVVideoTransferFunction_ITU_R_709_2,
AVVideoTransferFunctionKey: AVVideoYCbCrMatrix_ITU_R_709_2,
};
// Asset writer input setup
NSDictionary* settings =
@{ AVVideoCodecKey: AVVideoCodecTypeH264,
AVVideoWidthKey: @(width),
AVVideoHeightKey: @(height),
AVVideoColorPropertiesKey: colorPropertySettings,
};
_writerInput =
[AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo
outputSettings: settings];
が依然として、ビデオプレーヤーでバグが出ることを確認。
2021.3.12f1: OK
2022.1.20f1: OK
2022.2.0b13.112.4548: NG
と、2022.2で一新されたとされるビデオプレーヤーの問題。
↑ 明らかなUnity側のバグっぽいので、再現プロジェクトと一緒にひとまずバグレポ送信した。
一ヶ月待って、バグレポ回答が来た。多分2022.2のTech Stream リリースへ向けて忙しかったんだろな。
2022.2で変更入ったビデオプレーヤーではVariable Frame Rateに対応しないというRegression. 2023 の最新アルファで直したよーと返答きた。2022 LTSにbackporting してくれって連絡しようかな。
とりあえず2023で開発してみるか
The comment below has been added to your bug report: IN-22670: A Unity Employee (Dominique Leroux) has responded to this issue: Hi, Thanks for reporting this problem, we'll try to address this as best as we can. The reason the clip is not playing correctly is because it has a variable frame rate. E.g.: there is a long gap between the two first frames: the first is at t=0, second is at t=0.3333s, third at .35s, fourth at .3666s and so on. These types of clips, while they have worked better in the past on AVFoundation and are also working better on Windows Media Foundation, are not perfectly well supported (e.g.: seek may not be giving expected results). But we should at least be able to bring back the same level of support there was prior to 2022.2 - where the regression happened. Until the fix gets integrated into a release, you should use clips that have a constant frame rate (CFR). Most softwares are better behaved with these clips. To create a constant frame rate version of the clip you provided that has the issue, you can use ffmpeg: ffmpeg -i freeze-video.mp4 -vsync cfr cfr-video.mp4 This is of course not optimal for image quality, since this causes a re-encoding. Ideally, the video would be produced directly with constant frame rate, but it is frequent for mobile devices to produce movies that have variable frame rate because they may vary the exposure time depending on lighting conditions, thus modulating the frame rate. Hope this helps, Dominique Leroux A/V developer at Unity
2022 LTSにバックポートをお願いしている。これが治らんことにはどうにもならんが
2022最新版へもバックポート作業中のステータスに入った。きちんとバグレポ送れば対応してくれますね。
2022年最新版へのバックポートがリジェクトされたって連絡きた。まあ実装適当なのが目にみえてわかったので…。
今日時間があったので、少し見た。AVFoundationのレコードするときに、無理やり固定フレームレートにする(やや現実の時間とずれるが)方法を見つけたのでこの問題を回避できそうな。
またこの現象を確認したことで、なぜ他の録画系のアセット NatCorderなどでwarm upのメソッドが実装されているのかが理解できた。初回の録画だけやたら遅い…。 どこ時間がかかっているのかちゃんとプロファイルをとってみたほうが良いかもしれない。
動画がなんとかなったので、見ぬふりをしていた、
ネイティブプラグイン化しなきゃだめなSubsystemsを見ているが、XRSDKの通りにやってみたがEditorで読み込んでくれない。インターネット上に実装例がほぼないので、よーわからない。
実機ではどうなってるんだろうと、ARKitで動いてるアプリを実行して、Input Debuggerで見てみると、以下のようにデバイスはHandheldARInputDeviceが登録されているのが確認できる。
GitHub advanced search
でいくつか事例が出てきたぽいぞ。これをもとに試すかな…。
XR SDKのダウンロードフォーラムからSDKをもう一度ダウンロードしてみたらテストSuitesへのリンクが貼ってあることに気づいた。
Test Suites
SDK自体はUnity Companion License
Ok。要するにValveがUnity XRチームのサポート受けてて、かつBSDライセンスで公開してるので、参考にしても良さそう。
XR SDKでXRInputSystemをネイティブプラグインで作らなきゃいけないし、ドキュメントもないしでわからなかったのだが、
新Input Systemで独自デバイスを作って、C#クラスから、HandheldARInputDevice
のイベントを発行することができた。ハックではあるが直接カメラのTransfromをいじるよりはいささか丁寧。
Variable Frame Rateのビデオが再生されないというマイナーIssue投稿から5ヶ月。やっと修正されました。
Androidの方も動画ファイルにメタデータを仕込むことができるぽい。サンプルコードもついている。
XRPlaneSubsystemを実装した。
基本的にstructはバイナリとしてコピーする作戦
長らくXR SDKのネイティブプラグインの使い方が分からなかったのだが、頑張って実装できた気がする。
実装した変更点はここ。最低限のXR SDK実装として参考になる気がする。
XR SDKについては英語でもGitHubでもUnity 公式でも実装方法についてほぼ情報が無いので別にまとめたい。
まとめる際の要点
-
UnitySubsystemsManifest.json
がちゃんと読み込まれてるかはEditor Logを[Subsystems]
で検索して確認。 - 同様にXR SDKのログには prefix
[XR]
がつくのでそれで検索。 - 読み込まれるネイティブプラグインは相対パスのUnitySubsystemsManifest.json 以下に配置しなくてはいけない。フォルダストラクチャが厳しい。
- XR SDKのサンプルをコピーしてから開発を始めるといいかもしれない。
- package.jsonのkeywordsに"xreditorsubsystem"が入っていないと駄目。
迂闊にXcode15にしてしまったら、Unity 2022.3.7f1 LTS でiOS実機ビルドエラー
2022.3.10f1 LTSにアップグレードして解決。
ずっとXRSDK native pluginを作るときに何故か、UnitySubsystemsManifest.json
が読み込まれない問題。しかもなぜかサンプルでは読み込まれてるけど、自分の新規プロジェクトではどうやっても読み込まれない問題があり、3日くらい色々試していたのだが、
自分のpackage.json
に "xreditorsubsystem" ってキーワードが無いとそもそも読み込み対象に入らないということが判明。
"keywords": [
"xreditorsubsystem"
],
あらゆるドキュメントを漁ったけどどこにも書いてなくて、Verified Solutions Partnerになって、開発者から聞かないとわからないやつじゃん…。これだからクローズドソースは。
AR Foundation Remoteの作者も数日ついやしたって書いてある…。Unity ~~~~~~
いくつかのSubsystems と ARCore Geospatialが動くとこまでできたのでクローズします。ちまちまアップデート予定。