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.