Snapdragon Spaces SDKを読んだり、OpenXRやARFoundationについて学ぶ会
Spaces SDK 1.4.1のtgzを解凍して、まずはAssetsにぶち込むぜ!
当然UPMによる依存関係の解決はされないので
必要な依存パッケージは自分で読み込むしかない
- input system
- ARFoundation
- OpenXR plugin
XRIはパッケージ名指定で入れる必要があるらしい
本当はそれぞれのpackage.json見ながらバージョン合わせたほうが良さそうですが
今回はザクザクとやっていきます
環境は
- Windows 10 Home
- Unity 2021.3.4
なぜか必要パッケージをインポートしてもエラーが出る
SpacesのUntyバージョンが2021.3.16推奨なのと
XRIのインポート方法が2021.3.9以降で違うらしいので
Unityのバージョンがいけないのかもしれない
↑雑だけど、インストールしてあった2022.3.2f1にアプデしたらUnityエディタで出てくるエラーにつては解消した
やはり念のため……ということで
2021.3.16f1をインストしてそこで検証することに
Spaces SDKはこれ
2021.3.16で、SpacesSDKをtgz解凍してAssets以下に設置し、
- Input System
- ARFoundation
- OpenXR Plugin
- XRI
をインポート。
manifest.jsonの中身はこれ
{
"dependencies": {
"com.unity.collab-proxy": "1.17.7",
"com.unity.feature.development": "1.0.1",
"com.unity.ide.rider": "3.0.24",
"com.unity.ide.visualstudio": "2.0.18",
"com.unity.ide.vscode": "1.2.5",
"com.unity.textmeshpro": "3.0.6",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.assetbundle": "1.0.0",
"com.unity.modules.imageconversion": "1.0.0",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0",
"com.unity.modules.physics": "1.0.0",
"com.unity.modules.screencapture": "1.0.0",
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.ui": "1.0.0",
"com.unity.modules.umbra": "1.0.0",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
"com.unity.modules.unitywebrequestaudio": "1.0.0",
"com.unity.modules.unitywebrequesttexture": "1.0.0",
"com.unity.modules.unitywebrequestwww": "1.0.0",
"com.unity.modules.vr": "1.0.0",
"com.unity.modules.xr": "1.0.0",
"com.unity.xr.openxr": "1.6.0",
"com.unity.xr.arfoundation": "4.2.7",
"com.unity.inputsystem": "1.0.2",
"com.unity.xr.interaction.toolkit": "2.3.0",
"com.unity.xr.management": "2.3.0-pre.1"
}
}
自動的にUnityが再起動して、エラーがすべて解決
ARFoundationなのか、OpenXRPluginsなのかわからないけど
subsystem, providor, featureなどという概念を整理したいね
edoさんの記事が参考になりそう
それぞれの機能については、同じような構成になってるっぽい
- Feature
- (Feature.Delegates)
- Subsystem
SubsystemのインナークラスとしてProvidorがで定義してあって
SubsystemはProvidorのメソッドを呼んでいるみたいな構成になっている
またsubsystemにuderlyningFeatureがあってそれも使う
subsystemはXRXxxSubsystemを継承し、ProvidorはXRXxxxSubsystemのインナークラスであるProvidorを継承している
Featureは(SpacesOpenXRFeatureを経由して)OpenXRFeatureを実装
ちなみにARFoundationのSubsystem一覧はこちら
ARF5のページにあったので注意
Subsystemの説明和訳
AR Foundationはサブシステムで構築されている。サブシステムは、さまざまなタイプの情報を表示するための、プラットフォームにとらわれないインターフェイスです。AR関連のサブシステムはAR Subsystemsパッケージで定義され、名前空間UnityEngine.XR.ARSubsystemsを使用します。AR Subsystems パッケージの型と対話する必要がある場合があります。
各サブシステムは特定の機能を処理します。たとえば、XRPlaneSubsystem はプレーン検出インターフェイスを提供します。
Providorの説明和訳
プロバイダはサブシステムの具体的な実装です。例えば、ARCore XR Plugin パッケージには、多くの AR サブシステムの ARCore 実装が含まれています。
プロバイダによって特定の機能のサポートが異なるため、各サブシステムには、どの特定のサブシステムの機能をサポートするかを示す記述子もあります。例えば、XRPlaneSubsystemDescriptor には、水平面検出と垂直面検出のどちらをサポートしているかを示すプロパティが含まれています。
各サブシステムの実装方法は、個々のプロバイダが決定します。一般的には、そのプラットフォームのネイティブSDK(例えば、iOSのARKitやAndroidのARCore)をラップします。
ソース
実際に、MockでARFoundationのsubsystemを実装している例があった
OpenUPMからインポートしてみる
理解のためにCameraSubsystemのクラス構成を書いてみた
参考リンク達
Spacesの機能の実態は、OpenXRFeatureの実装になっており
FeatureをProvidorが使って機能を提供していて、
SubsystemがProvidorの機能を使って機能を提供している
という階層構造になっていそう
Spacesの中に入っているHandTracking系の機能は全部Obsoleteになっていて
代わりにQCHT内に実装がありそう
HandTrackingのSubsystemはもともとARFoundation(ARSubsystem)にはないが
SubsystemWithPreovidorを継承してカスタムで作られて入るっぽさ
結局SpacesSDKの機能の実態って何なんですかー!っていうのは分からんな
Spaces対応デバイスがどこかでネイティブのAPIを提供していて、
おそらくそれがネイティブプラグインになっていて
そのDLLをOpenXRFeatureが参照しているっぽいと推測しているけど
xr architectureみたいな図作りたいね
ここのページのDeepL和訳してみる
Unityは、プラグインフレームワークと一連の機能とツールパッケージを通じてXR開発をサポートしています。プロジェクト設定のXRプラグイン管理カテゴリに移動して、UnityプロジェクトでXRサポートを有効にし、プロジェクトがサポートするXRプラットフォーム用のプラグインを選択します。Unity Package Manager を使用して、追加機能パッケージをインストールします。
次の図は、現在のUnity XRプラグインフレームワークの構造と、プラットフォームプロバイダーの実装との連携方法を示しています:
XR サブシステムは、XR 機能の共通インターフェースを定義します。XR プラグインは、実行時にサブシステムにデータを提供するために、これらのサブシステムインターフェイスを実装します。XR アプリケーションは、Unity Engine およびパッケージ API を使用して XR 機能のデータにアクセスできます。
XR providor plug-in framework
XRプロバイダプラグインは、1つまたは複数のXRデバイスプラットフォームをサポートするUnityプラグインです。例えば、ARCoreプラグインはハンドヘルドAndroidデバイスのAndroid ARプラットフォームをサポートし、OpenXRプラグインは複数のオペレーティングシステムの複数のXRデバイスをサポートします。
XRプロバイダプラグインは、Unity XR SDKによって定義されたインターフェースを実装します。これらのインターフェースはサブシステムと呼ばれます。1 つ以上のサブシステムを実装するプラグインをプロバイダプラグインと呼びます。通常、プロバイダプラグインは、デバイスプラットフォームのネイティブライブラリを使用して、デバイス用のUnityインターフェースを実装します。
Unityは、サブシステムインターフェースを使用してさまざまなプラットフォームのプロバイダーと通信し、アプリケーションのXR機能を強化します。これらのインターフェースのおかげで、その機能のプロバイダを持つすべてのXRデバイスで、アプリケーション内の同じ機能コードを再利用できます。
Subsystems
XR サブシステムを使用すると、Unity アプリで XR 機能にアクセスできます。Unity XR SDKは、サブシステム用の共通インターフェイスを定義しているため、機能を実装するすべてのプロバイダプラグインは、一般的にアプリで同じように動作します。多くの場合、プラットフォームがほぼ類似している限り、アクティブなプロバイダを変更し、異なるXRプラットフォーム上で実行するためにアプリを再構築することができます。
Unityエンジンは、基本的なXRサブシステムのセットを定義します。Unityパッケージは追加のサブシステムを提供できます。たとえば、AR Subsystems パッケージには、AR 固有のサブシステム インターフェイスの多くが含まれています。
こんな感じ……?
ここまで調べた内容でyokohama.unity 12に登壇しましたよ