swiftasynchronousaugmented-realityrealitykitusdz

RealityKit – Asynchronous model loading doesn't work


This code works:

let entity = try! Entity.load(named: "toy_robot_vintage")
anchorEntity.addChild(entity)

But this doesn't:

_ = Entity.loadAsync(named: "toy_robot_vintage")
        .sink(receiveCompletion: { loadCompletion in
            print("This is never executed")
        }, receiveValue: { entity in
            print("This is never executed")
            anchorEntity.addChild(entity)
        })

What could be the issue?


Solution

  • Use the following macOS code version to find out how to load model asynchronously:

    import AppKit
    import RealityKit
    import Combine
    
    class GameViewController: NSViewController {
        
        @IBOutlet var arView: ARView!
        var model: ModelEntity? = nil
        let anchor = AnchorEntity()
        var cancellable: AnyCancellable? = nil
        
        override func awakeFromNib() {
        
            arView.environment.background = .color(.systemTeal)
                    
            cancellable = Entity.loadModelAsync(named: "Glasses.usdz")
                .sink(receiveCompletion: { completion in
                    if case let .failure(error) = completion {
                        print("Unable to load a model due to error \(error)")
                    }
                    self.cancellable?.cancel()
                    
                }, receiveValue: { [self] (model: Entity) in
                    if let model = model as? ModelEntity {
                        self.model = model
                        cancellable?.cancel()
                        print("Congrats! Model is successfully loaded!")
                        anchor.addChild(model)
                        anchor.position = [0.4, 1.5, -1]
                        anchor.scale = [300, 300, 300]   // set appropriate scale
                        arView.scene.anchors.append(anchor)
                    }
                })
        }
    }
    

    enter image description here