所以感谢Jazz先生的回答,我已经能够在一个Reality Composer场景中制作所有对象,可拖动。
在使它们可拖动之前,我已经为两个模型实体添加了行为。它工作得很好:当我打开应用程序时,场景是可见的,当我点击蓝色矩形时,它消失了;当我点击绿色按钮时,按钮上下移动。 下面的代码适用于未对模型实体进行分组的场景。
let cubesBlueAnchor = try! Experience.loadCubesBlue()
self.arView.scene.anchors.append(cubesBlueAnchor)
cubesBlueAnchor.actions.behavior.onAction = handleTapOnEntity(_:)
见下方 Reality Composer 行为屏幕截图,我在两个场景中使用了相同的行为。
但是,一旦他们在 realitykit 中分组,他们的行为就不再可访问。 我认为这是我需要 Combine 的东西,但我不确定。也许有一个更简单的解决方案。
我复制了具有相同行为的场景,其中 blueCubes 是尚未分组/无法拖动但行为有效的场景。
在立方体场景中,对象是可拖动和可伸缩的,但是它们的行为是无法访问的。 这是有效的代码。
let cubesAnchor = try! Experience.loadCubes()
arView.scene.anchors.append(cubesAnchor)
print (cubesAnchor)
let redModel = cubesAnchor.children[0].children[0]
let group = ModelEntity() as ModelEntity & HasCollision
group.addChild(redModel)
group.generateCollisionShapes(recursive: false)
self.arView.installGestures(.all, for: group)
let shape = ShapeResource.generateBox(width: 1, height: 1, depth: 1)
let collision = CollisionComponent(shapes: [shape],
mode: .trigger,
filter: .sensor)
group.components.set(collision)
let anchor = AnchorEntity()
anchor.addChild(group)
anchor.scale = [5,5,5]
arView.scene.anchors.append(anchor)
查看手机屏幕截图,显示两者。 (屏幕截图显示蓝色矩形消失的 blueCubes 行为。
我希望能够做到这两点——将对象分组在一个实体下,可以将它们拖动到那里,并且当我在同一场景中单击每个实体时,每个模型实体的行为都会被触发。
但我不知道该怎么做。也许在不拖动对象时消除碰撞?
查看下面的完整代码
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
//self.arView.debugOptions = .showPhysics
let cubesAnchor = try! Experience.loadCubes()
arView.scene.anchors.append(cubesAnchor)
print (cubesAnchor)
let redModel = cubesAnchor.children[0].children[0]
let group = ModelEntity() as ModelEntity & HasCollision
group.addChild(redModel)
group.generateCollisionShapes(recursive: false)
self.arView.installGestures(.all, for: group)
let shape = ShapeResource.generateBox(width: 1, height: 1, depth: 1)
let collision = CollisionComponent(shapes: [shape],
mode: .trigger,
filter: .sensor)
group.components.set(collision)
let anchor = AnchorEntity()
anchor.addChild(group)
anchor.scale = [5,5,5]
arView.scene.anchors.append(anchor)
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
//self.arView.scene.anchors.removeAll()
let cubesBlueAnchor = try! Experience.loadCubesBlue()
self.arView.scene.anchors.append(cubesBlueAnchor)
cubesBlueAnchor.actions.behavior.onAction = handleTapOnEntity(_:)
}
func handleTapOnEntity(_ entity: Entity?){
guard let entity = entity else { return }
}
}
}