如何解决在RealityKit中删除多个实体
当我触发按钮时,我尝试删除多个实体,该按钮将布尔值更改为“ true”。 放置了两个不同的实体后,我尝试将其删除,但是按我的按钮后什么也没有发生。 ARViewContainer看起来像这样:
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)
}
}
}
modelSelector存储我的模型名称,并在开始时设置为“默认”。 当我在App内按下模型时,选择器将设置为模型名称,并创建一个实体并将其绑定到锚点。
更新1
到目前为止,这是我完整的代码。 (我评论了加载并保存了一部分,因为到目前为止它无法按预期工作):
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,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)
}
}
}
}
在modelGallery结构中,我循环了我的modelName数组中的不同模型,并将其保存在modelSelector中,该模型用于放置对象。 到目前为止,删除这些对象无效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。