XR プロバイダーは、Unity プロジェクトの一部であり、最低限、マニフェストファイルと 1 つ以上のネイティブプラグインで構成されています。また、スクリプトや画像などの他のアセットを加えることもできます。エディターを起動したときにこれらがプロジェクト内にあれば、Unity に検出されます。
ノート: プロバイダーのマニフェストやエディターのネイティブプラグインを変更した場合は、Unity を再起動する必要があります。
ネイティブプラグインは、UnitySubsystemsManifest.json
に関連するサブフォルダーに保存されている必要があります。プロバイダーがパッケージに含まれていない場合、Unity は Assets
フォルダーの 1 階層までにあるUnitySubsystemsManifest.json
ファイルのみを検索します。
このマニフェストには、プロバイダーが提供するサブシステムやプラグイン名など、プロバイダーに関する情報が含まれています。
詳細については、UnitySubsystemsManifest.json ページを参照してください。
ターゲットプラットフォーム用のネイティブプラグインを作成する方法については、Unity ネイティブプラグインインターフェース のドキュメントを参照してください。ダイナミックライブラリを Unity に取得後、すべてのオプション (プラグイン設定 のターゲットプラットフォームなど) が正しいことを確認してください。
実装しようとしているサブシステムのライフサイクルハンドラーを登録する必要があります。以下はその例です。
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
s_XrDisplay = unityInterfaces->Get<IUnityXRDisplayInterface>();
UnityLifecycleProvider displayLifecycleHandler =
{
NULL, // これは、 userData として以下の関数に渡される任意のオブジェクトです
&Lifecycle_Initialize,
&Lifecycle_Start,
&Lifecycle_Stop,
&Lifecycle_Shutdown
};
s_XrDisplay->RegisterLifecycleProvider("Provider Plugin Name", "Display0", &displayLifecycleHandler);
// 他のサブシステムに登録
}
ノート: RegisterLifecycleProvider
に渡されるパラメーターは、マニフェストファイル の name
と id
のフィールドと一致する必要があります。
後に、Initialize
メソッドを呼び出すと、UnitySubsystemHandle
を取るメソッドを呼び出すのに使用するインスタンスハンドルを取得します。以下はその例です。
/// サブシステムがアクティブになる準備として初期化する必要があるときに実行されるコールバック。
static UnitySubsystemErrorCode UNITY_INTERFACE_API Lifecycle_Initialize(UnitySubsystemHandle handle, void* data)
{
// グラフィックスレッドでコールバックに登録します。
UnityXRDisplayGraphicsThreadProvider gfxThreadProvider = { NULL, NULL, &GfxThread_WaitForNextFrameDesc, NULL };
s_XrDisplay->RegisterProviderForGraphicsThread(handle, &gfxThreadProvider);
return kUnitySubsystemErrorCodeSuccess;
}
SDK パッケージには、プラグインのサンプルを作成するサンプルプロジェクトが含まれています。
Unity でのプロバイダーのロードに関する詳細は、ランタイムディスカバリーとサブシステムのアクティベーション ページを参照してください。