OpenXR 開発ガイド
OpenXR は、Khronos Group が定義・維持するオープンでロイヤリティフリーの XR(VR/AR/MR)インターフェース標準です。その中核的な目標は、開発者が「一度書けばどこでも動く」ことを可能にし、デバイスごとに異なる API セットが存在するという断片化問題を解決することです。LCC Unity SDK は現在 OpenXR 標準に対応しているため、特定の VR デバイスベンダーが提供する SDK なしで、OpenXR 対応デバイス上で 3DGS データをレンダリングできます。
バージョン要件
このガイドで使用するソフトウェアとプラグインのバージョンは以下のとおりです。同じバージョンでの開発を推奨します。テストされていない他のバージョンには互換性の問題がある場合があります。
| ソフトウェア / プラグイン | バージョン |
|---|---|
| Unity | v6000.0.69f1 |
| LCC Unity SDK | v2.3.0 以上 |
注:
- OpenXR は標準であり、各 VR デバイスベンダーはその全機能を対応する場合もあれば一部のみ対応する場合もあるため、使用前に特定デバイスの対応状況を確認する必要があります。
- OpenXR 標準は共通の技術仕様を定義しますが、デバイス固有の機能にはベンダー SDK やベンダーの OpenXR Extension が必要です。たとえば ATW(Asynchronous Time Warp)、PTW(Late Stage Reprojection)など、フレーム間の滑らかさを向上させる技術が該当します。
- このガイドは主に実 VR デバイスでの OpenXR 開発を実演します。LCC Unity SDK は OpenXR のデスクトップアプリケーション開発には対応していません(PCVR を除く)。
開発手順
手順 1:URP プロジェクトを作成する
プロジェクトテンプレートで Universal 3D(URP レンダーパイプライン)タイプを選択します。以下のとおりです。

Universal 3D プロジェクトを作成
手順 2:プラットフォームを切り替える
プロジェクト作成後、Unity メニューから File → Build Profiles を選択してビルドウィンドウを開き、プラットフォームを Android に切り替えます。以下のとおりです。

Build Profiles でプラットフォームを Android に切り替え
手順 3:Unity OpenXR をインポートする
Unity メニュー Window → Package Manager から UPM ウィンドウを開き、左のリストで Unity Registry を選択し、検索ボックスに OpenXR を入力し、検索結果から OpenXR Plugin を選択してインストールします。以下のとおりです。

Unity Registry から OpenXR Plugin をインストール
手順 4:XR Interaction Toolkit をインポートする
左のリストで Unity Registry を選択し、検索ボックスに XR を入力し、検索結果から XR Interaction Toolkit を選択してインストールします。以下のとおりです。

Unity Registry から XR Interaction Toolkit をインストール
手順 5:LCC Unity SDK をインポートする
Unity メニュー Window → Package Manager から UPM ウィンドウを開き、左の + をクリックし、ドロップダウンメニューから Install package from disk を選択し、LCC Unity SDK を特定して package.json ファイルを選択してインポートします。以下のとおりです。

Install package from disk で LCC Unity SDK をインポート
手順 6:Unity 環境を設定する
XR Plug-in Management を設定(Android プラットフォーム)
Unity メニューバーから File → Project Settings を選択し、左側の XR Plug-in Management を選択し、Android プラットフォームタブで OpenXR にチェックを入れ、Initialize XR on Startup にチェックを入れます。以下のとおりです。

Android プラットフォームで OpenXR と Initialize XR on Startup にチェック
XR Plug-in Management を設定(Desktop プラットフォーム)
LCC Unity SDK はデスクトップの OpenXR 開発に対応していないため、Desktop プラットフォームでは OpenXR と Initialize XR on Startup にチェックを入れないでください。以下のとおりです。

Desktop プラットフォームでは OpenXR と Initialize XR on Startup にチェックしない
注:デスクトップの PCVR については PCVR ストリーミング を参照してください。
OpenXR のレンダーモードとインタラクション設定を設定
XR Plug-in Management の OpenXR 項目を選択し、Android プラットフォームの Render Mode を Single Pass Instanced または Multi-View に設定します。OpenXR では Interaction Profiles の設定が必要なため、通常は Oculus Touch Controller Profile または類似のデバイス性能特性を持つプロファイルを選択します。以下のとおりです。

OpenXR の Render Mode と Interaction Profiles を設定
Project Validation
XR Plug-in Management の Project Validation 項目を選択し、Fix All をクリックして必要な設定を完了します(当面未処理のままにして後で手動作成することもできます)。以下のとおりです。

Project Validation で Fix All をクリック
Player を設定(Desktop プラットフォーム)
Project Settings 左側の Player を選択し、Desktop プラットフォームに切り替え、Other Settings セクションを展開し、Auto Graphics API のチェックを外し、Graphics APIs を Direct3D12、Vulkan、Direct3D11 に設定して他のグラフィックス API を削除します。Color Space を Gamma に設定します。以下のとおりです。

