如何通过在RealityKit中点击实体来打开SwiftUI视图?

3
我正在使用SwiftUI和RealityKit。如下所示的代码中,我有一个平面实体,当点击它时,只会打印出实体的名称。当我点击实体时,我应该采取什么方法来导航到新视图?最好像在普通视图中使用导航链接一样进行导航,但如果不可能,则可以考虑使用fullScreenCover吗?

ARViewContainer.swift:

class Coordinator: NSObject {
    
    weak var view: ARView?
    
    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        
        guard let view = self.view else { return }
        
        let tapLocation = recognizer.location(in: view)
        
        if let entity = view.entity(at: tapLocation) as? ModelEntity {
            print(entity.name)
        }
        
    }
    
}


struct ARViewContainer: UIViewRepresentable {
    typealias UIViewType = ARView
    

    func makeUIView(context: Context) -> ARView{
        let arView = ARView(frame: .zero, cameraMode: .ar, automaticallyConfigureSession: true)
        
        context.coordinator.view = arView
                
        arView.addGestureRecognizer(UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleTap)))
        
        arView.scene.anchors.removeAll()
        

        let anchor = AnchorEntity()

        let plane = MeshResource.generatePlane(width: 1, height: 1)

        
        
        var material = UnlitMaterial()
        material.color = .init(tint: .white,
                            texture: .init(try! .load(named: "instagram")))
       

        let planeEntity = ModelEntity(mesh: plane, materials: [material])
        planeEntity.generateCollisionShapes(recursive: true)
        
        planeEntity.name = "Plane Entity"

        planeEntity.position.z -= 1.0
        planeEntity.setParent(anchor)
        arView.scene.addAnchor(anchor)
        
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context){
        
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
}

ContentView.swift

struct ContentView: View {   
    @State var open = false
    
    var body: some View {
        NavigationView{
            ZStack {
                ARViewContainer()
                    .ignoresSafeArea(.all)
            }
        } 
    }
}

我想要导航到的视图:

struct TestView : View {
    var body : some View {
        VStack{
            Text("Test View")
        }
    }
}
1个回答

4

在可观察对象中管理视图状态,并从您的AR视图修改它。

struct ContentView: View {
    @ObservedObject var settings = Settings.shared

    var body: some View {
        NavigationView {
            ZStack {
                ARViewContainer()
                    .ignoresSafeArea(.all)

                NavigationLink("", isActive: $settings.shouldOpenDetailsView) {
                    TestView()
                }
            }
        }
    }
}

class Settings: ObservableObject {
    static let shared = Settings()

    @Published var shouldOpenDetailsView = false
}

class Coordinator: NSObject {
    weak var view: ARView?

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        guard let view = self.view else { return }

        let tapLocation = recognizer.location(in: view)

        if let entity = view.entity(at: tapLocation) as? ModelEntity {
            Settings.shared.shouldOpenDetailsView = true
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接