サブスペースは、アプリ内の 3D 空間のパーティションで、3D モデルを配置したり、3D レイアウトを作成したり、2D コンテンツに奥行きを追加したりできます。サブスペースは、空間化が有効になっている場合にのみレンダリングされます。ホーム スペースまたは XR 以外のデバイスでは、そのサブスペース内のコードは無視されます。
3D モデルを配置するには、Volume
や SpatialPanel
などの @SubspaceComposable
を使用できます。Orbiter
や SpatialDialog
などの XR コンポーネントは、2D UI 階層のどこでも使用できる標準の 2D コンポーザブルですが、SubspaceComposable
はアプリのサブスペースで呼び出す必要があります。これを行うには、Subspace
コンポーザブルを使用します。
他のコンポーザブルと同様に、2D UI 階層で Subspace
を直接呼び出すことができます。ただし、Subspace
を呼び出す階層内の場所が持つ意味を理解しておくことが重要です。
サブスペース階層について
最上位のサブスペースは、アプリによって呼び出される最も外側のサブスペースです。このサブスペースの境界は事実上無限であり、通常はアプリの空間レイアウトと SpatialPanel
を配置します。
ただし、トップレベルのサブスペースに含まれるパネルの 2D UI 階層内に別のサブスペースをネストすると、そのネストされたサブスペースの動作は異なります。
ネストされたサブスペースには、トップレベルの Subspace
と次の 2 つの主な違いがあります。
- 呼び出された 2D レイアウトに参加します。つまり、サブスペースの高さと幅は、2D 親レイアウトの高さと幅によって制限されます。
- 呼び出されたエンティティの子として動作します。つまり、
SpatialPanel
内にネストされたSubspace
コンポーザブルを呼び出すと、そのサブスペースは、呼び出されたSpatialPanel
の子になります。
ネストされたサブスペースのこれらの動作により、次のような機能が有効になります。
- 親エンティティとともに子を移動する
- オフセット
SubspaceModifier
を使用して子の位置をオフセットする - 2D UI の上にホバーし、2D レイアウト内の適切なスペースの高さと幅と一致する 3D オブジェクトを表示する
アプリにサブスペースを追加する
次のコードサンプルは、トップレベルとネストされたサブスペースをアプリに追加する方法を示しています。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
// This is a top-level subspace
Subspace {
SpatialPanel {
MyComposable()
}
}
}
}
@Composable
private fun MyComposable() {
Row {
PrimaryPane()
SecondaryPane()
}
}
@Composable
private fun PrimaryPane() {
...
// This is a nested subspace, because PrimaryPane is in a SpatialPanel
// and that SpatialPanel is in a top-level Subspace
Subspace {
ObjectInAVolume(show3DObject)
}
...
}