Desktop プラットフォームでグラフィックス API と Gamma 色空間を設定
注:一部の VR デバイスは Gamma 色空間に対応していません。その場合は Linear 色空間を選択するしかなく、Linear 色空間でレンダリングした LCC シーンはわずかに白っぽく見えます。
Player を設定(Android プラットフォーム)
Project Settings 左側の Player を選択し、Android プラットフォームに切り替え、Other Settings セクションを展開し、Auto Graphics API のチェックを外し、Graphics APIs を Vulkan に設定して他のグラフィックス API を削除します。Color Space を Gamma に設定します。以下のとおりです。

Android プラットフォームでグラフィックス API を Vulkan、色空間を Gamma に設定
Android プラットフォームのスクリプトバックエンドと入力を設定
Android プラットフォームの Other Settings タブを下にスクロールし、Minimum API Level = Android 12L (API Level 32) 以上、Scripting Backend = IL2CPP、Target Architectures = ARM64、Active Input Handling = Input System Package (New) または Both に設定します。以下のとおりです。

Minimum API Level、Scripting Backend、Target Architectures、Active Input Handling を設定
Graphics と Quality を確認
Project Settings 左側の Graphics を選択し、Mobile プラットフォームが使用する Default Render Pipeline に対応する Render Asset(この例では Mobile_RPAsset)を確認します。以下のとおりです。

Mobile プラットフォームの Default Render Pipeline Render Asset を確認
Project Settings 左側の Quality を選択し、Mobile プラットフォームが使用する Default Render Pipeline に対応する Render Asset(この例では Mobile_RPAsset)を確認し、Resolution Scaling Fixed DPI Factor = 0.7、VSync Count = Don't Sync に設定します。以下のとおりです。

Quality で DPI Factor と VSync を設定
Render Asset を設定
Mobile プラットフォームが使用する Default Render Pipeline に対応する Render Asset(この例では Mobile_RPAsset)を見つけ、Asset を選択し、プロパティウィンドウ(Inspector)で Depth Texture、Opaque Texture、HDR のチェックを外し、Anti Aliasing (MSAA) = Disabled、Render Scale = 0.7、Upscaling Filter = Automatic に設定します。以下のとおりです。

Render Asset で Depth/Opaque Texture、HDR、MSAA を無効化し Render Scale = 0.7 を設定
この Render Asset に対応する Renderer(この例では Mobile_Renderer(Universal Renderer Data))を見つけ、プロパティウィンドウ(Inspector)で関連プロパティを設定します。以下のとおりです。

Mobile_Renderer (Universal Renderer Data) のプロパティを設定
手順 7:シーンを作成する
Unity で新しいシーンを作成し、Main Camera と Directional Light を削除し、ヒエラルキーウィンドウ(Hierarchy)の空の領域を右クリックし、ポップアップメニューから XR → XR Origin (VR) を選択して必要な XR オブジェクトを作成します。
手順 8:シーンを設定する
ヒエラルキーウィンドウ(Hierarchy)で XR Origin (VR) GameObject を選択し、プロパティウィンドウ(Inspector)の XR Origin コンポーネントで Tracking Origin Mode を Floor に設定します。その他の関連プロパティは以下のとおりです。

XR Origin の Tracking Origin Mode を Floor に設定
ヒエラルキーウィンドウ(Hierarchy)で XR Origin (VR) 配下の Main Camera GameObject を選択し、プロパティウィンドウ(Inspector)で Camera コンポーネントのプロパティを設定します。Clipping Planes Near = 0.3、Far = 5000、Anti-aliasing = No Anti-aliasing、Opaque Texture = Off、Depth Texture = Off、Background Type = Solid Color、Background = 黒、HDR = Off、MSAA = Off。その他のプロパティは以下のとおりです。

XR Origin (VR) 配下の Main Camera の Camera コンポーネントプロパティを設定
手順 9:シーンを読み込むコードを書く
ヒエラルキーウィンドウ(Hierarchy)で Create Empty を右クリックして空のオブジェクトを作成し、LCCManager と名前を付け、その Transform を正規化し、Add Component で LCCManager スクリプトをアタッチします。以下のとおりです。

LCCManager 空オブジェクトを作成し LCCManager スクリプトをアタッチ
ヒエラルキーウィンドウ(Hierarchy)で Create Empty を右クリックして別の空のオブジェクトを作成し、LCCRenderer と名前を付け、その Transform の Rotation.x = -90、Scale.x = -1 に設定します。以下のとおりです。

LCCRenderer 空オブジェクトを作成し、Rotation.x = -90、Scale.x = -1 を設定して座標系をアライメント
Rotation.x = -90 と Scale.x = -1 は、LCC データ座標系(Z 軸上・右手系)から Unity 座標系(Y 軸上・左手系)へのアライメント変換です。詳しくは Unity SDK の概要 の「LCC データの座標系」を参照してください。
この時点で、ヒエラルキーウィンドウ(Hierarchy)の GameObject 構成は以下のとおりです。

