Search code examples
swiftswiftuiaugmented-realityrealitykit

Create segues in RealityKit


I want to add a segue in my Reality Kit project between a simple swiftUI page and the AR camera ContentView. Here is my SegueView, the swiftui page that has a button which I want to segue to the AR view.

struct SegueView: View {
    @State private var isActive: Bool = false
    var body: some View {
        NavigationLink(destination: ContentView(rootActive: $isActive), isActive: $isActive, label: {
            Text("See in AR")
        })
    }
}

Here is the code from my ContentView, which only renders a box:

struct ContentView : View {
    @Binding var rootActive: Bool
    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        
        // Load the "Box" scene from the "Experience" Reality File
        let anchor = AnchorEntity(plane: .horizontal)
        let box = ModelEntity(mesh: MeshResource.generateBox(size: 0.3), materials: [SimpleMaterial(color: .blue, isMetallic: true)])
        
        anchor.addChild(box)
        // Add the box anchor to the scene
        arView.scene.anchors.append(anchor)
        
        return arView
        
    }
    func updateUIView(_ uiView: ARView, context: Context) {} 
}

I followed this tutorial to create the segue, but it doesn't contain an AR view and I cannot find a tutorial that does. I also have to add the rootActive variable in the app delegate here:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView(rootActive: .constant(true))

        // Use a UIHostingController as window root view controller.
        let window = UIWindow(frame: UIScreen.main.bounds)
        window.rootViewController = UIHostingController(rootView: contentView)
        self.window = window
        window.makeKeyAndVisible()
        return true
    }

But since the tutorial doesn't have this step, I'm not entirely sure what to do. When I run the app, only the ContentView gets rendered. Does anyone know how I can create a segue where the SegueView is rendered first, and then when the navigation link "see in AR" is pressed, it goes to the ContentView?

Thanks!


Solution

  • In ContentView, put NavigationLink inside NavigationView.

    import SwiftUI
    import RealityKit
    
    struct ContentView: View {
        var body: some View {           
            NavigationView {
                ZStack {
                    Color.black
                    
                    VStack {    
                        NavigationLink(destination: Reality().ignoresSafeArea()) {
                            Text("Go to ARView")
                                .foregroundColor(.cyan)
                                .font(.title3)
                        }                   
                    }
                }.ignoresSafeArea()
            }
        }
    }
    

    ARView

    struct Reality: UIViewRepresentable {
        
        func makeUIView(context: Context) -> ARView {
            let arView = ARView(frame: .zero)
            let model = ModelEntity(mesh: .generateSphere(radius: 0.2))
            let anchor = AnchorEntity(plane: .horizontal)
            anchor.addChild(model)
            arView.scene.anchors.append(anchor)
            return arView
        }
        func updateUIView(_ uiView: ARView, context: Context) { }
    }
    

    P. S.

    In project's Info tab add key Privacy - Camera Usage Description.