如何从 Reality Composer 场景中恢复每个 ModelEntity() 对象的行为,这些对象与 HasCollision 协议组合在一起?

问题描述 投票:0回答:0

所以感谢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 }
            
        }
        
        
        
    }
}
arkit swift-protocols realitykit reality-composer
© www.soinside.com 2019 - 2024. All rights reserved.