使用SceneKit中的键将声音作为动作放在节点上

时间:2016-08-08 14:19:12

标签: audio action scenekit

我在SceneKit中编写了一个函数,它将背景音乐作为带有键的节点上的动作播放,因此我可以使用键停止播放音乐

我有一个全局变量,所以我可以调用从类中的任何地方停止操作,(顺便说一下,这是SceneKit而不是SpriteKit,我仍然使用Swift作为语言)

var musicPlayingAction = SCNAction()

然而没有什么能阻止它,无论是forKey还是removeAllActions,如......

这没有任何作为

scnScene.rootNode.removeActionForKey("bgMusicKey")

所以我尝试更高级别并向下钻取,杀死场景,视图或节点上的所有动作(取决于我附加声音动作的位置)。

self.scnView.scene!.rootNode.removeAllActions()

仍然没有...

即使我在特定节点上运行声音动作并试图杀死它......你猜对了,或者我应该说音乐还在播放。

这是功能

func playMusic() {
        if game.state == .Playing {

            let music = SCNAudioSource(fileNamed: "art.scnassets/Sounds/BgMusic.mp3")!

            music.volume = 0.3;
            music.loops = true
            music.shouldStream = true
            music.positional = false
            musicPlayingAction = SCNAction.playAudioSource(music, waitForCompletion: false)
            scnScene.rootNode.runAction(musicPlayingAction, forKey: "bgMusicKey")
   }
}

动作与音乐剧一样,但不会停止。

甚至可以将AudioSource作为动作停止,我知道你可以用Key停止动作,虽然这是我第一次试图用一个键停止音频SCNAction(注意不是SKAction)?

任何想法都表示赞赏,谢谢。

3 个答案:

答案 0 :(得分:1)

解决!

删除了Action forKey ...

将我的游戏分解为场景,为每个场景添加游戏状态,然后加载依赖于状态和场景的背景音乐。场景。

感谢您的帮助,非常感谢=)

答案 1 :(得分:0)

有一个简单的答案

self.rootNode.removeAllAudioPlayers() 

这将阻止所有音频播放器

答案 2 :(得分:0)

如果将声音作为操作添加到节点,则可以使用键删除此操作,如果将声音添加为音频播放器,则可以使用删除yourNode.removeAllAudioPlayers()

来删除它