子空間是應用程式中 3D 空間的區隔,可用於放置 3D 模型、建構 3D 版面配置,以及為 2D 內容新增深度。只有在啟用空間化功能時,系統才會算繪子空間。在 Home Space 或非 XR 裝置上,系統會忽略該子空間中的任何程式碼。
您可以使用 @SubspaceComposable
(例如 Volume
和 SpatialPanel
) 來放置 3D 模型。部分 XR 元件 (例如 Orbiter
或 SpatialDialog
) 是標準的 2D 可組合項,可用於 2D UI 階層中的任何位置,但 SubspaceComposable
必須在應用程式的子區域中叫用。為此,您將使用 Subspace
可組合函式。
如同其他可組合項,您可以在 2D UI 階層中直接呼叫 Subspace
。不過,請務必瞭解在階層中叫用 Subspace
的影響。
關於子空間階層
頂層子空間是應用程式叫用的最外層子空間。這個子空間實際上具有無限邊界,通常是放置應用程式空間版面配置和 SpatialPanel
的位置。
不過,如果您在頂層子區域中包含的面板中,在 2D UI 階層中巢狀結構另一個子區域,該巢狀結構子區域的行為會有所不同。
巢狀子空間與頂層 Subspace
有兩個主要差異:
- 這些物件會參與其叫用的 2D 版面配置。這表示子區域的高度和寬度會受到其 2D 父項版面配置的高度和寬度限制。
- 這些元素的行為就像是其叫用所在實體的子項。也就是說,如果您呼叫巢狀在
SpatialPanel
中的Subspace
可組合函式,該子空間將會是呼叫所在SpatialPanel
的子項。
巢狀子空間的這些行為可啟用以下功能:
- 使用父項實體移動子項
- 使用偏移量
SubspaceModifier
偏移子項的位置 - 呈現 3D 物件,讓其懸停在 2D UI 上方,並與 2D 版面配置中適當空間的高度和寬度相符
在應用程式中新增子區
以下程式碼範例說明如何在應用程式中新增頂層和巢狀子集。
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)
}
...
}