เพิ่มพื้นที่ย่อยลงในแอป

พื้นที่ย่อยคือส่วนของพื้นที่ 3 มิติภายในแอปที่คุณวางโมเดล 3 มิติ สร้างเลย์เอาต์ 3 มิติ และเพิ่มมิติให้กับเนื้อหา 2 มิติได้ ระบบจะแสดงผลพื้นที่ย่อยก็ต่อเมื่อเปิดใช้การจัดวางเสียงเท่านั้น ใน Home Space หรือในอุปกรณ์ที่ไม่ใช่ XR ระบบจะไม่สนใจโค้ดภายในพื้นที่ย่อยนั้น

คุณสามารถใช้คอมโพสิชันย่อย เช่น Volume และ SpatialPanelเพื่อวางโมเดล 3 มิติ คอมโพเนนต์ XR บางรายการ เช่น Orbiter หรือ SpatialDialog เป็นแบบ 2 มิติมาตรฐานที่ใช้ได้ทุกที่ในลําดับชั้น UI 2 มิติ แต่ต้องเรียกใช้ SubspaceComposable ในเซบ์สเปซของแอป โดยจะใช้คอมโพสิเบิล ApplicationSubspace หรือคอมโพสิเบิล Subspace ก็ได้

ตามชื่อที่บอกไว้ คอมโพสิเบิล ApplicationSubspace ควรมีเนื้อหาที่วางตำแหน่งตามพื้นที่ทั้งหมดของแอป คอมโพสิเบิล Subspace เหมาะอย่างยิ่งสำหรับการฝังการแบ่งพื้นที่ 3 มิติให้ลึกลงไปในลําดับชั้น UI ที่มีอยู่ของแอป

คุณสามารถเรียกใช้ Subspace ได้โดยตรงในลําดับชั้น 2D UI เช่นเดียวกับคอมโพสิเบิลอื่นๆ อย่างไรก็ตาม คุณควรตระหนักถึงผลที่ตามมาของตําแหน่งในลําดับชั้นที่คุณเรียกใช้ Subspace

เกี่ยวกับลําดับชั้นของพื้นที่ทำงานย่อย

พื้นที่ทำงานย่อยระดับบนสุดคือพื้นที่ทำงานย่อยด้านนอกสุดที่แอปเรียกใช้ ให้ใช้คอมโพสิเบิล ApplicationSubspace สำหรับพื้นที่ทำงานย่อยระดับบนสุด แต่หากคุณใช้เฉพาะคอมโพสิเบิลพื้นที่ทำงานย่อยในแอป คอมโพสิเบิล Subspace ด้านนอกสุดจะเป็นพื้นที่ทำงานย่อยระดับบนสุด โดยค่าเริ่มต้น พื้นที่ทำงานย่อยระดับบนสุดนี้จะกําหนดขอบเขตโดยพื้นที่ที่แนะนําสําหรับดูแอป และโดยปกติแล้วจะเป็นตําแหน่งที่คุณวางเลย์เอาต์เชิงพื้นที่และ SpatialPanel ของแอป หากต้องการเปลี่ยนขอบเขตของเซสชันย่อยระดับบนสุด ให้ส่ง VolumeConstraints อื่นไปยัง ApplicationSubspace

อย่างไรก็ตาม หากคุณฝังพื้นที่ทำงานย่อยอื่นภายในลําดับชั้น UI 2 มิติในแผงที่อยู่ในพื้นที่ทำงานย่อยระดับบนสุด พื้นที่ทำงานย่อยที่ฝังนั้นจะทํางานต่างจากเดิม

พื้นที่ทำงานย่อยที่ฝังมีความแตกต่างที่สำคัญ 2 ประการจาก Subspace ระดับบนสุด

  • โดยจะอยู่ในเลย์เอาต์ 2 มิติที่เรียกใช้ ซึ่งหมายความว่าความสูงและความกว้างของพื้นที่ย่อยจะจำกัดตามความสูงและความกว้างของเลย์เอาต์หลัก 2 มิติ
  • โดยจะทํางานเป็นองค์ประกอบย่อยของเอนทิตีที่เรียกใช้ ซึ่งหมายความว่าหากคุณเรียกใช้คอมโพสิเบิล Subspace ที่ฝังอยู่ภายใน SpatialPanel นั้น ซับสเปซดังกล่าวจะเป็นซับสเปซย่อยของ SpatialPanel ที่เรียกใช้

ลักษณะการทํางานของพื้นที่ย่อยที่ซ้อนกันเหล่านี้จะเปิดใช้ความสามารถต่างๆ เช่น

  • การย้ายเอนทิตีย่อยไปพร้อมกับเอนทิตีหลัก
  • การปรับตำแหน่งของบุตรหลานโดยใช้ออฟเซต SubspaceModifier
  • การนำเสนอวัตถุ 3 มิติที่วางอยู่เหนือ UI 2 มิติและตรงกับความสูงและความกว้างของพื้นที่ที่เหมาะสมในเลย์เอาต์ 2 มิติ

เพิ่มพื้นที่ย่อยลงในแอป

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่มพื้นที่ทำงานย่อยระดับบนสุดและที่ฝังลงในแอป

setContent {
    // This is a top-level subspace
    ApplicationSubspace {
        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(true)
    }
}