พื้นที่ย่อยคือส่วนของพื้นที่ 3 มิติภายในแอปที่คุณวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มมิติให้กับเนื้อหา 2 มิติได้ ระบบจะแสดงผลพื้นที่ย่อยก็ต่อเมื่อเปิดใช้การจัดวางเสียงเท่านั้น ใน Home Space หรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะไม่สนใจโค้ดภายในพื้นที่ย่อยนั้น
คุณสามารถใช้ @SubspaceComposable
เช่น Volume
และ SpatialPanel
เพื่อวางโมเดล 3 มิติ คอมโพเนนต์ XR บางรายการ เช่น Orbiter
หรือ SpatialDialog
เป็นส่วนประกอบ 2 มิติมาตรฐานที่ใช้ได้ทุกที่ในลําดับชั้น UI 2 มิติ แต่ต้องเรียกใช้ SubspaceComposable
ในเซบ์สเปซของแอป โดยจะใช้คอมโพสิเบิล Subspace
คุณสามารถเรียกใช้ Subspace
ได้โดยตรงในลําดับชั้น UI 2 มิติเช่นเดียวกับคอมโพสิเบิลอื่นๆ อย่างไรก็ตาม โปรดคำนึงถึงผลที่ตามมาของตำแหน่งในลําดับชั้นที่คุณเรียกใช้ Subspace
เกี่ยวกับลําดับชั้นของพื้นที่ทำงานย่อย
พื้นที่ทำงานย่อยระดับบนสุดคือพื้นที่ทำงานย่อยด้านนอกสุดที่แอปเรียกใช้ พื้นที่ทำงานย่อยนี้ไม่มีขอบเขตที่สิ้นสุด และโดยปกติแล้วจะเป็นตําแหน่งที่คุณวางเลย์เอาต์เชิงพื้นที่และ SpatialPanel
ของแอป
อย่างไรก็ตาม หากคุณฝังพื้นที่ทำงานย่อยอื่นภายในลําดับชั้น UI 2 มิติในแผงที่อยู่ในพื้นที่ทำงานย่อยระดับบนสุด พื้นที่ทำงานย่อยที่ฝังนั้นจะทํางานต่างจากเดิม
พื้นที่ทำงานย่อยที่ฝังมีความแตกต่างที่สำคัญ 2 ประการจาก Subspace
ระดับบนสุด
- โดยจะอยู่ในเลย์เอาต์ 2 มิติที่เรียกใช้ ซึ่งหมายความว่าความสูงและความกว้างของพื้นที่ย่อยจะจำกัดตามความสูงและความกว้างของเลย์เอาต์หลัก 2 มิติ
- โดยจะทํางานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่าหากคุณเรียกใช้คอมโพสิเบิล
Subspace
ที่ฝังอยู่ภายในSpatialPanel
นั้น พื้นที่ทำงานย่อยจะเป็นส่วนหนึ่งของSpatialPanel
ที่เรียกใช้
ลักษณะการทํางานของพื้นที่ย่อยที่ซ้อนกันเหล่านี้จะเปิดใช้ความสามารถต่างๆ เช่น
- การย้ายเอนทิตีย่อยไปพร้อมกับเอนทิตีหลัก
- การปรับตำแหน่งของบุตรหลานโดยใช้ออฟเซต
SubspaceModifier
- การนำเสนอวัตถุ 3 มิติที่วางอยู่เหนือ UI 2 มิติและตรงกับความสูงและความกว้างของพื้นที่ที่เหมาะสมในเลย์เอาต์ 2 มิติ
เพิ่มพื้นที่ย่อยลงในแอป
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่มพื้นที่ทำงานย่อยระดับบนสุดและที่ฝังลงในแอป
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)
}
...
}