Removing multiple Entities in RealityKit

988 Views Asked by At

I try to remove multiple Entities when I triggered a button, which changes a Boolean to "true". After placing two different Entities I tried to remove them but nothing happens after pressing my button. The ARViewContainer looks like this:

struct ARViewContainer: UIViewRepresentable {
    
    @Binding var reset: Bool
    @Binding var modelSelector: String
    let anchor = AnchorEntity(plane: .any)

    
    
    
    
    
    // App initialisieren
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        
        // create config for all entities
        
        let config = ARWorldTrackingConfiguration()
        
            config.planeDetection = [.horizontal, .vertical]
            config.environmentTexturing = .automatic
            config.sceneReconstruction = .mesh
        
        arView.session.run(config)
        
        
        
        
    
        
        return arView
        
    }
    func updateUIView(_ uiView: ARView, context: Context) {
        
        
        // create anchor and model-Entity
        if modelSelector != "default" {
            let modelEntity = try! ModelEntity.loadModel(named: "\( modelSelector)")

            
            
            anchor.addChild(modelEntity)
                
            uiView.scene.addAnchor(anchor)
            
        }
        
        
        // reset anchor
        if reset == true {
            
            uiView.scene.removeAnchor(anchor)
            
            
        }
        
        
        }

    
}

the modelSelector stores the name of my model and is set to "default" in the beginning. When I press on a model inside my App, the Selector is set to the model name and an Entity is created and bound to the anchor?.

Update 1

This is my complete code so far. (I commented the load and save part out, since it does not work as intended so far):

import SwiftUI
import RealityKit
import ARKit
import UIKit



//MARK: - User Interface



struct ContentView : View {
    
    @State var reset: Bool = false
    @State var modelName: [String] = ["teapot", "toyplane"]
    @State var modelSelector: String = "default"
    @State var showModels: Bool = false
    @State var save: Bool = false
    @State var load: Bool = false
    
    var body: some View {
        ZStack {
            
            ARViewContainer(reset: self.$reset, modelSelector: self.$modelSelector, save: self.$save,load: self.$load ).edgesIgnoringSafeArea(.all)
            
            VStack {
                
                SaveLoadReset(save: self.$save, load: self.$load, reset: self.$reset)
                
                Spacer()
                
                if showModels {
                    
                    ModelGallery(modelName: self.$modelName, modelSelector: self.$modelSelector, showModels: self.$showModels)
                     
                }
                else {
                    
                    MenuButton(showModels: self.$showModels, modelSelector: self.$modelSelector)
                    
                }
            }
        }
    }
}



//MARK: - UI-Elements


//MARK: ARViewContainer

struct ARViewContainer: UIViewRepresentable {
    
    @Binding var reset: Bool
    @Binding var modelSelector: String
    @Binding var save: Bool
    @Binding var load: Bool
    let anchor = AnchorEntity(plane: .any)
    

    
    
    
    
    
    func makeUIView(context: Context) -> ARView {
        
        
        
        // create config for all entities
        
        let arView = ARView(frame: .zero)
        let config = ARWorldTrackingConfiguration()
        
            config.planeDetection = [.horizontal, .vertical]
            config.environmentTexturing = .automatic
            config.sceneReconstruction = .mesh
        
        
        
        arView.session.run(config)
        
        
        
        
    
        
        return arView
        
    }
    
//MARK: - save and load
    
  /*  fileprivate func saveWorldMap() {

        arView.session.getCurrentWorldMap { (worldMap, _) in
            
            if let map: ARWorldMap = worldMap {
                
                let data = try! NSKeyedArchiver.archivedData(withRootObject: map,
                                                      requiringSecureCoding: true)
                
                let savedMap = UserDefaults.standard
                savedMap.set(data, forKey: "WorldMap")
                savedMap.synchronize()
            }
        }
    }

    fileprivate func loadWorldMap() {

        let storedData = UserDefaults.standard

        if let data = storedData.data(forKey: "WorldMap") {

            if let unarchiver = try? NSKeyedUnarchiver.unarchivedObject(
                                   ofClasses: [ARWorldMap.classForKeyedUnarchiver()],
                                        from: data),
               let worldMap = unarchiver as? ARWorldMap {

                    config.initialWorldMap = worldMap
                    arView.session.run(config)
            }
        }
    }*/
    // App kontinuierlich beobachten
    func updateUIView(_ uiView: ARView, context: Context) {
        
        
        // create anchor and model-Entity
        if modelSelector != "default" {
            let modelEntity = try! ModelEntity.loadModel(named: "\( modelSelector)")
            modelEntity.name = "\(self.modelSelector)"
            
            
            anchor.addChild(modelEntity)
                
            uiView.scene.addAnchor(anchor)
            
        }
    // reset anchor
    if reset == true {
        
        uiView.scene.removeAnchor(anchor)
        /*guard let entity = uiView.scene.findEntity(named: "SPHERE")
        else { return }
        
        if save {
            self.saveWorldMap()
        }
        if load {
            self.loadWorldMap()
        }*/
        
        
       
            
            
        }
        
        
        }

    
}

