Ленивая переменная для воспроизведения звука при обнаружении эталонного изображения - PullRequest
0 голосов
/ 02 августа 2020

Я хотел бы воспроизвести отдельные аудиофайлы из эталонных изображений.

Могу ли я использовать lazy var для загрузки аудиофайла, а затем использовать

func getNode(withImageName name: String) 

, чтобы запускать звук для играть?

1 Ответ

1 голос
/ 05 августа 2020

Да, вы можете.

Если вы хотите знать, как использовать SceneKit positional audio прочтите этот пост .

Если вы используете RealityKit positional audio в вашем приложении - прочтите этот пост .


Давайте посмотрим, как ваш код может выглядеть для lazy var:

 lazy var geoAndAudioNode: SCNNode = {
    
    guard let scene: SCNScene = SCNScene(named: "pixar.usdz"),
          let node: SCNNode = scene.rootNode.childNode(withName: "model", 
                                                    recursively: true)
    else { return SCNNode() }
    
    let myPath = Bundle.main.path(forResource: "audio", ofType: "mp3")
    let myURL = URL(fileURLWithPath: myPath!)
    let mySource = SCNAudioSource(url: myURL)!
    
    let audioNode = SCNNode()
    let player = SCNAudioPlayer(source: mySource)
    node.addChildNode(audioNode)
    audioNode.addAudioPlayer(player)
    
    return node
}()

А вот как ваш код может выглядеть внутри renderer метода:

extension ViewController: ARSCNViewDelegate {
    
    func renderer(_ renderer: SCNSceneRenderer,
                 didAdd node: SCNNode,
                  for anchor: ARAnchor) {
        
        guard let imageAnchor = anchor as? ARImageAnchor,
              let imageName = imageAnchor.referenceImage.name
        else { return }
                    
        let geometryNode = retrieveNode(name: imageName)
        node.addChildNode(geometryNode)
    }
    
    func retrieveNode(name: String) -> SCNNode {
        
        var node = SCNNode()
        
        switch name {
            case "geoAndAudioImage": node = geoAndAudioNode
            default: break
        }
        return node
    }
}
...