Jordan Heath
Jordan Heath

Reputation: 124

SCNAudioSource won't play with a SCNNode

I am trying to play a sound every time i tap the screen. Here is my code

Global:

var shapeNode: SCNNode!
var SoundAction: SCNAction!

ViewDidLoad:

    let audioSource = SCNAudioSource(named: "launch.mp3")!
    audioSource.isPositional = true
    audioSource.volume = 1.0
    SoundAction = SCNAction.playAudio(audioSource, waitForCompletion: false)

@objc func sceneTapped(recognizer: UITapGestureRecognizer)

    shapeNode = SCNNode(geometry: myshape)

    self.myscene?.rootNode.addChildNode(shapeNode)
    shapeNode.runAction(SoundAction)

Sound won't play when I touch the screen... Someone please help

Upvotes: 1

Views: 573

Answers (1)

Voltan
Voltan

Reputation: 1213

I generated a default game project, then put in your code. At first, I received the same results. However, when I took the let scene = SCNScene(named: "art.scanassets/ship.scn")! and made scene a class variable, the sound plays. OR if you add the SoundNode during we did load and NOT when tapped, the sound will also play.

class GameViewController: UIViewController {

    var SoundAction = SCNAction()
    var SoundNode = SCNNode()
    var scene = SCNScene()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Change this
        scene = SCNScene(named: "art.scnassets/ship.scn")!

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        scene.rootNode.addChildNode(cameraNode)
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

        let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
        ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))

        let audioSource = SCNAudioSource(named: "MenuWinner.caf")!
        audioSource.volume = 1.0
        SoundAction = SCNAction.playAudio(audioSource, waitForCompletion: false)

        let scnView = self.view as! SCNView
        scnView.scene = scene
        scnView.allowsCameraControl = true
        scnView.showsStatistics = true
        scnView.backgroundColor = UIColor.black

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        scnView.addGestureRecognizer(tapGesture)
    }

    @objc
    func handleTap(_ gestureRecognize: UIGestureRecognizer) {
        scene.rootNode.addChildNode(SoundNode)
        SoundNode.runAction(SoundAction)
    }

Upvotes: 1

Related Questions