//MARK: - Menu-Button

struct MenuButton: View {
    
    @Binding var showModels: Bool
    @Binding var modelSelector: String
    
    var body: some View {
        
        Button(action: {
            
            self.showModels = true
            print("DEBUG: MenuButton pressed and showModels = \(self.showModels)")
            
            self.modelSelector = "default"
            print("DEBUG: Modelselector = \(self.modelSelector)")
                
                
                
            })
            {
                Image(systemName: "arkit")
                    .padding(20)
                    .background(Color.white)
                    .opacity(0.3)
                    .cornerRadius(20)
                    .font(.title)
        }
                .padding(.bottom, 30)
    }
}

//MARK: - Model Gallery

struct ModelGallery: View {
    
    @Binding var modelName: [String]
    @Binding var modelSelector: String
    @Binding var showModels: Bool
    
    var body: some View {
        
                        
        //HStack für die Objekte
            HStack() {
                // wir wollen eine Schleife erstellen, welche alle Modellnamen in den Knöpfen speichert. Index steht dabei für die Stelle in unserem String Array, also zu Beginn ist der Index 0 und geht bis Anz. Models - 1 hoch (wegen dem < Zeichen), denn self.models.count ist die Anzahl an Elementen in unserem String Array
                ForEach(0 ..< self.modelName.count) {
                    index in
                    
                    Button(action: {
                            
                            self.modelSelector = self.modelName[index]
                            print("DEBUG: Der Name des Modells lautet: \(self.modelSelector)")
                            
                        })
                        {
                            Image(uiImage: UIImage(named: self.modelName[index])!)
                                .resizable()
                                .frame(width: 80, height: 80)
                                .padding(10)
                                .background(Color.white)
                                .cornerRadius(15)
                            
                        }
                            .buttonStyle(PlainButtonStyle())
                            .padding(.bottom)
                }
                
                Spacer()
                
                Button(action: {
                    
                    self.showModels = false
                    print("DEBUG: close-Button")
                    
                    self.modelSelector = "default"
                    print("DEBUG: Modelselector = \(self.modelSelector)")
                    
                })
                {
                    Image(systemName: "xmark.square")
                        
                    .padding(20)
                    .background(Color.white)
                    .opacity(0.3)
                    .cornerRadius(20)
                    .padding(10)
                    .font(.title)
                }
                
            }
    }
}

//MARK: - save, load, reset

struct SaveLoadReset: View {

    @Binding var save: Bool
    @Binding var load: Bool
    @Binding var reset: Bool
    
    var body: some View {
        
            
            
    //HStack für den Laden und Speichern Knopf
                    HStack(spacing: 10){
        
    //save-Button:
                        Button(action: {
                            self.save = true
                            print("DEBUG: saveButton")
                            
                        })
                        {
                            Image(systemName: "square.and.arrow.up")
                                
                            .padding(20)
                            .background(Color.white)
                            .opacity(0.3)
                            .cornerRadius(20)
                            .padding(10)
                            .font(.title)
                        }
                            
                        
                        
    //load-Button:
                        Button(action: {
                            self.load = true
                            print("DEBUG: loadButton")
                            
                        })
                        {
                            Image(systemName: "square.and.arrow.down")
                                
                            .padding(20)
                            .background(Color.white)
                            .opacity(0.3)
                            .cornerRadius(20)
                            .font(.title)
                        }
                        
                        

                        Spacer()
                        
    //reset-Button:
                        Button(action: {
                            
                            print("DEBUG: removeButton")
                            self.reset = true
                            
                            print("DEBUG: reset = \(self.reset)" )
                            
                            
                        })
                        {
                            Image(systemName: "arrow.clockwise.circle")
                                
                            .padding(20)
                            .background(Color.white)
                            .opacity(0.3)
                            .cornerRadius(20)
                            .font(.title)
                            .padding(10)
                        }
                        
                    }
    }
}

In the modelGallery structure I loop the different models from my modelName array and save it inside the modelSelector, which uses it to place objects. Deleting these objects does not work so far.

0

There are 0 best solutions below