Hierarchy ウィンドウの構成
LCCRenderer.cs という名前の C# スクリプトを以下のコードで作成します。
using LCCCore;
using UnityEngine;
using UnityEngine.XR;
public class LCCRenderer : MonoBehaviour
{
public LCCManager m_manager;
public string m_FilePath;
private LCCCore.Renderer m_renderer;
void Start()
{
#if UNITY_EDITOR
m_manager.SetPlatformType(PlatformType.PC);
m_renderer = m_manager.GetRender(this.gameObject.transform);
m_renderer.Load(m_FilePath, onProgress, onLoaded);
#else
m_manager.SetPlatformType(PlatformType.OpenXR);
m_renderer = m_manager.GetRender(this.gameObject.transform);
m_renderer.Load($"{Application.persistentDataPath}/LccData/meta.lcc2", onProgress, onLoaded);
#endif
}
private void onProgress(float v)
{
Debug.Log("進捗:" + v);
}
private void onLoaded()
{
m_manager.SetStartLod(2);
m_renderer.SetEnvironment(false);
Debug.Log("データが読み込まれました");
}
}
スクリプトをヒエラルキーウィンドウ(Hierarchy)の LCCRenderer GameObject にアタッチし、プロパティウィンドウ(Inspector)で LCCManager GameObject をスクリプトの Manager プロパティへドラッグし、最後に LCC ファイルパスを入力します。
Unity Editor でのデバッグと Android デバイスへの直接ビルドを容易にするため、コードではコンパイルマクロで実行環境を区別しています。Unity Editor では m_FilePath で指定したアドレスを直接使用し、Android デバイスではオンデバイスのデータソースを使用します。オンデバイスデータの配置方法は以下のとおりです。
- ビルドしたアプリを VR デバイスで 1 回実行します。
- アプリのインストール後、そのデータディレクトリ(一般的に デバイスのストレージ → Android → data → アプリ BundleID → Files。具体的なディレクトリは Android アプリのインストールパスを参照)へ移動し、Files サブディレクトリの下に
LccDataフォルダを作成します。 - すべての LCC データソースを
LccDataフォルダにコピーします。
注:実務では、アプリのデータソースはアプリに直接パッケージ化するのではなく、サーバーに配置することを推奨します。
最適化の実践
上記の手順により VR デバイスで LCC データを正常にレンダリングできますが、主に 2 つの問題があります。
2D アプリウィンドウの表示
デバイスベンダー SDK なしで OpenXR 標準向けに開発されたアプリは、VR デバイス上で必ずしも 3D アプリとして認識されません。通常、VR デバイスのシステムはそれらを 2D アプリとして扱うため、2D アプリウィンドウが表示されます。この問題を解決するには 2 つの方法があります。
- デバイスベンダー SDK またはデバイスベンダーの OpenXR 拡張を導入します。デバイスベンダーのソフトウェアが関連問題を処理します。
AndroidManifest.xmlをカスタマイズします。
Manifest をカスタマイズする具体的な手順は次のとおりです。Project Settings 左側の Player を選択し、Android プラットフォームに切り替え、Publishing Settings セクションを展開し、Custom Main Manifest にチェックを入れると、カスタム Manifest ファイルが生成されます。以下のとおりです。

Custom Main Manifest にチェックしてカスタム Manifest ファイルを生成
AndroidManifest.xml ファイルを見つけ、VR マーカーを追加して VR デバイスに 3D 没入型アプリとして認識させます。起動したアプリは 3D 空間として表示されます。例:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!--Application Entry が GameActivity に設定されている場合に使用。それ以外はこのアクティビティブロックを削除-->
<activity android:name="com.unity3d.player.UnityPlayerGameActivity"
android:theme="@style/BaseUnityGameActivityTheme"
android:resizeableActivity="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
</manifest>
レンダリングフレームレートが 90FPS を下回る場合のカクつき
OpenXR 標準自体はフレーム補間やスムージングなどを定義していません。フレームレートが 90FPS に達しない場合、頭を回転させたり移動したりすると顕著なカクつきを感じます。より良い体験、特に限られたハードウェア性能下での滑らかさ向上のため、デバイスベンダーは通常トゥイーン、フレーム補間、スムージングなどの技術を提供します。たとえば ATW(Asynchronous Time Warp)、PTW(Late Stage Reprojection)などです。
デバイスが OpenXR に対応している場合、デバイスベンダーは通常 OpenXR Extension や OpenXR を直接対応する SDK を提供します。この場合はより滑らかな体験のため、デバイスベンダー SDK を導入するのが最善です。
関連ドキュメント
- プロジェクト設定とパフォーマンス最適化については、プロジェクト設定の最適化ガイド と レンダリングパフォーマンスパラメータガイド の章を参照してください。
- VR デバイスの 3DGS オンスクリーンレンダリング能力は約 70 万ガウスプリミティブです。大規模シーンをレンダリングする場合は StartLOD を
2に設定し、環境データ表示を無効にすることを推奨します。大規模シーンは PC ストリーミングの方が滑らかです。